From 9e460c5b3da63c9e70b27e2b855e731f06048852 Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 20 Jun 2021 20:30:42 +0100 Subject: [PATCH] Refactor + add message box. --- src/components/common/messaging/Message.tsx | 4 +- .../common/messaging/MessageBox.tsx | 89 +++++++++++++++++++ .../common/messaging/SystemMessage.tsx | 6 +- .../common/{ => user}/UserCheckbox.tsx | 2 +- .../common/{ => user}/UserHeader.tsx | 10 +-- src/components/common/{ => user}/UserIcon.tsx | 8 +- .../common/{ => user}/UserShort.tsx | 0 .../common/{ => user}/UserStatus.tsx | 0 .../navigation/items/ButtonItem.tsx | 4 +- .../navigation/left/HomeSidebar.tsx | 32 ++++--- src/components/ui/TextArea.tsx | 43 +++++++-- src/context/intermediate/modals/Prompt.tsx | 6 +- .../intermediate/popovers/UserPicker.tsx | 2 +- .../intermediate/popovers/UserProfile.tsx | 22 ++--- src/context/revoltjs/CheckAuth.tsx | 4 +- src/context/revoltjs/hooks.ts | 13 ++- src/lib/defer.ts | 3 + src/pages/channels/Channel.tsx | 2 + src/pages/friends/Friend.tsx | 4 +- src/pages/settings/Settings.module.scss | 22 ----- src/pages/settings/SettingsTextArea.tsx | 6 -- src/pages/settings/channel/Overview.tsx | 12 +-- src/pages/settings/panes/Account.tsx | 6 +- src/pages/settings/panes/Appearance.tsx | 11 +-- src/pages/settings/panes/Feedback.tsx | 8 +- src/pages/settings/panes/Profile.tsx | 12 +-- src/pages/settings/server/Invites.tsx | 2 +- src/pages/settings/server/Overview.tsx | 12 +-- 28 files changed, 225 insertions(+), 120 deletions(-) create mode 100644 src/components/common/messaging/MessageBox.tsx rename src/components/common/{ => user}/UserCheckbox.tsx (85%) rename src/components/common/{ => user}/UserHeader.tsx (88%) rename src/components/common/{ => user}/UserIcon.tsx (92%) rename src/components/common/{ => user}/UserShort.tsx (100%) rename src/components/common/{ => user}/UserStatus.tsx (100%) create mode 100644 src/lib/defer.ts delete mode 100644 src/pages/settings/SettingsTextArea.tsx diff --git a/src/components/common/messaging/Message.tsx b/src/components/common/messaging/Message.tsx index 03c13596..dfe9793d 100644 --- a/src/components/common/messaging/Message.tsx +++ b/src/components/common/messaging/Message.tsx @@ -1,5 +1,5 @@ -import UserIcon from "../UserIcon"; -import { Username } from "../UserShort"; +import UserIcon from "../user/UserIcon"; +import { Username } from "../user/UserShort"; import Markdown from "../../markdown/Markdown"; import { Children } from "../../../types/Preact"; import { attachContextMenu } from "preact-context-menu"; diff --git a/src/components/common/messaging/MessageBox.tsx b/src/components/common/messaging/MessageBox.tsx new file mode 100644 index 00000000..ae980526 --- /dev/null +++ b/src/components/common/messaging/MessageBox.tsx @@ -0,0 +1,89 @@ +import { useContext } from "preact/hooks"; +import { Channel } from "revolt.js"; +import { ulid } from "ulid"; +import { AppContext } from "../../../context/revoltjs/RevoltClient"; +import { takeError } from "../../../context/revoltjs/util"; +import { defer } from "../../../lib/defer"; +import { isTouchscreenDevice } from "../../../lib/isTouchscreenDevice"; +import { SingletonMessageRenderer, SMOOTH_SCROLL_ON_RECEIVE } from "../../../lib/renderer/Singleton"; +import { connectState } from "../../../redux/connector"; +import { WithDispatcher } from "../../../redux/reducers"; +import TextArea from "../../ui/TextArea"; + +type Props = WithDispatcher & { + channel: Channel; + draft?: string; +}; + +function MessageBox({ channel, draft, dispatcher }: Props) { + const client = useContext(AppContext); + + function setMessage(content?: string) { + if (content) { + dispatcher({ + type: "SET_DRAFT", + channel: channel._id, + content + }); + } else { + dispatcher({ + type: "CLEAR_DRAFT", + channel: channel._id + }); + } + } + + async function send() { + const nonce = ulid(); + + const content = draft?.trim() ?? ''; + if (content.length === 0) return; + + setMessage(); + dispatcher({ + type: "QUEUE_ADD", + nonce, + channel: channel._id, + message: { + _id: nonce, + channel: channel._id, + author: client.user!._id, + content + } + }); + + defer(() => SingletonMessageRenderer.jumpToBottom(channel._id, SMOOTH_SCROLL_ON_RECEIVE)); + // Sounds.playOutbound(); + + try { + await client.channels.sendMessage(channel._id, { + content, + nonce + }); + } catch (error) { + dispatcher({ + type: "QUEUE_FAIL", + error: takeError(error), + nonce + }); + } + } + + return ( +