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",
    }),
}));