Files
sarlink-portal/app/(dashboard)/users/[userId]/verify/page.tsx

194 lines
6.0 KiB
TypeScript

import { PencilIcon } from "lucide-react";
import Image from "next/image";
import Link from "next/link";
import { redirect } from "next/navigation";
import ClientErrorMessage from "@/components/client-error-message";
import InputReadOnly from "@/components/input-read-only";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import UserRejectDialog from "@/components/user/user-reject-dialog";
import { UserVerifyDialog } from "@/components/user/user-verify-dialog";
import { getNationalPerson } from "@/lib/person";
import { getProfileById } from "@/queries/users";
import { tryCatch } from "@/utils/tryCatch";
export default async function VerifyUserPage({
params,
}: {
params: Promise<{
userId: string;
}>;
}) {
const userId = (await params).userId;
const [error, dbUser] = await tryCatch(getProfileById(userId));
const [nationalDataEror, nationalData] = await tryCatch(getNationalPerson({ idCard: dbUser?.id_card ?? "" }))
if (nationalDataEror) {
console.warn("Error fetching national data:", nationalDataEror);
}
if (error) {
if (error.message === "UNAUTHORIZED") {
redirect("/auth/signin");
} else {
return <ClientErrorMessage message={error.message} />;
}
}
// return <pre>{JSON.stringify(nationalData, null, 2)}</pre>
const fullName = `${dbUser?.first_name} ${dbUser?.last_name}`;
const nationalDob = nationalData?.dob?.split("T")[0];
const dbUserDob = new Date(dbUser?.dob).toISOString().split("T")[0];
return (
<div>
<div className="flex items-center justify-between text-gray-500 text-2xl font-bold title-bg py-4 px-2 mb-4">
<h3 className="text-sarLinkOrange text-2xl">Verify user</h3>
<div className="flex gap-2">
{dbUser && !dbUser?.verified && <UserVerifyDialog user={dbUser} />}
{dbUser && !dbUser?.verified && <UserRejectDialog user={dbUser} />}
<Link href={'update'}>
<Button className="hover:cursor-pointer">
<PencilIcon />
Update User
</Button>
</Link>
{dbUser?.verified && (
<Badge variant={"secondary"} className="bg-lime-500">
Verified
</Badge>
)}
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 items-start justify-start">
<div id="database-information">
<h4 className="p-2 rounded font-semibold">Database Information</h4>
<div className="shadow-md p-2 bg-sarLinkOrange/10 border border-dashed border-sarLinkOrange rounded-lg space-y-1 my-2 grid grid-cols-1 md:grid-cols-2 gap-2">
<InputReadOnly
showCheck
checkTrue={dbUser?.id_card === nationalData?.nic}
labelClassName="text-sarLinkOrange"
label="ID Card"
value={dbUser?.id_card ?? ""}
/>
<InputReadOnly
showCheck
checkTrue={fullName === nationalData?.name_en}
labelClassName="text-sarLinkOrange"
label="Name"
value={fullName}
/>
<InputReadOnly
showCheck
checkTrue={dbUser?.address === nationalData?.house_name_en}
labelClassName="text-sarLinkOrange"
label="House Name"
value={dbUser?.address ?? ""}
/>
<InputReadOnly
showCheck
checkTrue={dbUser?.island?.name === nationalData?.island_name_en}
labelClassName="text-sarLinkOrange"
label="Island"
value={dbUser?.island?.name ?? ""}
/>
<InputReadOnly
showCheck
checkTrue={dbUser?.atoll.name === nationalData?.atoll_en}
labelClassName="text-sarLinkOrange"
label="Atoll"
value={dbUser?.atoll?.name ?? ""}
/>
<InputReadOnly
showCheck
checkTrue={
dbUserDob === nationalDob
}
labelClassName="text-sarLinkOrange"
label="DOB"
value={new Date(dbUser?.dob ?? "").toLocaleDateString("en-US", {
month: "short",
day: "2-digit",
year: "numeric",
})}
/>
<InputReadOnly
showCheck
checkTrue={dbUser?.mobile === nationalData?.primary_contact}
labelClassName="text-sarLinkOrange"
label="Phone Number"
value={dbUser?.mobile ?? ""}
/>
</div>
</div>
{(
<div id="national-information">
<h4 className="p-2 rounded font-semibold">National Information</h4>
<div className="bg-green-800/10 shadow p-2 rounded-lg border border-dashed border-green-800 space-y-1 my-2 grid grid-cols-1 md:grid-cols-2 gap-2">
<InputReadOnly
showCheck={false}
labelClassName="text-green-500"
label="ID Card"
value={nationalData?.nic ?? ""}
/>
<InputReadOnly
showCheck={false}
labelClassName="text-green-500"
label="Name"
value={nationalData?.name_en ?? ""}
/>
<InputReadOnly
showCheck={false}
labelClassName="text-green-500"
label="House Name"
value={nationalData?.house_name_en ?? ""}
/>
<InputReadOnly
showCheck={false}
labelClassName="text-green-500"
label="Island"
value={nationalData?.island_name_en ?? ""}
/>
<InputReadOnly
showCheck={false}
labelClassName="text-green-500"
label="Atoll"
value={nationalData?.atoll_en ?? ""}
/>
<InputReadOnly
showCheck={false}
labelClassName="text-green-500"
label="DOB"
value={new Date(nationalData?.dob ?? "").toLocaleDateString(
"en-US",
{
month: "short",
day: "2-digit",
year: "numeric",
},
)}
/>
<InputReadOnly
showCheck={false}
labelClassName="text-green-500"
label="Phone Number"
value={nationalData?.primary_contact ?? ""}
/>
<div className="flex flex-col col-span-2 items-center justify-center">
<Image
src={nationalData?.image_url || "https://i.pravatar.cc/300"}
height={100}
width={100}
className="object-fit aspect-square rounded-full"
alt="id photo"
/>
</div>
</div>
</div>
)}
</div>
</div>
);
}