src/features/tickets/draft-provider.tsx
此代码来自构建时的仓库快照。修改源码后重新构建即可更新。
'use client';
import { createContext, useContext, useEffect, useState } from 'react';
import { useStore } from 'zustand';
import { createDraftStore, type DraftState } from '@/stores/drafts';
const DraftContext = createContext<ReturnType<typeof createDraftStore> | null>(
null,
);
export function DraftProvider({
userId,
children,
}: {
userId: string;
children: React.ReactNode;
}) {
const [store] = useState(() => createDraftStore(userId));
useEffect(() => {
// 首屏先使用空状态,挂载后读取 sessionStorage,避免服务端 HTML 与浏览器首帧不一致。
void Promise.resolve(store.persist.rehydrate()).finally(() =>
store.setState({ hydrated: true }),
);
}, [store]);
return (
<DraftContext.Provider value={store}>{children}</DraftContext.Provider>
);
}
export function useDraftStore<T>(selector: (state: DraftState) => T) {
const store = useContext(DraftContext);
if (!store) throw new Error('草稿必须在登录后的工作区使用');
return useStore(store, selector);
}