UserSelector.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import React from 'react';
  2. import { useQuery } from '@tanstack/react-query';
  3. import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@d8d/shared-ui-components/components/ui/select';
  4. import { userClientManager } from '../api/userClient';
  5. interface UserSelectorProps {
  6. value?: number;
  7. onChange?: (value: number) => void;
  8. placeholder?: string;
  9. disabled?: boolean;
  10. testId?: string;
  11. }
  12. export const UserSelector: React.FC<UserSelectorProps> = ({
  13. value,
  14. onChange,
  15. placeholder = "选择用户",
  16. disabled,
  17. testId
  18. }) => {
  19. const { data: users, isLoading } = useQuery({
  20. queryKey: ['users'],
  21. queryFn: async () => {
  22. const userClient = userClientManager.get();
  23. const res = await userClient.$get({
  24. query: {
  25. page: 1,
  26. pageSize: 100
  27. }
  28. });
  29. if (res.status !== 200) throw new Error('获取用户列表失败');
  30. const result = await res.json();
  31. return result.data;
  32. }
  33. });
  34. return (
  35. <Select
  36. value={value?.toString() || ''}
  37. onValueChange={(val) => onChange?.(parseInt(val))}
  38. disabled={disabled || isLoading}
  39. >
  40. <SelectTrigger data-testid={testId}>
  41. <SelectValue placeholder={placeholder} />
  42. </SelectTrigger>
  43. <SelectContent>
  44. {isLoading ? (
  45. <SelectItem value="loading" disabled>加载中...</SelectItem>
  46. ) : users && users.length > 0 ? (
  47. users.map((user) => (
  48. <SelectItem key={user.id} value={user.id.toString()}>
  49. {user.name || user.username} ({user.phone || user.email})
  50. </SelectItem>
  51. ))
  52. ) : (
  53. <SelectItem value="no-users" disabled>暂无用户</SelectItem>
  54. )}
  55. </SelectContent>
  56. </Select>
  57. );
  58. };