You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 3.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { CommonTabKeys } from '@/enums';
  2. import { useCacheState } from '@/hooks/pageCacheState';
  3. import { getAssetIcon } from '@/services/dataset/index.js';
  4. import { to } from '@/utils/promise';
  5. import { Flex, Tabs, type TabsProps } from 'antd';
  6. import { useEffect, useRef, useState } from 'react';
  7. import { CategoryData, ResourceType, resourceConfig } from '../../types';
  8. import CategoryList from '../CategoryList';
  9. import ResourceList, { ResourceListRef } from '../ResourceList';
  10. import styles from './index.less';
  11. type ResourcePageProps = {
  12. resourceType: ResourceType; // 资源类型,数据集还是模型
  13. };
  14. function ResourcePage({ resourceType }: ResourcePageProps) {
  15. const [cacheState, setCacheState] = useCacheState();
  16. const [activeTab, setActiveTab] = useState<string>(cacheState?.activeTab ?? CommonTabKeys.Public);
  17. const [typeList, setTypeList] = useState<CategoryData[]>([]);
  18. const [tagList, setTagList] = useState<CategoryData[]>([]);
  19. const [activeType, setActiveType] = useState<number | undefined>(cacheState?.activeType);
  20. const [activeTag, setActiveTag] = useState<number | undefined>(cacheState?.activeTag);
  21. const dataListRef = useRef<ResourceListRef>(null);
  22. useEffect(() => {
  23. getAssetIconList();
  24. }, []);
  25. // 分类搜索
  26. const handleCategorySearch = (value: string) => {
  27. getAssetIconList(value);
  28. };
  29. // 选择类型
  30. const chooseType = (record: CategoryData) => {
  31. setActiveType((prev) => (prev === record.id ? undefined : record.id));
  32. };
  33. // 选择 Tag
  34. const chooseTag = (record: CategoryData) => {
  35. setActiveTag((prev) => (prev === record.id ? undefined : record.id));
  36. };
  37. // 获取分类
  38. const getAssetIconList = async (name: string = '') => {
  39. const params = {
  40. name: name,
  41. page: 0,
  42. size: 10000,
  43. };
  44. const [res] = await to(getAssetIcon(params));
  45. if (res && res.data && res.data.content) {
  46. const { content } = res.data;
  47. setTypeList(
  48. content.filter(
  49. (item: CategoryData) =>
  50. Number(item.category_id) === resourceConfig[resourceType].typeValue,
  51. ),
  52. );
  53. setTagList(
  54. content.filter(
  55. (item: CategoryData) =>
  56. Number(item.category_id) === resourceConfig[resourceType].tagValue,
  57. ),
  58. );
  59. }
  60. };
  61. // 切换 Tab,重置数据
  62. const hanleTabChange: TabsProps['onChange'] = (value) => {
  63. dataListRef.current?.reset();
  64. setActiveTab(value);
  65. };
  66. const isPublic = activeTab === CommonTabKeys.Public;
  67. return (
  68. <div className={styles['resource-page']}>
  69. <div className={styles['resource-page__tabs-container']}>
  70. <Tabs
  71. activeKey={activeTab}
  72. items={resourceConfig[resourceType].tabItems}
  73. onChange={hanleTabChange}
  74. />
  75. </div>
  76. <Flex style={{ marginTop: '10px', height: 'calc(100% - 59px)' }}>
  77. <CategoryList
  78. resourceType={resourceType}
  79. typeList={typeList}
  80. tagList={tagList}
  81. activeType={activeType}
  82. activeTag={activeTag}
  83. onTypeSelect={chooseType}
  84. onTagSelect={chooseTag}
  85. onSearch={handleCategorySearch}
  86. />
  87. <ResourceList
  88. ref={dataListRef}
  89. resourceType={resourceType}
  90. typeList={typeList}
  91. tagList={tagList}
  92. isPublic={isPublic}
  93. dataType={activeType}
  94. dataTag={activeTag}
  95. initialSearchText={cacheState?.searchText}
  96. initialPagination={cacheState?.initialPagination}
  97. setCacheState={setCacheState}
  98. ></ResourceList>
  99. </Flex>
  100. </div>
  101. );
  102. }
  103. export default ResourcePage;