diff --git a/package.json b/package.json index 3c65836..b490ae3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "figma-ai-plugin", - "version": "0.1.17", + "version": "0.1.18", "private": true, "dependencies": { "@create-figma-plugin/ui": "^4.0.3", diff --git a/src/ui.tsx b/src/ui.tsx index d0d8a52..68d40de 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -30,7 +30,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.17' +const PLUGIN_VERSION = '0.1.18' const fieldStyle = { display: 'flex', @@ -97,8 +97,8 @@ class ErrorBoundary extends Component<{ children: any }, { error: Error | null } } } -function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) => void, logEvent: (msg: string) => void }) { - const { settings, setSettings, logEvent } = props +function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) => void, logEvent: (msg: string) => void, fetching: boolean, setFetching: (v: boolean) => void }) { + const { settings, setSettings, logEvent, fetching, setFetching } = props const [showKey, setShowKey] = useState(false) const [savedNote, setSavedNote] = useState(false) const fileInputRef = useRef(null) @@ -112,6 +112,7 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) useEffect(function () { const dispose = on('MODELS_RESULT', function (payload: { ok: boolean, models: string[], error?: string, status?: number, raw?: string, requestEcho?: { baseUrl: string, keyLen: number } }) { + setFetching(false) logEvent('MODELS_RESULT · ok=' + payload.ok + ' · status=' + (payload.status != null ? payload.status : '?')) if (payload.requestEcho != null) { logEvent(' request reached main · baseUrl=' + payload.requestEcho.baseUrl + ' · keyLen=' + payload.requestEcho.keyLen) @@ -138,6 +139,7 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) useEffect(function () { const dispose = on('PROBE_RESULT', function (p: { msg: string }) { + setFetching(false) logEvent('PROBE: ' + p.msg) }) return dispose @@ -153,6 +155,7 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) function fetchModels () { if (provider == null) return + setFetching(true) setModelsError(null) logEvent('FETCH clicked · baseUrl=' + provider.baseUrl + ' · key=' + (provider.apiKey.trim() !== '' ? 'PRESENT(' + provider.apiKey.length + ' chars)' : 'EMPTY')) emit('FETCH_MODELS', { baseUrl: provider.baseUrl, ['api' + 'Key']: provider.apiKey }) @@ -226,7 +229,10 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) onValueChange={function (id: string) { patch({ defaultModel: id }) }} options={modelOptions.map(function (m) { return { value: m, text: m } })} /> - + + {fetching && request is running…} {modelsError != null && ( {modelsError} @@ -259,6 +265,7 @@ function Plugin () { const [loaded, setLoaded] = useState(false) const [log, setLog] = useState([]) const [copied, setCopied] = useState(false) + const [fetching, setFetching] = useState(false) function logEvent (msg: string) { const t = new Date().toISOString().slice(11, 23) setLog(function (prev) { return prev.concat('[' + t + '] ' + msg) }) @@ -597,9 +604,16 @@ function Plugin () { {/* Body — semantic
, stretches via flex child of the column */}
{loaded - ? + ? : Loading…}
+ {/* Live log — shows the actual request flow (PROBE / FETCH / RESULT) from main.ts */} +
+ Request log + {log.length === 0 + ? No events yet + :
{log.join('\n')}
} +
{/* Footer — status bar */}