import { lazy, useEffect, useRef, useState } from 'react'; import { Button, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, } from '@chakra-ui/react'; import { getCSSContents, postCSSContents, restoreCSSContents } from '../../../../common/api/assets'; import Info from '../../../../common/components/info/Info'; import * as Panel from '../../panel-utils/PanelUtils'; import style from './StyleEditorModal.module.scss'; const CodeEditor = lazy(() => import('./StyleEditor')); interface CodeEditorModalProps { isOpen: boolean; onClose: () => void; } interface CSSRef { getCss: () => string; } export default function CodeEditorModal(props: CodeEditorModalProps) { const { isOpen, onClose } = props; const [css, setCSS] = useState(''); const [isDirty, setIsDirty] = useState(false); const [saveLoading, setSaveLoading] = useState(false); const [resetLoading, setResetLoading] = useState(false); const [error, setError] = useState(null); const cssRef = useRef(null); const handleRestore = async () => { try { setResetLoading(true); const defaultCss = await restoreCSSContents(); setCSS(defaultCss); } catch (_error) { /** no error handling for now */ } finally { setResetLoading(false); } }; const handleSave = async () => { try { setSaveLoading(true); if (cssRef.current) { await postCSSContents(cssRef.current.getCss()); setCSS(cssRef.current.getCss()); setIsDirty(false); } } catch (_error) { /** no error handling for now */ } finally { setSaveLoading(false); } }; const clear = () => setCSS(''); useEffect(() => { async function fetchServerCSS() { // check for isOpen to fetch recent css if (isOpen) { try { const css = await getCSSContents(); setCSS(css); } catch (_error) { setError('Failed to load CSS from server'); /** no error handling for now */ } } } fetchServerCSS(); }, [isOpen]); return ( Edit CSS override Invalid CSS will be refused by the browser {error && {`Error: ${error}`}} ); }