File size: 2,400 Bytes
e218aaf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 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",
}),
})); |