import { Messenger } from '@estruyf/vscode/dist/client'; import { CodeBracketIcon, PlusIcon } from '@heroicons/react/24/outline'; import * as React from 'react'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useRecoilValue } from 'recoil'; import { FeatureFlag } from '../../../components/features/FeatureFlag'; import { FEATURE_FLAG, GeneralCommands, WEBSITE_LINKS } from '../../../constants'; import { SnippetParser } from '../../../helpers/SnippetParser'; import { DashboardMessage } from '../../DashboardMessage'; import { ModeAtom, SettingsSelector, ViewDataSelector } from '../../state'; import { FilterInput } from '../Header/FilterInput'; import { PageLayout } from '../Layout/PageLayout'; import { SponsorMsg } from '../Layout/SponsorMsg'; import { Item } from './Item'; import { NewForm } from './NewForm'; import * as l10n from '@vscode/l10n'; import { LocalizationKey } from '../../../localization'; import { List } from '../Media/List'; import { SlideOver } from '../Modals/SlideOver'; import { DEFAULT_DASHBOARD_FEATURE_FLAGS } from '../../../constants/DefaultFeatureFlags'; export interface ISnippetsProps { } export const Snippets: React.FunctionComponent = () => { const settings = useRecoilValue(SettingsSelector); const viewData = useRecoilValue(ViewDataSelector); const mode = useRecoilValue(ModeAtom); const [snippetTitle, setSnippetTitle] = useState(''); const [snippetDescription, setSnippetDescription] = useState(''); const [snippetBody, setSnippetBody] = useState(''); const [showCreateDialog, setShowCreateDialog] = useState(false); const [mediaSnippet, setMediaSnippet] = useState(false); const [snippetFilter, setSnippetFilter] = useState(''); const snippets = settings?.snippets || {}; const snippetKeys = useMemo(() => { let allSnippetKeys = Object.keys(snippets).sort((a, b) => a.localeCompare(b)); if (viewData?.data?.filePath) { allSnippetKeys = allSnippetKeys.filter((key) => { return !snippets[key].isMediaSnippet; }); } return allSnippetKeys.filter((key) => { const value = snippetFilter.toLowerCase(); const keyValue = key.toLowerCase(); const descriptionValue = snippets[key].description?.toLowerCase() || ''; // Contains in key or description, values included in key are ranked higher (sort and fuzzy search) return keyValue.includes(value) || descriptionValue.includes(value); }); }, [settings?.snippets, snippetFilter, viewData?.data?.filePath]); const onSnippetAdd = useCallback(() => { if (!snippetTitle || !snippetBody) { reset(); return; } const fields = SnippetParser.getFields(snippetBody, []); Messenger.send(DashboardMessage.addSnippet, { title: snippetTitle, description: snippetDescription || '', body: snippetBody, fields, isMediaSnippet: mediaSnippet }); reset(); }, [snippetTitle, snippetDescription, snippetBody, mediaSnippet]); const reset = () => { setShowCreateDialog(false); setSnippetTitle(''); setSnippetDescription(''); setSnippetBody(''); }; useEffect(() => { Messenger.send(DashboardMessage.setTitle, l10n.t(LocalizationKey.dashboardHeaderTabsSnippets)); Messenger.send(GeneralCommands.toVSCode.logging.info, { message: `Snippets view loaded`, location: 'DASHBOARD' }); }, []); return (
0)} value={snippetFilter} onChange={(value: string) => setSnippetFilter(value)} onReset={() => setSnippetFilter('')} />
} >
{viewData?.data?.filePath && (

{l10n.t(LocalizationKey.dashboardSnippetsViewSnippetsSelectDescription)}

)} {(snippetKeys && snippetKeys.length > 0) ? ( {snippetKeys.map((snippetKey: any, index: number) => ( ))} ) : (

{l10n.t(LocalizationKey.dashboardSnippetsViewSnippetsEmptyMessage)}

{l10n.t(LocalizationKey.dashboardSnippetsViewSnippetsReadMore)}

)} {showCreateDialog && ( setMediaSnippet(value)} onTitleUpdate={(value: string) => setSnippetTitle(value)} onDescriptionUpdate={(value: string) => setSnippetDescription(value)} onBodyUpdate={(value: string) => setSnippetBody(value)} /> )}
Snippets metrics
); };