import {useCallback, useState, useEffect} from 'react';
import {Container, Row, Col} from '@gravity-ui/uikit';
import {CallOut} from './callout';
import {InputArea} from './input-area';
import {OutputArea} from './output-area';
import {useTabs} from './useTabs';
import {generateMD, generateHTML, generateTokens} from './generators';
import persistRestore from './persistRestore';
import './styles.css';
(window as any).MonacoEnvironment = {
getWorker: (_, label: string) => {
if (label === 'json') {
return new Worker(
new URL('monaco-editor/esm/vs/language/json/json.worker?worker', 'monaco-worker'),
);
}
return new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker?worker', 'monaco-worker'));
},
};
const App = () => {
return(<>
>)
};
export type PlaygroundProperties = {
content?: string;
tabs?: { id: string, title: string }[];
persistRestore?: boolean;
}
function Playground(props: PlaygroundProperties) {
const persist = useCallback(persistRestore.persist, []);
const restore = useCallback(persistRestore.restore, []);
const content = props?.persistRestore ? restore() : props?.content
const [input, setInput] = useState(content ?? '');
const [generated, setGenerated] = useState(input);
const generate = useCallback((active: string) => {
if (active === 'markdown') {
setGenerated(generateMD(input));
} else if (active === 'html') {
setGenerated(generateHTML(input));
} else if (active === 'tokens') {
setGenerated(generateTokens(input));
} else if (active === 'preview') {
setGenerated(generateHTML(input));
} else {
setGenerated(input);
}
}, [input]);
const [
inputItems,
inputActive,
handleSetInputAreaTabActive
] = useTabs({
items: [ { id: 'input', title: 'input' } ],
initial: 'input',
});
const [
outputItems,
outputActive,
handleSetOutputAreaTabActive
] = useTabs({
items: props?.tabs || [
{ id: 'preview', title: 'html preview' },
{ id: 'html', title: 'html' },
{ id: 'markdown', title: 'markdown' },
{ id: 'tokens', title: 'tokens' },
],
initial: 'preview',
onSetActive: generate,
});
const handleInputChange = (input?: string) => {
setInput(input || '');
};
useEffect(() => {
generate(outputActive);
if (props?.persistRestore) {
persist(input);
}
}, [input]);
return (
);
}
export {App, Playground};
export default {App, Playground};