import { FolderOpen } from 'lucide-react'; import React, { useEffect, useMemo, useState } from 'react'; import { normalizePluginKeyboardEvent } from '../../../application/state/pluginKeybindings'; import { usePluginContributions } from '../../../application/state/usePluginContributions'; import { useI18n } from '../../../application/i18n/I18nProvider'; import { Button } from '../../ui/button'; import { Input } from '../../ui/input'; import { SettingsAnchor, SettingsTabContent } from '../settings-ui'; import { requestOpenPluginView } from '../../plugins/PluginContributionHost'; import { parsePluginStructuredSettingValue } from './pluginSettingValues'; import { PluginStructuredSettingEditor } from './PluginStructuredSettingEditor'; import { useAvailableFonts } from '../../../application/state/fontStore'; import { TerminalFontSelect } from '../TerminalFontSelect'; import { resolvePluginSettingScopeSelection, usePluginSettingScopeCatalog, } from '../../../application/state/usePluginSettingScopeCatalog'; import { PluginContributionIcon } from '../../plugins/PluginContributionIcon'; export function PluginSettingField({ pluginId, setting, updateSetting, resetSetting, selectSettingPath, availableFonts, }: { pluginId: string; setting: NetcattyPluginSettingContribution; updateSetting: ReturnType['updateSetting']; resetSetting: ReturnType['resetSetting']; selectSettingPath: ReturnType['selectSettingPath']; availableFonts: ReturnType; }) { const { t } = useI18n(); const [value, setValue] = useState(setting.secret ? '' : setting.value ?? ''); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const itemLabel = (key: 'settings.plugins.moveItemUp' | 'settings.plugins.moveItemDown', index: number) => ( t(key).replace('{label}', setting.label).replace('{index}', String(index + 1)) ); useEffect(() => { setValue(setting.secret ? '' : setting.value ?? ''); }, [setting.secret, setting.value]); const save = async (nextValue: unknown) => { setSaving(true); setError(null); try { await updateSetting(pluginId, setting.id, nextValue, setting.scopeId ?? undefined); if (setting.secret) setValue(''); } catch (cause) { setError(cause instanceof Error ? cause.message : String(cause)); } finally { setSaving(false); } }; const control = (() => { if (setting.scopeId == null) { return
{t('settings.plugins.scopeContext').replace('{scope}', setting.scope)}
; } if (setting.control === 'switch') { return ( { setValue(event.target.checked); void save(event.target.checked); }} className="h-4 w-4 accent-primary" /> ); } if (setting.control === 'radio') { return (
{setting.label} {setting.options?.map((option) => ( ))}
); } if (setting.control === 'select') { return ( ); } if (setting.control === 'multiselect') { const selected = Array.isArray(value) ? value.map(String) : []; return ( ); } if (setting.control === 'textarea') { return (