'use client'; import { Building2, LayoutGrid, List, Map, MapPin } from 'lucide-react'; import dynamic from 'next/dynamic'; import Image from 'next/image'; import { notFound } from 'next/navigation'; import * as React from 'react'; import { ProjectCard } from '@/components/du-an/project-card'; import { ProjectFilterBar } from '@/components/du-an/project-filter-bar'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Link } from '@/i18n/navigation'; import { formatPrice } from '@/lib/currency'; import { PROJECT_PROPERTY_TYPE_LABELS, PROJECT_STATUS_COLORS, PROJECT_STATUS_LABELS, type ProjectSummary, type SearchProjectsParams, } from '@/lib/du-an-api'; import { useProjectsSearch } from '@/lib/hooks/use-du-an'; import { useResidentialProjectsFlag } from '@/lib/hooks/use-residential-projects-flag'; import { cn } from '@/lib/utils'; const ProjectMap = dynamic( () => import('@/components/du-an/project-map').then((m) => m.ProjectMap), { ssr: false }, ); const PAGE_SIZE = 12; type ViewMode = 'grid' | 'list' | 'map'; export default function DuAnPage() { const flagEnabled = useResidentialProjectsFlag(); const [filters, setFilters] = React.useState({ page: 1, limit: PAGE_SIZE, }); const [viewMode, setViewMode] = React.useState('grid'); const { data, isLoading, isError } = useProjectsSearch(filters); if (!flagEnabled) { notFound(); } const handleFilterChange = (newFilters: SearchProjectsParams) => { setFilters({ ...newFilters, limit: PAGE_SIZE }); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const handlePageChange = (page: number) => { setFilters((prev) => ({ ...prev, page })); window.scrollTo({ top: 0, behavior: 'smooth' }); }; return (
{/* Page header */}

Dự án bất động sản

Khám phá các dự án mới nhất từ các chủ đầu tư uy tín

{/* Filters */} {/* Results */}
{isLoading ? (
{Array.from({ length: 6 }).map((_, i) => (
))}
) : isError ? (

Không thể tải danh sách dự án. Vui lòng thử lại.

) : data && data.data.length > 0 ? ( <>

{data.total} dự án được tìm thấy

{viewMode === 'map' ? ( ) : viewMode === 'list' ? (
{data.data.map((project) => ( ))}
) : (
{data.data.map((project) => ( ))}
)} {/* Pagination (grid/list mode) */} {viewMode !== 'map' && data.totalPages > 1 && (
Trang {data.page} / {data.totalPages}
)} ) : (

Không tìm thấy dự án

Thử thay đổi bộ lọc để tìm kiếm nhiều hơn

)}
); } function ProjectListItem({ project }: { project: ProjectSummary }) { const statusLabel = PROJECT_STATUS_LABELS[project.status]; const statusColor = PROJECT_STATUS_COLORS[project.status]; const propertyLabels = project.propertyTypes .map((t) => PROJECT_PROPERTY_TYPE_LABELS[t]) .join(', '); return ( {/* Thumbnail */}
{project.thumbnailUrl ? ( {project.name} ) : (
)} {statusLabel}
{/* Content */}

{project.name}

{project.district}, {project.city}
{propertyLabels} · {project.totalUnits} căn · {project.developer.name}
{project.minPrice ? (

{formatPrice(project.minPrice)} {project.maxPrice && project.maxPrice !== project.minPrice && ( – {formatPrice(project.maxPrice)} )}

) : (

Liên hệ

)}
); }