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.

219 lines
7.8 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. import { useEffect, useMemo, useState } from "react";
  2. import useCopyLink from "~/hooks/useCopy";
  3. import { getTime, splitAddress, toThousands } from "~/utils";
  4. import store from "~/store";
  5. import { observer } from "mobx-react";
  6. import { useRouter } from "~/hooks/useRouter";
  7. import BackBar from "~/components/BackBar";
  8. import { Cell, Empty, List, Tabs } from "react-vant";
  9. import { debounce } from 'lodash';
  10. import '~/styles/personal.scss';
  11. import { history_record } from "~/api";
  12. const Record = () => {
  13. const { token } = store.state;
  14. const { push, location } = useRouter()
  15. console.log(location);
  16. const recordTabs = useMemo(() => ['充值', '提现', '收益'], []);
  17. const [recordIndex, setRecordIndex] = useState(location.state ? location.state.index : 0);
  18. const { copyVal } = useCopyLink();
  19. const [query, setQuery] = useState([
  20. { page: 1, page_size: 20 },
  21. { page: 1, page_size: 20 },
  22. { page: 1, page_size: 20 },
  23. ]);
  24. const [finished, setFinished] = useState<boolean[]>([true, true, true]);
  25. const [assetsRecord, setAssetsRecord] = useState([
  26. [] as any[],
  27. [] as any[],
  28. [] as any[],
  29. ]);
  30. const getAssetsRecord = debounce(async () => {
  31. let res: any = await history_record({ type: recordIndex + 1, ...query[recordIndex] });
  32. if (res.code === 0) {
  33. if (res.data.length < 20) {
  34. if (assetsRecord[recordIndex].length <= 0) {
  35. assetsRecord[recordIndex] = res.data
  36. } else {
  37. assetsRecord[recordIndex] = [...assetsRecord[recordIndex], ...res.data]
  38. }
  39. finished[recordIndex] = true
  40. setFinished([...finished]);
  41. setAssetsRecord([...assetsRecord]);
  42. return
  43. }
  44. query[recordIndex].page = query[recordIndex].page + 1
  45. if (assetsRecord[recordIndex].length <= 0) {
  46. assetsRecord[recordIndex] = res.data
  47. } else {
  48. assetsRecord[recordIndex] = [...assetsRecord[recordIndex], ...res.data]
  49. };
  50. finished[recordIndex] = false;
  51. setFinished([...finished]);
  52. setAssetsRecord([...assetsRecord]);
  53. setQuery([...query]);
  54. };
  55. }, 200);
  56. const renderItem = (index: number) => {
  57. let el = [
  58. <RechargeRecord list={assetsRecord[recordIndex]} copy={copyVal} finished={finished[recordIndex]} getData={getAssetsRecord} />,
  59. <WithdrawRecord list={assetsRecord[recordIndex]} copy={copyVal} finished={finished[recordIndex]} getData={getAssetsRecord} />,
  60. <TransferRecord list={assetsRecord[recordIndex]} finished={finished[recordIndex]} getData={getAssetsRecord} />,
  61. ];
  62. return el[index];
  63. };
  64. useEffect(() => {
  65. token && assetsRecord[recordIndex].length <= 0 && getAssetsRecord();
  66. !token && push('/', null, true);
  67. !token && setFinished([true, true, true, true, true, true]);
  68. }, [recordIndex, token]);
  69. return (
  70. <div className="plr-2 record">
  71. <BackBar
  72. title='账单'
  73. />
  74. <Tabs
  75. swipeable
  76. type="capsule"
  77. background="rgb(248,247,255)"
  78. sticky
  79. defaultActive={recordIndex}
  80. offsetTop={window.innerWidth / 430 * 60}
  81. onChange={(_, index) => setRecordIndex(index)}
  82. align="start"
  83. className="tabs"
  84. lazyRender
  85. >
  86. {
  87. recordTabs.map((item, index) => (
  88. <Tabs.TabPane
  89. key={index}
  90. title={item}
  91. titleStyle={{ width: 70, height: 30, padding: 0 }}
  92. >
  93. {renderItem(index)}
  94. </Tabs.TabPane>
  95. ))
  96. }
  97. </Tabs>
  98. </div>
  99. )
  100. }
  101. interface ChildProps {
  102. list: any[],
  103. copy?: Function,
  104. finished: boolean,
  105. getData: Function
  106. }
  107. const RechargeRecord = (
  108. { list, copy, finished, getData }: ChildProps
  109. ) => {
  110. if (list.length <= 0 || Object.keys(list).length <= 0) return <Empty description="暂无记录" />;
  111. return (
  112. <List finished={finished} onLoad={() => getData()} errorText="请求失败,点击重新加载" offset={10}>
  113. {
  114. list.map((item) => (
  115. <Cell key={item.id} className="ptb-1" style={{ background: 'none' }}>
  116. <div style={{ display: 'flex', justifyContent: 'space-between' }}>
  117. <div>
  118. <div className='fz-wb-550'>{item.name}</div>
  119. <div className='sub-text fz-14 mt-6px'>{getTime(item.time * 1000)}</div>
  120. <div className='sub-text fz-14'>
  121. {splitAddress(item.tx_hash, 10)}
  122. {
  123. item.tx_hash && (
  124. <i className='iconfont icon-fuzhi_copy black ml-5px' onClick={() => copy && copy(item.tx_hash)}></i>
  125. )
  126. }
  127. </div>
  128. </div>
  129. <div className='column-justify-between tae'>
  130. <div className='green fz-wb-550'>+{toThousands(item.amount)} {item.symbol}</div>
  131. <div className={`tar ${item.status === 1 && 'green'}`}>
  132. {item.status === 1 ? '完成' : '確認中'}
  133. </div>
  134. </div>
  135. </div>
  136. </Cell>
  137. ))
  138. }
  139. </List >
  140. )
  141. }
  142. const WithdrawRecord = ({ list, finished, getData, copy }: ChildProps) => {
  143. if (list.length <= 0 || Object.keys(list).length <= 0) return <Empty description="暂无记录" />;
  144. return (
  145. <List finished={finished} onLoad={() => getData()} errorText="请求失败,点击重新加载" offset={10}>
  146. {
  147. list.map((item, index) => (
  148. <Cell className='ptb-1' key={item.id} style={{ background: 'none' }}>
  149. <div style={{ display: 'flex', justifyContent: 'space-between' }}>
  150. <div>
  151. <div className='fz-wb-550'></div>
  152. <div className='sub-color fz-14'>{getTime(item.time * 1000)}</div>
  153. <div className='sub-color fz-14'>
  154. {item.tx_hash && splitAddress(item.tx_hash, 8)}
  155. {item.tx_hash && <i className='iconfont icon-fuzhi_copy black ml-5px' onClick={() => {
  156. copy && copy(item.tx_hash)
  157. }}></i>}
  158. </div>
  159. </div>
  160. <div className='column-justify-between tae'>
  161. <div className='tar'>
  162. <div className="red fz-wb-550">-{toThousands(item.amount)} {item.symbol}</div>
  163. <div className="sub-text fz-14">{item.withdraw_fee} {item.withdraw_fee_symbol}</div>
  164. </div>
  165. <div className='tar sub-text fz-14'>{item.status === 4 ? '完成' : '確認中'}</div>
  166. </div>
  167. </div>
  168. </Cell>
  169. ))
  170. }
  171. </List>
  172. )
  173. }
  174. const TransferRecord = ({ list, finished, getData }: ChildProps) => {
  175. if (list.length <= 0 || Object.keys(list).length <= 0) return <Empty description="暂无记录" />;
  176. return (
  177. <List finished={finished} onLoad={() => getData()} errorText="请求失败,点击重新加载" offset={10}>
  178. {
  179. list.map((item, index) => (
  180. <Cell className="ptb-1" key={item.id} style={{ background: 'none' }}>
  181. <div style={{ display: 'flex', justifyContent: 'space-between' }}>
  182. <div>
  183. <div className='fz-wb-550'> {item.name}</div>
  184. <div className='sub-color fz-14 mt-6px'>{getTime(item.time * 1000)}</div>
  185. </div>
  186. <div className='column-justify-between tar fz-wb-550'>
  187. <div>
  188. <div className=" green">+{toThousands(item.amount)} {item.symbol}</div>
  189. </div>
  190. <div className='sub-text'>+{toThousands(item.amount_usdt)} USDT()</div>
  191. </div>
  192. </div>
  193. </Cell>
  194. ))
  195. }
  196. </List>
  197. )
  198. }
  199. export default observer(Record);