webapp/src/components/Inbox/Message.tsx

59 lines
2.0 KiB
TypeScript
Raw Normal View History

import type { ChatMember, Message as MessageType } from '~/graphql/schema/chat.gen'
import { clsx } from 'clsx'
2024-02-04 11:25:21 +00:00
import { Show, createSignal } from 'solid-js'
import { useLocalize } from '~/context/localize'
2022-12-17 03:27:00 +00:00
import { Icon } from '../_shared/Icon'
import DialogAvatar from './DialogAvatar'
2022-12-17 03:27:00 +00:00
import { MessageActionsPopup } from './MessageActionsPopup'
import QuotedMessage from './QuotedMessage'
import styles from './Message.module.scss'
2022-11-16 12:25:37 +00:00
type Props = {
content: MessageType
2022-12-17 03:27:00 +00:00
ownId: number
members: ChatMember[]
replyClick?: () => void
replyBody?: string
replyAuthor?: string
2022-11-16 12:25:37 +00:00
}
2023-02-17 09:21:02 +00:00
export const Message = (props: Props) => {
const { formatTime } = useLocalize()
2023-11-17 09:00:00 +00:00
const isOwn = props.ownId === Number(props.content.created_by)
const user = props.members?.find((m) => m.id === Number(props.content.created_by))
2022-12-17 03:27:00 +00:00
const [isPopupVisible, setIsPopupVisible] = createSignal<boolean>(false)
2022-11-16 12:25:37 +00:00
return (
2022-12-17 03:27:00 +00:00
<div class={clsx(styles.Message, isOwn && styles.own)}>
2024-06-24 17:50:27 +00:00
<Show when={!isOwn && user?.name}>
2022-11-21 05:06:53 +00:00
<div class={styles.author}>
2024-06-24 17:50:27 +00:00
<DialogAvatar size="small" name={user?.name || ''} url={user?.pic || ''} />
<div class={styles.name}>{user?.name}</div>
2022-11-21 05:06:53 +00:00
</div>
</Show>
2022-12-17 03:27:00 +00:00
<div class={clsx(styles.body, { [styles.popupVisible]: isPopupVisible() })}>
<div class={styles.text}>
<div class={styles.actions}>
<div onClick={props.replyClick}>
<Icon name="chat-reply" class={styles.reply} />
</div>
<MessageActionsPopup
onVisibilityChange={(isVisible) => setIsPopupVisible(isVisible)}
trigger={<Icon name="menu" />}
/>
</div>
<Show when={props.replyBody}>
2024-06-24 17:50:27 +00:00
<QuotedMessage body={props.replyBody || ''} variant="inline" isOwn={isOwn} />
2022-12-17 03:27:00 +00:00
</Show>
2023-10-15 12:09:31 +00:00
<div innerHTML={props.content.body} />
2022-12-17 03:27:00 +00:00
</div>
2022-11-21 05:06:53 +00:00
</div>
2023-11-17 09:00:00 +00:00
<div class={styles.time}>{formatTime(new Date(props.content.created_at * 1000))}</div>
2022-11-16 12:25:37 +00:00
</div>
)
}