feat: refactor AdminMembers and AdminStaff to utilize useMembers hook for improved member management

This commit is contained in:
2026-01-22 14:47:34 -06:00
parent ac879b69b4
commit 554b599599
3 changed files with 103 additions and 101 deletions

View File

@@ -0,0 +1,68 @@
import { useCallback, useEffect, useState } from 'react';
import { toast } from 'sonner';
import api from '../utils/api';
const useMembers = ({
initialFilter = 'active',
initialSearch = '',
filterKey = 'status',
allowedRoles = ['member'],
fetchErrorMessage = 'Failed to fetch members',
} = {}) => {
const [users, setUsers] = useState([]);
const [filteredUsers, setFilteredUsers] = useState([]);
const [loading, setLoading] = useState(true);
const [searchQuery, setSearchQuery] = useState(initialSearch);
const [filterValue, setFilterValue] = useState(initialFilter);
const fetchMembers = useCallback(async () => {
try {
const response = await api.get('/admin/users');
let filtered = response.data;
if (allowedRoles && allowedRoles.length) {
filtered = filtered.filter(user => allowedRoles.includes(user.role));
}
setUsers(filtered);
} catch (error) {
toast.error(fetchErrorMessage);
} finally {
setLoading(false);
}
}, [allowedRoles, fetchErrorMessage]);
useEffect(() => {
fetchMembers();
}, [fetchMembers]);
useEffect(() => {
let filtered = users;
if (filterValue && filterValue !== 'all') {
filtered = filtered.filter(user => user[filterKey] === filterValue);
}
if (searchQuery) {
const query = searchQuery.toLowerCase();
filtered = filtered.filter(user =>
user.first_name.toLowerCase().includes(query) ||
user.last_name.toLowerCase().includes(query) ||
user.email.toLowerCase().includes(query)
);
}
setFilteredUsers(filtered);
}, [users, searchQuery, filterKey, filterValue]);
return {
users,
filteredUsers,
loading,
searchQuery,
setSearchQuery,
filterValue,
setFilterValue,
fetchMembers,
};
};
export default useMembers;