Skip to content

Commit ecb64a3

Browse files
committed
fix: description is nullable, only show delete / edit if you own the expense
1 parent 9b20a96 commit ecb64a3

File tree

3 files changed

+80
-78
lines changed

3 files changed

+80
-78
lines changed

frontend/src/components/create-pool-modal.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { Input } from "./ui/input"
1818

1919
const poolSchema = z.object({
2020
poolName: z.string().min(1, "Required"),
21-
poolDescription: z.string().min(1, "Required"),
21+
poolDescription: z.string().optional(),
2222
})
2323

2424
type PoolFormValues = z.infer<typeof poolSchema>
@@ -71,7 +71,7 @@ export function CreatePoolModal({
7171
await createPool({
7272
body: {
7373
name: data.poolName,
74-
description: data.poolDescription,
74+
description: data.poolDescription ?? undefined,
7575
},
7676
params: {
7777
path: {

frontend/src/components/expense.tsx

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -119,38 +119,40 @@ export function Expense({
119119
</div>
120120
</div>
121121
</div>
122-
<div className="flex items-center gap-x-1">
123-
<Button
124-
size="sm"
125-
variant="ghost"
126-
className="text-muted-foreground hover:text-foreground h-8 w-8 p-0"
127-
onClick={() => setIsUpdateModalOpen(true)}
128-
aria-label={`Edit expense: ${expense.name}`}
129-
>
130-
<Edit className="size-4" />
131-
</Button>
132-
<Button
133-
size="sm"
134-
variant="ghost"
135-
className="text-destructive hover:text-destructive h-8 w-8 p-0"
136-
onClick={async () => {
137-
await deleteExpense({
138-
params: {
139-
path: {
140-
pool_id: expense.pool_id,
141-
member_id: memberId,
142-
expense_id: expense.id,
122+
{expense.paid_by_member_id === memberId && (
123+
<div className="flex items-center gap-x-1">
124+
<Button
125+
size="sm"
126+
variant="ghost"
127+
className="text-muted-foreground hover:text-foreground h-8 w-8 p-0"
128+
onClick={() => setIsUpdateModalOpen(true)}
129+
aria-label={`Edit expense: ${expense.name}`}
130+
>
131+
<Edit className="size-4" />
132+
</Button>
133+
<Button
134+
size="sm"
135+
variant="ghost"
136+
className="text-destructive hover:text-destructive h-8 w-8 p-0"
137+
onClick={async () => {
138+
await deleteExpense({
139+
params: {
140+
path: {
141+
pool_id: expense.pool_id,
142+
member_id: memberId,
143+
expense_id: expense.id,
144+
},
143145
},
144-
},
145-
headers: createAuthHeader(),
146-
})
147-
}}
148-
disabled={isPending}
149-
aria-label={`Delete expense: ${expense.name}`}
150-
>
151-
<X className="size-4" />
152-
</Button>
153-
</div>
146+
headers: createAuthHeader(),
147+
})
148+
}}
149+
disabled={isPending}
150+
aria-label={`Delete expense: ${expense.name}`}
151+
>
152+
<X className="size-4" />
153+
</Button>
154+
</div>
155+
)}
154156
</div>
155157
{expense.description && (
156158
<div className="py-4">{expense.description}</div>

frontend/src/routeTree.gen.ts

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,67 +10,67 @@
1010

1111
// Import Routes
1212

13-
import { Route as rootRoute } from "./routes/__root"
14-
import { Route as IndexImport } from "./routes/index"
15-
import { Route as LoginImport } from "./routes/login"
16-
import { Route as PoolsPoolIdImport } from "./routes/pools.$poolId"
17-
import { Route as SignupImport } from "./routes/signup"
13+
import { Route as rootRoute } from './routes/__root'
14+
import { Route as SignupImport } from './routes/signup'
15+
import { Route as LoginImport } from './routes/login'
16+
import { Route as IndexImport } from './routes/index'
17+
import { Route as PoolsPoolIdImport } from './routes/pools.$poolId'
1818

1919
// Create/Update Routes
2020

2121
const SignupRoute = SignupImport.update({
22-
id: "/signup",
23-
path: "/signup",
22+
id: '/signup',
23+
path: '/signup',
2424
getParentRoute: () => rootRoute,
2525
} as any)
2626

2727
const LoginRoute = LoginImport.update({
28-
id: "/login",
29-
path: "/login",
28+
id: '/login',
29+
path: '/login',
3030
getParentRoute: () => rootRoute,
3131
} as any)
3232

3333
const IndexRoute = IndexImport.update({
34-
id: "/",
35-
path: "/",
34+
id: '/',
35+
path: '/',
3636
getParentRoute: () => rootRoute,
3737
} as any)
3838

3939
const PoolsPoolIdRoute = PoolsPoolIdImport.update({
40-
id: "/pools/$poolId",
41-
path: "/pools/$poolId",
40+
id: '/pools/$poolId',
41+
path: '/pools/$poolId',
4242
getParentRoute: () => rootRoute,
4343
} as any)
4444

4545
// Populate the FileRoutesByPath interface
4646

47-
declare module "@tanstack/react-router" {
47+
declare module '@tanstack/react-router' {
4848
interface FileRoutesByPath {
49-
"/": {
50-
id: "/"
51-
path: "/"
52-
fullPath: "/"
49+
'/': {
50+
id: '/'
51+
path: '/'
52+
fullPath: '/'
5353
preLoaderRoute: typeof IndexImport
5454
parentRoute: typeof rootRoute
5555
}
56-
"/login": {
57-
id: "/login"
58-
path: "/login"
59-
fullPath: "/login"
56+
'/login': {
57+
id: '/login'
58+
path: '/login'
59+
fullPath: '/login'
6060
preLoaderRoute: typeof LoginImport
6161
parentRoute: typeof rootRoute
6262
}
63-
"/signup": {
64-
id: "/signup"
65-
path: "/signup"
66-
fullPath: "/signup"
63+
'/signup': {
64+
id: '/signup'
65+
path: '/signup'
66+
fullPath: '/signup'
6767
preLoaderRoute: typeof SignupImport
6868
parentRoute: typeof rootRoute
6969
}
70-
"/pools/$poolId": {
71-
id: "/pools/$poolId"
72-
path: "/pools/$poolId"
73-
fullPath: "/pools/$poolId"
70+
'/pools/$poolId': {
71+
id: '/pools/$poolId'
72+
path: '/pools/$poolId'
73+
fullPath: '/pools/$poolId'
7474
preLoaderRoute: typeof PoolsPoolIdImport
7575
parentRoute: typeof rootRoute
7676
}
@@ -80,33 +80,33 @@ declare module "@tanstack/react-router" {
8080
// Create and export the route tree
8181

8282
export interface FileRoutesByFullPath {
83-
"/": typeof IndexRoute
84-
"/login": typeof LoginRoute
85-
"/signup": typeof SignupRoute
86-
"/pools/$poolId": typeof PoolsPoolIdRoute
83+
'/': typeof IndexRoute
84+
'/login': typeof LoginRoute
85+
'/signup': typeof SignupRoute
86+
'/pools/$poolId': typeof PoolsPoolIdRoute
8787
}
8888

8989
export interface FileRoutesByTo {
90-
"/": typeof IndexRoute
91-
"/login": typeof LoginRoute
92-
"/signup": typeof SignupRoute
93-
"/pools/$poolId": typeof PoolsPoolIdRoute
90+
'/': typeof IndexRoute
91+
'/login': typeof LoginRoute
92+
'/signup': typeof SignupRoute
93+
'/pools/$poolId': typeof PoolsPoolIdRoute
9494
}
9595

9696
export interface FileRoutesById {
9797
__root__: typeof rootRoute
98-
"/": typeof IndexRoute
99-
"/login": typeof LoginRoute
100-
"/signup": typeof SignupRoute
101-
"/pools/$poolId": typeof PoolsPoolIdRoute
98+
'/': typeof IndexRoute
99+
'/login': typeof LoginRoute
100+
'/signup': typeof SignupRoute
101+
'/pools/$poolId': typeof PoolsPoolIdRoute
102102
}
103103

104104
export interface FileRouteTypes {
105105
fileRoutesByFullPath: FileRoutesByFullPath
106-
fullPaths: "/" | "/login" | "/signup" | "/pools/$poolId"
106+
fullPaths: '/' | '/login' | '/signup' | '/pools/$poolId'
107107
fileRoutesByTo: FileRoutesByTo
108-
to: "/" | "/login" | "/signup" | "/pools/$poolId"
109-
id: "__root__" | "/" | "/login" | "/signup" | "/pools/$poolId"
108+
to: '/' | '/login' | '/signup' | '/pools/$poolId'
109+
id: '__root__' | '/' | '/login' | '/signup' | '/pools/$poolId'
110110
fileRoutesById: FileRoutesById
111111
}
112112

0 commit comments

Comments
 (0)