| import { create } from "zustand"; |
|
|
| export type View = "landing" | "auth" | "dashboard"; |
|
|
| export interface InvoiceRow { |
| id: string; |
| filename: string | null; |
| vendor: string | null; |
| invNumber: string | null; |
| invDate: string | null; |
| dueDate: string | null; |
| amount: number | null; |
| vatAmount: number | null; |
| total: number | null; |
| currency: string; |
| status: string; |
| isDuplicate: boolean; |
| confidence: number | null; |
| createdAt: string; |
| } |
|
|
| export interface UserProfile { |
| id: string; |
| email: string; |
| name: string; |
| plan: string; |
| apiKey: string | null; |
| createdAt: string; |
| } |
|
|
| interface ChatMessage { |
| role: "user" | "assistant"; |
| content: string; |
| } |
|
|
| interface AppState { |
| view: View; |
| user: UserProfile | null; |
| isLoading: boolean; |
| invoices: InvoiceRow[]; |
| chatHistory: ChatMessage[]; |
| uploadResults: InvoiceRow[] | null; |
| uploadLoading: boolean; |
| chatLoading: boolean; |
| activeDashTab: string; |
|
|
| setView: (view: View) => void; |
| setUser: (user: UserProfile | null) => void; |
| setLoading: (loading: boolean) => void; |
| setInvoices: (invoices: InvoiceRow[]) => void; |
| addChatMessage: (message: ChatMessage) => void; |
| clearChat: () => void; |
| setUploadResults: (results: InvoiceRow[] | null) => void; |
| setUploadLoading: (loading: boolean) => void; |
| setChatLoading: (loading: boolean) => void; |
| setActiveDashTab: (tab: string) => void; |
| logout: () => void; |
| } |
|
|
| export const useAppStore = create<AppState>((set) => ({ |
| view: "landing", |
| user: null, |
| isLoading: true, |
| invoices: [], |
| chatHistory: [], |
| uploadResults: null, |
| uploadLoading: false, |
| chatLoading: false, |
| activeDashTab: "upload", |
|
|
| setView: (view) => set({ view }), |
| setUser: (user) => set({ user, isLoading: false }), |
| setLoading: (isLoading) => set({ isLoading }), |
| setInvoices: (invoices) => set({ invoices }), |
| addChatMessage: (message) => |
| set((state) => ({ chatHistory: [...state.chatHistory, message] })), |
| clearChat: () => set({ chatHistory: [] }), |
| setUploadResults: (uploadResults) => set({ uploadResults }), |
| setUploadLoading: (uploadLoading) => set({ uploadLoading }), |
| setChatLoading: (chatLoading) => set({ chatLoading }), |
| setActiveDashTab: (activeDashTab) => set({ activeDashTab }), |
| logout: () => |
| set({ |
| user: null, |
| view: "landing", |
| invoices: [], |
| chatHistory: [], |
| uploadResults: null, |
| activeDashTab: "upload", |
| }), |
| })); |