feat(22-01): add UIStore modal states, AddToCollectionModal, and sonner toasts

- Extend UIStore with addToCollectionModal, addToThreadModal, catalogSessionThreadId
- Create AddToCollectionModal with category dropdown, notes, purchase price
- Install sonner and add Toaster + AddToCollectionModal to root layout
- closeCatalogSearch now resets catalogSessionThreadId

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-06 15:55:44 +02:00
parent 576c59a460
commit f309c73304
5 changed files with 221 additions and 1 deletions

View File

@@ -57,6 +57,20 @@ interface UIState {
catalogSearchMode: "collection" | "thread" | null;
openCatalogSearch: (mode: "collection" | "thread") => void;
closeCatalogSearch: () => void;
// Add-to-collection modal
addToCollectionModal: { open: boolean; globalItemId: number | null; globalItemName: string | null };
openAddToCollection: (globalItemId: number, globalItemName: string) => void;
closeAddToCollection: () => void;
// Add-to-thread modal
addToThreadModal: { open: boolean; globalItemId: number | null; globalItemName: string | null };
openAddToThread: (globalItemId: number, globalItemName: string) => void;
closeAddToThread: () => void;
// Session thread tracking
catalogSessionThreadId: number | null;
setCatalogSessionThreadId: (id: number | null) => void;
}
export const useUIStore = create<UIState>((set) => ({
@@ -123,5 +137,23 @@ export const useUIStore = create<UIState>((set) => ({
fabMenuOpen: false,
}),
closeCatalogSearch: () =>
set({ catalogSearchOpen: false, catalogSearchMode: null }),
set({ catalogSearchOpen: false, catalogSearchMode: null, catalogSessionThreadId: null }),
// Add-to-collection modal
addToCollectionModal: { open: false, globalItemId: null, globalItemName: null },
openAddToCollection: (globalItemId, globalItemName) =>
set({ addToCollectionModal: { open: true, globalItemId, globalItemName } }),
closeAddToCollection: () =>
set({ addToCollectionModal: { open: false, globalItemId: null, globalItemName: null } }),
// Add-to-thread modal
addToThreadModal: { open: false, globalItemId: null, globalItemName: null },
openAddToThread: (globalItemId, globalItemName) =>
set({ addToThreadModal: { open: true, globalItemId, globalItemName } }),
closeAddToThread: () =>
set({ addToThreadModal: { open: false, globalItemId: null, globalItemName: null } }),
// Session thread tracking
catalogSessionThreadId: null,
setCatalogSessionThreadId: (id) => set({ catalogSessionThreadId: id }),
}));