/** * AI 创作全局状态(Pinia Store) * * 从 lesingle-aicreate-client/utils/store.js 迁移 * 保留原有字段和方法,适配 Pinia setup 语法 */ import { defineStore } from 'pinia' import { ref, reactive } from 'vue' export const useAicreateStore = defineStore('aicreate', () => { // ─── 认证信息 ─── const phone = ref(localStorage.getItem('le_phone') || '') const orgId = ref(localStorage.getItem('le_orgId') || '') const appSecret = ref(localStorage.getItem('le_appSecret') || '') const sessionToken = ref(sessionStorage.getItem('le_sessionToken') || '') // ─── 创作流程数据 ─── const imageUrl = ref('') const extractId = ref('') const characters = ref([]) const selectedCharacter = ref(null) const selectedStyle = ref('') const storyData = ref(null) const workId = ref('') const workDetail = ref(null) const authRedirectUrl = ref('') // ─── Tab 切换状态保存 ─── const lastCreateRoute = ref('') // ─── 方法 ─── function setPhone(val: string) { phone.value = val localStorage.setItem('le_phone', val) } function setOrg(id: string, secret: string) { orgId.value = id appSecret.value = secret localStorage.setItem('le_orgId', id) localStorage.setItem('le_appSecret', secret) } function setSession(id: string, token: string) { orgId.value = id sessionToken.value = token localStorage.setItem('le_orgId', id) sessionStorage.setItem('le_orgId', id) sessionStorage.setItem('le_sessionToken', token) } function clearSession() { sessionToken.value = '' sessionStorage.removeItem('le_sessionToken') } function setLastCreateRoute(path: string) { lastCreateRoute.value = path } function clearLastCreateRoute() { lastCreateRoute.value = '' } function reset() { imageUrl.value = '' extractId.value = '' characters.value = [] selectedCharacter.value = null selectedStyle.value = '' storyData.value = null workId.value = '' workDetail.value = null lastCreateRoute.value = '' localStorage.removeItem('le_workId') } function saveRecoveryState() { const recovery = { path: window.location.pathname || '/', workId: workId.value || localStorage.getItem('le_workId') || '', imageUrl: imageUrl.value || '', extractId: extractId.value || '', selectedStyle: selectedStyle.value || '', savedAt: Date.now() } sessionStorage.setItem('le_recovery', JSON.stringify(recovery)) } function restoreRecoveryState() { const raw = sessionStorage.getItem('le_recovery') if (!raw) return null try { const recovery = JSON.parse(raw) if (Date.now() - recovery.savedAt > 30 * 60 * 1000) { sessionStorage.removeItem('le_recovery') return null } if (recovery.workId) workId.value = recovery.workId if (recovery.imageUrl) imageUrl.value = recovery.imageUrl if (recovery.extractId) extractId.value = recovery.extractId if (recovery.selectedStyle) selectedStyle.value = recovery.selectedStyle sessionStorage.removeItem('le_recovery') return recovery } catch { sessionStorage.removeItem('le_recovery') return null } } return { // 认证 phone, orgId, appSecret, sessionToken, authRedirectUrl, setPhone, setOrg, setSession, clearSession, // 创作流程 imageUrl, extractId, characters, selectedCharacter, selectedStyle, storyData, workId, workDetail, reset, saveRecoveryState, restoreRecoveryState, // Tab 切换状态 lastCreateRoute, setLastCreateRoute, clearLastCreateRoute, } })