RecordsHistory.tsx 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. import { clearTimeRecords, getClockRecords } from "@/services/trackTimeDuration";
  2. import { View, Text, ScrollView } from "@tarojs/components";
  3. import { usePullDownRefresh, useReachBottom, useReady, useRouter } from "@tarojs/taro";
  4. import { useEffect, useState } from "react";
  5. import Schedule from '@/features/trackTimeDuration/components/Schedule'
  6. import MetricHistory from "@/features/trackSomething/components/MetricHistory";
  7. import ActivityHistory from "@/features/trackSomething/components/ActivityHistory";
  8. import { activityRecords, clearMetricRecords, cleartActivityRecords, metricRecords } from "@/services/trackSomething";
  9. import Taro from "@tarojs/taro";
  10. import Layout from "@/components/layout/layout";
  11. import NoData from "@/components/view/NoData";
  12. import { NaviBarTitleShowType, TemplateType } from "@/utils/types";
  13. import { useSelector } from "react-redux";
  14. import RecordFastSleep from "@/features/trackTimeDuration/components/RecordFastSleep";
  15. import './RecordsHistory.scss'
  16. import { useTranslation } from "react-i18next";
  17. import './RecordsHistory.scss'
  18. export default function Page() {
  19. const router = useRouter();
  20. const pageSize = 10
  21. const [pageIndex, setPageIndex] = useState(1)
  22. const [records, setRecords] = useState<any[]>([])
  23. const [counter, setCounter] = useState(0)
  24. const [timerId, setTimerId] = useState(null)
  25. const [showErrorPage, setShowErrorPage] = useState(false)
  26. const { refreshList } = router.params
  27. const [triggered, setTriggered] = useState(false)
  28. const [showModal, setShowModal] = useState(false)
  29. const [modalDetail, setModalDetail] = useState<any>({})
  30. const [total, setTotal] = useState(0)
  31. const [isLoading, setIsLoading] = useState(false)
  32. const [loaded, setLoaded] = useState(false)
  33. const user = useSelector((state: any) => state.user);
  34. const { t } = useTranslation()
  35. global.showModal = (isShow: boolean, detail: any) => {
  36. setShowModal(isShow)
  37. setModalDetail(detail)
  38. }
  39. useEffect(() => {
  40. startTimer();
  41. return () => {
  42. // 在组件卸载时清除定时器
  43. if (timerId) {
  44. clearInterval(timerId);
  45. }
  46. };
  47. }, [timerId]);
  48. const startTimer = () => {
  49. // 避免重复启动定时器
  50. if (timerId) {
  51. return;
  52. }
  53. const id = setInterval(() => {
  54. setCounter((prevCounter) => prevCounter + 1);
  55. }, 1000);
  56. setTimerId(id as any);
  57. };
  58. useReady(() => {
  59. refresh()
  60. })
  61. usePullDownRefresh(() => {
  62. console.log('aaa')
  63. refresh()
  64. })
  65. useReachBottom(() => {
  66. more()
  67. // setPageIndex(pageIndex+1)
  68. // getHistory()
  69. })
  70. function refresh() {
  71. setIsLoading(true)
  72. setPageIndex(1)
  73. getHistory(1)
  74. }
  75. function more() {
  76. if (total <= records.length || isLoading) {
  77. return;
  78. }
  79. setIsLoading(true)
  80. var page = pageIndex + 1
  81. setPageIndex(page)
  82. getHistory(page)
  83. }
  84. function getHistory(page = pageIndex) {
  85. if (page == 1)
  86. setTriggered(true)
  87. if (router.params.type == 'time') {
  88. getClockRecords({
  89. page: page,
  90. limit: pageSize,
  91. // completed: true,
  92. part_completed: true
  93. }).then(res => {
  94. Taro.stopPullDownRefresh()
  95. setTriggered(false)
  96. setLoaded(true)
  97. setTotal((res as any).total)
  98. if (page == 1) {
  99. setRecords((res as any).data)
  100. } else {
  101. setRecords(records.concat((res as any).data))
  102. }
  103. setIsLoading(false)
  104. })
  105. }
  106. else if (router.params.type == 'activity') {
  107. activityRecords(
  108. {
  109. page: page,
  110. limit: pageSize,
  111. code: '_walk'
  112. }
  113. ).then(res => {
  114. Taro.stopPullDownRefresh()
  115. setTriggered(false)
  116. setLoaded(true)
  117. setTotal((res as any).total)
  118. if (page == 1) {
  119. setRecords((res as any).data)
  120. } else {
  121. setRecords(records.concat((res as any).data))
  122. }
  123. setIsLoading(false)
  124. })
  125. }
  126. else if (router.params.type == 'metric') {
  127. metricRecords(
  128. {
  129. page: page,
  130. limit: pageSize,
  131. code: router.params.code
  132. }
  133. ).then(res => {
  134. Taro.stopPullDownRefresh()
  135. setTriggered(false)
  136. setLoaded(true)
  137. setTotal((res as any).total)
  138. if (page == 1) {
  139. setRecords((res as any).data)
  140. } else {
  141. setRecords(records.concat((res as any).data))
  142. }
  143. setIsLoading(false)
  144. })
  145. }
  146. }
  147. function removeItem(item) {
  148. setRecords(records.filter(i => i.id != item.id))
  149. }
  150. global.clearHistory = () => {
  151. // var page = Taro.getCurrentPages()[0]
  152. // debugger
  153. // page.refresh()
  154. Taro.showModal({
  155. title: t('feature.common.modal.delete_all_title'),
  156. content: t('feature.common.modal.delete_all_content'),
  157. success: (res) => {
  158. if (res.confirm) {
  159. doClear()
  160. }
  161. }
  162. })
  163. }
  164. function doClear() {
  165. if (router.params.type == 'activity') {
  166. cleartActivityRecords({
  167. code: '_walk'
  168. }).then(res => {
  169. refresh()
  170. global.refreshActivity()
  171. // router.params.refreshList()
  172. // Taro.getCurrentPages()[0].refresh()
  173. })
  174. }
  175. else if (router.params.type == 'metric') {
  176. clearMetricRecords({
  177. code: router.params.code
  178. }).then(res => {
  179. refresh()
  180. global.refreshMetric()
  181. // Taro.getCurrentPages()[0].refresh()
  182. })
  183. }
  184. else if (router.params.type == 'time') {
  185. clearTimeRecords().then(res => {
  186. refresh()
  187. global.refreshTime()
  188. // global.refreshMetric()
  189. // Taro.getCurrentPages()[0].refresh()
  190. })
  191. }
  192. }
  193. function detail() {
  194. if (router.params.type == 'time') {
  195. return <View>
  196. {
  197. user.test_user && <Text style={{ color: '#fff', position: 'absolute', right: 50, top: 0 }} onClick={() => global.clearHistory()}>删除全部</Text>
  198. }
  199. {
  200. records.map((item, index) => {
  201. return <View className="fast_sleep_item_bg">
  202. <RecordFastSleep key={index} data={item} type='record' delSuccess={(item) => removeItem(item)} />
  203. </View>
  204. // return <Schedule key={index} data={item} type="record" delSuccess={(item) => removeItem(item)} />
  205. })
  206. }
  207. </View>
  208. }
  209. if (router.params.type == 'metric') {
  210. return <MetricHistory records={records} />
  211. }
  212. if (router.params.type == 'activity') {
  213. return <ActivityHistory records={records} />
  214. }
  215. }
  216. function getTitle() {
  217. if (router.params.type == 'time') {
  218. return t('page.records_history.time_title')
  219. }
  220. else if (router.params.type == 'metric') {
  221. return t('page.records_history.metric_title', { title: router.params.title })
  222. }
  223. else {
  224. return t('page.records_history.activity_title', { title: router.params.title })
  225. }
  226. }
  227. return <View style={{ position: 'relative' }}>
  228. <Layout children={showErrorPage ? <NoData refresh={() => { refresh() }} /> : detail()}
  229. // title={router.params.title}
  230. isFastSleepTheme={router.params.type=='time'}
  231. secondPage={true}
  232. titleColor={router.params.themeColor ? router.params.themeColor : '#fff'}
  233. title={getTitle()}
  234. type={TemplateType.flex}
  235. refresh={() => { refresh() }}
  236. triggered={triggered}
  237. more={() => { more() }}
  238. titleShowStyle={NaviBarTitleShowType.scrollToShow}
  239. />
  240. {
  241. loaded && records.length == 0 && <View className="no_records_bg">
  242. <Text className="no_records">{t('feature.common.no_data.no_record')}</Text>
  243. </View>
  244. }
  245. {
  246. showModal && modalDetail
  247. }
  248. </View>
  249. // return <View className="container">
  250. // {
  251. // (router.params.type == 'metric' || router.params.type == 'activity') && <View style={{ height: 50, fontSize: 30, color: '#fff' }} onClick={clear}>删除全部</View>
  252. // }
  253. // <ScrollView scrollY style={{ height: '100%', display: 'flex', flexDirection: 'column' }}
  254. // onScrollToLower={more} enableFlex
  255. // // onRefresh={refresh}
  256. // >
  257. // {
  258. // router.params.type == 'time' && records.map((item, index) => {
  259. // return <Schedule key={index} data={item} type="record" delSuccess={(item) => removeItem(item)} />
  260. // })
  261. // }
  262. // {
  263. // router.params.type == 'metric' && <MetricHistory records={records} />
  264. // }
  265. // {
  266. // router.params.type == 'activity' && <ActivityHistory records={records} />
  267. // }
  268. // </ScrollView>
  269. // </View>;
  270. }