Skip to content

Commit 4e8ac23

Browse files
fix: improve type safety and input validation
- Update activity type casting in backend service for better Prisma compatibility - Refine currency prop type in web component to prevent type mismatches - Add accessibility titles to select elements in recurring expense list - Enhance currency cents input normalization with integer validation in shared types Fixes #2, #3, #5, #20
1 parent f161b18 commit 4e8ac23

3 files changed

Lines changed: 10 additions & 4 deletions

File tree

apps/backend/src/activity/activity.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export class ActivityService {
7878
data: {
7979
groupId: params.groupId,
8080
actorUserId: params.actorUserId,
81-
type: params.type as never,
81+
type: params.type as Prisma.ActivityType,
8282
entityId: params.entityId,
8383
metadata: (params.metadata ?? {}) as Prisma.InputJsonValue,
8484
},

apps/web/src/components/groups/RecurringExpenseList.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { useToast } from '../ui/Toaster';
1818
type RecurringExpenseListProps = {
1919
recurringExpenses: RecurringExpenseDto[];
2020
members: GroupMemberSummaryDto[];
21-
currency: string;
21+
currency: CurrencyCode;
2222
onChanged?: () => void;
2323
};
2424

@@ -208,6 +208,7 @@ export function RecurringExpenseList({ recurringExpenses, members, currency, onC
208208
placeholder="Amount"
209209
/>
210210
<select
211+
title="Category"
211212
className="rounded-xl border border-[var(--fs-border)] bg-[var(--fs-card)] p-3 text-sm text-[var(--fs-text-primary)] outline-none focus:border-[var(--fs-primary)]"
212213
value={category}
213214
onChange={(event) => setCategory(event.target.value as ExpenseCategory | '')}
@@ -220,6 +221,7 @@ export function RecurringExpenseList({ recurringExpenses, members, currency, onC
220221
))}
221222
</select>
222223
<select
224+
title="Frequency"
223225
className="rounded-xl border border-[var(--fs-border)] bg-[var(--fs-card)] p-3 text-sm text-[var(--fs-text-primary)] outline-none focus:border-[var(--fs-primary)]"
224226
value={frequency}
225227
onChange={(event) => setFrequency(event.target.value as RecurringExpenseFrequency)}
@@ -288,7 +290,7 @@ export function RecurringExpenseList({ recurringExpenses, members, currency, onC
288290
<div className="mt-3 flex items-center justify-between text-sm">
289291
<span className="font-medium text-[var(--fs-text-muted)]">Amount</span>
290292
<span className="text-lg font-extrabold text-[var(--fs-primary)]">
291-
{formatCurrencyFromCents(item.totalAmountCents, currency as CurrencyCode)}
293+
{formatCurrencyFromCents(item.totalAmountCents, currency)}
292294
</span>
293295
</div>
294296
</>

packages/shared-types/src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ function normalizeCentsInput(amountCents: bigint | number | string): string {
2424
return String(amountCents);
2525
}
2626

27-
return amountCents.trim();
27+
const trimmed = amountCents.trim();
28+
if (!/^-?\d+$/.test(trimmed)) {
29+
throw new Error('Currency formatter expects an integer-cent string.');
30+
}
31+
return trimmed;
2832
}
2933

3034
/**

0 commit comments

Comments
 (0)