mirror of
https://github.com/hanzo-io/chat.git
synced 2026-10-30 18:57:58 +00:00
94 lines
4.0 KiB
TypeScript
94 lines
4.0 KiB
TypeScript
import { Pressable, View } from 'react-native';
|
|
import { Text } from '@components/nativewindui/Text';
|
|
import { Message } from '@raven/types/common/Message';
|
|
import { useMemo } from 'react';
|
|
import { DMChannelListItem } from '@raven/types/common/ChannelListItem';
|
|
import { useCurrentChannelData } from '@raven/lib/hooks/useCurrentChannelData';
|
|
import { useGetUserRecords } from '@raven/lib/hooks/useGetUserRecords';
|
|
import { formatDateAndTime } from '@raven/lib/utils/dateConversions';
|
|
import { BaseMessageItem } from '../chat-stream/BaseMessageItem';
|
|
import { useRouteToChannel } from '@hooks/useRouting';
|
|
import * as ContextMenu from 'zeego/context-menu';
|
|
import { useColorScheme } from '@hooks/useColorScheme';
|
|
import useSaveMessage from '@hooks/useSaveMessage';
|
|
|
|
const SavedMessageItem = ({ message }: { message: Message & { workspace?: string } }) => {
|
|
|
|
const { save } = useSaveMessage(message)
|
|
|
|
const { colors } = useColorScheme()
|
|
|
|
const { creation, channel_id } = message
|
|
const users = useGetUserRecords()
|
|
|
|
const { channel } = useCurrentChannelData(channel_id)
|
|
const channelData = channel?.channelData
|
|
|
|
const channelName = useMemo(() => {
|
|
if (channelData) {
|
|
if (channelData.is_direct_message) {
|
|
const peer_user_name = users[(channelData as DMChannelListItem).peer_user_id]?.full_name ?? (channelData as DMChannelListItem).peer_user_id
|
|
return `DM with ${peer_user_name}`
|
|
} else {
|
|
return channelData.channel_name
|
|
}
|
|
}
|
|
}, [channelData])
|
|
|
|
const goToChannel = useRouteToChannel()
|
|
const handleNavigateToChannel = (channelID: string) => {
|
|
goToChannel(channelID)
|
|
}
|
|
|
|
return (
|
|
<ContextMenu.Root>
|
|
<ContextMenu.Trigger>
|
|
<Pressable
|
|
className='pb-2 rounded-md active:bg-linkColor active:dark:bg-linkColor'
|
|
onPress={() => handleNavigateToChannel(channel_id)}
|
|
// long press -> this is a workaround to prevent a press to register on long press (esp on Android)
|
|
// Ref: https://github.com/nandorojo/zeego/issues/145
|
|
onLongPress={() => { }}
|
|
>
|
|
<View>
|
|
<View className='flex flex-row items-center px-3 pt-2 gap-2'>
|
|
<Text className='text-sm'>{channelName}</Text>
|
|
<Text className='text-[13px] text-muted'>|</Text>
|
|
<Text className='text-[13px] text-muted-foreground'>
|
|
{formatDateAndTime(creation)}
|
|
</Text>
|
|
</View>
|
|
<BaseMessageItem message={message} />
|
|
</View>
|
|
</Pressable>
|
|
</ContextMenu.Trigger>
|
|
<ContextMenu.Content>
|
|
<ContextMenu.Item key="unsave" onSelect={save}>
|
|
<ContextMenu.ItemTitle>Unsave message</ContextMenu.ItemTitle>
|
|
<ContextMenu.ItemIcon
|
|
ios={{
|
|
name: 'bookmark.slash',
|
|
pointSize: 14,
|
|
weight: 'semibold',
|
|
scale: 'medium',
|
|
// can also be a color string. Requires iOS 15+
|
|
hierarchicalColor: {
|
|
dark: colors.icon,
|
|
light: colors.icon,
|
|
},
|
|
// alternative to hierarchical color. Requires iOS 15+
|
|
paletteColors: [
|
|
{
|
|
dark: colors.icon,
|
|
light: colors.icon,
|
|
},
|
|
],
|
|
}}
|
|
/>
|
|
</ContextMenu.Item>
|
|
</ContextMenu.Content>
|
|
</ContextMenu.Root>
|
|
)
|
|
}
|
|
|
|
export default SavedMessageItem |