@accounter/client
Version:
Accounter client application
69 lines (57 loc) • 1.93 kB
text/typescript
import type { LoaderFunctionArgs, Params } from 'react-router-dom';
/**
* Type-safe route parameter definitions
*/
export interface ChargeParams extends Params {
chargeId: string;
}
export interface BusinessParams extends Params {
businessId: string;
}
export interface BusinessTripParams extends Params {
businessTripId: string;
}
export interface ReportYearParams extends Params {
year?: string;
}
/**
* Type-safe loader argument types
*/
export type ChargeLoaderArgs = LoaderFunctionArgs<ChargeParams>;
export type BusinessLoaderArgs = LoaderFunctionArgs<BusinessParams>;
export type BusinessTripLoaderArgs = LoaderFunctionArgs<BusinessTripParams>;
export type ReportYearLoaderArgs = LoaderFunctionArgs<ReportYearParams>;
/**
* Helper functions to validate and parse params
*/
export function validateChargeParams(params: Params): ChargeParams {
if (!params.chargeId) {
throw new Response('Charge ID is required', { status: 400 });
}
return { chargeId: params.chargeId };
}
export function validateBusinessParams(params: Params): BusinessParams {
if (!params.businessId) {
throw new Response('Business ID is required', { status: 400 });
}
return { businessId: params.businessId };
}
export function validateBusinessTripParams(params: Params): BusinessTripParams {
if (!params.businessTripId) {
throw new Response('Business Trip ID is required', { status: 400 });
}
return { businessTripId: params.businessTripId };
}
export function parseYearParam(params: Params): number | undefined {
if (!params.year) return undefined;
const year = parseInt(params.year, 10);
if (Number.isNaN(year) || year < 2000 || year > 2100) {
throw new Response('Invalid year parameter', { status: 400 });
}
return year;
}
export interface RouteHandle {
breadcrumb?: string | ((data?: unknown) => string);
title?: string | ((data?: unknown) => string);
[key: string]: unknown;
}