"use client"; import { useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useTranslations } from "next-intl"; import { Plus, Pencil, Search, Trash2 } from "lucide-react"; import { apiDelete, apiGet } from "@/lib/api/client"; import type { Customer } from "@/lib/api/types"; import { useAuthStore } from "@/lib/stores/auth.store"; import { formatNumber } from "@/lib/format"; import { notify } from "@/lib/notify"; import { useApiError } from "@/lib/use-api-error"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { LabeledField } from "@/components/ui/labeled-field"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { ConfirmDialog } from "@/components/ui/confirm-dialog"; import { CustomerWizard, type CustomerWizardMode } from "@/components/crm/customer-wizard"; export function CrmScreen() { const t = useTranslations("crm"); const tCommon = useTranslations("common"); const apiError = useApiError(); const cafeId = useAuthStore((s) => s.user?.cafeId); const queryClient = useQueryClient(); const [search, setSearch] = useState(""); const [debouncedSearch, setDebouncedSearch] = useState(""); const [wizardOpen, setWizardOpen] = useState(false); const [wizardMode, setWizardMode] = useState("create"); const [editingCustomer, setEditingCustomer] = useState(null); const [deleteTarget, setDeleteTarget] = useState(null); const { data: customers = [], isLoading } = useQuery({ queryKey: ["customers", cafeId, debouncedSearch], queryFn: () => apiGet( `/api/cafes/${cafeId}/customers${debouncedSearch ? `?q=${encodeURIComponent(debouncedSearch)}` : ""}` ), enabled: !!cafeId, }); const openWizard = (mode: CustomerWizardMode, customer?: Customer) => { setWizardMode(mode); setEditingCustomer(customer ?? null); setWizardOpen(true); }; const refreshCustomers = () => { queryClient.invalidateQueries({ queryKey: ["customers", cafeId] }); }; const deleteCustomer = useMutation({ mutationFn: (id: string) => apiDelete(`/api/cafes/${cafeId}/customers/${id}`), onSuccess: () => { refreshCustomers(); setDeleteTarget(null); notify.success(t("deleted")); }, onError: (err) => notify.error(apiError(err)), }); if (!cafeId) return null; return (

{t("title")}

setSearch(e.target.value)} onKeyDown={(e) => e.key === "Enter" && setDebouncedSearch(search)} />
{isLoading ? (

{tCommon("loading")}

) : customers.length === 0 ? (

{t("noCustomers")}

) : (
{customers.map((c) => (
{c.name} {t(`groups.${c.group}`)}

{c.phone}

{c.nationalId ? (

{t("nationalId")}: {c.nationalId}

) : null}

{t("loyaltyPoints")}: {formatNumber(c.loyaltyPoints)}

))}
)} { if (!o) setDeleteTarget(null); }} title={t("deleteConfirmTitle")} description={deleteTarget ? t("deleteConfirmDesc", { name: deleteTarget.name }) : undefined} busy={deleteCustomer.isPending} onConfirm={() => deleteTarget && deleteCustomer.mutate(deleteTarget.id)} /> setWizardOpen(false)} onSaved={refreshCustomers} />
); }