Files
figma-ai-plugin/src/settings.ts
T

86 lines
2.3 KiB
TypeScript

// Local settings model + persistence (figma.clientStorage).
//
// No server auth yet — everything lives on the Figma file locally. Backup/restore
// is just a JSON export/import of this same document. (Server auth comes later.)
export type ProviderType = 'apinex'
export interface ProviderConfig {
id: string
name: string
type: ProviderType
baseUrl: string
apiKey: string
defaultModel: string
models: string[]
}
export interface Settings {
version: 1
auth: { mode: 'local' } // later: { mode: 'server', ... }
providers: ProviderConfig[]
activeProviderId: string | null
}
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: [p],
activeProviderId: p.id
}
}
function genId (): string {
return 'p_' + Math.random().toString(36).slice(2, 10)
}
export function createApinexProvider (): ProviderConfig {
return {
id: genId(),
name: 'APInex',
type: 'apinex',
baseUrl: APINEX_BASE_URL,
apiKey: '',
defaultModel: '',
models: []
}
}
export async function loadSettings (): Promise<Settings> {
const defaults = defaultSettings()
try {
const stored = await figma.clientStorage.getAsync(SETTINGS_KEY)
if (stored == null || stored.version !== 1) return defaults
const merged: Settings = { ...defaults, ...(stored as Settings) }
if (!Array.isArray(merged.providers) || merged.providers.length === 0) {
merged.providers = defaults.providers
merged.activeProviderId = defaults.providers[0].id
}
return merged
} catch (e) {
return defaults
}
}
export async function saveSettings (settings: Settings): Promise<void> {
try {
await figma.clientStorage.setAsync(SETTINGS_KEY, settings)
} catch (e) { /* storage unavailable — ignore */ }
}
export function settingsToJSON (settings: Settings): string {
return JSON.stringify(settings, null, 2)
}
export function settingsFromJSON (text: string): Settings {
const parsed = JSON.parse(text)
if (parsed == null || parsed.version !== 1) throw new Error('Unsupported settings version')
if (!Array.isArray(parsed.providers)) throw new Error('Invalid settings: providers must be an array')
return parsed as Settings
}