Overview.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { makeStyles, Theme, Typography } from '@material-ui/core';
  2. import { useCallback, useContext, useEffect, useMemo, useState } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import EmptyCard from '../../components/cards/EmptyCard';
  5. import icons from '../../components/icons/Icons';
  6. import { LOADING_STATE } from '../../consts/Milvus';
  7. import { rootContext } from '../../context/Root';
  8. import { useLoadAndReleaseDialogHook } from '../../hooks/Dialog';
  9. import { useNavigationHook } from '../../hooks/Navigation';
  10. import { CollectionHttp } from '../../http/Collection';
  11. import { ALL_ROUTER_TYPES } from '../../router/Types';
  12. import { formatNumber } from '../../utils/Common';
  13. import { CollectionData } from '../collections/Types';
  14. import CollectionCard from './collectionCard/CollectionCard';
  15. import StatisticsCard from './statisticsCard/StatisticsCard';
  16. const useStyles = makeStyles((theme: Theme) => ({
  17. collectionTitle: {
  18. margin: theme.spacing(2, 0),
  19. lineHeight: '20px',
  20. fontSize: '14px',
  21. color: '#82838e',
  22. },
  23. cardsWrapper: {
  24. display: 'grid',
  25. gridTemplateColumns: 'repeat(auto-fill, minmax(380px, 1fr))',
  26. gap: '10px',
  27. },
  28. }));
  29. const Overview = () => {
  30. useNavigationHook(ALL_ROUTER_TYPES.OVERVIEW);
  31. const { handleAction } = useLoadAndReleaseDialogHook({ type: 'collection' });
  32. const classes = useStyles();
  33. const { t: overviewTrans } = useTranslation('overview');
  34. const { t: collectionTrans } = useTranslation('collection');
  35. const { t: successTrans } = useTranslation('success');
  36. const [statistics, setStatistics] = useState<{
  37. collectionCount: number;
  38. totalData: number;
  39. }>({
  40. collectionCount: 0,
  41. totalData: 0,
  42. });
  43. const [loading, setLoading] = useState(false);
  44. const [loadCollections, setLoadCollections] = useState<CollectionHttp[]>([]);
  45. const { openSnackBar } = useContext(rootContext);
  46. const fetchData = useCallback(async () => {
  47. setLoading(true);
  48. const res = await CollectionHttp.getStatistics();
  49. const collections = await CollectionHttp.getCollections();
  50. const loadCollections = collections.filter(
  51. c => c._status !== LOADING_STATE.UNLOADED
  52. );
  53. setStatistics(res);
  54. setLoadCollections(loadCollections);
  55. setLoading(false);
  56. }, []);
  57. useEffect(() => {
  58. fetchData();
  59. }, [fetchData]);
  60. const fetchRelease = async (data: CollectionData) => {
  61. const name = data._name;
  62. const res = await CollectionHttp.releaseCollection(name);
  63. openSnackBar(
  64. successTrans('release', { name: collectionTrans('collection') })
  65. );
  66. fetchData();
  67. return res;
  68. };
  69. const handleRelease = (data: CollectionData) => {
  70. handleAction(data, fetchRelease);
  71. };
  72. const statisticsData = useMemo(() => {
  73. return {
  74. data: [
  75. {
  76. label: overviewTrans('load'),
  77. value: formatNumber(loadCollections.length),
  78. valueColor: '#07d197',
  79. },
  80. {
  81. label: overviewTrans('all'),
  82. value: formatNumber(statistics.collectionCount),
  83. valueColor: '#06aff2',
  84. },
  85. {
  86. label: overviewTrans('data'),
  87. value: overviewTrans('rows', {
  88. number: formatNumber(statistics.totalData),
  89. }) as string,
  90. valueColor: '#0689d2',
  91. },
  92. ],
  93. };
  94. }, [overviewTrans, statistics, loadCollections]);
  95. const CollectionIcon = icons.navCollection;
  96. return (
  97. <section className="page-wrapper">
  98. <StatisticsCard data={statisticsData.data} />
  99. <Typography className={classes.collectionTitle}>
  100. {overviewTrans('load')}
  101. </Typography>
  102. {loadCollections.length > 0 ? (
  103. <div className={classes.cardsWrapper}>
  104. {loadCollections.map(collection => (
  105. <CollectionCard
  106. key={collection._id}
  107. data={collection}
  108. handleRelease={handleRelease}
  109. />
  110. ))}
  111. </div>
  112. ) : (
  113. <EmptyCard
  114. loading={loading}
  115. wrapperClass="page-empty-card"
  116. icon={!loading ? <CollectionIcon /> : undefined}
  117. text={
  118. loading ? overviewTrans('loading') : collectionTrans('noLoadData')
  119. }
  120. />
  121. )}
  122. </section>
  123. );
  124. };
  125. export default Overview;