frontend fully integreated with the backend

This commit is contained in:
Kalana B. Thilakarathna
2026-08-25 23:47:33 +05:30
parent 1bee5f91c6
commit 83d3272784
151 changed files with 10724 additions and 573 deletions
@@ -0,0 +1,73 @@
'use client'
import { useState, useEffect } from 'react'
import { useForm, zodResolver, z } from '@/lib/form'
import { FormField } from '@/components/shared/form-field'
import { Checkbox } from '@/components/ui/checkbox'
import { Button } from '@/components/ui/button'
import { FieldGroup } from '@/components/ui/field'
import { toast } from '@/components/ui/toast'
import { compliance as complianceApi, getApiError } from '@/lib/api/index'
const schema = z.object({
enforceLicenseExpiry: z.boolean(),
enforceMedicalClearance: z.boolean(),
})
type FormValues = z.infer<typeof schema>
export default function CompliancePage() {
const [loading, setLoading] = useState(true)
const form = useForm<FormValues>({
resolver: zodResolver(schema),
defaultValues: { enforceLicenseExpiry: false, enforceMedicalClearance: false },
})
useEffect(() => {
complianceApi.get().then(cfg => {
form.reset({ enforceLicenseExpiry: cfg.enforceLicenseExpiry, enforceMedicalClearance: cfg.enforceMedicalClearance })
}).catch(err => toast.add({ title: 'Failed to load config', description: getApiError(err), type: 'error' }))
.finally(() => setLoading(false))
}, [])
async function onSubmit(values: FormValues) {
try {
await complianceApi.update(values)
toast.add({ title: 'Compliance config saved', type: 'success' })
} catch (err) {
toast.add({ title: 'Failed to save', description: getApiError(err), type: 'error' })
}
}
return (
<div className="flex flex-col gap-6 max-w-lg">
<div>
<h1 className="text-2xl font-semibold text-foreground">Compliance</h1>
<p className="text-sm text-muted-foreground mt-0.5">Rules that enforce license and medical clearance before a ride starts</p>
</div>
{loading ? <p className="text-muted-foreground text-sm">Loading...</p> : (
<form onSubmit={form.handleSubmit(onSubmit)} className="flex flex-col gap-6">
<FieldGroup>
<FormField control={form.control} name="enforceLicenseExpiry"
render={({ field }) => (
<div className="flex items-center gap-2">
<Checkbox id="enforceLicenseExpiry" checked={field.value as boolean} onCheckedChange={field.onChange} />
<label htmlFor="enforceLicenseExpiry" className="text-sm font-medium cursor-pointer">Enforce license expiry check</label>
</div>
)} />
<FormField control={form.control} name="enforceMedicalClearance"
render={({ field }) => (
<div className="flex items-center gap-2">
<Checkbox id="enforceMedicalClearance" checked={field.value as boolean} onCheckedChange={field.onChange} />
<label htmlFor="enforceMedicalClearance" className="text-sm font-medium cursor-pointer">Enforce medical clearance check</label>
</div>
)} />
</FieldGroup>
<div>
<Button type="submit" disabled={form.formState.isSubmitting}>{form.formState.isSubmitting ? 'Saving…' : 'Save Changes'}</Button>
</div>
</form>
)}
</div>
)
}