mirror of
https://github.com/hanzo-io/chat.git
synced 2026-10-30 18:57:58 +00:00
70 lines
3.6 KiB
TypeScript
70 lines
3.6 KiB
TypeScript
import clsx from 'clsx';
|
|
import MessageAvatar from '../chat-stream/MessageItemElements/MessageAvatar';
|
|
import { useGetUser } from '@raven/lib/hooks/useGetUser';
|
|
import MessageHeader from '../chat-stream/MessageItemElements/MessageHeader';
|
|
import { ImageMessageView } from '../chat/ChatMessage/Renderers/ImageMessage';
|
|
import { PollMessageBlock } from '../chat/ChatMessage/Renderers/PollMessage';
|
|
import { FileMessageView } from '../chat/ChatMessage/Renderers/FileMessageRenderer';
|
|
import MessageTextRenderer from '../chat-stream/MessageItemElements/MessageTextRenderer';
|
|
import DocTypeLinkRenderer from '../chat/ChatMessage/Renderers/DocTypeLinkRenderer';
|
|
import { MessageLinkRenderer } from '../chat-stream/MessageItemElements/MessageLinkRenderer';
|
|
import PinIcon from '@assets/icons/PinIcon.svg'
|
|
import ShareForward from '@assets/icons/ShareForward.svg'
|
|
import ReplyMessageBox from '../chat/ChatMessage/Renderers/ReplyMessageBox';
|
|
import { Message } from '@raven/types/common/Message';
|
|
import { View } from 'react-native';
|
|
import { Text } from '@components/nativewindui/Text';
|
|
|
|
export const BaseMessageItem = ({ message }: { message: Message }) => {
|
|
|
|
const username = message.bot || message.owner
|
|
const user = useGetUser(username)
|
|
const userFullName = user?.full_name || username
|
|
const { linked_message, replied_message_details } = message
|
|
|
|
return (
|
|
<View className={clsx('flex-1 flex-row px-3 gap-1', message.is_continuation ? 'pt-0' : 'pt-2')}>
|
|
<MessageAvatar
|
|
userFullName={userFullName}
|
|
userImage={user?.user_image}
|
|
isBot={!!message.bot}
|
|
userID={message.owner}
|
|
botID={message.bot}
|
|
is_continuation={message.is_continuation}
|
|
/>
|
|
<View className='flex-1 items-start gap-0'>
|
|
<MessageHeader
|
|
is_continuation={message.is_continuation}
|
|
userFullName={userFullName}
|
|
timestamp={message.formattedTime || ''}
|
|
/>
|
|
{message.is_forwarded === 1 &&
|
|
<View className='flex-row items-center gap-1'>
|
|
<ShareForward fill={'#6b7280'} width={12} height={12} />
|
|
<Text className='text-xs text-gray-500 dark:text-gray-400'>
|
|
forwarded
|
|
</Text>
|
|
</View>}
|
|
{message.is_pinned === 1 &&
|
|
<View className='flex-row items-center gap-1'>
|
|
<PinIcon width={12} height={12} />
|
|
<Text className='text-xs text-accent'>Pinned</Text>
|
|
</View>}
|
|
|
|
{linked_message && replied_message_details && <ReplyMessageBox message={message} />}
|
|
|
|
{message.text ? <MessageTextRenderer text={message.text} /> : null}
|
|
{message.message_type === 'Image' && <ImageMessageView message={message} />}
|
|
{message.message_type === 'File' && <FileMessageView message={message} />}
|
|
{message.message_type === 'Poll' && <PollMessageBlock message={message} />}
|
|
|
|
{message.link_doctype && message.link_document && <View className={clsx(message.is_continuation ? 'ml-0.5' : '-ml-0.5')}>
|
|
<DocTypeLinkRenderer doctype={message.link_doctype} docname={message.link_document} />
|
|
</View>}
|
|
|
|
{message.is_edited === 1 && <Text className='text-xs text-muted-foreground'>(edited)</Text>}
|
|
{message.hide_link_preview === 0 && message.text && <MessageLinkRenderer message={message} />}
|
|
</View>
|
|
</View>
|
|
)
|
|
} |