diff --git a/packages/website/src/components/ASTViewerESTree.tsx b/packages/website/src/components/ASTViewerESTree.tsx index 7dfcef130cf2..855235eba0b4 100644 --- a/packages/website/src/components/ASTViewerESTree.tsx +++ b/packages/website/src/components/ASTViewerESTree.tsx @@ -1,13 +1,14 @@ -import React, { useEffect, useState } from 'react'; +import React, { useMemo } from 'react'; import ASTViewer from './ast/ASTViewer'; -import type { ASTViewerBaseProps, ASTViewerModelMap } from './ast/types'; +import type { ASTViewerBaseProps } from './ast/types'; import type { TSESTree } from '@typescript-eslint/utils'; + import { serialize } from './ast/serializer/serializer'; import { createESTreeSerializer } from './ast/serializer/serializerESTree'; export interface ASTESTreeViewerProps extends ASTViewerBaseProps { - readonly value: TSESTree.BaseNode | string; + readonly value: TSESTree.BaseNode; } export default function ASTViewerESTree({ @@ -15,16 +16,10 @@ export default function ASTViewerESTree({ position, onSelectNode, }: ASTESTreeViewerProps): JSX.Element { - const [model, setModel] = useState(''); - - useEffect(() => { - if (typeof value === 'string') { - setModel(value); - } else { - const astSerializer = createESTreeSerializer(); - setModel(serialize(value, astSerializer)); - } - }, [value]); + const model = useMemo( + () => serialize(value, createESTreeSerializer()), + [value], + ); return ( diff --git a/packages/website/src/components/ASTViewerScope.tsx b/packages/website/src/components/ASTViewerScope.tsx index b14514855381..9d5dff8fc5af 100644 --- a/packages/website/src/components/ASTViewerScope.tsx +++ b/packages/website/src/components/ASTViewerScope.tsx @@ -1,29 +1,23 @@ -import React, { useEffect, useState } from 'react'; +import React, { useMemo } from 'react'; import ASTViewer from './ast/ASTViewer'; -import type { ASTViewerBaseProps, ASTViewerModelMap } from './ast/types'; +import type { ASTViewerBaseProps } from './ast/types'; import { serialize } from './ast/serializer/serializer'; import { createScopeSerializer } from './ast/serializer/serializerScope'; export interface ASTScopeViewerProps extends ASTViewerBaseProps { - readonly value: Record | string; + readonly value: Record; } export default function ASTViewerScope({ value, onSelectNode, }: ASTScopeViewerProps): JSX.Element { - const [model, setModel] = useState(''); - - useEffect(() => { - if (typeof value === 'string') { - setModel(value); - } else { - const scopeSerializer = createScopeSerializer(); - setModel(serialize(value, scopeSerializer)); - } - }, [value]); + const model = useMemo( + () => serialize(value, createScopeSerializer()), + [value], + ); return ; } diff --git a/packages/website/src/components/ASTViewerTS.tsx b/packages/website/src/components/ASTViewerTS.tsx index d33e524366aa..8cd3f15ce5a8 100644 --- a/packages/website/src/components/ASTViewerTS.tsx +++ b/packages/website/src/components/ASTViewerTS.tsx @@ -7,7 +7,7 @@ import { serialize } from './ast/serializer/serializer'; import { createTsSerializer } from './ast/serializer/serializerTS'; export interface ASTTsViewerProps extends ASTViewerBaseProps { - readonly value: SourceFile | string; + readonly value: SourceFile; } function extractEnum( @@ -41,22 +41,18 @@ export default function ASTViewerTS({ const [typeFlags] = useState(() => extractEnum(window.ts.TypeFlags)); useEffect(() => { - if (typeof value === 'string') { - setModel(value); - } else { - const scopeSerializer = createTsSerializer( - value, - syntaxKind, - ['NodeFlags', nodeFlags], - ['TokenFlags', tokenFlags], - ['ModifierFlags', modifierFlags], - ['ObjectFlags', objectFlags], - ['SymbolFlags', symbolFlags], - ['FlowFlags', flowFlags], - ['TypeFlags', typeFlags], - ); - setModel(serialize(value, scopeSerializer)); - } + const scopeSerializer = createTsSerializer( + value, + syntaxKind, + ['NodeFlags', nodeFlags], + ['TokenFlags', tokenFlags], + ['ModifierFlags', modifierFlags], + ['ObjectFlags', objectFlags], + ['SymbolFlags', symbolFlags], + ['FlowFlags', flowFlags], + ['TypeFlags', typeFlags], + ); + setModel(serialize(value, scopeSerializer)); }, [value, syntaxKind]); return ( diff --git a/packages/website/src/components/EditorTabs.tsx b/packages/website/src/components/EditorTabs.tsx new file mode 100644 index 000000000000..a0b81e9dc058 --- /dev/null +++ b/packages/website/src/components/EditorTabs.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import type { TabType } from './types'; +import styles from './Playground.module.css'; +import EditIcon from '@site/src/icons/edit.svg'; + +export interface FileTabsProps { + readonly tabs: TabType[]; + readonly activeTab: TabType; + readonly change: (tab: TabType) => void; + readonly showModal: () => void; +} + +export default function EditorTabs({ + tabs, + activeTab, + change, + showModal, +}: FileTabsProps): JSX.Element { + return ( +
+
+ {tabs.map(item => { + return ( + + ); + })} +
+ {activeTab !== 'code' && ( + + )} +
+ ); +} diff --git a/packages/website/src/components/ErrorsViewer.tsx b/packages/website/src/components/ErrorsViewer.tsx index fa1b56c937fb..566f1b83fdc4 100644 --- a/packages/website/src/components/ErrorsViewer.tsx +++ b/packages/website/src/components/ErrorsViewer.tsx @@ -19,7 +19,7 @@ function severityClass(severity: Monaco.MarkerSeverity): string { case 8: return 'danger'; case 4: - return 'caution'; + return 'warning'; case 2: return 'note'; } diff --git a/packages/website/src/components/OptionsSelector.tsx b/packages/website/src/components/OptionsSelector.tsx index 9b9d9f7ec90e..f3a579df30b4 100644 --- a/packages/website/src/components/OptionsSelector.tsx +++ b/packages/website/src/components/OptionsSelector.tsx @@ -1,27 +1,21 @@ /* eslint-disable jsx-a11y/label-has-associated-control */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback } from 'react'; -import ConfigEslint from './config/ConfigEslint'; -import ConfigTypeScript from './config/ConfigTypeScript'; import Expander from './layout/Expander'; import Dropdown from './inputs/Dropdown'; import Checkbox from './inputs/Checkbox'; import Tooltip from './inputs/Tooltip'; -import EditIcon from '@site/src/icons/edit.svg'; import CopyIcon from '@site/src/icons/copy.svg'; import useDebouncedToggle from './hooks/useDebouncedToggle'; import { createMarkdown, createMarkdownParams } from './lib/markdown'; -import type { RuleDetails } from './types'; - import styles from './OptionsSelector.module.css'; -import type { CompilerFlags, ConfigModel, RulesRecord } from './types'; +import type { ConfigModel } from './types'; export interface OptionsSelectorParams { - readonly ruleOptions: RuleDetails[]; readonly state: ConfigModel; readonly setState: (cfg: Partial) => void; readonly tsVersions: readonly string[]; @@ -36,14 +30,11 @@ const ASTOptions = [ ] as const; function OptionsSelector({ - ruleOptions, state, setState, tsVersions, isLoading, }: OptionsSelectorParams): JSX.Element { - const [eslintModal, setEslintModal] = useState(false); - const [typeScriptModal, setTypeScriptModal] = useState(false); const [copyLink, setCopyLink] = useDebouncedToggle(false); const [copyMarkdown, setCopyMarkdown] = useDebouncedToggle(false); @@ -54,26 +45,6 @@ function OptionsSelector({ [setState], ); - const updateRules = useCallback( - (rules?: RulesRecord) => { - if (rules) { - setState({ rules: rules }); - } - setEslintModal(false); - }, - [setState], - ); - - const updateTsConfig = useCallback( - (config?: CompilerFlags) => { - if (config) { - setState({ tsConfig: config }); - } - setTypeScriptModal(false); - }, - [setState], - ); - const copyLinkToClipboard = useCallback(() => { void navigator.clipboard .writeText(document.location.toString()) @@ -107,19 +78,6 @@ function OptionsSelector({ return ( <> - {state.rules && ruleOptions.length > 0 && ( - - )} - - - - - {editJson && ( -