File
Blob: src/client/stores/shared-inbox.ts
| 1 | import { create } from "zustand"; |
| 2 | import type { SharedWithMeItem, SharedInboxWorkspaceSummary } from "@/shared/types"; |
| 3 | |
| 4 | export interface SharedInboxState { |
| 5 | items: SharedWithMeItem[]; |
| 6 | workspaceSummaries: SharedInboxWorkspaceSummary[]; |
| 7 | } |
| 8 | |
| 9 | const initialState: SharedInboxState = { |
| 10 | items: [], |
| 11 | workspaceSummaries: [], |
| 12 | }; |
| 13 | |
| 14 | export const useSharedInboxStore = create<SharedInboxState>(() => initialState); |
| 15 | |
| 16 | export function applySharedInboxProjection(projection: SharedInboxState): void { |
| 17 | useSharedInboxStore.setState(projection, true); |
| 18 | } |
| 19 | |
| 20 | export function resetSharedInboxProjection(): void { |
| 21 | useSharedInboxStore.setState(initialState, true); |
| 22 | } |
| 23 | |
| 24 | export function selectSharedInboxItems(state: SharedInboxState): SharedWithMeItem[] { |
| 25 | return state.items; |
| 26 | } |
| 27 | |
| 28 | export function selectSharedInboxWorkspaceSummaries(state: SharedInboxState): SharedInboxWorkspaceSummary[] { |
| 29 | return state.workspaceSummaries; |
| 30 | } |
| 31 | |
| 32 | export interface SharedInboxView { |
| 33 | items: SharedWithMeItem[]; |
| 34 | workspaceSummaries: SharedInboxWorkspaceSummary[]; |
| 35 | } |
| 36 | |
| 37 | export function selectSharedInboxView(state: SharedInboxState): SharedInboxView { |
| 38 | return { items: state.items, workspaceSummaries: state.workspaceSummaries }; |
| 39 | } |
| 40 | |
| 41 | export function useSharedInboxItems(): SharedWithMeItem[] { |
| 42 | return useSharedInboxStore(selectSharedInboxItems); |
| 43 | } |
| 44 | |
| 45 | export function useSharedInboxWorkspaceSummaries(): SharedInboxWorkspaceSummary[] { |
| 46 | return useSharedInboxStore(selectSharedInboxWorkspaceSummaries); |
| 47 | } |