Q: Why do mountain climbers rope themselves together?

A:	To prevent the sensible ones from going home.
This commit is contained in:
Sebastien Castiel
2024-10-25 15:02:31 -04:00
parent 9bdc8a715c
commit c1c75fa260
29 changed files with 73 additions and 96 deletions

View File

@@ -9,7 +9,6 @@
"check-formatting": "prettier -c src",
"prettier": "prettier -w src",
"postinstall": "prisma generate",
"build": "tsc"
},
"dependencies": {
"@formatjs/intl-localematcher": "^0.5.4",

View File

@@ -2,4 +2,4 @@ export {
appRouter,
type AppRouter,
type AppRouterOutput,
} from '@/trpc/routers/_app'
} from './trpc/routers/_app'

View File

@@ -1,7 +1,7 @@
import { prisma } from '@/lib/prisma'
import { ExpenseFormValues, GroupFormValues } from '@/lib/schemas'
import { ActivityType, Expense } from '@prisma/client'
import { nanoid } from 'nanoid'
import { prisma } from './prisma'
import { ExpenseFormValues, GroupFormValues } from './schemas'
export function randomId() {
return nanoid()

View File

@@ -1,6 +1,6 @@
import { getGroupExpenses } from '@/lib/api'
import { Participant } from '@prisma/client'
import { match } from 'ts-pattern'
import { getGroupExpenses } from './api'
export type Balances = Record<
Participant['id'],
@@ -87,7 +87,10 @@ export function getPublicBalances(reimbursements: Reimbursement[]): Balances {
* This ensures that a participant executing a suggested reimbursement
* does not result in completely new repayment suggestions.
*/
function compareBalancesForReimbursements(b1: any, b2: any): number {
function compareBalancesForReimbursements(
b1: { total: number; participantId: string },
b2: { total: number; participantId: string },
): number {
// positive balances come before negative balances
if (b1.total > 0 && 0 > b2.total) {
return -1
@@ -95,7 +98,7 @@ function compareBalancesForReimbursements(b1: any, b2: any): number {
return 1
}
// if signs match, sort based on userid
return b1.participantId < b2.participantId ? -1 : 1
return b1.participantId.localeCompare(b2.participantId)
}
export function getSuggestedReimbursements(

View File

@@ -2,7 +2,7 @@ import { PrismaClient } from '@prisma/client'
declare const global: Global & { prisma?: PrismaClient }
export let p: PrismaClient = undefined as any as PrismaClient
export let p: PrismaClient = undefined as unknown as PrismaClient
if (typeof window === 'undefined') {
// await delay(1000)

View File

@@ -1,4 +1,4 @@
import { getGroupExpenses } from '@/lib/api'
import { getGroupExpenses } from './api'
export function getTotalGroupSpending(
expenses: NonNullable<Awaited<ReturnType<typeof getGroupExpenses>>>,
@@ -55,14 +55,15 @@ export function getTotalActiveUserShare(
// Calculate the user's share based on their percentage of the total expense
total += (expense.amount * userPaidFor.shares) / 10000 // Assuming shares are out of 10000 for percentage
break
case 'BY_SHARES':
// Calculate the user's share based on their shares relative to the total shares
case 'BY_SHARES': // Calculate the user's share based on their shares relative to the total shares
{
const totalShares = paidFors.reduce(
(sum, paidFor) => sum + paidFor.shares,
0,
)
total += (expense.amount * userPaidFor.shares) / totalShares
break
}
}
})

View File

@@ -1,21 +0,0 @@
import { defaultShouldDehydrateQuery, QueryClient } from '@tanstack/react-query'
import superjson from 'superjson'
export function makeQueryClient() {
return new QueryClient({
defaultOptions: {
queries: {
staleTime: 30 * 1000,
},
dehydrate: {
serializeData: superjson.serialize,
shouldDehydrateQuery: (query) =>
defaultShouldDehydrateQuery(query) ||
query.state.status === 'pending',
},
hydrate: {
deserializeData: superjson.deserialize,
},
},
})
}

View File

@@ -1,7 +1,6 @@
import { categoriesRouter } from '@/trpc/routers/categories'
import { groupsRouter } from '@/trpc/routers/groups'
import { inferRouterOutputs } from '@trpc/server'
import { createTRPCRouter } from '../init'
import { categoriesRouter } from './categories'
export const appRouter = createTRPCRouter({
groups: groupsRouter,

View File

@@ -1,5 +1,5 @@
import { createTRPCRouter } from '@/trpc/init'
import { listCategoriesProcedure } from '@/trpc/routers/categories/list.procedure'
import { createTRPCRouter } from '../../init'
import { listCategoriesProcedure } from './list.procedure'
export const categoriesRouter = createTRPCRouter({
list: listCategoriesProcedure,

View File

@@ -1,5 +1,5 @@
import { getCategories } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { getCategories } from '../../../lib/api'
import { baseProcedure } from '../../init'
export const listCategoriesProcedure = baseProcedure.query(async () => {
return { categories: await getCategories() }

View File

@@ -1,5 +1,5 @@
import { createTRPCRouter } from '@/trpc/init'
import { listGroupActivitiesProcedure } from '@/trpc/routers/groups/activities/list.procedure'
import { createTRPCRouter } from '../../../init'
import { listGroupActivitiesProcedure } from './list.procedure'
export const activitiesRouter = createTRPCRouter({
list: listGroupActivitiesProcedure,

View File

@@ -1,6 +1,6 @@
import { getActivities } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { getActivities } from '../../../../lib/api'
import { baseProcedure } from '../../../init'
export const listGroupActivitiesProcedure = baseProcedure
.input(

View File

@@ -1,5 +1,5 @@
import { createTRPCRouter } from '@/trpc/init'
import { listGroupBalancesProcedure } from '@/trpc/routers/groups/balances/list.procedure'
import { createTRPCRouter } from '../../../init'
import { listGroupBalancesProcedure } from './list.procedure'
export const groupBalancesRouter = createTRPCRouter({
list: listGroupBalancesProcedure,

View File

@@ -1,11 +1,11 @@
import { getGroupExpenses } from '@/lib/api'
import { z } from 'zod'
import { getGroupExpenses } from '../../../../lib/api'
import {
getBalances,
getPublicBalances,
getSuggestedReimbursements,
} from '@/lib/balances'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
} from '../../../../lib/balances'
import { baseProcedure } from '../../../init'
export const listGroupBalancesProcedure = baseProcedure
.input(z.object({ groupId: z.string().min(1) }))

View File

@@ -1,7 +1,7 @@
import { createGroup } from '@/lib/api'
import { groupFormSchema } from '@/lib/schemas'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { createGroup } from '../../../lib/api'
import { groupFormSchema } from '../../../lib/schemas'
import { baseProcedure } from '../../init'
export const createGroupProcedure = baseProcedure
.input(

View File

@@ -1,7 +1,7 @@
import { createExpense } from '@/lib/api'
import { expenseFormSchema } from '@/lib/schemas'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { createExpense } from '../../../../lib/api'
import { expenseFormSchema } from '../../../../lib/schemas'
import { baseProcedure } from '../../../init'
export const createGroupExpenseProcedure = baseProcedure
.input(

View File

@@ -1,6 +1,6 @@
import { deleteExpense } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { deleteExpense } from '../../../../lib/api'
import { baseProcedure } from '../../../init'
export const deleteGroupExpenseProcedure = baseProcedure
.input(

View File

@@ -1,7 +1,7 @@
import { getExpense } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { TRPCError } from '@trpc/server'
import { z } from 'zod'
import { getExpense } from '../../../../lib/api'
import { baseProcedure } from '../../../init'
export const getGroupExpenseProcedure = baseProcedure
.input(z.object({ groupId: z.string().min(1), expenseId: z.string().min(1) }))

View File

@@ -1,9 +1,9 @@
import { createTRPCRouter } from '@/trpc/init'
import { createGroupExpenseProcedure } from '@/trpc/routers/groups/expenses/create.procedure'
import { deleteGroupExpenseProcedure } from '@/trpc/routers/groups/expenses/delete.procedure'
import { getGroupExpenseProcedure } from '@/trpc/routers/groups/expenses/get.procedure'
import { listGroupExpensesProcedure } from '@/trpc/routers/groups/expenses/list.procedure'
import { updateGroupExpenseProcedure } from '@/trpc/routers/groups/expenses/update.procedure'
import { createTRPCRouter } from '../../../init'
import { createGroupExpenseProcedure } from './create.procedure'
import { deleteGroupExpenseProcedure } from './delete.procedure'
import { getGroupExpenseProcedure } from './get.procedure'
import { listGroupExpensesProcedure } from './list.procedure'
import { updateGroupExpenseProcedure } from './update.procedure'
export const groupExpensesRouter = createTRPCRouter({
list: listGroupExpensesProcedure,

View File

@@ -1,6 +1,6 @@
import { getGroupExpenses } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { getGroupExpenses } from '../../../../lib/api'
import { baseProcedure } from '../../../init'
export const listGroupExpensesProcedure = baseProcedure
.input(

View File

@@ -1,7 +1,7 @@
import { updateExpense } from '@/lib/api'
import { expenseFormSchema } from '@/lib/schemas'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { updateExpense } from '../../../../lib/api'
import { expenseFormSchema } from '../../../../lib/schemas'
import { baseProcedure } from '../../../init'
export const updateGroupExpenseProcedure = baseProcedure
.input(

View File

@@ -1,6 +1,6 @@
import { getGroup } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { getGroup } from '../../../lib/api'
import { baseProcedure } from '../../init'
export const getGroupProcedure = baseProcedure
.input(z.object({ groupId: z.string().min(1) }))

View File

@@ -1,7 +1,7 @@
import { getGroup, getGroupExpensesParticipants } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { TRPCError } from '@trpc/server'
import { z } from 'zod'
import { getGroup, getGroupExpensesParticipants } from '../../../lib/api'
import { baseProcedure } from '../../init'
export const getGroupDetailsProcedure = baseProcedure
.input(z.object({ groupId: z.string().min(1) }))

View File

@@ -1,13 +1,13 @@
import { createTRPCRouter } from '@/trpc/init'
import { activitiesRouter } from '@/trpc/routers/groups/activities'
import { groupBalancesRouter } from '@/trpc/routers/groups/balances'
import { createGroupProcedure } from '@/trpc/routers/groups/create.procedure'
import { groupExpensesRouter } from '@/trpc/routers/groups/expenses'
import { getGroupProcedure } from '@/trpc/routers/groups/get.procedure'
import { groupStatsRouter } from '@/trpc/routers/groups/stats'
import { updateGroupProcedure } from '@/trpc/routers/groups/update.procedure'
import { createTRPCRouter } from '../../init'
import { activitiesRouter } from './activities'
import { groupBalancesRouter } from './balances'
import { createGroupProcedure } from './create.procedure'
import { groupExpensesRouter } from './expenses'
import { getGroupProcedure } from './get.procedure'
import { getGroupDetailsProcedure } from './getDetails.procedure'
import { listGroupsProcedure } from './list.procedure'
import { groupStatsRouter } from './stats'
import { updateGroupProcedure } from './update.procedure'
export const groupsRouter = createTRPCRouter({
expenses: groupExpensesRouter,

View File

@@ -1,6 +1,6 @@
import { getGroups } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { getGroups } from '../../../lib/api'
import { baseProcedure } from '../../init'
export const listGroupsProcedure = baseProcedure
.input(

View File

@@ -1,11 +1,11 @@
import { getGroupExpenses } from '@/lib/api'
import { z } from 'zod'
import { getGroupExpenses } from '../../../../lib/api'
import {
getTotalActiveUserPaidFor,
getTotalActiveUserShare,
getTotalGroupSpending,
} from '@/lib/totals'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
} from '../../../../lib/totals'
import { baseProcedure } from '../../../init'
export const getGroupStatsProcedure = baseProcedure
.input(

View File

@@ -1,5 +1,5 @@
import { createTRPCRouter } from '@/trpc/init'
import { getGroupStatsProcedure } from '@/trpc/routers/groups/stats/get.procedure'
import { createTRPCRouter } from '../../../init'
import { getGroupStatsProcedure } from './get.procedure'
export const groupStatsRouter = createTRPCRouter({
get: getGroupStatsProcedure,

View File

@@ -1,7 +1,7 @@
import { updateGroup } from '@/lib/api'
import { groupFormSchema } from '@/lib/schemas'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
import { updateGroup } from '../../../lib/api'
import { groupFormSchema } from '../../../lib/schemas'
import { baseProcedure } from '../../init'
export const updateGroupProcedure = baseProcedure
.input(

View File

@@ -12,10 +12,6 @@
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"paths": {
"@/*": ["./src/*"]
},
"outDir": "./dist",
"declaration": true
},
"include": ["./src/index.ts", "./reset.d.ts"],