Use tRPC in other group pages (#249)

* Use tRPC in group edition + group layout

* Use tRPC in group modals

* Use tRPC in group stats

* Use tRPC in group activity
This commit is contained in:
Sebastien Castiel
2024-10-19 21:29:53 -04:00
committed by GitHub
parent 66e15e419e
commit 210c12b7ef
35 changed files with 709 additions and 498 deletions

View File

@@ -1,9 +1,11 @@
import { categoriesRouter } from '@/trpc/routers/categories'
import { groupsRouter } from '@/trpc/routers/groups'
import { inferRouterOutputs } from '@trpc/server'
import { createTRPCRouter } from '../init'
export const appRouter = createTRPCRouter({
groups: groupsRouter,
categories: categoriesRouter,
})
export type AppRouter = typeof appRouter

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,23 @@
import { getActivities } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
export const listGroupActivitiesProcedure = baseProcedure
.input(
z.object({
groupId: z.string(),
cursor: z.number().optional().default(0),
limit: z.number().optional().default(5),
}),
)
.query(async ({ input: { groupId, cursor, limit } }) => {
const activities = await getActivities(groupId, {
offset: cursor,
length: limit + 1,
})
return {
activities: activities.slice(0, limit),
hasMore: !!activities[limit],
nextCursor: cursor + limit,
}
})

View File

@@ -1,14 +1,10 @@
import { getGroup } from '@/lib/api'
import { getGroup, getGroupExpensesParticipants } from '@/lib/api'
import { baseProcedure } from '@/trpc/init'
import { TRPCError } from '@trpc/server'
import { z } from 'zod'
export const getGroupInformationProcedure = baseProcedure
.input(
z.object({
groupId: z.string().min(1),
}),
)
export const getGroupProcedure = baseProcedure
.input(z.object({ groupId: z.string().min(1) }))
.query(async ({ input: { groupId } }) => {
const group = await getGroup(groupId)
if (!group) {
@@ -17,5 +13,7 @@ export const getGroupInformationProcedure = baseProcedure
message: 'Group not found.',
})
}
return { information: group.information ?? '' }
const participantsWithExpenses = await getGroupExpensesParticipants(groupId)
return { group, participantsWithExpenses }
})

View File

@@ -1,10 +1,17 @@
import { createTRPCRouter } from '@/trpc/init'
import { activitiesRouter } from '@/trpc/routers/groups/activities'
import { groupBalancesRouter } from '@/trpc/routers/groups/balances'
import { groupExpensesRouter } from '@/trpc/routers/groups/expenses'
import { groupInformationRouter } from '@/trpc/routers/groups/information'
import { getGroupProcedure } from '@/trpc/routers/groups/get.procedure'
import { groupStatsRouter } from '@/trpc/routers/groups/stats'
import { updateGroupProcedure } from '@/trpc/routers/groups/update.procedure'
export const groupsRouter = createTRPCRouter({
expenses: groupExpensesRouter,
balances: groupBalancesRouter,
information: groupInformationRouter,
stats: groupStatsRouter,
activities: activitiesRouter,
get: getGroupProcedure,
update: updateGroupProcedure,
})

View File

@@ -1,6 +0,0 @@
import { createTRPCRouter } from '@/trpc/init'
import { getGroupInformationProcedure } from '@/trpc/routers/groups/information/get.procedure'
export const groupInformationRouter = createTRPCRouter({
get: getGroupInformationProcedure,
})

View File

@@ -0,0 +1,35 @@
import { getGroupExpenses } from '@/lib/api'
import {
getTotalActiveUserPaidFor,
getTotalActiveUserShare,
getTotalGroupSpending,
} from '@/lib/totals'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
export const getGroupStatsProcedure = baseProcedure
.input(
z.object({
groupId: z.string().min(1),
participantId: z.string().optional(),
}),
)
.query(async ({ input: { groupId, participantId } }) => {
const expenses = await getGroupExpenses(groupId)
const totalGroupSpendings = getTotalGroupSpending(expenses)
const totalParticipantSpendings =
participantId !== undefined
? getTotalActiveUserPaidFor(participantId, expenses)
: undefined
const totalParticipantShare =
participantId !== undefined
? getTotalActiveUserShare(participantId, expenses)
: undefined
return {
totalGroupSpendings,
totalParticipantSpendings,
totalParticipantShare,
}
})

View File

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

View File

@@ -0,0 +1,16 @@
import { updateGroup } from '@/lib/api'
import { groupFormSchema } from '@/lib/schemas'
import { baseProcedure } from '@/trpc/init'
import { z } from 'zod'
export const updateGroupProcedure = baseProcedure
.input(
z.object({
groupId: z.string().min(1),
groupFormValues: groupFormSchema,
participantId: z.string().optional(),
}),
)
.mutation(async ({ input: { groupId, groupFormValues, participantId } }) => {
await updateGroup(groupId, groupFormValues, participantId)
})