"use client"; import { useState } from "react"; import { format } from "date-fns"; import { getDocumentDateFnsLocale } from "@/lib/i18n/date-fns"; import { Card, CardContent, Badge, Button, Input, Textarea, Label } from "poyraz-ui/atoms"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogFooter, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, DialogDescription, Tabs, TabsList, TabsTrigger, TabsContent } from "poyraz-ui/molecules"; import { Phone, Mail, ExternalLink, Calendar, Plus, MessageSquare, UserPlus, Loader2, Copy } from "lucide-react"; import { toast } from "poyraz-ui/molecules"; import { addClientActivity } from "./actions"; import { useTranslations } from "@/components/i18n/i18n-provider"; export type ClientDetailData = { id: string; name: string; company_name: string | null; email: string | null; phone: string | null; website: string | null; pipeline_stage: string; status: string; notes: string | null; client_auth_id: string | null; portal_locale: string; translations?: Record>; }; export type ClientActivity = { id: string; type: "note" | "call" | "meeting" | "email"; title: string; content: string | null; activity_date: string; created_at: string; translations?: Record>; }; export function ClientDetailClient({ client, activities, locales, currentLocale, }: { client: ClientDetailData; activities: ClientActivity[]; locales: Array<{ code: string; nativeName: string; name: string }>; currentLocale: string; }) { const [isAddingActivity, setIsAddingActivity] = useState(false); const [openDialog, setOpenDialog] = useState(false); const [portalLocale, setPortalLocale] = useState(client.portal_locale); const t = useTranslations(); const getActivityIcon = (type: string) => { switch (type) { case "call": return ; case "meeting": return ; case "email": return ; default: return ; } }; const getActivityBadge = (type: string) => { switch (type) { case "call": return {t("clients.detail.activityTypes.call")}; case "meeting": return {t("clients.detail.activityTypes.meeting")}; case "email": return {t("clients.detail.activityTypes.email")}; default: return {t("clients.detail.activityTypes.note")}; } }; async function handleAddActivity(formData: FormData) { setIsAddingActivity(true); try { await addClientActivity(client.id, formData); setOpenDialog(false); } finally { setIsAddingActivity(false); } } const [isCreatingUser, setIsCreatingUser] = useState(false); const [createUserOpen, setCreateUserOpen] = useState(false); const [invitationUrl, setInvitationUrl] = useState(null); async function handleCreateUser(e: React.FormEvent) { e.preventDefault(); const formData = new FormData(e.currentTarget); const email = formData.get("email") as string; const locale = formData.get("locale") as string; setIsCreatingUser(true); try { const res = await fetch("/api/create-client-user", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email, client_id: client.id, locale }) }); const data = await res.json(); if (!res.ok || data.error) { throw new Error(data.error || "clients.detail.portalInviteFailed"); } setInvitationUrl(data.invitation.invitationUrl); setPortalLocale(data.invitation.locale ?? locale); toast.success(t("clients.detail.portalInviteCreated")); } catch (error: unknown) { toast.error(resolveTranslatedError(t, error, "clients.detail.portalInviteFailed")); } finally { setIsCreatingUser(false); } } async function handlePortalLocaleChange(nextLocale: string) { setPortalLocale(nextLocale); try { const response = await fetch(`/api/portal-clients/${client.id}/locale`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ locale: nextLocale }), }); const data = await response.json(); if (!response.ok || data.error) throw new Error(data.error || "clients.detail.portalLocaleUpdateFailed"); toast.success(t("clients.detail.portalLocaleUpdated")); } catch (error) { setPortalLocale(client.portal_locale); toast.error(resolveTranslatedError(t, error, "clients.detail.portalLocaleUpdateFailed")); } } return (
{/* Header Info */}
{client.name.split(" ").slice(0, 2).map(n => n[0]?.toUpperCase()).join("")}

{client.name}

{client.status} {client.pipeline_stage.replace('_', ' ')} {!client.client_auth_id && (
{t("clients.detail.invitePortal")} {t("clients.detail.portalInviteDescription")}
{invitationUrl ? (

{t("clients.detail.invitationUrlHelp")}

) : null}
)} {client.client_auth_id && ( <> {t("clients.detail.portalActive")} )}
{/* Left Column: Contact & Details */}

{t("clients.detail.contactInfo")}

{client.email ? ( ) : null} {client.phone ? ( ) : null} {client.website ? ( ) : null} {!client.email && !client.phone && !client.website && (

{t("clients.detail.noContact")}

)}

{t("clients.form.notes")}

{client.notes ? (

{client.notes}

) : (

{t("clients.detail.noNotes")}

)}
{/* Right Column: Activities & Timeline */}

{t("clients.detail.activityHistory")}

{t("clients.detail.addActivity")}
{locales.map((locale) => ( {locale.name} ))} {locales.map((locale) => (