diff --git a/app/routes/account/manage.tsx b/app/routes/account/manage.tsx index 6b615ab..75f9439 100644 --- a/app/routes/account/manage.tsx +++ b/app/routes/account/manage.tsx @@ -50,7 +50,7 @@ function validateConfirmPassword(confirmPassword: unknown, password: string) { } function validateIcon(icon: unknown) { - if (typeof icon === "string" && icon.length > 2) { + if (typeof icon === "string" && icon.length < 0) { return `Icons must be a single character, e.g. "A" or "😎"`; } } diff --git a/app/routes/expenses/index.tsx b/app/routes/expenses/index.tsx index d802f3a..aeed653 100644 --- a/app/routes/expenses/index.tsx +++ b/app/routes/expenses/index.tsx @@ -5,7 +5,22 @@ import { db } from "~/utils/db.server"; import { getUser } from "~/utils/session.server"; import Group from "~/icons/Group"; -type LoaderData = { lastExpenses: (Expense & { user: User })[]; user: User }; +type LoaderData = { + lastExpenses: (Expense & { user: User })[]; + user: User; + teamCounts: { + id: string; + username: string; + icon: string; + count: number; + spent: number; + dueAmount: number; + }[]; + totalExpenses: { + count: number; + amount: number; + }; +}; export const loader: LoaderFunction = async ({ request }) => { const user = await getUser(request); @@ -21,7 +36,45 @@ export const loader: LoaderFunction = async ({ request }) => { where: { teamId: user.teamId }, }); - const data: LoaderData = { lastExpenses, user }; + let teamExpenses = await db.expense.groupBy({ + by: ["userId"], + _count: { + _all: true, + }, + _sum: { + amount: true, + }, + where: { user: { teamId: user.teamId } }, + }); + let expensesByUser = user.team.members.map((m) => ({ + id: m.id, + username: m.username, + icon: m.icon, + count: teamExpenses.find((e) => e.userId === m.id)?._count?._all ?? 0, + spent: teamExpenses.find((e) => e.userId === m.id)?._sum?.amount ?? 0, + dueAmount: 0, + })); + let totalExpenses = expensesByUser.reduce( + (acc, { count, spent }) => ({ + count: acc.count + count, + amount: acc.amount + spent, + }), + { count: 0, amount: 0 } + ); + const avgPerUser = totalExpenses.amount / user.team.members.length; + let teamCounts = expensesByUser.map((userData) => ({ + ...userData, + dueAmount: avgPerUser - userData.spent, + })); + console.log("totalExpenses", totalExpenses); + console.log("expensesByUser", expensesByUser); + + const data: LoaderData = { + lastExpenses, + user, + totalExpenses, + teamCounts, + }; return data; }; @@ -66,8 +119,41 @@ export default function JokesIndexRoute() {