main page and group car
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
"use client";
|
||||
import { create } from "zustand";
|
||||
import { calculateSplits, type Payment } from "@/lib/utils/expense";
|
||||
import type { Session } from "next-auth";
|
||||
import type { PublicUser } from "next-auth";
|
||||
import type { Group, User } from "@/server/db/schema";
|
||||
|
||||
export enum SplitTypeEnum {
|
||||
Fixed = "fixed",
|
||||
@@ -14,18 +13,21 @@ export const splitTypeKeys = Object.keys(SplitTypeEnum);
|
||||
|
||||
interface ExpenseStore {
|
||||
amount: number;
|
||||
session: Session | null;
|
||||
|
||||
participants: PublicUser[];
|
||||
participants: User[];
|
||||
groupBadges: Group[];
|
||||
|
||||
friendTarget?: string;
|
||||
splitType: SplitType;
|
||||
payments: Payment[];
|
||||
splits: Record<string, string>;
|
||||
|
||||
setAmount: (amount: number) => void;
|
||||
setSession: (session: Session) => void;
|
||||
|
||||
addParticipant: (user: PublicUser) => void;
|
||||
addGroupBadges: (groupIds: Group[]) => void;
|
||||
removeGroupBadge: (groupIds: string[]) => void;
|
||||
|
||||
addParticipants: (user: User[]) => void;
|
||||
removeParticipant: (userId: string) => void;
|
||||
|
||||
setFriendTarget: (id?: string) => void;
|
||||
@@ -43,9 +45,11 @@ const defaultValues: Pick<
|
||||
| "splitType"
|
||||
| "payments"
|
||||
| "splits"
|
||||
| "groupBadges"
|
||||
> = {
|
||||
amount: 0,
|
||||
participants: [],
|
||||
groupBadges: [],
|
||||
friendTarget: undefined,
|
||||
splitType: "Equal",
|
||||
payments: [],
|
||||
@@ -54,25 +58,14 @@ const defaultValues: Pick<
|
||||
|
||||
export const useExpenseStore = create<ExpenseStore>((set, get) => ({
|
||||
...defaultValues,
|
||||
session: null,
|
||||
setAmount: (amount) => set({ amount }),
|
||||
setSession: (session) =>
|
||||
set(
|
||||
{
|
||||
session,
|
||||
participants: [session.user],
|
||||
payments: [{ amount: get().amount, userId: session.user.id }],
|
||||
},
|
||||
false
|
||||
),
|
||||
|
||||
addParticipant: (newUser) => {
|
||||
addParticipants: (newUsers) => {
|
||||
const { participants } = get();
|
||||
if (!participants.find((user) => user.id === newUser.id)) {
|
||||
set({ participants: [...participants, newUser] });
|
||||
}
|
||||
const uniqueUsers = newUsers.filter(
|
||||
(user) => !participants.find((u) => u.id === user.id)
|
||||
);
|
||||
set({ participants: [...participants, ...uniqueUsers] });
|
||||
},
|
||||
|
||||
removeParticipant: (userId) => {
|
||||
const filtered = get().participants.filter((user) => user.id !== userId);
|
||||
set({ participants: filtered });
|
||||
@@ -92,5 +85,17 @@ export const useExpenseStore = create<ExpenseStore>((set, get) => ({
|
||||
set({ splits });
|
||||
},
|
||||
|
||||
addGroupBadges: (newGroups) => {
|
||||
const { groupBadges } = get();
|
||||
const uniqueGroups = newGroups.filter(
|
||||
(group) => !groupBadges.find((g) => g.id === group.id)
|
||||
);
|
||||
set({ groupBadges: [...groupBadges, ...uniqueGroups] });
|
||||
},
|
||||
removeGroupBadge: (groupIds) =>
|
||||
set({
|
||||
groupBadges: get().groupBadges.filter(({ id }) => !groupIds.includes(id)),
|
||||
}),
|
||||
|
||||
resetExpenseStore: () => set(defaultValues),
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user