import { Dispatch, SetStateAction, useEffect, useMemo, useState, VFC, } from 'react'; import { Box, Button, FormControl, InputLabel, MenuItem, Select, TextField, Typography, useTheme, } from '@mui/material'; import { debounce } from 'debounce'; import useUnleashContext from 'hooks/api/getters/useUnleashContext/useUnleashContext'; import { formatUnknownError } from 'utils/formatUnknownError'; import useToast from 'hooks/useToast'; interface IPlaygroundCodeFieldsetProps { value: string | undefined; setValue: Dispatch>; } export const PlaygroundCodeFieldset: VFC = ({ value, setValue, }) => { const theme = useTheme(); const { setToastData } = useToast(); const { context: contextData } = useUnleashContext(); const contextOptions = contextData .sort((a, b) => a.sortOrder - b.sortOrder) .map(({ name }) => name); const [error, setError] = useState(); const [fieldExist, setFieldExist] = useState(false); const [contextField, setContextField] = useState(''); const [contextValue, setContextValue] = useState(''); const debounceJsonParsing = useMemo( () => debounce((input?: string) => { if (!input) { return setError(undefined); } try { const contextValue = JSON.parse(input); setFieldExist(contextValue[contextField] !== undefined); } catch (error: unknown) { return setError(formatUnknownError(error)); } return setError(undefined); }, 250), [setError, contextField, setFieldExist] ); useEffect(() => { debounceJsonParsing(value); }, [debounceJsonParsing, value]); const onAddField = () => { try { const currentValue = JSON.parse(value || '{}'); setValue( JSON.stringify( { ...currentValue, [contextField]: contextValue, }, null, 2 ) ); setContextValue(''); } catch (error) { setToastData({ type: 'error', title: `Error parsing context: ${formatUnknownError(error)}`, }); } }; return ( Unleash context setValue(event.target.value)} /> Context field setContextValue(event.target.value || '') } /> ); };