-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstore.ts
More file actions
90 lines (81 loc) · 4.17 KB
/
store.ts
File metadata and controls
90 lines (81 loc) · 4.17 KB
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
import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';
import AsyncStorage from '@react-native-async-storage/async-storage'; // <-- NEWLY ADDED
import { Asset, Liability, Receivable, StrategicInstallment } from './types';
interface FinanceStore {
assets: Asset[];
liabilities: Liability[];
receivables: Receivable[];
installments: StrategicInstallment[];
addAsset: (asset: Asset) => void;
removeAsset: (id: string) => void;
updateAsset: (id: string, asset: Partial<Asset>) => void;
addLiability: (liability: Liability) => void;
removeLiability: (id: string) => void;
updateLiability: (id: string, liability: Partial<Liability>) => void;
addReceivable: (receivable: Receivable) => void;
removeReceivable: (id: string) => void;
updateReceivable: (id: string, receivable: Partial<Receivable>) => void;
addInstallment: (installment: StrategicInstallment) => void;
removeInstallment: (id: string) => void;
updateInstallment: (id: string, installment: Partial<StrategicInstallment>) => void;
getTotalAssets: () => number;
getTotalLiabilities: () => number;
getNetWorth: () => number;
getSafeToSpend: () => number;
}
export const useFinanceStore = create<FinanceStore>()(
persist(
(set, get) => ({
// --- STATE ---
assets: [],
liabilities: [],
receivables: [],
installments: [],
// --- ACTIONS ---
addAsset: (asset) => set((state) => ({ assets: [...state.assets, { ...asset, id: Date.now().toString() }] })),
removeAsset: (id) => set((state) => ({ assets: state.assets.filter(asset => asset.id !== id) })),
updateAsset: (id, updatedAsset) => set((state) => ({
assets: state.assets.map(asset => asset.id === id ? { ...asset, ...updatedAsset } : asset)
})),
addLiability: (liability) => set((state) => ({ liabilities: [...state.liabilities, { ...liability, id: Date.now().toString() }] })),
removeLiability: (id) => set((state) => ({ liabilities: state.liabilities.filter(liability => liability.id !== id) })),
updateLiability: (id, updatedLiability) => set((state) => ({
liabilities: state.liabilities.map(liability => liability.id === id ? { ...liability, ...updatedLiability } : liability)
})),
addReceivable: (receivable) => set((state) => ({ receivables: [...state.receivables, { ...receivable, id: Date.now().toString() }] })),
removeReceivable: (id) => set((state) => ({ receivables: state.receivables.filter(receivable => receivable.id !== id) })),
updateReceivable: (id, updatedReceivable) => set((state) => ({
receivables: state.receivables.map(receivable => receivable.id === id ? { ...receivable, ...updatedReceivable } : receivable)
})),
addInstallment: (installment) => set((state) => ({ installments: [...state.installments, { ...installment, id: Date.now().toString() }] })),
removeInstallment: (id) => set((state) => ({ installments: state.installments.filter(installment => installment.id !== id) })),
updateInstallment: (id, updatedInstallment) => set((state) => ({
installments: state.installments.map(installment => installment.id === id ? { ...installment, ...updatedInstallment } : installment)
})),
getTotalAssets: () => {
return get().assets.reduce((total, item) => total + (Number(item.value) || 0), 0);
},
getTotalLiabilities: () => {
return get().liabilities.reduce((total, item) => total + (Number(item.currentDebt) || 0), 0);
},
getNetWorth: () => {
const assets = get().getTotalAssets();
const liabilities = get().getTotalLiabilities();
const receivables = get().receivables.reduce((t, i) => t + (Number(i.amount) || 0), 0);
return (assets + receivables) - liabilities;
},
getSafeToSpend: () => {
const liquidAssets = get().assets
.filter(a => a.type === 'liquid')
.reduce((total, item) => total + (Number(item.value) || 0), 0);
const totalDebt = get().getTotalLiabilities();
return liquidAssets - totalDebt;
}
}),
{
name: 'finance-storage',
storage: createJSONStorage(() => AsyncStorage),
}
)
);