import * as lz from 'lzutf8'; import React, { useEffect, useState } from 'react'; import { CodeBlock } from '../components/codeblock'; import { DumbEditor } from '../components/dumb-editor'; import { LanguageSelector } from '../components/language-selector'; import { ThemeSelector } from '../components/theme-selector'; import { MainLayout } from '../layouts/main'; interface Data { v: number; code: string; lang: string | null; theme: string; } const URL_FMT_VER = 1; const DEFAULT_THEME = 'atom-one-dark'; function persistToURL({ code, lang, theme }: Data): void { const params = new URLSearchParams(); if (lang !== null) { params.set('lang', lang); } params.set('v', '' + URL_FMT_VER); params.set('theme', theme); if (code.length > 0) { params.set('code', lz.compress(code, { outputEncoding: 'Base64' })); } window.location.hash = params.toString(); } function parseURL(): Data { const params = new URLSearchParams(window.location.hash.substring(1)); return { v: +params.get('v') ?? URL_FMT_VER, lang: params.get('lang') ?? '', code: lz.decompress(params.get('code') ?? '', { inputEncoding: 'Base64' }), theme: params.get('theme') ?? DEFAULT_THEME, }; } const Demo = () => { const [code, setCode] = useState(''); const [lang, setLang] = useState(''); const [theme, setTheme] = useState(DEFAULT_THEME); const handleShare = () => { persistToURL({ v: 1, code, lang, theme }); }; useEffect(() => { const { lang, code, theme } = parseURL(); setCode(code); setLang(lang); setTheme(theme); }, []); return (
); }; export default Demo;