'use client'; import React, { useEffect, useState } from 'react'; import Link from 'next/link'; import { useRouter, useParams } from 'next/navigation'; import { useMembers, Member } from '../../../../hooks/useMembers'; export default function MemberDetailsPage() { const params = useParams(); const id = params.id as string; const router = useRouter(); const { getMemberById, deleteMember, bulkAction } = useMembers(); const [member, setMember] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [deleteConfirm, setDeleteConfirm] = useState(false); const [actionLoading, setActionLoading] = useState(false); // Fetch member data useEffect(() => { const fetchMember = async () => { setLoading(true); try { const data = await getMemberById(id); setMember(data); } catch (err) { console.error('Error fetching member:', err); setError('Failed to load member details. Please try again.'); } finally { setLoading(false); } }; fetchMember(); }, [id, getMemberById]); // Handle member deletion const handleDelete = async () => { if (!deleteConfirm) { setDeleteConfirm(true); return; } setActionLoading(true); try { const success = await deleteMember(id); if (success) { router.push('/admin/members'); } else { setError('Failed to delete member. Please try again.'); } } catch (err) { console.error('Error deleting member:', err); setError('Failed to delete member. Please try again.'); } finally { setActionLoading(false); setDeleteConfirm(false); } }; // Handle member renewal const handleRenew = async () => { setActionLoading(true); try { const result = await bulkAction('renew', [id]); if (result) { // Refresh member data const updatedMember = await getMemberById(id); setMember(updatedMember); alert('Membership renewed successfully'); } else { setError('Failed to renew membership. Please try again.'); } } catch (err) { console.error('Error renewing membership:', err); setError('Failed to renew membership. Please try again.'); } finally { setActionLoading(false); } }; // Format date for display const formatDate = (dateString: string | null | undefined) => { if (!dateString) return 'N/A'; const date = new Date(dateString); return new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric' }).format(date); }; // Get status badge classes const getStatusBadgeClasses = (status: string) => { switch (status) { case 'active': return 'bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-200'; case 'expired': return 'bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-200'; case 'pending': return 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900 dark:text-yellow-200'; default: return 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300'; } }; if (loading) { return (
); } if (error) { return (

{error}

); } if (!member) { return (

Member not found

); } return (
{/* Header */}

{member.firstName} {member.lastName}

Member since {formatDate(member.joinDate)}

Back to Members Edit Member
{/* Status and Quick Actions */}
Status: {member.status.charAt(0).toUpperCase() + member.status.slice(1)}
{/* Member Details */}
{/* Personal Information */}

Personal Information

First Name
{member.firstName}
Last Name
{member.lastName}
Email
{member.email}
Phone
{member.phone || 'Not provided'}
{/* Membership Information */}

Membership Information

Membership Type
{member.membershipType}
Join Date
{formatDate(member.joinDate)}
Expiration Date
{formatDate(member.expirationDate)}
Last Renewal
{formatDate(member.lastRenewalDate)}
Notification Preference
{member.notificationPreference || 'Email'}
{/* Address */}

Address

{member.address && (Object.values(member.address).some(val => val)) ? (
Street
{member.address.street || 'Not provided'}
City
{member.address.city || 'Not provided'}
State
{member.address.state || 'Not provided'}
ZIP Code
{member.address.zip || 'Not provided'}
) : (

No address information provided.

)}
{/* Board Member Information */}

Board Member Information

{member.boardMember ? (
Board Position
{member.boardPosition || 'Not specified'}
) : (

Not a board member.

)}
{/* Emergency Contact */}

Emergency Contact

{member.emergencyContact && (Object.values(member.emergencyContact).some(val => val)) ? (
Name
{member.emergencyContact.name || 'Not provided'}
Relationship
{member.emergencyContact.relationship || 'Not provided'}
Phone
{member.emergencyContact.phone || 'Not provided'}
) : (

No emergency contact information provided.

)}
); }