Scrapboard.org client
1import { create } from "zustand";
2import { persist } from "zustand/middleware";
3import * as z from "zod";
4import { createMapStorage } from "../utils/mapStorage";
5
6export const BoardItem = z.looseObject({
7 url: z.string(),
8 list: z.string(),
9 $type: z.string(),
10 createdAt: z.string().optional(),
11});
12
13export type BoardItem = z.infer<typeof BoardItem>;
14
15type BoardItemsState = {
16 boardItems: Map<string, BoardItem>;
17 setBoardItem: (rkey: string, board: BoardItem) => void;
18 removeBoardItem: (rkey: string) => void;
19 isLoading: boolean;
20 setLoading: (value: boolean) => void;
21};
22
23export const useBoardItemsStore = create<BoardItemsState>()(
24 persist(
25 (set) => ({
26 boardItems: new Map(),
27 setBoardItem: (rkey, board) =>
28 set((state) => ({
29 boardItems: new Map(state.boardItems).set(rkey, board),
30 })),
31 removeBoardItem: (rkey) =>
32 set((state) => {
33 const newMap = new Map(state.boardItems);
34 newMap.delete(rkey);
35 return {
36 boardItems: newMap,
37 };
38 }),
39 isLoading: true,
40 setLoading(value) {
41 set(() => ({
42 isLoading: value,
43 }));
44 },
45 }),
46 {
47 name: "board-items",
48 partialize: (state) => ({
49 items: state.boardItems,
50 }),
51 storage: createMapStorage("boardItems"),
52 }
53 )
54);