import { Box, Button, ButtonGroup, Margins, TextInput, Field, FieldLabel, FieldRow, FieldError, IconButton } from '@rocket.chat/fuselage'; import { ContextualbarScrollableContent, ContextualbarFooter } from '@rocket.chat/ui-client'; import { useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useQueryClient } from '@tanstack/react-query'; import type { ChangeEvent } from 'react'; import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useEndpointUploadMutation } from '../../../hooks/useEndpointUploadMutation'; import { useSingleFileInput } from '../../../hooks/useSingleFileInput'; export type AddCustomEmojiProps = { close: () => void; onChange: () => void; }; const AddCustomEmoji = ({ close, onChange, ...props }: AddCustomEmojiProps) => { const { t } = useTranslation(); const [name, setName] = useState(''); const [aliases, setAliases] = useState(''); const [emojiFile, setEmojiFile] = useState(); const [newEmojiPreview, setNewEmojiPreview] = useState(''); const [errors, setErrors] = useState({ name: false, emoji: false, aliases: false }); const setEmojiPreview = useCallback( async (file: Blob) => { setEmojiFile(file); setNewEmojiPreview(URL.createObjectURL(file)); setErrors((prevState) => ({ ...prevState, emoji: false })); }, [setEmojiFile], ); const dispatchToastMessage = useToastMessageDispatch(); const queryClient = useQueryClient(); const { mutateAsync: saveAction } = useEndpointUploadMutation('/v1/emoji-custom.create', { onSuccess: () => { dispatchToastMessage({ type: 'success', message: t('Custom_Emoji_Added_Successfully') }); queryClient.invalidateQueries({ queryKey: ['emoji-custom.list'] }); onChange(); close(); }, }); const handleSave = useCallback(async () => { if (!name) { return setErrors((prevState) => ({ ...prevState, name: true })); } if (name === aliases) { return setErrors((prevState) => ({ ...prevState, aliases: true })); } if (!emojiFile) { return setErrors((prevState) => ({ ...prevState, emoji: true })); } const formData = new FormData(); formData.append('emoji', emojiFile); formData.append('name', name); formData.append('aliases', aliases); await saveAction(formData); }, [emojiFile, name, aliases, saveAction]); const [clickUpload] = useSingleFileInput(setEmojiPreview, 'emoji'); const handleChangeName = (e: ChangeEvent): void => { if (e.currentTarget.value !== '') { setErrors((prevState) => ({ ...prevState, name: false })); } return setName(e.currentTarget.value); }; const handleChangeAliases = (e: ChangeEvent): void => { if (e.currentTarget.value !== name) { setErrors((prevState) => ({ ...prevState, aliases: false })); } return setAliases(e.currentTarget.value); }; return ( <> {t('Name')} {errors.name && {t('Required_field', { field: t('Name') })}} {t('Aliases')} {errors.aliases && {t('Custom_Emoji_Error_Same_Name_And_Alias')}} {t('Custom_Emoji')} {errors.emoji && {t('Required_field', { field: t('Custom_Emoji') })}} {newEmojiPreview && ( )} ); }; export default AddCustomEmoji;