import clsx from 'clsx' import {MAX_COMMENT_LENGTH} from 'common/comment' import {User} from 'common/user' import {findKey} from 'lodash' import {useRouter} from 'next/router' import {useEffect, useState} from 'react' import {BiEnvelope} from 'react-icons/bi' import {Button} from 'web/components/buttons/button' import {CommentInputTextArea} from 'web/components/comments/comment-input' import {Col} from 'web/components/layout/col' import {Modal, MODAL_CLASS} from 'web/components/layout/modal' import {Row} from 'web/components/layout/row' import {EmailVerificationPrompt} from 'web/components/messaging/email-verification-prompt' import {useTextEditor} from 'web/components/widgets/editor' import {Title} from 'web/components/widgets/title' import {Tooltip} from 'web/components/widgets/tooltip' import {useFirebaseUser} from 'web/hooks/use-firebase-user' import {useSortedPrivateMessageMemberships} from 'web/hooks/use-private-messages' import {usePrivateUser} from 'web/hooks/use-user' import {api} from 'web/lib/api' import {firebaseLogin} from 'web/lib/firebase/users' import {useT} from 'web/lib/locale' export const SendMessageButton = (props: { toUser: User currentUser: User | undefined | null includeLabel?: boolean circleButton?: boolean text?: string tooltipText?: string disabled?: boolean }) => { const {toUser, currentUser, includeLabel, circleButton, text, tooltipText, disabled} = props const firebaseUser = useFirebaseUser() const router = useRouter() const privateUser = usePrivateUser() const channelMemberships = useSortedPrivateMessageMemberships(currentUser?.id) const {memberIdsByChannelId} = channelMemberships const t = useT() const [openComposeModal, setOpenComposeModal] = useState(false) const [error, setError] = useState('') const [submitting, setSubmitting] = useState(false) const messageButtonClicked = async () => { if (disabled) return if (!currentUser) return firebaseLogin() const previousDirectMessageChannel = findKey( memberIdsByChannelId, (dm) => dm.includes(toUser.id) && dm.length === 1, ) const previousChannelId = previousDirectMessageChannel !== undefined ? previousDirectMessageChannel : undefined if (previousChannelId) router.push(`/messages/${previousChannelId}`) else setOpenComposeModal(true) } const editor = useTextEditor({ key: `compose-new-message-${toUser.id}`, size: 'sm', max: MAX_COMMENT_LENGTH, // placeholder: t('send_message.placeholder', '...'), }) useEffect(() => { if (openComposeModal && editor) { // Focus the editor after a short delay to ensure the modal is fully rendered setTimeout(() => { editor.commands.focus() }, 100) } }, [openComposeModal, editor]) const sendMessage = async () => { if (!editor) return setSubmitting(true) const res = await api('create-private-user-message-channel', { userIds: [toUser.id], }).catch((e) => { setError(e.message) setSubmitting(false) return }) if (!res) return const msgRes = await api('create-private-user-message', { channelId: res.channelId, content: editor.getJSON(), }).catch((e: any) => { setError(e.message) setSubmitting(false) return }) if (!msgRes) return router.push(`/messages/${res.channelId}`) } if (privateUser?.blockedByUserIds.includes(toUser.id)) return null return ( <> {text ? ( ) : circleButton ? ( ) : ( )} {t('send_message.title', 'Message')} {toUser.name} {firebaseUser?.emailVerified ? ( ) : ( )} {error} ) }