Metric.tsx 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. import { View, Text } from "@tarojs/components";
  2. import './Metric.scss'
  3. import { setAuth } from "../hooks/werun";
  4. import { useReady } from "@tarojs/taro";
  5. import { useSelector } from "react-redux";
  6. import { useEffect, useState } from "react";
  7. import Taro from "@tarojs/taro";
  8. import { metricCards, uploadMetric, uploadSteps } from "@/services/trackSomething";
  9. import { TimeFormatter } from "@/utils/time_format";
  10. import MetricItem from "./MetricItem";
  11. import { get } from "http";
  12. import Modal from "@/components/Modal";
  13. import PickerViews from "@/components/PickerViews";
  14. import LimitPickers from "@/components/LimitPickers";
  15. export default function Component(props: any) {
  16. const user = useSelector((state: any) => state.user);
  17. const [list, setList] = useState([])
  18. const [isModalOpen, setIsModalOpen] = useState(false);
  19. const [isTimePickerOpen, setIsTimePickerOpen] = useState(false);
  20. const [pickerValue, setPickerValue] = useState([]);
  21. const [pickerItems, setPickerItems] = useState([]);
  22. const [isPoint, setIsPoint] = useState(false)
  23. const [metricItem, setMetricItem] = useState({})
  24. const [strTime, setStrTime] = useState('')
  25. const [time, setTime] = useState(0)
  26. //未登录<->已登录 状态切换时,执行一次授权检查
  27. useEffect(() => {
  28. }, [user.isLogin])
  29. useReady(() => {
  30. getCards();
  31. })
  32. const openModal = () => {
  33. setIsModalOpen(true);
  34. };
  35. const closeModal = () => {
  36. setIsModalOpen(false);
  37. };
  38. function getCards() {
  39. metricCards().then(res => {
  40. setList((res as any).cards)
  41. })
  42. }
  43. //ts 把数组items: [{code: "_walk", value: 2180},{code: "_walk", value: 4444}]中的value取出来,/分割,组成字符串,如2180/4444
  44. function getValues(items) {
  45. var values = ''
  46. items.map((item, index) => {
  47. if (index == 0) {
  48. values = item.value
  49. }
  50. else {
  51. values = values + '/' + item.value
  52. }
  53. })
  54. return values
  55. }
  56. function goDetail(item) {
  57. if (user.isLogin) {
  58. Taro.navigateTo({
  59. url: '/pages/RecordsHistory?type=metric&code=' + item.code
  60. })
  61. }
  62. else {
  63. Taro.navigateTo({
  64. url: '/pages/ChooseAuth'
  65. })
  66. }
  67. }
  68. function record(item: any) {
  69. if (user.isLogin) {
  70. setMetricItem(item)
  71. var now = new Date();
  72. var t = (now.getHours() < 10 ? '0' + now.getHours() : now.getHours()) + ":" + (now.getMinutes() < 10 ? '0' + now.getMinutes() : now.getMinutes());
  73. setStrTime(t)
  74. setTime(now.getTime())
  75. if (item.schemas[0].type == 'DECIMAL') {
  76. pointPicker(item.schemas[0])
  77. }
  78. else if (item.schemas.length > 1) {
  79. }
  80. else {
  81. singlePicker(item.schemas[0])
  82. }
  83. }
  84. else {
  85. Taro.navigateTo({
  86. url: '/pages/ChooseAuth'
  87. })
  88. }
  89. }
  90. function pointPicker(item: any) {
  91. var min = item.min
  92. var max = item.max
  93. var step = item.step
  94. var value = item.default_value
  95. var items: number[] = []
  96. var items2: number[] = []
  97. var value0Index = 0
  98. var value1Index = 0
  99. for (var i = min; i <= max; i++) {
  100. if (i == Math.floor(value)) {
  101. value0Index = i - min
  102. }
  103. items.push(i)
  104. // items2.push(i)
  105. }
  106. for (var i = 0; i <= 9; i++) {
  107. items2.push(i)
  108. }
  109. value1Index = 10 * (value - Math.floor(value));
  110. setPickerValue([value0Index, value1Index] as any)
  111. setPickerItems([items, items2] as any)
  112. setIsPoint(true)
  113. openModal()
  114. }
  115. function singlePicker(item: any) {
  116. var min = item.min
  117. var max = item.max
  118. var step = 1//item.step
  119. var value = item.default_value
  120. var items: number[] = []
  121. for (var i = min; i <= max; i += step) {
  122. if (i == value) {
  123. setPickerValue([i - min] as any)
  124. }
  125. items.push(i)
  126. }
  127. setPickerItems([items] as any)
  128. setIsPoint(false)
  129. openModal()
  130. }
  131. function pickerChanged(e) {
  132. closeModal();
  133. var params = {}
  134. var date = new Date(time)
  135. var strDate = (date.getFullYear() + '') + (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : (date.getMonth() + 1)) + (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
  136. if ((metricItem as any).schemas[0].type == 'DECIMAL') {
  137. var array = pickerItems;
  138. var value = array[0][e[0]] + '.' + array[1][e[1]]
  139. console.log(value)
  140. params = {
  141. code: (metricItem as any).code,
  142. timestamp: time,
  143. date: strDate,
  144. items: [{ code: (metricItem as any).schemas[0].code, value: value }]
  145. }
  146. }
  147. else if ((metricItem as any).schemas.length > 1) {
  148. }
  149. else {
  150. var array = pickerItems;
  151. var value = array[0][e[0]] + ''
  152. console.log(value)
  153. params = {
  154. code: (metricItem as any).code,
  155. timestamp: time,
  156. date: strDate,
  157. items: [{ code: (metricItem as any).schemas[0].code, value: value }]
  158. }
  159. }
  160. uploadMetric(params).then(res => {
  161. getCards();
  162. })
  163. }
  164. function showTimePicker() {
  165. setIsTimePickerOpen(true)
  166. }
  167. function chooseTime(e){
  168. setTime(e);
  169. setStrTime(TimeFormatter.formatTimestamp(e))
  170. setIsTimePickerOpen(false)
  171. }
  172. const limit = new Date().getTime() - 7 * 3600 * 1000 * 24;
  173. return <View className="metric_container">
  174. {
  175. list.map((item: any, index: number) => {
  176. var unit = ''
  177. var value = '无记录'
  178. var desc = '记录解锁趋势'
  179. if (item.latest_record) {
  180. unit = item.schemas[0].default_unit
  181. value = getValues(item.latest_record.items)
  182. desc = TimeFormatter.formatTimestamp(item.latest_record.timestamp)
  183. }
  184. return <MetricItem title={item.name}
  185. value={value}
  186. unit={unit}
  187. desc={desc}
  188. btnText='记录'
  189. isDisabled={false}
  190. themeColor={item.theme_color}
  191. onClickDetail={() => { goDetail(item) }}
  192. onClick={() => { record(item) }}
  193. />
  194. })
  195. }
  196. <View className="space_width" />
  197. {
  198. isModalOpen && <Modal dismiss={closeModal}>
  199. <View style={{
  200. backgroundColor: 'white',
  201. display: 'flex', flexDirection: 'column',
  202. width: '100%', height: '50%', color: '#000'
  203. }}>
  204. <Text style={{ textAlign: 'center' }}>{(metricItem as any).name}</Text>
  205. <Text style={{ textAlign: 'center', paddingTop: 10, paddingBottom: 10 }} onClick={showTimePicker}>{strTime}</Text>
  206. <View style={{ position: 'relative' }}>
  207. <PickerViews onChange={pickerChanged}
  208. items={pickerItems}
  209. value={pickerValue}
  210. height={200} showBtns={true}
  211. onCancel={closeModal} />
  212. {isPoint && <View style={{
  213. position: 'absolute', width: '20%', height: 50, backgroundColor: 'transparent', left: '40%', top: 75,
  214. display: 'flex', alignItems: 'center', justifyContent: 'center'
  215. }}>
  216. <Text style={{ color: '#000', fontSize: 16, fontWeight: 'bold' }}>.</Text>
  217. </View>}
  218. </View>
  219. </View>
  220. </Modal>
  221. }
  222. {
  223. isTimePickerOpen && <Modal dismiss={() => setIsTimePickerOpen(false)}>
  224. <LimitPickers isRealTime={true} limit={limit} onCancel={() => { setIsTimePickerOpen(false) }} onChange={(e) => {
  225. chooseTime(e)
  226. // pickerConfirm(e)
  227. // hidePicker()
  228. }} />
  229. </Modal>
  230. }
  231. </View>
  232. /*
  233. return <MetricItem title="行走"
  234. value={allowRun ? stepInfo ? (stepInfo as any).step : '' : '未开启'}
  235. unit={(allowRun && stepInfo) ? '步' : ''}
  236. desc={allowRun ? stepInfo ? TimeFormatter.formatTimestamp(lastTime) : '' : '开启步数仅自己可见'}
  237. btnText={allowRun ? isCheking ? '打卡中...' : '打卡' : '开启'}
  238. isDisabled={isCheking}
  239. themeColor='#EEC01F'
  240. onClickDetail={goDetail}
  241. onClick={checkout}
  242. />*/
  243. return <View className="metric_bg">
  244. <Text className="metric_title">行走</Text>
  245. {
  246. !allowRun && <Text className="metric_value">未开启</Text>
  247. }
  248. {
  249. !allowRun && <Text className="mteric_desc">开启步数仅自己可见</Text>
  250. }
  251. {
  252. allowRun && stepInfo && <Text className="metric_value">{(stepInfo as any).step}<Text className="metric_unit">步</Text></Text>
  253. }
  254. {
  255. allowRun && stepInfo && <Text className="mteric_desc">{TimeFormatter.formatTimestamp(lastTime)}</Text>
  256. }
  257. <View className="operate" onClick={checkout}>{allowRun ? '打卡' : '开启'}</View>
  258. </View>
  259. }