"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { DotsThree, Plus, PencilSimple, Trash, ToggleLeft } from '@/lib/icons'; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { deleteCustomerSearchAction, toggleCustomerSearchActiveAction, } from "@/lib/appwrite/customer-search-actions"; import { SearchFormSheet } from "./search-form-sheet"; import { DeleteConfirmDialog } from "@/components/ui/delete-confirm-dialog"; import type { Customer, CustomerSearch } from "@/lib/appwrite/schema"; interface SearchesClientProps { initialSearches: CustomerSearch[]; customers: Customer[]; } export function SearchesClient({ initialSearches, customers }: SearchesClientProps) { const router = useRouter(); const [searches, setSearches] = useState(initialSearches); const [sheetOpen, setSheetOpen] = useState(false); const [editing, setEditing] = useState(null); const [deleteTarget, setDeleteTarget] = useState(null); function customerName(id: string) { return customers.find((c) => c.$id === id)?.name ?? id; } function openCreate() { setEditing(null); setSheetOpen(true); } function openEdit(s: CustomerSearch) { setEditing(s); setSheetOpen(true); } async function handleToggle(s: CustomerSearch) { const next = !s.isActive; const result = await toggleCustomerSearchActiveAction(s.$id, next); if (result.ok) { setSearches((prev) => prev.map((x) => x.$id === s.$id ? { ...x, isActive: next } : x)); } else { toast.error(result.error ?? "Durum güncellenemedi."); } } async function doDelete() { if (!deleteTarget) return; const result = await deleteCustomerSearchAction(deleteTarget.$id); if (result.ok) { setSearches((prev) => prev.filter((x) => x.$id !== deleteTarget.$id)); setDeleteTarget(null); toast.success("Arama kriteri silindi."); } else { toast.error(result.error ?? "Silinemedi."); } } function formatRange(min?: number | null, max?: number | null, unit = "") { if (min && max) return `${min.toLocaleString("tr-TR")}–${max.toLocaleString("tr-TR")} ${unit}`.trim(); if (min) return `≥ ${min.toLocaleString("tr-TR")} ${unit}`.trim(); if (max) return `≤ ${max.toLocaleString("tr-TR")} ${unit}`.trim(); return "—"; } function parseJsonList(json?: string | null): string { if (!json) return "—"; try { const arr = JSON.parse(json) as string[]; return arr.length ? arr.join(", ") : "—"; } catch { return json; } } return (

Arama Kriterleri

Müşteri Tür Oda Fiyat Aralığı Şehir / İlçe Durum {searches.length === 0 && ( Henüz arama kriteri yok. )} {searches.map((s) => ( {customerName(s.customerId)} {s.listingType ?? "Tümü"} {parseJsonList(s.roomCounts)} {formatRange(s.minPrice, s.maxPrice, "₺")} {[parseJsonList(s.cities), parseJsonList(s.districts)] .filter((v) => v !== "—") .join(" / ") || "—"} {s.isActive ? "Aktif" : "Pasif"} openEdit(s)}> Düzenle handleToggle(s)}> {s.isActive ? "Pasif yap" : "Aktif yap"} setDeleteTarget(s)} className="text-destructive focus:text-destructive" > Sil ))}
router.refresh()} /> { if (!v) setDeleteTarget(null); }} title="Bu arama kriteri silinsin mi?" description="Arama kriteri ve eşleşme bildirimleri kalıcı olarak silinecek." onConfirm={doDelete} />
); }