From bfd36380934032fa459095c42d5772a428777d21 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sat, 19 Sep 2026 16:19:34 +0200 Subject: [PATCH] refactor: static single-provider settings form (no Add/Delete, form visible immediately); defaultSettings seeds one provider --- package.json | 2 +- src/settings.ts | 5 +- src/ui.tsx | 131 ++++++++++++++++++------------------------------ 3 files changed, 53 insertions(+), 85 deletions(-) diff --git a/package.json b/package.json index 56a2d9e..0415310 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "figma-ai-plugin", - "version": "0.1.2", + "version": "0.1.3", "private": true, "dependencies": { "@create-figma-plugin/ui": "^4.0.3", diff --git a/src/settings.ts b/src/settings.ts index 7da80dd..226d53f 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -26,11 +26,12 @@ export const APINEX_BASE_URL = 'https://api.apinex.bond/v1' const SETTINGS_KEY = 'settings' export function defaultSettings (): Settings { + const p = createApinexProvider() return { version: 1, auth: { mode: 'local' }, - providers: [], - activeProviderId: null + providers: [p], + activeProviderId: p.id } } diff --git a/src/ui.tsx b/src/ui.tsx index f2ac46a..c3208ee 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -21,7 +21,7 @@ import { emit, on } from '@create-figma-plugin/utilities' import { h, Fragment } from 'preact' import { useState, useEffect, useRef } from 'preact/hooks' import MenuItem from './MenuItem' -import { type Settings, type ProviderConfig, defaultSettings, loadSettings, saveSettings, createApinexProvider, settingsToJSON, settingsFromJSON, APINEX_BASE_URL } from './settings' +import { type Settings, type ProviderConfig, defaultSettings, loadSettings, saveSettings, settingsToJSON, settingsFromJSON, APINEX_BASE_URL } from './settings' const MIN_WINDOW_SIZE = { width: 320, height: 200 } // No static max: "maximize" targets the whole viewport (maxViewport from main), @@ -29,7 +29,7 @@ const MIN_WINDOW_SIZE = { width: 320, height: 200 } // very high — actual clamp is done by main via clampWindowSize (bounds*zoom). // Full plugin version shown in the footer status bar. Keep in sync with package.json "version". -const PLUGIN_VERSION = '0.1.2' +const PLUGIN_VERSION = '0.1.3' const fieldStyle = { display: 'flex', @@ -64,50 +64,33 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) const settingsRef = useRef(settings) settingsRef.current = settings + // Static single provider (APInex). Always edit providers[0]. + const provider = settings.providers[0] != null ? settings.providers[0] : null + useEffect(function () { const dispose = on('MODELS_RESULT', function (payload: { ok: boolean, models: string[], error?: string }) { if (!payload.ok) { setModelsError(payload.error != null ? payload.error : 'Failed to load models'); return } setModelsError(null) const prev = settingsRef.current - setSettings({ - ...prev, - providers: prev.providers.map(function (p) { - return p.id === prev.activeProviderId ? { ...p, models: payload.models } : p - }) - }) + if (prev.providers[0] == null) return + const updated = { ...prev.providers[0], models: payload.models } + setSettings({ ...prev, providers: [updated] }) }) return dispose }, []) - function fetchModels () { - if (active == null) return - setModelsError(null) - emit('FETCH_MODELS', { baseUrl: active.baseUrl, apiKey: active.apiKey }) - } - - const active = settings.providers.find(function (p) { return p.id === settings.activeProviderId }) || null - - function patchActive (patch: Partial) { - if (active == null) return + function patch (p: Partial) { + if (provider == null) return setSettings({ ...settings, - providers: settings.providers.map(function (p) { - return p.id === active.id ? { ...p, ...patch } : p - }) + providers: [{ ...provider, ...p }] }) } - function addProvider () { - const p = createApinexProvider() - const prev = settingsRef.current - setSettings({ ...prev, providers: [...prev.providers, p], activeProviderId: p.id }) - } - - function deleteActive () { - if (active == null) return - const providers = settings.providers.filter(function (p) { return p.id !== active.id }) - const activeProviderId = providers.length > 0 ? providers[0].id : null - setSettings({ ...settings, providers, activeProviderId }) + function fetchModels () { + if (provider == null) return + setModelsError(null) + emit('FETCH_MODELS', { baseUrl: provider.baseUrl, apiKey: provider.apiKey }) } function save () { @@ -146,60 +129,44 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) input.value = '' } - const providerOptions = settings.providers.map(function (p) { - return { value: p.id, text: p.name } - }) + if (provider == null) { + return No provider configured. + } return ( -
-
- Providers -
- - - -
+
+
+ Provider · {provider.type} + + + Show key + +
- {active != null && ( -
- {active.name} · {active.type} - - - Show key - - -
- )} -
{savedNote && Saved}