import React, { createContext, useContext, useEffect, useMemo, useState } from 'react'; import { useHistory, useParams } from 'react-router-dom'; import { toggleMainWindow } from 'soapbox/actions/chats'; import { useAppDispatch, useSettings } from 'soapbox/hooks'; import { useChat } from 'soapbox/queries/chats'; import type { Chat } from 'pl-api'; const ChatContext = createContext({ isOpen: false, }); enum ChatWidgetScreens { INBOX = 'INBOX', SEARCH = 'SEARCH', CHAT = 'CHAT', CHAT_SETTINGS = 'CHAT_SETTINGS' } interface IChatProvider { children: React.ReactNode; } const ChatProvider: React.FC = ({ children }) => { const history = useHistory(); const dispatch = useAppDispatch(); const { chats } = useSettings(); const path = history.location.pathname; const isUsingMainChatPage = Boolean(path.match(/^\/chats/)); const { chatId } = useParams<{ chatId: string }>(); const [screen, setScreen] = useState(ChatWidgetScreens.INBOX); const [currentChatId, setCurrentChatId] = useState(chatId); const { data: chat } = useChat(currentChatId as string); const isOpen = chats.mainWindow === 'open'; const changeScreen = (screen: ChatWidgetScreens, currentChatId?: string | null) => { setCurrentChatId(currentChatId || null); setScreen(screen); }; const toggleChatPane = () => dispatch(toggleMainWindow()); const value = useMemo(() => ({ chat, isOpen, isUsingMainChatPage, toggleChatPane, screen, changeScreen, currentChatId, }), [chat, currentChatId, isUsingMainChatPage, isOpen, screen, changeScreen]); useEffect(() => { if (chatId) { setCurrentChatId(chatId); } else { setCurrentChatId(null); } }, [chatId]); return ( {children} ); }; interface IChatContext { chat: Chat | null; isOpen: boolean; isUsingMainChatPage?: boolean; toggleChatPane(): void; screen: ChatWidgetScreens; currentChatId: string | null; changeScreen(screen: ChatWidgetScreens, currentChatId?: string | null): void; } const useChatContext = (): IChatContext => useContext(ChatContext); export { ChatContext, ChatProvider, useChatContext, ChatWidgetScreens };