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

119 lines
3.4 KiB

5 months ago
  1. import { NavBar, Toast } from 'antd-mobile';
  2. import { useEffect, useRef, useState } from 'react';
  3. import './Mine.scss';
  4. import UploadedList from '../components/UploadedList';
  5. import { Measurement } from '../services/apiTypes';
  6. import UnuploadList from '../components/UnuploadList';
  7. import MineSegment from '../components/MineSegment';
  8. import Bridge from '../utils/bridge';
  9. const PAGE_SIZE = 10;
  10. export default function Mine() {
  11. const [tabIndex, setTabIndex] = useState(0);
  12. const [uploadedList, setUploadedList] = useState<Measurement[]>([]);
  13. const [unuploadList, setUnuploadList] = useState<Measurement[]>([]);
  14. const noMoreUploaded = useRef(false);
  15. const noMoreUnupload = useRef(false);
  16. const [selectIds, setSelectIds] = useState<number[]>([]);
  17. const onItemSelected = (id: number) => {
  18. if (selectIds.includes(id)) {
  19. setSelectIds(selectIds.filter((i) => i !== id));
  20. } else {
  21. setSelectIds([...selectIds, id]);
  22. }
  23. };
  24. useEffect(() => {
  25. Bridge.getUploadedRecords({
  26. size: PAGE_SIZE,
  27. }).then((res) => {
  28. if (res.success) {
  29. setUploadedList((list) => list.concat(res.data || []));
  30. noMoreUploaded.current = res.data.length < PAGE_SIZE;
  31. } else {
  32. noMoreUnupload.current = true;
  33. Toast.show(res.message);
  34. }
  35. });
  36. Bridge.getUnuploadRecords({
  37. size: PAGE_SIZE,
  38. }).then((res) => {
  39. if (res.success) {
  40. setUnuploadList((list) => list.concat(res.data || []));
  41. noMoreUnupload.current = res.data.length < PAGE_SIZE;
  42. } else {
  43. noMoreUnupload.current = true;
  44. Toast.show(res.message);
  45. }
  46. });
  47. }, []);
  48. const onUploadClick = () => {
  49. Bridge.uploadRecords({ ids: selectIds }).then((res) => {
  50. if (!res.success) {
  51. Toast.show(res.message);
  52. }
  53. });
  54. };
  55. async function loadMoreUploadedRecords() {
  56. const res = await Bridge.getUploadedRecords({
  57. lastId: uploadedList[uploadedList.length - 1].id,
  58. size: PAGE_SIZE,
  59. });
  60. if (res.success) {
  61. noMoreUploaded.current = res.data.length < PAGE_SIZE;
  62. setUploadedList((list) => list.concat(res.data));
  63. } else {
  64. noMoreUploaded.current = true;
  65. Toast.show(res.message);
  66. }
  67. }
  68. async function loadMoreUnuploadRecords() {
  69. const res = await Bridge.getUnuploadRecords({
  70. lastId: unuploadList[unuploadList.length - 1].id,
  71. size: PAGE_SIZE,
  72. });
  73. if (res.success) {
  74. noMoreUnupload.current = res.data.length < PAGE_SIZE;
  75. setUnuploadList((list) => list.concat(res.data));
  76. } else {
  77. noMoreUnupload.current = true;
  78. Toast.show(res.message);
  79. }
  80. }
  81. return (
  82. <div>
  83. <NavBar className="bg-white" back={null}>
  84. </NavBar>
  85. <div className="home-page-content">
  86. <MineSegment tabIndex={tabIndex} setTabIndex={setTabIndex} />
  87. <main>
  88. {tabIndex === 0 && (
  89. <UploadedList
  90. dataList={uploadedList}
  91. hasMore={!noMoreUploaded.current}
  92. loadMore={loadMoreUploadedRecords}
  93. />
  94. )}
  95. {tabIndex === 1 && (
  96. <UnuploadList
  97. dataList={unuploadList}
  98. selectIds={selectIds}
  99. onItemSelected={onItemSelected}
  100. onUpload={onUploadClick}
  101. hasMore={!noMoreUnupload.current}
  102. loadMore={loadMoreUnuploadRecords}
  103. />
  104. )}
  105. </main>
  106. </div>
  107. </div>
  108. );
  109. }