"use client"; import Image from "next/image"; import { useMemo } from "react"; import { FaBell } from "react-icons/fa6"; import Button from "@/components/ui/button"; import { PageBackground } from "@/components/utils/page-background"; import type { MarriageField, MarriageFieldValue, MarriageMatchSummary, } from "@/hooks/marriage/types"; import { useMarriageProfileQuery } from "@/hooks/marriage/use-profile-main"; import { useI18n } from "@/i18n/provider"; const advisorAvatars = [ { id: "advisor-primary", src: "/assets/images/Avatar Image.png" }, { id: "advisor-secondary", src: "/assets/images/Ellipse 370.png" }, { id: "advisor-tertiary", src: "/assets/images/Avatar Image.png" }, ]; const fieldCandidates = { name: ["name", "full_name", "fullname", "first_name", "display_name"], occupation: ["occupation", "job", "profession", "career", "work"], age: ["age"], city: ["city", "current_city", "residence_city", "location", "residence"], maritalStatus: ["marital_status", "maritalstatus", "relationship_status"], cityPreference: [ "city_preference", "citypreference", "preferred_city", "preferred_location", "future_residence", ], } as const; type DisplayField = { id: string; label: string; value: string; }; function normalizeFieldName(value: string) { return value .toLowerCase() .replace(/^q\d+[_-]?/, "") .replace(/[^a-z0-9]/g, ""); } function formatFieldValue(value: MarriageFieldValue) { if (value === null || value === "") { return null; } if (typeof value === "boolean") { return value ? "Yes" : "No"; } return String(value); } function titleFromKey(key: string) { return key .replace(/^q\d+[_-]?/i, "") .replace(/[_-]+/g, " ") .replace(/\s+/g, " ") .trim() .replace(/\b\w/g, (letter) => letter.toUpperCase()); } function toDisplayField(field: MarriageField): DisplayField | null { const value = formatFieldValue(field.value); if (!value) { return null; } return { id: field.key || field.label || value, label: field.label || titleFromKey(field.key), value, }; } function pickField( fields: MarriageField[], candidates: readonly string[], usedIndexes: Set, ) { const candidateSet = new Set(candidates.map(normalizeFieldName)); for (const [fieldIndex, field] of fields.entries()) { if (usedIndexes.has(fieldIndex)) { continue; } const displayField = toDisplayField(field); if ( displayField && [field.key, field.label].some((value) => candidateSet.has(normalizeFieldName(value)), ) ) { usedIndexes.add(fieldIndex); return displayField; } } return null; } function useMatchSummaryDisplay(matchSummary: MarriageMatchSummary | null) { return useMemo(() => { const fields = matchSummary?.public_info ?? []; const usedIndexes = new Set(); const name = pickField(fields, fieldCandidates.name, usedIndexes); const occupation = pickField( fields, fieldCandidates.occupation, usedIndexes, ); const age = pickField(fields, fieldCandidates.age, usedIndexes); const city = pickField(fields, fieldCandidates.city, usedIndexes); const maritalStatus = pickField( fields, fieldCandidates.maritalStatus, usedIndexes, ); const cityPreference = pickField( fields, fieldCandidates.cityPreference, usedIndexes, ); const extraFields = fields .filter((_, index) => !usedIndexes.has(index)) .map(toDisplayField) .filter((field): field is DisplayField => Boolean(field)) .slice(0, 4); return { age, city, cityPreference, extraFields, maritalStatus, name: name?.value ?? (matchSummary?.id ? `Profile #${matchSummary.id}` : null), occupation, }; }, [matchSummary]); } function FieldLine({ field }: { field: DisplayField }) { return (

{field.label}: {field.value}

); } export default function NewMatchPage() { const { dictionary: t } = useI18n(); const { data: profile, isError, isLoading } = useMarriageProfileQuery(); const matchSummary = profile?.match_summary ?? null; const matchDisplay = useMatchSummaryDisplay(matchSummary); const pairedFields = [matchDisplay.age, matchDisplay.city].filter( (field): field is DisplayField => Boolean(field), ); return ( <>

You have a new match!

A matching profile has been found. Information is provided by the girl's family or introducers. If you approve, we'll share your profile with her family

{isLoading ? (

Loading match summary...

) : isError ? (

Unable to load match summary.

) : matchSummary ? ( <>

Name: {matchDisplay.name}

{matchDisplay.occupation ? ( ) : null} {pairedFields.length ? (

{pairedFields.map((field, index) => ( {index > 0 ? | : null} {field.label}: {field.value} ))}

) : null} {matchDisplay.maritalStatus ? ( ) : null} {matchDisplay.cityPreference ? ( ) : null} {matchDisplay.extraFields.map((field) => ( ))}
) : (

No match summary is available yet.

)}

{t.findingMatch.advisorTitle}

{t.findingMatch.advisorDescription}

{advisorAvatars.map((avatar) => ( ))} +7
); }