You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
memos/web/src/store/v1/memo.ts

34 lines
829 B
TypeScript

import { create } from "zustand";
import { combine } from "zustand/middleware";
import { memoServiceClient } from "@/grpcweb";
import { Memo } from "@/types/proto/api/v2/memo_service";
export const useMemoV1Store = create(
combine({ memoById: new Map<number, Memo>() }, (set, get) => ({
getState: () => get(),
getOrFetchMemoById: async (id: MemoId) => {
const memo = get().memoById.get(id);
if (memo) {
return memo;
}
const res = await memoServiceClient.getMemo({
id,
});
if (!res.memo) {
throw new Error("Memo not found");
}
set((state) => {
state.memoById.set(id, res.memo as Memo);
return state;
});
return res.memo;
},
getMemoById: (id: number) => {
return get().memoById.get(id);
},
}))
);