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}
>
)
}