From f8d1826ae19ba077dbd457b49b16d24774c32471 Mon Sep 17 00:00:00 2001 From: ilya-bkv Date: Thu, 15 Dec 2022 10:00:57 +0300 Subject: [PATCH] Send message from context --- src/components/Inbox/Message.module.scss | 1 + src/components/Views/Inbox.tsx | 48 ++++++++---------------- src/context/inbox.tsx | 14 ++++++- 3 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/components/Inbox/Message.module.scss b/src/components/Inbox/Message.module.scss index fc6b1dba..3a3bb818 100644 --- a/src/components/Inbox/Message.module.scss +++ b/src/components/Inbox/Message.module.scss @@ -21,6 +21,7 @@ $actionsWidth: 32px * 2; padding: 12px 16px; position: relative; z-index: 1; + word-wrap: break-word; p { margin: 0; diff --git a/src/components/Views/Inbox.tsx b/src/components/Views/Inbox.tsx index e64dd302..de32ed65 100644 --- a/src/components/Views/Inbox.tsx +++ b/src/components/Views/Inbox.tsx @@ -1,23 +1,22 @@ import { For, createSignal, Show, onMount, createEffect, createMemo } from 'solid-js' import type { Author, Chat, Message as MessageType } from '../../graphql/types.gen' -import { Icon } from '../_shared/Icon' import DialogCard from '../Inbox/DialogCard' import Search from '../Inbox/Search' -import { useSession } from '../../context/session' import Message from '../Inbox/Message' -import { loadRecipients, loadMessages } from '../../stores/inbox' +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 CreateModalContent from '../Inbox/CreateModalContent' import { useInbox } from '../../context/inbox' -import DialogHeader from '../Inbox/DialogHeader' -import { apiClient } from '../../utils/apiClient' -import MessagesFallback from '../Inbox/MessagesFallback' import { useRouter } from '../../stores/router' import { clsx } from 'clsx' import styles from '../../styles/Inbox.module.scss' -import QuotedMessage from '../Inbox/QuotedMessage' const userSearch = (array: Author[], keyword: string) => { const searchTerm = keyword.toLowerCase() @@ -30,7 +29,7 @@ export const InboxView = () => { const { chats, messages, - actions: { loadChats, getMessages } // setListener + actions: { loadChats, getMessages, sendMessage } } = useInbox() // const [messages, setMessages] = createSignal([]) @@ -64,14 +63,6 @@ export const InboxView = () => { } finally { chatWindow.scrollTop = chatWindow.scrollHeight } - // try { - // const response = await loadMessages({ chat: chat.id }) - // setMessages(response as unknown as MessageType[]) - // } catch (error) { - // console.error('[loadMessages]', error) - // } finally { - // chatWindow.scrollTop = chatWindow.scrollHeight - // } } createEffect(() => { @@ -89,21 +80,14 @@ export const InboxView = () => { }) const handleSubmit = async () => { - try { - console.log('!!! post:') - const post = await apiClient.createMessage({ - body: postMessageText().toString(), - chat: currentDialog().id.toString(), - replyTo: messageToReply()?.id - }) - // setMessages((prev) => [...prev, post.message]) - setPostMessageText('') - setMessageToReply(null) - chatWindow.scrollTop = chatWindow.scrollHeight - console.log('!!! messages:', messages()) - } catch (error) { - console.error('[post message error]:', error) - } + 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 diff --git a/src/context/inbox.tsx b/src/context/inbox.tsx index 7316e947..d068d87b 100644 --- a/src/context/inbox.tsx +++ b/src/context/inbox.tsx @@ -1,7 +1,7 @@ import { Accessor, createMemo, JSX, onMount } from 'solid-js' import { createContext, createSignal, useContext } from 'solid-js' import { createChatClient } from '../graphql/privateGraphQLClient' -import type { Chat, Message } from '../graphql/types.gen' +import type { Chat, Message, MutationCreateMessageArgs } from '../graphql/types.gen' import { apiClient } from '../utils/apiClient' import newMessage from '../graphql/subs/new-message' import type { Client } from '@urql/core' @@ -15,6 +15,7 @@ type InboxContextType = { createChat: (members: number[], title: string) => Promise<{ chat: Chat }> loadChats: () => Promise getMessages?: (chatId: string) => Promise + sendMessage?: (args: MutationCreateMessageArgs) => void unsubscribe: () => void } } @@ -43,6 +44,7 @@ export const InboxProvider = (props: { children: JSX.Element }) => { } const getMessages = async (chatId: string) => { + if (!chatId) return try { const response = await loadMessages({ chat: chatId }) setMessages(response as unknown as Message[]) @@ -51,6 +53,15 @@ export const InboxProvider = (props: { children: JSX.Element }) => { } } + const sendMessage = async (args) => { + try { + const post = await apiClient.createMessage(args) + setMessages((prev) => [...prev, post.message]) + } catch (error) { + console.error('[post message error]:', error) + } + } + const createChat = async (members: number[], title: string) => { const chat = await apiClient.createChat({ members, title }) setChats((prevChats) => { @@ -71,6 +82,7 @@ export const InboxProvider = (props: { children: JSX.Element }) => { createChat, loadChats, getMessages, + sendMessage, unsubscribe // TODO: call unsubscribe some time! }