feat: incident report form, API route, middleware shared-route + redirect

This commit is contained in:
2026-07-10 13:19:45 +08:00
parent a40a0f7c59
commit 3f8da5bd91
9 changed files with 505 additions and 32 deletions
+44
View File
@@ -0,0 +1,44 @@
export const dynamic = 'force-dynamic'
import { redirect } from 'next/navigation'
import { createClient } from '@/lib/supabase/server'
import { ReportForm } from '@/components/incidents/report-form'
interface Props {
searchParams: Promise<{ zone?: string }>
}
export default async function ReportPage({ searchParams }: Props) {
const { zone } = await searchParams
const supabase = await createClient()
const { data, error: authError } = await supabase.auth.getUser()
if (authError || !data?.user) redirect(`/login?redirect=/report${zone ? `?zone=${zone}` : ''}`)
let zoneData: { id: string; name: string; site_id: string; sites: { name: string } } | null = null
if (zone) {
const { data: zd } = await supabase
.from('zones')
.select('id, name, site_id, sites (name)')
.eq('qr_code_token', zone)
.single()
zoneData = zd as typeof zoneData
}
return (
<main className="min-h-screen bg-gray-50 py-6 px-4 max-w-lg mx-auto">
<div className="mb-6">
<h1 className="text-2xl font-bold text-gray-900">Report an Incident</h1>
{zoneData ? (
<p className="text-sm text-gray-600 mt-1">
{(zoneData.sites as any)?.name ?? 'Unknown Site'} {zoneData.name}
</p>
) : (
<p className="text-sm text-amber-600 mt-1">No zone detected zone will not be recorded</p>
)}
</div>
<ReportForm zoneToken={zone ?? null} zoneName={zoneData?.name ?? null} siteName={(zoneData?.sites as any)?.name ?? null} />
</main>
)
}
+30
View File
@@ -0,0 +1,30 @@
export const dynamic = 'force-dynamic'
import Link from 'next/link'
interface Props {
searchParams: Promise<{ ref?: string }>
}
export default async function ReportSuccessPage({ searchParams }: Props) {
const { ref } = await searchParams
return (
<main className="min-h-screen bg-gray-50 flex items-center justify-center px-4">
<div className="bg-white rounded-xl shadow-sm p-8 max-w-sm w-full text-center">
<div className="text-4xl mb-4"></div>
<h1 className="text-xl font-bold text-gray-900 mb-2">Report submitted</h1>
{ref && (
<p className="text-sm text-gray-600 mb-1">
Reference: <span className="font-mono font-semibold">{ref}</span>
</p>
)}
<p className="text-sm text-gray-500 mb-6">
The supervisor and HSE officer have been notified.
</p>
<Link href="/report" className="text-sm text-blue-600 hover:underline">
Submit another report
</Link>
</div>
</main>
)
}