86 lines
2.3 KiB
TypeScript
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
|
|
}
|