import React, { useRef } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { Link } from 'react-router-dom'; import { Avatar, HStack, Icon, Stack, Text, Tooltip } from 'soapbox/components/ui'; import VerificationBadge from 'soapbox/components/verification-badge'; import { ChatWidgetScreens, useChatContext } from 'soapbox/contexts/chat-context'; import { secondsToDays } from 'soapbox/utils/numbers'; import Chat from '../chat'; import ChatPaneHeader from './chat-pane-header'; import ChatSettings from './chat-settings'; const messages = defineMessages({ autoDeleteMessage: { id: 'chat_window.auto_delete_label', defaultMessage: 'Auto-delete after {day} days' }, autoDeleteMessageTooltip: { id: 'chat_window.auto_delete_tooltip', defaultMessage: 'Chat messages are set to auto-delete after {day} days upon sending.' }, }); const LinkWrapper = ({ enabled, to, children }: { enabled: boolean, to: string, children: React.ReactNode }): JSX.Element => { if (!enabled) { return <>{children}>; } return ( {children} ); }; /** Floating desktop chat window. */ const ChatWindow = () => { const intl = useIntl(); const { chat, currentChatId, screen, changeScreen, isOpen, needsAcceptance, toggleChatPane } = useChatContext(); const inputRef = useRef(null); const closeChat = () => { changeScreen(ChatWidgetScreens.INBOX); }; const openSearch = () => { toggleChatPane(); changeScreen(ChatWidgetScreens.SEARCH); }; const openChatSettings = () => { changeScreen(ChatWidgetScreens.CHAT_SETTINGS, currentChatId); }; const secondaryAction = () => { if (needsAcceptance) { return undefined; } return isOpen ? openChatSettings : openSearch; }; if (!chat) return null; if (screen === ChatWidgetScreens.CHAT_SETTINGS) { return ; } return ( <> {isOpen && ( )} {isOpen && ( )} {chat.account.display_name || `@${chat.account.acct}`} {chat.account.verified && } {chat.message_expiration && ( {intl.formatMessage(messages.autoDeleteMessage, { day: secondsToDays(chat.message_expiration) })} )} } secondaryAction={secondaryAction()} secondaryActionIcon={isOpen ? require('@tabler/icons/info-circle.svg') : require('@tabler/icons/edit.svg')} isToggleable={!isOpen} isOpen={isOpen} onToggle={toggleChatPane} /> > ); }; export default ChatWindow;