feat(web): complete du-an project pages, neighborhood components, and public notification bell

- Add grid/map view toggle on /du-an listing page with Mapbox project markers
- Enhance du-an detail with master plan viewer, neighborhood radar chart, POI map, and price history chart
- Create neighborhood component suite: radar chart (Recharts), POI map (Mapbox), score badges
- Add du-an API client, server-side fetching, and React Query hooks
- Wire NotificationBell into public layout header for authenticated users
- Fix missing PROJECT_STATUS_COLORS import in du-an detail client

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-16 05:11:21 +07:00
parent 8da488711b
commit e21e096e54
14 changed files with 1299 additions and 49 deletions

View File

@@ -5,6 +5,7 @@ import { usePathname } from 'next/navigation';
import { useTranslations } from 'next-intl';
import { useState } from 'react';
import { CompareFloatingBar } from '@/components/comparison/compare-floating-bar';
import { NotificationBell } from '@/components/notifications/notification-bell';
import { Button } from '@/components/ui/button';
import { LanguageSwitcher } from '@/components/ui/language-switcher';
import { Link } from '@/i18n/navigation';
@@ -28,6 +29,11 @@ export default function PublicLayout({ children }: { children: React.ReactNode }
label: t('nav.search'),
isActive: pathname.includes('/search'),
},
{
href: '/du-an' as const,
label: t('nav.projects'),
isActive: pathname.includes('/du-an'),
},
{
href: '/pricing' as const,
label: t('nav.pricing'),
@@ -68,6 +74,7 @@ export default function PublicLayout({ children }: { children: React.ReactNode }
<LanguageSwitcher />
{user ? (
<>
<NotificationBell />
<span className="hidden text-sm text-muted-foreground sm:inline">
{user.fullName}
</span>