/** * 用途:按分页与筛选条件拉取用户列表(参数组装与后端接口保持原样) * 必需参数:page / pageSize / search / roleFilter / statusFilter * 已知限制:来源(sourceFilter)为前端过滤,不参与请求;失败时 toast 必现 */ import { useState, useEffect, useCallback } from 'react'; import { userApi } from '@/api/user'; import { toast } from '@/hooks/useToast'; import type { UserItem } from '../types'; export interface UseUsersListParams { page: number; pageSize: number; search: string; roleFilter: string; statusFilter: string; } export function useUsersList({ page, pageSize, search, roleFilter, statusFilter }: UseUsersListParams) { const [users, setUsers] = useState([]); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const fetchUsers = useCallback(async () => { setLoading(true); try { const params: any = { page, page_size: pageSize }; if (search) params.search = search; if (roleFilter) params.role = roleFilter; if (statusFilter === 'active') params.is_active = true; else if (statusFilter === 'disabled') params.is_active = false; const res = await userApi.list(params); const data = res as any; setUsers(Array.isArray(data?.items) ? data.items : Array.isArray(data) ? data : []); setTotal(data?.total ?? data?.length ?? 0); } catch { toast('error', '获取用户列表失败'); } finally { setLoading(false); } }, [page, pageSize, search, roleFilter, statusFilter]); useEffect(() => { fetchUsers(); }, [fetchUsers]); return { users, total, loading, fetchUsers }; }