import { useRosettaColors } from "@/app/hooks/useRosettaColors"; import { OnlineState } from "@/app/providers/ProtocolProvider/protocol/packets/packet.onlinestate"; import { usePublicKey } from "@/app/providers/AccountProvider/usePublicKey"; import { useBlacklist } from "@/app/providers/BlacklistProvider/useBlacklist"; import { useDialog } from "@/app/providers/DialogProvider/useDialog"; import { useUserInformation } from "@/app/providers/InformationProvider/useUserInformation"; import { ProtocolState } from "@/app/providers/ProtocolProvider/ProtocolProvider"; import { useProtocolState } from "@/app/providers/ProtocolProvider/useProtocolState"; import { Avatar, Box, Divider, Flex, Loader, Text, Tooltip, useComputedColorScheme, useMantineTheme } from "@mantine/core"; import { modals } from "@mantine/modals"; import { IconBookmark, IconLockAccess, IconLockCancel, IconTrashX } from "@tabler/icons-react"; import { useEffect, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { VerifiedBadge } from "../VerifiedBadge/VerifiedBadge"; import { usePacket } from "@/app/providers/ProtocolProvider/usePacket"; import { PacketTyping } from "@/app/providers/ProtocolProvider/protocol/packets/packet.typeing"; import { useAvatars } from "@/app/providers/AvatarProvider/useAvatars"; import { useReplyMessages } from "@/app/providers/DialogProvider/useReplyMessages"; import { ReplyHeader } from "../ReplyHeader/ReplyHeader"; import { useRosettaBreakpoints } from "@/app/hooks/useRosettaBreakpoints"; import { BackToDialogs } from "../BackToDialogs/BackToDialogs"; import { useSystemAccounts } from "@/app/providers/SystemAccountsProvider/useSystemAccounts"; export function ChatHeader() { const colors = useRosettaColors(); const computedTheme = useComputedColorScheme(); const navigate = useNavigate(); const publicKey = usePublicKey(); const {deleteMessages, dialog} = useDialog(); const theme = useMantineTheme(); const [blocked, blockUser, unblockUser] = useBlacklist(dialog); const [opponent, ___, forceUpdateUserInformation] = useUserInformation(dialog); const [protocolState] = useProtocolState(); const [userTypeing, setUserTypeing] = useState(false); const timeoutRef = useRef(undefined); const avatars = useAvatars(dialog); const {replyMessages} = useReplyMessages(); const {lg} = useRosettaBreakpoints(); const systemAccounts = useSystemAccounts(); const isSystemAccount = systemAccounts.find((acc) => acc.publicKey == dialog) != undefined; useEffect(() => { forceUpdateUserInformation(); setUserTypeing(false); clearTimeout(timeoutRef.current); }, [dialog]); usePacket(0x0B, (packet : PacketTyping) => { if(packet.getFromPublicKey() == dialog && packet.getToPublicKey() == publicKey){ setUserTypeing(true); clearTimeout(timeoutRef.current); timeoutRef.current = setTimeout(() => { setUserTypeing(false); }, 3000); } }, [dialog]); const clearMessages = async () => { deleteMessages(); modals.closeAll(); } const onClickClearMessages = () => { modals.openConfirmModal({ title: 'Clear all messages?', centered: true, children: ( Are you sure you want to clear all messages? This action cannot be undone. ), withCloseButton: false, labels: { confirm: 'Continue', cancel: "Cancel" }, confirmProps: { color: 'red' }, onConfirm: clearMessages }); } const onClickBlockUser = () => { if(opponent.publicKey != "DELETED" && opponent.publicKey != publicKey){ blockUser(); } } const onClickUnblockUser = () => { if(opponent.publicKey != "DELETED" && opponent.publicKey != publicKey){ unblockUser(); } } const onClickProfile = () => { if(opponent.publicKey != "DELETED" && opponent.publicKey != publicKey){ navigate("/main/profile/" + opponent.publicKey); } } return (<> {(replyMessages.messages.length <= 0 || replyMessages.inDialogInput) && {!lg && } { publicKey == opponent.publicKey ? : 0 ? avatars[0].avatar : undefined} name={opponent.title}> } {( publicKey == opponent.publicKey ? "Saved messages" : opponent.title )} {(opponent.verified > 0 && publicKey != opponent.publicKey) && } {(publicKey != opponent.publicKey && protocolState == ProtocolState.CONNECTED && !userTypeing) && <> {( opponent.online == OnlineState.ONLINE ? online : {isSystemAccount ? 'official account' : 'offline'} )} } {userTypeing && publicKey != opponent.publicKey && protocolState == ProtocolState.CONNECTED && <> typing } {protocolState != ProtocolState.CONNECTED && connecting... } {publicKey != opponent.publicKey && !blocked && !isSystemAccount && ( )} {blocked && !isSystemAccount && ( )} } {replyMessages.messages.length > 0 && !replyMessages.inDialogInput && } ) }