| 12345678910111213141516171819202122232425262728293031 |
- import Dexie from "dexie"
- import { getToken } from "@/libs/auth"
- import type { AiCoursewareOutline, AiCoursewarePreferences, AiCoursewareResourceBinding, AiCoursewarePage } from "@/api/aiCourseware"
- import type { Slide, SlideTheme } from "@/types/slides"
- export type ProtectedPageContent = Pick<AiCoursewarePage, "title" | "subtitle" | "bullets" | "studentContent" | "learningEvidence" | "interaction"> & { studentTask?: string }
- export interface AiDraftRecord {
- key: string
- updatedAt: number
- outline?: AiCoursewareOutline
- converted?: { title: string; theme: Partial<SlideTheme>; slides: Slide[] }
- preferences: AiCoursewarePreferences
- extraPrompt: string
- taskId?: string
- resources?: AiCoursewareResourceBinding[]
- protectedContent?: Array<[number, ProtectedPageContent]>
- backup?: { title: string; theme: SlideTheme; slides: Slide[]; width: number; ratio: number }
- }
- const database = new Dexie("AI_COURSEWARE_DRAFTS")
- database.version(1).stores({ drafts: "key,updatedAt" })
- const drafts = database.table<AiDraftRecord, string>("drafts")
- export async function draftKey(id: string, source: string): Promise<string> {
- const token = getToken()
- if (!token) throw new Error("登录状态不可用,无法保存个人草稿")
- const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(token))
- const owner = Array.from(new Uint8Array(digest), byte => byte.toString(16).padStart(2, "0")).join("")
- return `${owner}:${source}:${id}`
- }
- export const loadAiDraft = (key: string) => drafts.get(key)
- export const saveAiDraft = (record: AiDraftRecord) => drafts.put(JSON.parse(JSON.stringify(record)))
|