'use client'; import { useRouter } from 'next/navigation'; import * as React from 'react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { useSavedSearches, useDeleteSavedSearch, useUpdateSavedSearch, } from '@/lib/hooks/use-saved-searches'; import { type SavedSearch, type SavedSearchFilters } from '@/lib/saved-search-api'; const PROPERTY_TYPE_LABELS: Record = { APARTMENT: 'Chung cư', HOUSE: 'Nhà phố', VILLA: 'Biệt thự', LAND: 'Đất nền', OFFICE: 'Văn phòng', SHOPHOUSE: 'Shophouse', }; const TRANSACTION_TYPE_LABELS: Record = { SALE: 'Bán', RENT: 'Cho thuê', }; function formatPrice(value: string): string { const num = Number(value); if (num >= 1_000_000_000) return `${(num / 1_000_000_000).toFixed(1)} tỷ`; if (num >= 1_000_000) return `${(num / 1_000_000).toFixed(0)} triệu`; return num.toLocaleString('vi-VN'); } function formatFilters(filters: SavedSearchFilters): string[] { const parts: string[] = []; if (filters.transactionType) { parts.push(TRANSACTION_TYPE_LABELS[filters.transactionType] ?? filters.transactionType); } if (filters.propertyType) { parts.push(PROPERTY_TYPE_LABELS[filters.propertyType] ?? filters.propertyType); } if (filters.district) parts.push(filters.district); if (filters.city) parts.push(filters.city); if (filters.priceMin && filters.priceMax) { parts.push(`${formatPrice(filters.priceMin)} - ${formatPrice(filters.priceMax)}`); } else if (filters.priceMin) { parts.push(`Từ ${formatPrice(filters.priceMin)}`); } else if (filters.priceMax) { parts.push(`Đến ${formatPrice(filters.priceMax)}`); } if (filters.areaMin || filters.areaMax) { if (filters.areaMin && filters.areaMax) { parts.push(`${filters.areaMin} - ${filters.areaMax} m²`); } else if (filters.areaMin) { parts.push(`Từ ${filters.areaMin} m²`); } else if (filters.areaMax) { parts.push(`Đến ${filters.areaMax} m²`); } } if (filters.bedrooms) parts.push(`${filters.bedrooms}+ phòng ngủ`); return parts; } function SavedSearchCard({ search, onDelete, onToggleAlert, onApplySearch, }: { search: SavedSearch; onDelete: (id: string) => void; onToggleAlert: (id: string, enabled: boolean) => void; onApplySearch: (filters: SavedSearchFilters) => void; }) { const [confirmDelete, setConfirmDelete] = React.useState(false); const filterTags = formatFilters(search.filters); return (
{search.name} Tạo lúc {new Date(search.createdAt).toLocaleDateString('vi-VN')} {search.lastAlertAt && ( <> · Thông báo gần nhất: {new Date(search.lastAlertAt).toLocaleDateString('vi-VN')} )}
{/* Filter tags */} {filterTags.length > 0 && (
{filterTags.map((tag, i) => ( {tag} ))}
)} {/* Actions */}
{confirmDelete ? (
) : ( )}
); } export default function SavedSearchesPage() { const router = useRouter(); const { data, isLoading, error } = useSavedSearches(); const deleteMutation = useDeleteSavedSearch(); const updateMutation = useUpdateSavedSearch(); const handleDelete = (id: string) => { deleteMutation.mutate(id); }; const handleToggleAlert = (id: string, enabled: boolean) => { updateMutation.mutate({ id, data: { alertEnabled: enabled } }); }; const handleApplySearch = (filters: SavedSearchFilters) => { const params = new URLSearchParams(); Object.entries(filters).forEach(([key, value]) => { if (value) params.set(key, String(value)); }); const qs = params.toString(); router.push(`/search${qs ? `?${qs}` : ''}`); }; return (
{/* Header */}

Tìm kiếm đã lưu

Quản lý các bộ lọc tìm kiếm và nhận thông báo khi có kết quả mới

{/* Content */} {isLoading ? (
) : error ? (

Không thể tải danh sách tìm kiếm đã lưu

) : !data || data.data.length === 0 ? (

Chưa có tìm kiếm nào được lưu

Bạn có thể lưu bộ lọc tìm kiếm từ trang tìm kiếm để nhận thông báo khi có kết quả mới

) : (

{data.total} tìm kiếm đã lưu

{data.data.map((search) => ( ))}
)}
); }