"use client";
import { UserIcon, PencilIcon, CheckIcon, XMarkIcon } from "@heroicons/react/24/outline";
import { Button } from "@/components/atoms/button";
import { Input } from "@/components/atoms/input";
/** Data required for displaying personal info card */
interface PersonalInfoData {
firstname: string | null | undefined;
lastname: string | null | undefined;
email: string;
phonenumber: string | null | undefined;
sfNumber: string | null | undefined;
dateOfBirth: string | null | undefined;
gender: string | null | undefined;
}
interface PersonalInfoCardProps {
/** User profile data including read-only fields */
data: PersonalInfoData;
/** Email value for editing (may differ from data.email during edit) */
editEmail: string;
/** Phone number value for editing (may differ from data.phonenumber during edit) */
editPhoneNumber: string;
isEditing: boolean;
isSaving: boolean;
onEdit: () => void;
onCancel: () => void;
onChange: (field: "email" | "phonenumber", value: string) => void;
onSave: () => void;
}
function ReadOnlyField({
label,
value,
hint,
}: {
label: string;
value: string | null | undefined;
hint: string;
}) {
return (
{value || Not provided}
{hint}
);
}
const EDITABLE_INPUT_CLASS =
"block w-full px-4 py-2.5 border border-input rounded-lg bg-background text-foreground shadow-[var(--cp-shadow-1)] focus:outline-none focus:ring-2 focus:ring-ring focus:border-ring transition-colors";
function EditableEmailField({
email,
editEmail,
isEditing,
onChange,
}: {
email: string;
editEmail: string;
isEditing: boolean;
onChange: (field: "email" | "phonenumber", value: string) => void;
}) {
return (
{isEditing ? (
onChange("email", e.target.value)}
className={EDITABLE_INPUT_CLASS}
/>
) : (
{email}
Email can be updated from the portal.
)}
);
}
function EditablePhoneField({
phonenumber,
editPhoneNumber,
isEditing,
onChange,
}: {
phonenumber: string | null | undefined;
editPhoneNumber: string;
isEditing: boolean;
onChange: (field: "email" | "phonenumber", value: string) => void;
}) {
return (
{isEditing ? (
onChange("phonenumber", e.target.value)}
placeholder="+81 XX-XXXX-XXXX"
className={EDITABLE_INPUT_CLASS}
/>
) : (
{phonenumber || Not provided}
)}
);
}
export function PersonalInfoCard({
data,
editEmail,
editPhoneNumber,
isEditing,
isSaving,
onEdit,
onCancel,
onChange,
onSave,
}: PersonalInfoCardProps) {
return (
Personal Information
{!isEditing && (
}
>
Edit
)}
{isEditing && (
}
>
Cancel
}
>
{isSaving ? "Saving..." : "Save Changes"}
)}
);
}