'use client'; import { Search, Filter, X } from 'lucide-react'; import { useEffect, useState, useCallback } from 'react'; import Link from 'next/link'; import { toast } from 'sonner'; import { supabase } from '@/lib/supabase'; import { Button } from "@/components/ui/button"; import { useRouter } from 'next/navigation'; import Image from 'next/image'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { FilterModal } from "@/components/FilterModal"; interface Expert { id: number; id_expert: string; nom: string; prenom: string; adresse: string; pays: string; ville: string; expertises: string; biographie: string; tarif: number; services: any; created_at: string; image_url: string; } interface Location { pays: string; villes: string[]; } interface Expertise { id: string; name: string; } const ExpertCard = ({ expert }: { expert: Expert }) => { const router = useRouter(); const handleContact = async (e: React.MouseEvent) => { e.preventDefault(); // Empêche la navigation vers la page expert try { // Vérifier si une conversation existe déjà const { data: existingMessages } = await supabase .from('messages') .select('*') .or(`sender_id.eq.user_id,receiver_id.eq.${expert.id_expert}`) .limit(1); if (!existingMessages || existingMessages.length === 0) { // Si pas de conversation existante, créer le premier message const { error: messageError } = await supabase .from('messages') .insert({ content: `Bonjour ${expert.prenom}, je souhaiterais échanger avec vous.`, sender_id: 'user_id', // À remplacer par l'ID de l'utilisateur connecté receiver_id: expert.id_expert, read: false }); if (messageError) { throw messageError; } } // Rediriger vers la conversation router.push(`/chatroom/${expert.id_expert}`); toast.success(`Conversation ouverte avec ${expert.prenom} ${expert.nom}`); } catch (error) { console.error('Error starting conversation:', error); toast.error("Erreur lors de l'ouverture de la conversation"); } }; return (
{expert.image_url ? ( {`${expert.prenom} { // Fallback en cas d'erreur de chargement de l'image const target = e.target as HTMLImageElement; target.onerror = null; target.src = '/placeholder-image.jpg'; }} /> ) : (
Pas d'image
)}
{expert.prenom} {expert.nom}

{expert.ville}, {expert.pays}

{expert.expertises}

{expert.tarif && (

{expert.tarif}€ /heure

)}
); }; const Page = () => { const [experts, setExperts] = useState(null); const [loading, setLoading] = useState(true); const [selectedPays, setSelectedPays] = useState(''); const [selectedVille, setSelectedVille] = useState(''); const [locations, setLocations] = useState([]); const [selectedExpertises, setSelectedExpertises] = useState([]); const [open, setOpen] = useState(false); // Calcul du nombre de filtres actifs const activeFiltersCount = [ ...(selectedExpertises.length > 0 ? [1] : []), selectedPays, selectedVille ].filter(Boolean).length; // Récupérer les experts avec filtres const fetchExperts = useCallback(async () => { try { let query = supabase .from('experts') .select('*'); if (selectedExpertises.length > 0) { // Adaptez cette partie selon la structure de votre base de données query = query.contains('expertises', selectedExpertises); } // Filtre par pays if (selectedPays) { query = query.eq('pays', selectedPays); } // Filtre par ville if (selectedVille) { query = query.eq('ville', selectedVille); } const { data, error } = await query; if (error) throw error; setExperts(data); } catch (err: any) { console.error('Error fetching experts:', err.message); toast.error('Erreur lors du chargement des experts'); } finally { setLoading(false); } }, [selectedPays, selectedVille, selectedExpertises]); // Récupérer la liste des pays et villes uniques const fetchLocations = async () => { try { const { data, error } = await supabase .from('experts') .select('pays, ville'); if (error) throw error; // Créer un objet avec pays et villes uniques const locationMap = new Map>(); data.forEach(expert => { if (expert.pays) { if (!locationMap.has(expert.pays)) { locationMap.set(expert.pays, new Set()); } if (expert.ville) { locationMap.get(expert.pays)?.add(expert.ville); } } }); // Convertir en tableau trié const sortedLocations = Array.from(locationMap).map(([pays, villes]) => ({ pays, villes: Array.from(villes).sort() })).sort((a, b) => a.pays.localeCompare(b.pays)); setLocations(sortedLocations); } catch (err: any) { console.error('Error fetching locations:', err.message); } }; // Reset ville quand le pays change useEffect(() => { setSelectedVille(''); }, [selectedPays]); useEffect(() => { fetchExperts(); fetchLocations(); }, [fetchExperts]); return loading ? (
) : (

Nos Experts

Plus de 300 experts à votre écoute
{/* CTA Filtres unifié */}
{/* Modale de filtres */}
{experts && experts.length > 0 ? ( experts.map((expert) => ( )) ) : (

Aucun expert trouvé

)}
); }; export default Page;