Scrapboard.org client
at labels 54 lines 1.4 kB view raw
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);