RecordsHistory.tsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. import { clearTimeRecords, getClockRecords } from "@/services/trackTimeDuration";
  2. import { View, Text, ScrollView, PageMeta, NavigationBar } 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. import { clearWorkoutRecords, workoutRecords } from "@/services/workout";
  19. import WorkoutHistory from "@/features/workout/WorkoutHistory";
  20. import showAlert from "@/components/basic/Alert";
  21. import { rpxToPx } from "@/utils/tools";
  22. let useRoute;
  23. let useNavigation;
  24. let scenario = '';
  25. if (process.env.TARO_ENV == 'rn') {
  26. useRoute = require("@react-navigation/native").useRoute
  27. useNavigation = require("@react-navigation/native").useNavigation
  28. }
  29. export default function Page() {
  30. const { t } = useTranslation()
  31. let router
  32. let navigation;
  33. if (useNavigation) {
  34. navigation = useNavigation()
  35. }
  36. if (process.env.TARO_ENV == 'rn') {
  37. router = useRoute()
  38. // var title = ''
  39. // if (router.params.type == 'time') {
  40. // title = t('page.clock.title')
  41. // }
  42. // else if (router.params.type == 'metric') {
  43. // title = t('page.metric.title')
  44. // }
  45. // else if (router.params.type == 'workout') {
  46. // title = t('page.workout.title')
  47. // }
  48. // navigation.setOptions({
  49. // headerBackTitle: title
  50. // });
  51. }
  52. else {
  53. router = useRouter()
  54. }
  55. const pageSize = 10
  56. const [pageIndex, setPageIndex] = useState(1)
  57. const [records, setRecords] = useState<any[]>([])
  58. const [counter, setCounter] = useState(0)
  59. const [timerId, setTimerId] = useState(null)
  60. const [showErrorPage, setShowErrorPage] = useState(false)
  61. const { refreshList } = router.params
  62. const [triggered, setTriggered] = useState(false)
  63. const [showModal, setShowModal] = useState(false)
  64. const [modalDetail, setModalDetail] = useState<any>({})
  65. const [total, setTotal] = useState(0)
  66. const [isLoading, setIsLoading] = useState(false)
  67. const [loaded, setLoaded] = useState(false)
  68. const [summary_stats, setSummaryStats] = useState(null)
  69. const user = useSelector((state: any) => state.user);
  70. const [count, setCount] = useState(0)
  71. const [filterIndex, setFilterIndex] = useState(0)
  72. useEffect(() => {
  73. refresh()
  74. }, [])
  75. // useEffect(() => {
  76. // startTimer();
  77. // return () => {
  78. // // 在组件卸载时清除定时器
  79. // if (timerId) {
  80. // clearInterval(timerId);
  81. // }
  82. // };
  83. // }, [timerId]);
  84. useEffect(() => {
  85. var name = ''
  86. switch (filterIndex) {
  87. case 0:
  88. name = ''
  89. break;
  90. case 1:
  91. name = 'FAST_SLEEP'
  92. break;
  93. case 2:
  94. name = 'FAST'
  95. break;
  96. case 3:
  97. name = 'SLEEP'
  98. break;
  99. }
  100. scenario = name
  101. setPageIndex(1)
  102. refresh()
  103. }, [filterIndex])
  104. // const startTimer = () => {
  105. // // 避免重复启动定时器
  106. // if (timerId) {
  107. // return;
  108. // }
  109. // const id = setInterval(() => {
  110. // setCounter((prevCounter) => prevCounter + 1);
  111. // }, 1000);
  112. // setTimerId(id as any);
  113. // };
  114. useReady(() => {
  115. // refresh()
  116. })
  117. usePullDownRefresh(() => {
  118. refresh()
  119. })
  120. useReachBottom(() => {
  121. more()
  122. // setPageIndex(pageIndex+1)
  123. // getHistory()
  124. })
  125. function refresh() {
  126. setIsLoading(true)
  127. setPageIndex(1)
  128. getHistory(1)
  129. }
  130. function more() {
  131. if (total <= records.length || isLoading) {
  132. return;
  133. }
  134. setIsLoading(true)
  135. var page = pageIndex + 1
  136. setPageIndex(page)
  137. getHistory(page)
  138. }
  139. global.reloadWorkoutList = () => {
  140. workoutRecords(
  141. {
  142. page: 1,
  143. limit: pageIndex * pageSize,
  144. code: router.params.code
  145. }
  146. ).then(res => {
  147. Taro.stopPullDownRefresh()
  148. setTriggered(false)
  149. setLoaded(true)
  150. setTotal((res as any).total)
  151. setSummaryStats((res as any).summary_stats)
  152. setRecords((res as any).data)
  153. setCount((res as any).total)
  154. setIsLoading(false)
  155. })
  156. }
  157. function getHistory(page = pageIndex) {
  158. if (page == 1)
  159. setTriggered(true)
  160. if (router.params.type == 'time') {
  161. getClockRecords({
  162. page: page,
  163. limit: pageSize,
  164. scenario: scenario,
  165. completed: true,
  166. // part_completed: true
  167. }).then(res => {
  168. Taro.stopPullDownRefresh()
  169. setTriggered(false)
  170. setLoaded(true)
  171. setTotal((res as any).total)
  172. if (page == 1) {
  173. setRecords([])
  174. setRecords((res as any).data)
  175. } else {
  176. setRecords(records.concat((res as any).data))
  177. }
  178. setIsLoading(false)
  179. })
  180. }
  181. else if (router.params.type == 'activity') {
  182. activityRecords(
  183. {
  184. page: page,
  185. limit: pageSize,
  186. code: '_walk'
  187. }
  188. ).then(res => {
  189. Taro.stopPullDownRefresh()
  190. setTriggered(false)
  191. setLoaded(true)
  192. setTotal((res as any).total)
  193. if (page == 1) {
  194. setRecords((res as any).data)
  195. } else {
  196. setRecords(records.concat((res as any).data))
  197. }
  198. setIsLoading(false)
  199. })
  200. }
  201. else if (router.params.type == 'metric') {
  202. metricRecords(
  203. {
  204. page: page,
  205. limit: pageSize,
  206. code: router.params.code
  207. }
  208. ).then(res => {
  209. Taro.stopPullDownRefresh()
  210. setTriggered(false)
  211. setLoaded(true)
  212. setTotal((res as any).total)
  213. if (page == 1) {
  214. setRecords((res as any).data)
  215. } else {
  216. setRecords(records.concat((res as any).data))
  217. }
  218. setIsLoading(false)
  219. })
  220. }
  221. else if (router.params.type == 'workout') {
  222. workoutRecords(
  223. {
  224. page: page,
  225. limit: pageSize,
  226. code: router.params.code
  227. }
  228. ).then(res => {
  229. Taro.stopPullDownRefresh()
  230. setTriggered(false)
  231. setLoaded(true)
  232. setTotal((res as any).total)
  233. setSummaryStats((res as any).summary_stats)
  234. if (page == 1) {
  235. setRecords((res as any).data)
  236. setCount((res as any).total)
  237. } else {
  238. setRecords(records.concat((res as any).data))
  239. }
  240. setIsLoading(false)
  241. })
  242. }
  243. }
  244. function removeItem(item) {
  245. setRecords(records.filter(i => i.id != item.id))
  246. }
  247. global.delFastSleep = (item) => {
  248. removeItem(item)
  249. global.refrehWeekly()
  250. global.refreshStreaks()
  251. }
  252. global.clearHistory = () => {
  253. // var page = Taro.getCurrentPages()[0]
  254. // debugger
  255. // page.refresh()
  256. showAlert({
  257. title: t('feature.common.modal.delete_all_title'),
  258. content: t('feature.common.modal.delete_all_content'),
  259. showCancel: true,
  260. confirm: () => {
  261. doClear()
  262. }
  263. })
  264. }
  265. function doClear() {
  266. if (router.params.type == 'activity') {
  267. cleartActivityRecords({
  268. code: '_walk'
  269. }).then(res => {
  270. refresh()
  271. global.refreshActivity()
  272. // router.params.refreshList()
  273. // Taro.getCurrentPages()[0].refresh()
  274. })
  275. }
  276. else if (router.params.type == 'metric') {
  277. clearMetricRecords({
  278. code: router.params.code
  279. }).then(res => {
  280. refresh()
  281. global.refreshMetric()
  282. // Taro.getCurrentPages()[0].refresh()
  283. })
  284. }
  285. else if (router.params.type == 'time') {
  286. clearTimeRecords().then(res => {
  287. refresh()
  288. global.refrehWeekly()
  289. if (global.refreshStreaks) {
  290. global.refreshStreaks()
  291. }
  292. if (global.checkAccess) {
  293. global.checkAccess((res as any).access)
  294. }
  295. if (global.indexPageRefresh) {
  296. global.indexPageRefresh()
  297. }
  298. // global.refreshTime()
  299. // global.refreshMetric()
  300. // Taro.getCurrentPages()[0].refresh()
  301. })
  302. }
  303. else if (router.params.type == 'workout') {
  304. clearWorkoutRecords({
  305. code: router.params.code
  306. }).then(res => {
  307. refresh()
  308. global.refreshWorkout()
  309. // global.refreshMetric()
  310. // Taro.getCurrentPages()[0].refresh()
  311. })
  312. }
  313. }
  314. function tapFilter(index) {
  315. setFilterIndex(index)
  316. }
  317. function filters() {
  318. return <View className="filter_bar">
  319. <View className="filter_bar_item" onClick={() => { tapFilter(0) }}>
  320. <Text onClick={() => { tapFilter(0) }} className={filterIndex == 0 ? 'filter_item_sel' : 'filter_item_normal'}>{t('feature.track_time_duration.record_fast_sleep.tab_all')}</Text>
  321. </View>
  322. <View className="filter_bar_item" onClick={() => { tapFilter(1) }}>
  323. <Text onClick={() => { tapFilter(1) }} className={filterIndex == 1 ? 'filter_item_sel' : 'filter_item_normal'}>{t('feature.track_time_duration.record_fast_sleep.tab_fast_sleep')}</Text>
  324. </View>
  325. <View className="filter_bar_item" onClick={() => { tapFilter(2) }}>
  326. <Text onClick={() => { tapFilter(2) }} className={filterIndex == 2 ? 'filter_item_sel' : 'filter_item_normal'}>{t('feature.track_time_duration.record_fast_sleep.tab_fast')}</Text>
  327. </View>
  328. <View className="filter_bar_item" onClick={() => { tapFilter(3) }}>
  329. <Text onClick={() => { tapFilter(3) }} className={filterIndex == 3 ? 'filter_item_sel' : 'filter_item_normal'}>{t('feature.track_time_duration.record_fast_sleep.tab_sleep')}</Text>
  330. </View>
  331. </View>
  332. }
  333. function detail() {
  334. if (router.params.type == 'time') {
  335. return <View>
  336. {
  337. process.env.TARO_ENV == 'weapp' && user.test_user && <Text style={{ color: '#fff', position: 'absolute', right: 50, top: 0 }} onClick={() => global.clearHistory()}>删除全部</Text>
  338. }
  339. {
  340. filters()
  341. }
  342. {
  343. records.map((item, index) => {
  344. return <View className="fast_sleep_item_bg">
  345. <RecordFastSleep key={index}
  346. data={item}
  347. index={index}
  348. type='record'
  349. />
  350. </View>
  351. })
  352. }
  353. </View>
  354. }
  355. if (router.params.type == 'metric') {
  356. return <MetricHistory records={records} />
  357. }
  358. if (router.params.type == 'activity') {
  359. return <ActivityHistory records={records} />
  360. }
  361. if (router.params.type == 'workout') {
  362. return <WorkoutHistory records={records} count={count} summary_stats={summary_stats} />
  363. }
  364. }
  365. function getTitle() {
  366. if (router.params.type == 'time') {
  367. return t('page.records_history.time_title')
  368. }
  369. else if (router.params.type == 'metric') {
  370. return router.params.title
  371. }
  372. else if (router.params.type == 'workout') {
  373. return router.params.title
  374. }
  375. else {
  376. return router.params.title
  377. }
  378. }
  379. return <View style={{ position: 'relative' }}>
  380. <Layout children={showErrorPage ? <NoData refresh={() => { refresh() }} /> : detail()}
  381. // title={router.params.title}
  382. isFastSleepTheme={router.params.type == 'time'}
  383. secondPage={true}
  384. titleColor={router.params.themeColor ? router.params.themeColor : '#fff'}
  385. title={getTitle()}
  386. type={TemplateType.flex}
  387. refresh={() => { refresh() }}
  388. triggered={triggered}
  389. more={() => { more() }}
  390. titleShowStyle={NaviBarTitleShowType.scrollToShow}
  391. />
  392. {
  393. loaded && records.length == 0 && <View className="no_records_bg">
  394. <Text className="no_records">{t('feature.common.no_data.no_record')}</Text>
  395. </View>
  396. }
  397. {
  398. showModal && modalDetail
  399. }
  400. </View>
  401. }