import { For, createSignal, Show, onMount, createEffect, createMemo } from 'solid-js' import type { Author, Chat, Message as MessageType } from '../../graphql/types.gen' import DialogCard from '../Inbox/DialogCard' import Search from '../Inbox/Search' import Message from '../Inbox/Message' import CreateModalContent from '../Inbox/CreateModalContent' import DialogHeader from '../Inbox/DialogHeader' import MessagesFallback from '../Inbox/MessagesFallback' import QuotedMessage from '../Inbox/QuotedMessage' import { Icon } from '../_shared/Icon' import { useSession } from '../../context/session' import { loadRecipients } from '../../stores/inbox' import { t } from '../../utils/intl' import { Modal } from '../Nav/Modal' import { showModal } from '../../stores/ui' import { useInbox } from '../../context/inbox' import { useRouter } from '../../stores/router' import { clsx } from 'clsx' import styles from '../../styles/Inbox.module.scss' type InboxSearchParams = { initChat: string chat: string } const userSearch = (array: Author[], keyword: string) => { const searchTerm = keyword.toLowerCase() return array.filter((value) => { return value.name.toLowerCase().match(new RegExp(searchTerm, 'g')) }) } export const InboxView = () => { const { chats, messages, actions: { loadChats, getMessages, sendMessage, createChat } } = useInbox() const [recipients, setRecipients] = createSignal([]) const [postMessageText, setPostMessageText] = createSignal('') const [sortByGroup, setSortByGroup] = createSignal(false) const [sortByPerToPer, setSortByPerToPer] = createSignal(false) const [currentDialog, setCurrentDialog] = createSignal() const [messageToReply, setMessageToReply] = createSignal(null) const { session } = useSession() const currentUserId = createMemo(() => session()?.user.id) // Поиск по диалогам const getQuery = (query) => { // if (query().length >= 2) { // const match = userSearch(recipients(), query()) // setRecipients(match) // } else { // setRecipients(cashedRecipients()) // } } let chatWindow const handleOpenChat = async (chat: Chat) => { setCurrentDialog(chat) changeSearchParam('chat', `${chat.id}`) try { await getMessages(chat.id) } catch (error) { console.error('[getMessages]', error) } finally { chatWindow.scrollTop = chatWindow.scrollHeight } } // TODO: удалить когда будет готова подписка createEffect(() => { setInterval(async () => { if (!currentDialog()) return try { await getMessages(currentDialog().id) } catch (error) { console.error('[getMessages]', error) } finally { chatWindow.scrollTop = chatWindow.scrollHeight } }, 2000) }) onMount(async () => { try { const response = await loadRecipients({ days: 365 }) setRecipients(response as unknown as Author[]) } catch (error) { console.log(error) } await loadChats() }) const handleSubmit = async () => { await sendMessage({ body: postMessageText().toString(), chat: currentDialog().id.toString(), replyTo: messageToReply()?.id }) setPostMessageText('') setMessageToReply(null) chatWindow.scrollTop = chatWindow.scrollHeight } let textareaParent // textarea autoresize ghost element const handleChangeMessage = (event) => { setPostMessageText(event.target.value) } const { changeSearchParam, searchParams } = useRouter() createEffect(async () => { if (textareaParent) { textareaParent.dataset.replicatedValue = postMessageText() } if (searchParams().chat) { const chatToOpen = chats()?.find((chat) => chat.id === searchParams().chat) if (!chatToOpen) return await handleOpenChat(chatToOpen) return } if (searchParams().initChat) { try { const newChat = await createChat([Number(searchParams().initChat)], '') await loadChats() changeSearchParam('initChat', null) changeSearchParam('chat', newChat.chat.id) const chatToOpen = chats().find((chat) => chat.id === newChat.chat.id) await handleOpenChat(chatToOpen) } catch (error) { console.error(error) } } }) const handleOpenInviteModal = () => { showModal('inviteToChat') } const chatsToShow = () => { const sorted = chats().sort((a, b) => { return b.updatedAt - a.updatedAt }) if (sortByPerToPer()) { return sorted.filter((chat) => Boolean(chat.title?.trim())) } else if (sortByGroup()) { return sorted.filter((chat) => chat.title?.trim().length > 0) } else { return sorted } } const findToReply = (messageId) => { return messages().find((message) => message.id === messageId) } const handleKeyDown = async (event) => { if (event.keyCode === 13 && event.shiftKey) return if (event.keyCode === 13 && !event.shiftKey && postMessageText()?.trim().length > 0) { event.preventDefault() handleSubmit() } } return (
  • { setSortByPerToPer(false) setSortByGroup(false) }} > {t('All')}
  • { setSortByPerToPer(true) setSortByGroup(false) }} > {t('Personal')}
  • { setSortByGroup(true) setSortByPerToPer(false) }} > {t('Groups')}
{(chat) => ( handleOpenChat(chat)} isOpened={chat.id === currentDialog()?.id} members={chat.members} ownId={currentUserId()} lastUpdate={chat.updatedAt} counter={chat.unread} message={chat.messages.pop()?.body} /> )}
} >
{(message) => ( setMessageToReply(message)} /> )} {/*
*/} {/* */} {/*
*/}
member.id === Number(messageToReply().author)) .name } body={messageToReply().body} cancel={() => setMessageToReply(null)} />