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 ( +