// 本地存储键常量:界面/用户偏好统一以 ledgerly. 前缀命名,作为唯一来源供路由与各页面复用 import { migrateKey } from './storage' /** 当前使用的本地存储键 */ export const STORAGE_KEYS = { // 语言偏好 locale: 'ledgerly.locale', // 邮箱账单页标签页 emailBillTab: 'ledgerly.emailBill.tab', // 系统日志页标签页 logsTab: 'ledgerly.logs.tab', // 账单导入的账单类型 billImportBillType: 'ledgerly.billImport.billType', // 统计面板偏好 dashboardPrefs: 'ledgerly.dashboard.prefs', // 统计面板 AI 查询历史 dashboardAiSearchHistory: 'ledgerly.dashboard.aiSearchHistory', // 统计面板 AI 查询浮窗位置尺寸 dashboardAiQueryWindow: 'ledgerly.dashboard.aiQueryWindow', // 收支记录 AI 建议范围 transactionAiScope: 'ledgerly.transaction.aiScope', // 收支记录 AI 记账方式 transactionAiRecordTab: 'ledgerly.transaction.aiRecordTab', // 收支记录备注关键词历史 transactionRemarkHistory: 'ledgerly.transaction.remarkHistory', // 收支记录筛选偏好(收支记录页与统计面板共用) transactionFilterPrefs: 'ledgerly.transaction.filterPrefs', // 各表格每页大小偏好(聚合 JSON,按表格键区分,本机记忆) paginationTablePageSizes: 'ledgerly.pagination.tablePageSizes', // 账单关系类型 transactionRelationType: 'ledgerly.transaction.relationType', // 收支记录 AI 查询历史 transactionAiQueryHistory: 'ledgerly.transaction.aiQueryHistory', // 收支记录 AI 查询浮窗位置尺寸 transactionAiQueryWindow: 'ledgerly.transaction.aiQueryWindow', // 内容区滚动位置(sessionStorage,按路由拼接后缀) scrollPrefix: 'ledgerly.scroll.', } as const /** 历史遗留的存储键(未带前缀),首次读取时迁移到新键 */ export const LEGACY_STORAGE_KEYS = { locale: 'locale', emailBillTab: 'emailBill.tab', logsTab: 'logs.tab', } as const /** 当前存储键前缀 */ const CURRENT_PREFIX = 'ledgerly.' /** 上一代存储键前缀(品牌改名前的 finance.) */ const LEGACY_PREFIX = 'finance.' /** 模块加载时迁移上一代 finance.* 偏好键到 ledgerly.*,保证老用户偏好不丢失 */ function migrateLegacyPrefixedKeys(): void { Object.values(STORAGE_KEYS).forEach((key) => { if (!key.startsWith(CURRENT_PREFIX)) return migrateKey(LEGACY_PREFIX + key.slice(CURRENT_PREFIX.length), key) }) } migrateLegacyPrefixedKeys() /** 生成指定路由的滚动位置存储键 */ export function scrollKey(path: string): string { return `${STORAGE_KEYS.scrollPrefix}${path}` }