-
-
Notifications
You must be signed in to change notification settings - Fork 312
Expand file tree
/
Copy pathDMChannelHeader.tsx
More file actions
93 lines (76 loc) · 3.84 KB
/
DMChannelHeader.tsx
File metadata and controls
93 lines (76 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { PageHeader } from "@/components/layout/Heading/PageHeader"
import { useIsUserActive } from "@/hooks/useIsUserActive"
import { DMChannelListItem } from "@/utils/channel/ChannelListProvider"
import { Badge, Flex, Heading } from "@radix-ui/themes"
import { UserAvatar } from "@/components/common/UserAvatar"
import { useContext, useMemo } from "react"
import useFetchChannelMembers from "@/hooks/fetchers/useFetchChannelMembers"
import ChannelHeaderMenu from "./ChannelHeaderMenu"
import { BiChevronLeft } from "react-icons/bi"
import { Link } from "react-router-dom"
import { useGetUser } from "@/hooks/useGetUser"
import useIsUserOnLeave from "@/hooks/fetchers/useIsUserOnLeave"
import { UserContext } from "@/utils/auth/UserProvider"
import { replaceCurrentUserFromDMChannelName } from "@/utils/operations"
import { useIsDesktop } from "@/hooks/useMediaQuery"
import CreateVideoCallButton from "../video-calling/CreateVideoCallButton"
interface DMChannelHeaderProps {
channelData: DMChannelListItem,
}
export const DMChannelHeader = ({ channelData }: DMChannelHeaderProps) => {
const { currentUser } = useContext(UserContext)
const { channelMembers } = useFetchChannelMembers(channelData.name)
// There are two people in a DM channel, the user (you) and the peer (the other person)
// If channelData.is_self_message is 1, then the user is having a conversation with themself
const peer = channelData.peer_user_id
const isActive = useIsUserActive(channelData.peer_user_id)
const { isBot, fullName, userImage } = useMemo(() => {
const peerUserData = channelMembers?.[peer]
const isBot = peerUserData?.type === 'Bot'
return {
fullName: peerUserData?.full_name ?? peer,
userImage: peerUserData?.user_image ?? '',
isBot
}
}, [channelMembers, peer])
const user = useGetUser(peer)
const isUserOnLeave = useIsUserOnLeave(peer)
const userName = fullName ?? peer ?? replaceCurrentUserFromDMChannelName(channelData.channel_name, currentUser)
const isDesktop = useIsDesktop()
const lastWorkspace = localStorage.getItem('ravenLastWorkspace')
return (
<PageHeader>
<Flex gap='3' align='center'>
<Link to={`/${lastWorkspace}`} className="block bg-transparent hover:bg-transparent active:bg-transparent sm:hidden">
<BiChevronLeft size='24' className="block text-gray-12" />
</Link>
<UserAvatar
key={peer}
alt={userName}
src={userImage}
isActive={isActive}
availabilityStatus={user?.availability_status}
skeletonSize='6'
isBot={isBot}
size={isDesktop ? '2' : '1'} />
<Heading size={{
initial: '4',
sm: '5'
}}>
<div className="flex items-center gap-2">
{userName}
{!user && <Badge color='gray' variant='soft'>Deleted</Badge>}
{user?.enabled === 0 && <Badge color='gray' variant='soft'>Disabled</Badge>}
{user?.custom_status && <Badge color='gray' className='font-semibold px-1.5 py-0.5'>{user.custom_status}</Badge>}
{isUserOnLeave && <Badge color="yellow" variant="surface">On Leave</Badge>}
{isBot && <Badge color='gray' className='font-semibold px-1.5 py-0.5'>Bot</Badge>}
</div>
</Heading>
</Flex>
<Flex gap='1' align='center'>
{channelData.is_self_message === 0 && <CreateVideoCallButton channelData={channelData} />}
<ChannelHeaderMenu channelData={channelData} />
</Flex>
</PageHeader>
)
}