GoodsCategorySelector.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import React from 'react';
  2. import { useQuery } from '@tanstack/react-query';
  3. import {
  4. Select,
  5. SelectContent,
  6. SelectItem,
  7. SelectTrigger,
  8. SelectValue,
  9. } from '@/client/components/ui/select';
  10. import { goodsCategoryClient } from '@/client/api';
  11. interface GoodsCategorySelectorProps {
  12. value?: number;
  13. onChange?: (value: number) => void;
  14. placeholder?: string;
  15. disabled?: boolean;
  16. level?: 1 | 2 | 3;
  17. parentId?: number;
  18. }
  19. const GoodsCategorySelector: React.FC<GoodsCategorySelectorProps> = ({
  20. value,
  21. onChange,
  22. placeholder = "请选择商品分类",
  23. disabled = false,
  24. level = 1,
  25. parentId,
  26. }) => {
  27. const { data: categories, isLoading } = useQuery({
  28. queryKey: ['goods-categories', level, parentId],
  29. queryFn: async () => {
  30. const res = await goodsCategoryClient.$get({
  31. query: {
  32. page: 1,
  33. pageSize: 100,
  34. filters: JSON.stringify({
  35. level,
  36. parentId: parentId || undefined,
  37. })
  38. }
  39. });
  40. if (res.status !== 200) throw new Error('获取商品分类失败');
  41. const data = await res.json();
  42. return data.data;
  43. },
  44. enabled: !disabled,
  45. });
  46. return (
  47. <Select
  48. value={value?.toString()}
  49. onValueChange={(v) => onChange?.(parseInt(v))}
  50. disabled={disabled || isLoading}
  51. >
  52. <SelectTrigger>
  53. <SelectValue placeholder={isLoading ? "加载中..." : placeholder} />
  54. </SelectTrigger>
  55. <SelectContent>
  56. {categories?.map((category) => (
  57. <SelectItem key={category.id} value={category.id.toString()}>
  58. {category.name}
  59. </SelectItem>
  60. ))}
  61. </SelectContent>
  62. </Select>
  63. );
  64. };
  65. export default GoodsCategorySelector;