'use client'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { Pencil, Plus, Trash2 } from 'lucide-react'; import Image from 'next/image'; import Link from 'next/link'; import * as React from 'react'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Select } from '@/components/ui/select'; import { useAuthStore } from '@/lib/auth-store'; import { formatPrice } from '@/lib/currency'; import { duAnApi, PROJECT_STATUS_COLORS, PROJECT_STATUS_LABELS, type ProjectStatus, type SearchProjectsParams, } from '@/lib/du-an-api'; import { shimmerBlurDataURL } from '@/lib/image-blur'; const STATUS_OPTIONS: { value: ProjectStatus; label: string }[] = [ { value: 'PLANNING', label: PROJECT_STATUS_LABELS.PLANNING }, { value: 'UNDER_CONSTRUCTION', label: PROJECT_STATUS_LABELS.UNDER_CONSTRUCTION }, { value: 'HANDOVER', label: PROJECT_STATUS_LABELS.HANDOVER }, { value: 'COMPLETED', label: PROJECT_STATUS_LABELS.COMPLETED }, ]; const INITIAL_FILTERS = { q: '', status: '' as '' | ProjectStatus, city: '', page: 1, }; export default function ProjectsAdminPage() { const [filters, setFilters] = React.useState(INITIAL_FILTERS); const role = useAuthStore((s) => s.user?.role); const isDeveloper = role === 'DEVELOPER'; const queryParams = React.useMemo(() => { const params: SearchProjectsParams = { page: filters.page, limit: 12 }; if (filters.q) params.q = filters.q; if (filters.status) params.status = filters.status; if (filters.city) params.city = filters.city; return params; }, [filters]); const { data: result, isLoading } = useQuery({ queryKey: ['admin-projects', { mine: isDeveloper, ...queryParams }], // DEVELOPER sees only their own projects; ADMIN sees all. queryFn: () => (isDeveloper ? duAnApi.searchMine(queryParams) : duAnApi.search(queryParams)), staleTime: 30_000, }); const queryClient = useQueryClient(); const deleteMutation = useMutation({ mutationFn: (id: string) => duAnApi.delete(id), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['admin-projects'] }), }); const handleDelete = (id: string, name: string) => { if (!window.confirm(`Xoá dự án "${name}"? Thao tác này không thể hoàn tác.`)) return; deleteMutation.mutate(id); }; const resetFilters = () => setFilters(INITIAL_FILTERS); return (
{/* Header */}

Quản lý dự án

Tạo, chỉnh sửa và xoá dự án bất động sản.

{/* Filters */}
setFilters((f) => ({ ...f, q: e.target.value, page: 1 }))} placeholder="Tìm theo tên dự án..." className="w-64" /> setFilters((f) => ({ ...f, city: e.target.value, page: 1 }))} placeholder="Thành phố" className="w-48" />
{/* Error banner */} {deleteMutation.isError && (

Không thể xoá dự án. Vui lòng thử lại.

)} {/* Content */} {isLoading ? (
) : !result || result.data.length === 0 ? (

Chưa có dự án nào

) : (
{result.data.map((project) => ( ))}
Ảnh Tên dự án Chủ đầu tư Thành phố / Quận Tổng căn Giá từ Trạng thái Thao tác
{project.thumbnailUrl ? ( {project.name} ) : (
N/A
)}
{project.name} {project.developer.name} {project.city} {project.district ? ` / ${project.district}` : ''} {project.totalUnits} {project.minPrice ? formatPrice(project.minPrice) : '—'} {PROJECT_STATUS_LABELS[project.status]}
)} {/* Pagination */} {result && result.totalPages > 1 && (
Trang {result.page} / {result.totalPages}
)}
); }