From 6acd5ebe2e83355654e893ca872c652c03f048df Mon Sep 17 00:00:00 2001 From: streaper2 Date: Sat, 9 May 2026 21:12:01 +0200 Subject: [PATCH] feat: implement business detail client view with interactive features including rating, favoriting, messaging, and analytics tracking --- .env | 2 +- app/HomeClient.tsx | 14 +- app/actions/upload.ts | 28 +++ app/annuaire/[id]/BusinessDetailClient.tsx | 197 +++++++++++++++++++ app/annuaire/page.tsx | 18 +- app/api/businesses/route.ts | 37 +++- app/dashboard/page.tsx | 10 +- app/globals.css | 5 +- app/layout.tsx | 14 ++ components/TagInput.tsx | 15 +- components/dashboard/DashboardProfile.tsx | 211 +++++++++++++++++++-- next.config.mjs | 5 + public/uploads/1777833997337-98dkw92.gif | Bin 1605 -> 0 bytes public/uploads/1777834233872-lz35qcr.jpg | Bin 35102 -> 0 bytes 14 files changed, 516 insertions(+), 40 deletions(-) create mode 100644 app/actions/upload.ts delete mode 100644 public/uploads/1777833997337-98dkw92.gif delete mode 100644 public/uploads/1777834233872-lz35qcr.jpg diff --git a/.env b/.env index b12abdd..0946db5 100644 --- a/.env +++ b/.env @@ -5,4 +5,4 @@ DATABASE_URL="postgresql://admin:adminpassword@192.168.1.25:5432/afrohub_dev?sch # Exemple avec Supabase ou Neon (si base distante) # DATABASE_URL="postgresql://postgres:[MOT_DE_PASSE]@db.[ID_PROJET].supabase.co:5432/postgres" # Environnement : "development" = accents rouges, "production" = accents normaux -NEXT_PUBLIC_APP_ENV=production \ No newline at end of file +NEXT_PUBLIC_APP_ENV=development \ No newline at end of file diff --git a/app/HomeClient.tsx b/app/HomeClient.tsx index a967cbb..6ba4b83 100644 --- a/app/HomeClient.tsx +++ b/app/HomeClient.tsx @@ -19,6 +19,7 @@ const HomeClient = ({ initialFeatured, initialPosts, initialCategories }: Props) const router = useRouter(); const { user, settings } = useUser(); const [searchTerm, setSearchTerm] = useState(''); + const [locationTerm, setLocationTerm] = useState(''); const [featuredBusinesses, setFeaturedBusinesses] = useState(initialFeatured); const [posts, setPosts] = useState(initialPosts); const [categories, setCategories] = useState(initialCategories); @@ -27,7 +28,10 @@ const HomeClient = ({ initialFeatured, initialPosts, initialCategories }: Props) const handleSearch = (e: React.FormEvent) => { e.preventDefault(); - router.push(`/annuaire?q=${searchTerm}`); + const params = new URLSearchParams(); + if (searchTerm) params.append('q', searchTerm); + if (locationTerm) params.append('location', locationTerm); + router.push(`/annuaire?${params.toString()}`); }; return ( @@ -59,7 +63,13 @@ const HomeClient = ({ initialFeatured, initialPosts, initialCategories }: Props)
- + setLocationTerm(e.target.value)} + />
+ ))} + + + {userRating ? "Merci pour votre note !" : "Cliquez sur une étoile pour voter"} + + + )} + + + {!isOwner && ( +
+

Laissez un commentaire

+
+