import React, { useState, useEffect } from 'react'; import api from '../../utils/api'; import Navbar from '../../components/Navbar'; import MemberFooter from '../../components/MemberFooter'; import { Card } from '../../components/ui/card'; import { Input } from '../../components/ui/input'; import { Badge } from '../../components/ui/badge'; import { Button } from '../../components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '../../components/ui/dialog'; import { User, Search, Mail, MapPin, Phone, Heart, Facebook, Instagram, Twitter, Linkedin, UserCircle, Calendar } from 'lucide-react'; import { useToast } from '../../hooks/use-toast'; const MembersDirectory = () => { const [members, setMembers] = useState([]); const [filteredMembers, setFilteredMembers] = useState([]); const [searchQuery, setSearchQuery] = useState(''); const [loading, setLoading] = useState(true); const [selectedMember, setSelectedMember] = useState(null); const [profileDialogOpen, setProfileDialogOpen] = useState(false); const { toast } = useToast(); useEffect(() => { fetchMembers(); }, []); useEffect(() => { filterMembers(); }, [searchQuery, members]); const fetchMembers = async () => { try { const response = await api.get('/members/directory'); setMembers(response.data); setFilteredMembers(response.data); } catch (error) { console.error('Failed to fetch members:', error); toast({ title: "Error", description: "Failed to load members directory. Please try again.", variant: "destructive" }); } finally { setLoading(false); } }; const filterMembers = () => { if (!searchQuery.trim()) { setFilteredMembers(members); return; } const query = searchQuery.toLowerCase(); const filtered = members.filter(member => { const fullName = `${member.first_name} ${member.last_name}`.toLowerCase(); const bio = (member.directory_bio || '').toLowerCase(); return fullName.includes(query) || bio.includes(query); }); setFilteredMembers(filtered); }; const getInitials = (firstName, lastName) => { return `${firstName.charAt(0)}${lastName.charAt(0)}`.toUpperCase(); }; const getSocialMediaLink = (url) => { if (!url) return null; // Ensure URL has protocol if (!url.startsWith('http://') && !url.startsWith('https://')) { return `https://${url}`; } return url; }; const handleViewProfile = async (memberId) => { try { const response = await api.get(`/members/directory/${memberId}`); setSelectedMember(response.data); setProfileDialogOpen(true); } catch (error) { toast({ title: "Error", description: "Failed to load member profile. Please try again.", variant: "destructive" }); } }; const formatDate = (dateString) => { if (!dateString) return null; return new Date(dateString).toLocaleDateString('en-US', { month: 'long', day: 'numeric' }); }; const MemberCard = ({ member }) => ( {/* Profile Photo */}
{member.profile_photo_url ? ( {`${member.first_name} ) : (
{getInitials(member.first_name, member.last_name)}
)}
{/* Name */}

{member.first_name} {member.last_name}

{/* Partner Name */} {member.directory_partner_name && (
Partner: {member.directory_partner_name}
)} {/* Bio */} {member.directory_bio && (

{member.directory_bio}

)} {/* Member Since */}
Member since {new Date(member.member_since || member.created_at).toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}
{/* Contact Information */}
{member.directory_email && (
{member.directory_email}
)} {member.directory_phone && (
{member.directory_phone}
)} {member.directory_address && (
{member.directory_address}
)}
{/* Social Media Links */} {(member.social_media_facebook || member.social_media_instagram || member.social_media_twitter || member.social_media_linkedin) && (
{member.social_media_facebook && ( )} {member.social_media_instagram && ( )} {member.social_media_twitter && ( )} {member.social_media_linkedin && ( )}
)} {/* View Profile Button */}
); return (
{/* Header */}

Members Directory

Connect with fellow LOAF members in our community.

{/* Search Bar */}
setSearchQuery(e.target.value)} className="pl-12 pr-4 py-6 text-lg border-[#ddd8eb] rounded-xl focus:border-[#664fa3] focus:ring-[#664fa3]" style={{ fontFamily: "'Nunito Sans', sans-serif" }} />
{searchQuery && (

Found {filteredMembers.length} {filteredMembers.length === 1 ? 'member' : 'members'}

)}
{/* Members Grid */} {loading ? (

Loading members...

) : filteredMembers.length > 0 ? (
{filteredMembers.map((member) => ( ))}
) : (

{searchQuery ? 'No Members Found' : 'No Members in Directory'}

{searchQuery ? 'Try adjusting your search query.' : 'Members who opt in to the directory will appear here.'}

)} {/* Info Card */} {!loading && members.length > 0 && (

Want to appear in the directory?

Update your profile settings to show in the directory and add your photo, bio, and contact information.{' '} Edit your profile →

)}
{/* Profile Detail Dialog */} {selectedMember && ( <> {selectedMember.first_name} {selectedMember.last_name} {selectedMember.directory_partner_name && ( Partner: {selectedMember.directory_partner_name} )}
{/* Bio */} {selectedMember.directory_bio && (

About

{selectedMember.directory_bio}

)} {/* Contact Information */}

Contact Information

{selectedMember.directory_email && ( )} {selectedMember.directory_phone && ( )} {selectedMember.directory_address && (

Address

{selectedMember.directory_address}

)} {selectedMember.directory_dob && (

Birthday

{formatDate(selectedMember.directory_dob)}

)}
{/* Volunteer Interests */} {selectedMember.volunteer_interests && selectedMember.volunteer_interests.length > 0 && (

Volunteer Interests

{selectedMember.volunteer_interests.map((interest, index) => ( {interest} ))}
)} {/* Social Media */} {(selectedMember.social_media_facebook || selectedMember.social_media_instagram || selectedMember.social_media_twitter || selectedMember.social_media_linkedin) && (

Connect on Social Media

{selectedMember.social_media_facebook && ( )} {selectedMember.social_media_instagram && ( )} {selectedMember.social_media_twitter && ( )} {selectedMember.social_media_linkedin && ( )}
)}
)}
); }; export default MembersDirectory;