'use client'; import React, { useState, useEffect } from 'react'; import { useMembers, Member as MemberType, MemberFilter as MemberFilterType } from '../../../hooks/useMembers'; import Link from 'next/link'; // Member Filter Component const MemberFilter = ({ onFilterChange }: { onFilterChange: (filter: { status: string; type: string; search: string }) => void }) => { const [status, setStatus] = useState('all'); const [type, setType] = useState('all'); const [search, setSearch] = useState(''); const handleFilterChange = () => { onFilterChange({ status, type, search }); }; const handleReset = () => { setStatus('all'); setType('all'); setSearch(''); onFilterChange({ status: 'all', type: 'all', search: '' }); }; return (

Filter Members

setSearch(e.target.value)} />
); }; // Bulk actions component const BulkActions = ({ selectedMembers, onAction }: { selectedMembers: string[], onAction: (action: string) => void }) => { if (selectedMembers.length === 0) return null; return (
{selectedMembers.length} member{selectedMembers.length > 1 ? 's' : ''} selected
); }; export default function MembersPage() { const [filter, setFilter] = useState({ status: 'all', type: 'all', search: '' }); const [selectedMembers, setSelectedMembers] = useState([]); const [selectAll, setSelectAll] = useState(false); // Use the members hook const { members, loading, error, pagination, fetchMembers, bulkAction } = useMembers(); // Apply filters when they change useEffect(() => { const apiFilter: MemberFilterType = {}; if (filter.status !== 'all') { apiFilter.status = filter.status; } if (filter.type !== 'all') { apiFilter.type = filter.type; } if (filter.search) { apiFilter.search = filter.search; } fetchMembers(apiFilter); }, [filter, fetchMembers]); // Handle filter changes const handleFilterChange = (newFilter: { status: string; type: string; search: string }) => { setFilter(newFilter); }; // Handle API errors if (error) { return (

Error Loading Members

{error.message}

); } // Handle bulk actions const handleBulkAction = async (action: string) => { if (selectedMembers.length === 0) return; const result = await bulkAction(action, selectedMembers); if (result) { // Reset selection after successful action setSelectedMembers([]); setSelectAll(false); // Could add a toast notification here alert(`${result.message} - Affected: ${result.affected} members`); } else { alert('Failed to perform bulk action. Please try again.'); } }; // Handle select all checkbox const handleSelectAll = (event: React.ChangeEvent) => { const checked = event.target.checked; setSelectAll(checked); if (checked) { setSelectedMembers(members.map(member => member._id)); } else { setSelectedMembers([]); } }; // Handle individual checkbox selection const handleSelectMember = (memberId: string, checked: boolean) => { if (checked) { setSelectedMembers(prev => [...prev, memberId]); } else { setSelectedMembers(prev => prev.filter(id => id !== memberId)); } }; // Function to get status badge styles - CSS Variable Strategy const getStatusBadgeClasses = (status: string) => { switch (status) { case 'active': return 'admin-badge admin-badge-success'; case 'expired': return 'admin-badge admin-badge-error'; case 'pending': return 'admin-badge admin-badge-warning'; default: return 'admin-badge admin-badge-default'; } }; // Format date for display const formatDate = (dateString: string | null) => { if (!dateString) return 'N/A'; const date = new Date(dateString); return new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'short', day: 'numeric' }).format(date); }; return (

Members

Manage memberships, track expirations, and communicate with members.

Add Member
{/* Filter component */} {/* Bulk actions */} {/* Members table */}
{loading ? ( ) : ( members.map((member) => ( )) )}
Member Contact Membership Dates Status Actions

Loading members...

handleSelectMember(member._id, e.target.checked)} />
{member.firstName} {member.lastName}
{member.email}
{member.phone}
{member.membershipType}
Joined: {formatDate(member.joinDate)}
Expires: {formatDate(member.expirationDate)}
{member.status.charAt(0).toUpperCase() + member.status.slice(1)}
View Edit
{!loading && members.length === 0 && (

No members found matching the current filters.

)}
); }