TTeamDesk 学习手册

src/features/tickets/draft-provider.tsx

此代码来自构建时的仓库快照。修改源码后重新构建即可更新。

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);
}

搜索教程

输入关键词,搜索全部章节。

阅读设置

外观
正文字号

从一张工单出发,读懂数据如何流转。

设置与进度仅保存在当前浏览器。