返回 oh-my-ppt
templateStore.ts
根目录 / src / renderer / src / store / templateStore.ts
1 import { create } from 'zustand'
2 import { ipc, type TemplateListItem } from '@renderer/lib/ipc'
3 import type { SourceDocumentPlan } from '@shared/generation'
4
5 interface TemplateStore {
6 templates: TemplateListItem[]
7 loading: boolean
8 fetchTemplates: () => Promise<void>
9 applyTemplateThumbnail: (templateId: string, thumbnailPath: string) => void
10 createTemplateFromSession: (payload: {
11 sessionId: string
12 name?: string
13 description?: string
14 tags?: string[]
15 }) => Promise<string>
16 createSessionFromTemplate: (payload: {
17 templateId: string
18 title?: string
19 modelConfigId?: string
20 pageCount?: number
21 referenceDocumentPath?: string
22 sourcePlan?: SourceDocumentPlan
23 }) => Promise<string>
24 createEditableSessionFromTemplate: (payload: {
25 templateId: string
26 title?: string
27 modelConfigId?: string
28 }) => Promise<string>
29 importPptxAsTemplate: (payload: {
30 filePath: string
31 name?: string
32 modelConfigId?: string
33 }) => Promise<{ id: string; pageCount: number; warnings: string[] }>
34 updateTemplateMetadata: (payload: {
35 templateId: string
36 name: string
37 description?: string
38 tags?: string[]
39 }) => Promise<void>
40 deleteTemplate: (templateId: string) => Promise<void>
41 }
42
43 export const useTemplateStore = create<TemplateStore>((set, get) => ({
44 templates: [],
45 loading: false,
46
47 fetchTemplates: async () => {
48 set({ loading: true })
49 try {
50 const { items } = await ipc.listTemplates()
51 set({ templates: items, loading: false })
52 } catch (error) {
53 set({ loading: false })
54 throw error
55 }
56 },
57
58 applyTemplateThumbnail: (templateId, thumbnailPath) => {
59 set((state) => ({
60 templates: state.templates.map((template) =>
61 template.id === templateId ? { ...template, thumbnailPath } : template
62 )
63 }))
64 },
65
66 createTemplateFromSession: async (payload) => {
67 const result = await ipc.createTemplateFromSession(payload)
68 await get().fetchTemplates()
69 return result.id
70 },
71
72 createSessionFromTemplate: async (payload) => {
73 const result = await ipc.createSessionFromTemplate(payload)
74 return result.sessionId
75 },
76
77 createEditableSessionFromTemplate: async (payload) => {
78 const result = await ipc.createEditableSessionFromTemplate(payload)
79 return result.sessionId
80 },
81
82 importPptxAsTemplate: async (payload) => {
83 const result = await ipc.importPptxAsTemplate(payload)
84 await get().fetchTemplates()
85 return {
86 id: result.id,
87 pageCount: result.pageCount,
88 warnings: result.warnings
89 }
90 },
91
92 updateTemplateMetadata: async (payload) => {
93 const result = await ipc.updateTemplateMetadata(payload)
94 set((state) => ({
95 templates: state.templates.map((template) =>
96 template.id === result.item.id ? result.item : template
97 )
98 }))
99 },
100
101 deleteTemplate: async (templateId) => {
102 await ipc.deleteTemplate(templateId)
103 await get().fetchTemplates()
104 }
105 }))
106
106 lines TYPESCRIPT