import { useMarkStore } from '@kevisual/api/store-mark'; export { useMarkStore } import { create } from 'zustand'; import { queryApi } from '@/modules/mark-api'; import { toast } from 'sonner'; type WorkspaceItem = { id: string; title: string; tags?: string[]; link?: string; summary?: string; description?: string; createdAt: string; updatedAt: string; } type WorkspaceState = { edit: boolean; setEdit: (edit: boolean) => void; list: WorkspaceItem[]; loading: boolean; setLoading: (loading: boolean) => void; // 弹窗状态 showCreateDialog: boolean; setShowCreateDialog: (show: boolean) => void; showEditDialog: boolean; setShowEditDialog: (show: boolean) => void; editingItem: WorkspaceItem | null; setEditingItem: (item: WorkspaceItem | null) => void; // 数据操作 getList: (params?: { search?: string, page?: number, pageSize?: number }) => Promise; createItem: (data: { title: string, tags?: string[], link?: string, summary?: string, description?: string }) => Promise; updateItem: (id: string, data: { title?: string, tags?: string[], link?: string, summary?: string, description?: string }) => Promise; deleteItem: (id: string) => Promise; getItem: (id: string) => Promise; } export type { WorkspaceState, WorkspaceItem }; export const useWorkspaceStore = create((set, get) => ({ edit: false, setEdit: (edit) => set({ edit }), list: [], loading: false, setLoading: (loading) => set({ loading }), showCreateDialog: false, setShowCreateDialog: (show) => set({ showCreateDialog: show }), showEditDialog: false, setShowEditDialog: (show) => set({ showEditDialog: show }), editingItem: null, setEditingItem: (item) => set({ editingItem: item }), getList: async (params = {}) => { const { page = 1, pageSize = 20, search } = params; set({ loading: true }); try { const res = await queryApi.mark.list({ markType: 'cnb', page, pageSize, search, sort: 'DESC' }); if (res.code === 200) { set({ list: res.data?.list || [] }); } else { toast.error(res.message || '获取列表失败'); } } catch (e) { console.error('获取workspace列表失败', e); toast.error('获取列表失败'); } finally { set({ loading: false }); } }, createItem: async (data) => { try { const res = await queryApi.mark.create({ title: data.title, markType: 'cnb', tags: data.tags || [], link: data.link || '', summary: data.summary || '', description: data.description || '' }); if (res.code === 200) { toast.success('创建成功'); get().getList(); set({ showCreateDialog: false }); } else { toast.error(res.message || '创建失败'); } } catch (e) { console.error('创建失败', e); toast.error('创建失败'); } }, updateItem: async (id, data) => { try { const res = await queryApi.mark.update({ data: { // @ts-ignore id, title: data.title || '', tags: data.tags || [], link: data.link || '', summary: data.summary || '', description: data.description || '' } }); if (res.code === 200) { toast.success('更新成功'); get().getList(); set({ showEditDialog: false, editingItem: null }); } else { toast.error(res.message || '更新失败'); } } catch (e) { console.error('更新失败', e); toast.error('更新失败'); } }, deleteItem: async (id) => { try { const res = await queryApi.mark.delete({ id }); if (res.code === 200) { toast.success('删除成功'); get().getList(); } else { toast.error(res.message || '删除失败'); } } catch (e) { console.error('删除失败', e); toast.error('删除失败'); } }, getItem: async (id) => { try { const res = await queryApi.mark.get({ id }); if (res.code === 200) { return res.data; } else { toast.error(res.message || '获取详情失败'); return null; } } catch (e) { console.error('获取详情失败', e); return null; } } }));