import React, { useRef, useState, FormEvent, useEffect } from 'react'; import classNames from 'classnames'; import { EnrichedActivity, Activity } from 'getstream'; import { Data as EmojiDataSet } from 'emoji-mart'; import { Avatar } from './Avatar'; import { Button } from './Button'; import { Textarea, TextareaProps } from './Textarea'; import { inputValueFromEvent, PropsWithElementAttributes } from '../utils'; import { useFeedContext, useTranslationContext } from '../context'; import { DefaultAT, DefaultUT } from '../context/StreamApp'; export type CommentFieldProps< UT extends DefaultUT = DefaultUT, AT extends DefaultAT = DefaultAT > = PropsWithElementAttributes< { activity: EnrichedActivity; /** Override the default emoji dataset, library has a light set of emojis * to show more emojis use your own or emoji-mart sets * https://github.com/missive/emoji-mart#datasets */ emojiData?: EmojiDataSet; image?: string; onSuccess?: () => void; placeholder?: string; targetFeeds?: string[]; trigger?: TextareaProps['trigger']; }, HTMLFormElement >; export const CommentField = ({ activity, emojiData, onSuccess, image, placeholder, trigger, targetFeeds, className, style, }: CommentFieldProps) => { const feed = useFeedContext(); const { t } = useTranslationContext(); const textareaReference = useRef(); const [text, setText] = useState(); const handleFormSubmit = async (event: FormEvent | KeyboardEvent) => { event.preventDefault(); if (!text) return; try { await feed.onAddReaction('comment', activity as Activity, { text }, { targetFeeds }); } catch (error) { console.error(error); } setText(''); onSuccess?.(); }; useEffect(() => { if (!textareaReference.current) return; const handleFormSubmitKey = (event: KeyboardEvent) => { const { current: textarea } = textareaReference; if (event.key === 'Enter' && textarea?.nextSibling === null) { handleFormSubmit(event); } }; textareaReference.current.addEventListener('keydown', handleFormSubmitKey); return () => textareaReference.current?.removeEventListener('keydown', handleFormSubmitKey); }, []); return (
{image && }