fix architecture and write new tests

This commit is contained in:
root
2026-06-10 00:40:19 -04:00
parent 560da1cadf
commit 80a597bc10
377 changed files with 84020 additions and 1337 deletions
@@ -131,6 +131,30 @@ const copy = {
},
} as const
export function calculateBookingTotalDays(startDate: string, endDate: string): number {
if (!startDate || !endDate) return 0
return Math.max(0, Math.ceil((new Date(endDate).getTime() - new Date(startDate).getTime()) / 86_400_000))
}
export function resolveReturnLocation({
dropoffMode,
returnLocation,
pickupLocation,
}: {
dropoffMode: 'same' | 'different'
returnLocation: string
pickupLocation: string
}): string | undefined {
if (dropoffMode === 'different') return returnLocation || undefined
return pickupLocation || undefined
}
export function normalizeOptionalText(value: string): string | undefined {
const trimmed = value.trim()
return trimmed || undefined
}
export default function BookingForm({
vehicleId,
companySlug,
@@ -169,10 +193,7 @@ export default function BookingForm({
const [error, setError] = useState<string | null>(null)
const [success, setSuccess] = useState(false)
const totalDays =
startDate && endDate
? Math.max(0, Math.ceil((new Date(endDate).getTime() - new Date(startDate).getTime()) / 86_400_000))
: 0
const totalDays = calculateBookingTotalDays(startDate, endDate)
async function handleSubmit(e: React.FormEvent) {
e.preventDefault()
@@ -228,12 +249,12 @@ export default function BookingForm({
licenseExpiry: new Date(licenseExpiry).toISOString(),
licenseCountry: licenseCountry.trim(),
licenseCategory: licenseCategory.trim(),
internationalLicenseNumber: internationalLicenseNumber.trim() || undefined,
internationalLicenseNumber: normalizeOptionalText(internationalLicenseNumber),
startDate: start.toISOString(),
endDate: end.toISOString(),
pickupLocation: pickupLocation || undefined,
returnLocation: dropoffMode === 'different' ? (returnLocation || undefined) : (pickupLocation || undefined),
notes: notes.trim() || undefined,
returnLocation: resolveReturnLocation({ dropoffMode, returnLocation, pickupLocation }),
notes: normalizeOptionalText(notes),
language,
})
setSuccess(true)