import { defineStore } from 'pinia' import { ref } from 'vue' import { fetchSettings, saveSettings, clearSetting, fetchModelPresets, createModelPreset, updateModelPreset, deleteModelPreset, type SettingEntry, type ModelPreset, } from '../api/client' const STORAGE_KEY = 'playchat_settings_password' export const useSettingsStore = defineStore('settings', () => { const password = ref(sessionStorage.getItem(STORAGE_KEY) ?? '') const unlocked = ref(false) const entries = ref([]) const modelPresets = ref([]) const loading = ref(false) const error = ref(null) async function unlock(candidatePassword: string): Promise { loading.value = true error.value = null try { entries.value = await fetchSettings(candidatePassword) password.value = candidatePassword sessionStorage.setItem(STORAGE_KEY, candidatePassword) unlocked.value = true return true } catch (e) { unlocked.value = false error.value = e instanceof Error ? e.message : 'エラーが発生しました' return false } finally { loading.value = false } } /** ページ再読み込み時などに、保存済みパスワードで自動的に再認証を試みる。 */ async function tryAutoUnlock(): Promise { if (!password.value || unlocked.value) return await unlock(password.value) } async function save(values: Record): Promise { loading.value = true error.value = null try { entries.value = await saveSettings(values, password.value) return true } catch (e) { error.value = e instanceof Error ? e.message : 'エラーが発生しました' return false } finally { loading.value = false } } async function clear(key: string): Promise { error.value = null try { entries.value = await clearSetting(key, password.value) } catch (e) { error.value = e instanceof Error ? e.message : 'エラーが発生しました' } } function lock() { unlocked.value = false password.value = '' sessionStorage.removeItem(STORAGE_KEY) } /** モデル一覧は認証不要で誰でも取得できる(ModelSelectorから直接呼ばれる想定)。 */ async function loadModelPresets(): Promise { try { modelPresets.value = await fetchModelPresets() } catch (e) { error.value = e instanceof Error ? e.message : 'エラーが発生しました' } } async function addModelPreset(label: string, value: string): Promise { error.value = null try { const created = await createModelPreset(label, value, password.value) modelPresets.value = [...modelPresets.value, created] return true } catch (e) { error.value = e instanceof Error ? e.message : 'エラーが発生しました' return false } } async function editModelPreset(id: number, label: string, value: string): Promise { error.value = null try { const updated = await updateModelPreset(id, label, value, password.value) modelPresets.value = modelPresets.value.map((p) => (p.id === id ? updated : p)) return true } catch (e) { error.value = e instanceof Error ? e.message : 'エラーが発生しました' return false } } async function removeModelPreset(id: number): Promise { error.value = null try { await deleteModelPreset(id, password.value) modelPresets.value = modelPresets.value.filter((p) => p.id !== id) } catch (e) { error.value = e instanceof Error ? e.message : 'エラーが発生しました' } } return { password, unlocked, entries, modelPresets, loading, error, unlock, tryAutoUnlock, save, clear, lock, loadModelPresets, addModelPreset, editModelPreset, removeModelPreset, } })