/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import MonacoEditor, {loader, type Monaco} from '@monaco-editor/react'; import type {editor} from 'monaco-editor'; import * as monaco from 'monaco-editor'; import React, { useState, useRef, unstable_ViewTransition as ViewTransition, unstable_addTransitionType as addTransitionType, startTransition, Activity, } from 'react'; import {Resizable} from 're-resizable'; import {useStore, useStoreDispatch} from '../StoreContext'; import {monacoConfigOptions} from './monacoOptions'; import {IconChevron} from '../Icons/IconChevron'; import {CONFIG_PANEL_TRANSITION} from '../../lib/transitionTypes'; // @ts-expect-error - webpack asset/source loader handles .d.ts files as strings import compilerTypeDefs from 'babel-plugin-react-compiler/dist/index.d.ts'; loader.config({monaco}); export default function ConfigEditor({ formattedAppliedConfig, }: { formattedAppliedConfig: string; }): React.ReactElement { const [isExpanded, setIsExpanded] = useState(false); return ( <> { startTransition(() => { addTransitionType(CONFIG_PANEL_TRANSITION); setIsExpanded(false); }); }} formattedAppliedConfig={formattedAppliedConfig} /> { startTransition(() => { addTransitionType(CONFIG_PANEL_TRANSITION); setIsExpanded(true); }); }} /> ); } function ExpandedEditor({ onToggle, formattedAppliedConfig, }: { onToggle: (expanded: boolean) => void; formattedAppliedConfig: string; }): React.ReactElement { const store = useStore(); const dispatchStore = useStoreDispatch(); const debounceTimerRef = useRef(null); const handleChange: (value: string | undefined) => void = ( value: string | undefined, ) => { if (value === undefined) return; if (debounceTimerRef.current) { clearTimeout(debounceTimerRef.current); } debounceTimerRef.current = setTimeout(() => { dispatchStore({ type: 'updateConfig', payload: { config: value, }, }); }, 500); // 500ms debounce delay }; const handleMount: ( _: editor.IStandaloneCodeEditor, monaco: Monaco, ) => void = (_, monaco) => { // Add the babel-plugin-react-compiler type definitions to Monaco monaco.languages.typescript.typescriptDefaults.addExtraLib( //@ts-expect-error - compilerTypeDefs is a string compilerTypeDefs, 'file:///node_modules/babel-plugin-react-compiler/dist/index.d.ts', ); monaco.languages.typescript.typescriptDefaults.setCompilerOptions({ target: monaco.languages.typescript.ScriptTarget.Latest, allowNonTsExtensions: true, moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs, module: monaco.languages.typescript.ModuleKind.ESNext, noEmit: true, strict: false, esModuleInterop: true, allowSyntheticDefaultImports: true, jsx: monaco.languages.typescript.JsxEmit.React, }); }; return (

Config Overrides

Applied Configs

); } function CollapsedEditor({ onToggle, }: { onToggle: () => void; }): React.ReactElement { return (
); }