162 lines
5.5 KiB
TypeScript
162 lines
5.5 KiB
TypeScript
'use client'
|
|
|
|
import { ef } from '@/lib/helpers/utfNumbers'
|
|
import { EmojiHappy, Microphone2, Paperclip2 } from 'iconsax-react'
|
|
import React, { useMemo, useState } from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { glassSurfaceCard } from '@/lib/styles/glassSurface'
|
|
|
|
type Props = object
|
|
|
|
type MessageModel = {
|
|
type: 'sender' | 'receiver'
|
|
senderName: string
|
|
content: string
|
|
date: string
|
|
time: string
|
|
}
|
|
|
|
function ChatIndex ({}: Props) {
|
|
const { t } = useTranslation('chat')
|
|
|
|
const [messages, setMessages] = useState<Array<MessageModel>>([
|
|
{
|
|
type: 'sender',
|
|
senderName: 'علی مصلحی',
|
|
content:
|
|
'لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است',
|
|
date: '1403/09/30',
|
|
time: '10:07'
|
|
},
|
|
{
|
|
type: 'receiver',
|
|
senderName: 'سیما فرهادی',
|
|
content:
|
|
'لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است',
|
|
date: '1403/09/30',
|
|
time: '10:07'
|
|
}
|
|
])
|
|
|
|
const addMessageOutgoing = (model: MessageModel) => {
|
|
setMessages(previous => {
|
|
return [...previous, model]
|
|
})
|
|
}
|
|
|
|
const submitMessage = (e: React.FormEvent<HTMLFormElement>) => {
|
|
e.preventDefault()
|
|
const formData = new FormData(e.currentTarget)
|
|
const content = formData.get('textMessage')
|
|
if (!content) return
|
|
const model: MessageModel = {
|
|
type: 'sender',
|
|
senderName: 'علی مصلحی',
|
|
content: String(content),
|
|
date: '1403/09/30',
|
|
time: '10:07'
|
|
}
|
|
addMessageOutgoing(model)
|
|
}
|
|
|
|
const messagesMemo = useMemo(() => messages, [messages])
|
|
|
|
return (
|
|
<section className='flex flex-col h-full pt-6'>
|
|
<h1 className='font-medium'>علی مصلحی</h1>
|
|
|
|
<div className={glassSurfaceCard('rounded-[30px] flex flex-col justify-between mt-6 flex-1 px-6 pt-7 pb-8 overflow-hidden')}>
|
|
<div className='overflow-y-auto flex flex-col-reverse'>
|
|
<ul className='grid gap-6 pb-6 '>
|
|
{messagesMemo.map((v, i) => {
|
|
if (v.type === 'sender') {
|
|
return (
|
|
<li
|
|
key={i}
|
|
className='bg-[#F6F7FA] dark:bg-gray-700 rounded-[30px] rounded-tr-none p-6'
|
|
>
|
|
<article>
|
|
<p className='text-xs2'>{v.content}</p>
|
|
|
|
<span
|
|
dir='ltr'
|
|
className='text-[11px] float-end text-disabled-text mt-2.5'
|
|
>
|
|
{ef(`${v.time} | ${v.date}`)}
|
|
</span>
|
|
</article>
|
|
</li>
|
|
)
|
|
} else {
|
|
return (
|
|
<li
|
|
key={i}
|
|
className='bg-[#EBEDF5] dark:bg-gray-600 rounded-[30px] rounded-tl-none p-6'
|
|
>
|
|
<article>
|
|
<h6 className='text-xs font-medium'>{v.senderName}</h6>
|
|
<p className='text-xs2 mt-2.5'>{v.content}</p>
|
|
|
|
<span
|
|
dir='ltr'
|
|
className='text-[11px] float-end text-disabled-text mt-2.5'
|
|
>
|
|
{ef(`${v.time} | ${v.date}`)}
|
|
</span>
|
|
</article>
|
|
</li>
|
|
)
|
|
}
|
|
})}
|
|
</ul>
|
|
</div>
|
|
|
|
<section
|
|
aria-labelledby={t('InputMessage.AriaLabelBy')}
|
|
className='w-full'
|
|
>
|
|
<form
|
|
onSubmit={submitMessage}
|
|
className='focus-within:outline-blue-400 outline outline-transparent transition-colors duration-100 flex items-center gap-0 bg-transparent border border-border h-12 rounded-xl py-2.5 px-2'
|
|
>
|
|
<button
|
|
type='button'
|
|
className='active:bg-neutral-100 dark:active:bg-neutral-600 transition-colors duration-150 rounded-full p-1'
|
|
>
|
|
<Microphone2 className='stroke-foreground' size={24} />
|
|
</button>
|
|
<input
|
|
name='textMessage'
|
|
role='textbox'
|
|
autoComplete='off'
|
|
className='w-full text-[11px] h-full outline-none ms-1'
|
|
type='text'
|
|
placeholder={t('InputMessage.Placeholder')}
|
|
/>
|
|
<button
|
|
type='button'
|
|
className='active:bg-neutral-100 dark:active:bg-neutral-600 transition-colors duration-150 rounded-full p-1.5'
|
|
>
|
|
<EmojiHappy
|
|
className='stroke-disabled2 dark:stroke-neutral-400'
|
|
size={20}
|
|
/>
|
|
</button>
|
|
<button
|
|
type='button'
|
|
className='active:bg-neutral-100 dark:active:bg-neutral-600 transition-colors duration-150 rounded-full p-1.5'
|
|
>
|
|
<Paperclip2
|
|
className='stroke-disabled2 dark:stroke-neutral-400'
|
|
size={20}
|
|
/>
|
|
</button>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
export default ChatIndex
|