// Dependencies import yaml from 'js-yaml' import { validateSettings } from './settings-validator.mjs' import { capitalize } from 'shared/utils.mjs' // Context import { LoadingStatusContext } from 'shared/context/loading-status-context.mjs' // Hooks import { useEffect, useState, useRef, useMemo } from 'react' import { useTranslation } from 'next-i18next' // Components import { CloseIcon } from 'shared/components/icons.mjs' import { V3Wip } from 'shared/components/v3-wip.mjs' export const ns = [] /** a view for editing the gist as yaml */ export const EditView = ({ settings, setSettings, design, Design }) => { const inputRef = useRef(null) const { setLoadingStatus } = useContext(LoadingStatusContext) const [error, setError] = useState(false) const [success, setSuccess] = useState(false) const { t } = useTranslation(ns) const patternConfig = useMemo(() => new Design().getConfig(), [Design]) // parse the settings to yaml and set them as the value on the textArea useEffect(() => { inputRef.current.value = yaml.dump(settings) }, [settings]) /** user-initiated save */ const onSave = () => { setError(false) setSuccess(false) try { setLoadingStatus([true, 'status:contactingBackend']) // parse back to json const editedAsJson = yaml.load(inputRef.current.value) // validate it const validation = validateSettings(editedAsJson, patternConfig) // if it's not valid, show a warning about errors if (!validation.valid) { const newError = JSON.stringify(validation.errors, null, 2) setError(newError) } // save regardless setSettings(editedAsJson) setSuccess(true) if (validation.valid) setLoadingStatus([true, 'status:settingsSaved', true, true]) } catch (e) { console.log(e) setError(e.message) } } return (

{t('yamlEditViewTitleThing', { thing: capitalize(design) })}

{error && (

{t('yamlEditViewError')}

{success &&

{t('yamlEditViewErrorDesc')}:

}
            
)}