// @flow import { SIMPLE_SITE } from 'config'; import * as PAGES from 'constants/pages'; import React, { useEffect, useState } from 'react'; import classnames from 'classnames'; import { FormField, Form } from 'component/common/form'; import Button from 'component/button'; import SelectChannel from 'component/selectChannel'; import usePersistedState from 'effects/use-persisted-state'; import { FF_MAX_CHARS_IN_COMMENT } from 'constants/form-field'; import { useHistory } from 'react-router'; import type { ElementRef } from 'react'; import emoji from 'emoji-dictionary'; const COMMENT_SLOW_MODE_SECONDS = 5; const LIVESTREAM_EMOJIS = [ emoji.getUnicode('rocket'), emoji.getUnicode('jeans'), emoji.getUnicode('fire'), emoji.getUnicode('heart'), emoji.getUnicode('open_mouth'), ]; type Props = { uri: string, claim: StreamClaim, createComment: (string, string, string, ?string) => Promise, channels: ?Array, onDoneReplying?: () => void, onCancelReplying?: () => void, isNested: boolean, isFetchingChannels: boolean, parentId: string, isReply: boolean, isPostingComment: boolean, activeChannel: string, activeChannelClaim: ?ChannelClaim, livestream?: boolean, toast: (string) => void, claimIsMine: boolean, }; export function CommentCreate(props: Props) { const { createComment, claim, channels, onDoneReplying, onCancelReplying, isNested, isFetchingChannels, isReply, parentId, isPostingComment, activeChannelClaim, livestream, toast, claimIsMine, } = props; const buttonref: ElementRef = React.useRef(); const { push } = useHistory(); const { claim_id: claimId } = claim; const [commentValue, setCommentValue] = React.useState(''); const [lastCommentTime, setLastCommentTime] = React.useState(); const [charCount, setCharCount] = useState(commentValue.length); const [advancedEditor, setAdvancedEditor] = usePersistedState('comment-editor-mode', false); const hasChannels = channels && channels.length; const disabled = isPostingComment || !activeChannelClaim || !commentValue.length; function handleCommentChange(event) { let commentValue; if (isReply) { commentValue = event.target.value; } else { commentValue = !SIMPLE_SITE && advancedEditor ? event : event.target.value; } setCommentValue(commentValue); } function altEnterListener(e: SyntheticKeyboardEvent<*>) { const KEYCODE_ENTER = 13; if ((e.ctrlKey || e.metaKey) && e.keyCode === KEYCODE_ENTER) { e.preventDefault(); buttonref.current.click(); } } function onTextareaFocus() { window.addEventListener('keydown', altEnterListener); } function onTextareaBlur() { window.removeEventListener('keydown', altEnterListener); } function handleSubmit() { if (activeChannelClaim && commentValue.length) { const timeUntilCanComment = !lastCommentTime ? 0 : lastCommentTime / 1000 - Date.now() / 1000 + COMMENT_SLOW_MODE_SECONDS; if (livestream && !claimIsMine && timeUntilCanComment > 0) { toast( __('Slowmode is on. You can comment again in %time% seconds.', { time: Math.floor(timeUntilCanComment) }) ); return; } createComment(commentValue, claimId, parentId).then((res) => { if (res && res.signature) { setCommentValue(''); if (onDoneReplying) { onDoneReplying(); } } }); } } function toggleEditorMode() { setAdvancedEditor(!advancedEditor); } useEffect(() => setCharCount(commentValue.length), [commentValue]); if (!hasChannels) { return (
push(`/$/${PAGES.CHANNEL_NEW}`)}>
); } return (
{isReply ? __('Replying as') + ' ' : __('Comment as') + ' '}
} quickActionLabel={ !SIMPLE_SITE && (isReply ? undefined : advancedEditor ? __('Simple Editor') : __('Advanced Editor')) } quickActionHandler={!SIMPLE_SITE && toggleEditorMode} onFocus={onTextareaFocus} onBlur={onTextareaBlur} placeholder={__('Say something about this...')} value={commentValue} charCount={charCount} onChange={handleCommentChange} autoFocus={isReply} textAreaMaxLength={FF_MAX_CHARS_IN_COMMENT} /> {livestream && hasChannels && (
{LIVESTREAM_EMOJIS.map((emoji) => (
)}
); }