import React, { useEffect } from 'react' import PropTypes from 'prop-types' import Editor, { getUserEvent } from '../../../components/Editor' import ChannelsMenu from '../ChannelsMenu' import { ReactComponent as WarningIcon } from '../../../assets/warning.svg' import useForm from '../../../contexts/Form/useForm' import useMetadata from '../../../contexts/Metadata/useMetadata' import useNotifications from '../../../contexts/Notifications/useNotifications' import useModal from '../../../contexts/Modal/useModal' import config from '../../../config' import { calculateByteLength, formatByteLength } from '../../../utils/helpers' import './MetadataForm.css' const MetadataForm = ({ sendMetadata, updateMetadata, deleteMetadata }) => { const { selectedMetadata, isStale, refreshCurrentMetadata } = useMetadata() const { notifyError } = useNotifications() const { showModal } = useModal() const { formData, setFormData, isFormDirty } = useForm() const isFormDisabled = !selectedMetadata const isSaveDisabled = !isStale && (isFormDisabled || !isFormDirty || !formData.title) const isSendDisabled = isFormDisabled || !formData.title || !formData.metadata useEffect(() => { if (selectedMetadata) { setFormData({ title: selectedMetadata.Title, metadata: selectedMetadata.Metadata }) } }, [selectedMetadata, setFormData]) const jsonParseLinter = (json) => { if (json) { try { JSON.parse(json) } catch (e) { notifyError(e.message) return false } } return true } const handleSave = (e) => { e.preventDefault() if (jsonParseLinter(formData.metadata)) { updateMetadata(formData) } } const handleSend = (e) => { e.preventDefault() if (jsonParseLinter(formData.metadata)) { sendMetadata(formData) if (isFormDirty) { updateMetadata(formData) } } } const handleDelete = (e) => { e.preventDefault() showModal('Are you sure you would like to delete this TimedMetadata?', { callback: deleteMetadata, buttonType: 'destruct', buttonText: 'Delete' }) } const handleEditorUpdate = (viewUpdate) => { const userEvent = getUserEvent(viewUpdate.transactions[0]) if (userEvent === 'input.paste' && !viewUpdate.docChanged) { notifyError( 'The text was not pasted since it will exceed the maximum TimedMetadata size' ) } } return (