post_moment_time.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. import { View, Text, Image } from '@tarojs/components'
  2. import './post_moment_time.scss'
  3. import NewModal from '../base/new_modal'
  4. import { useState } from 'react'
  5. import { useSelector } from 'react-redux';
  6. import { getScenario, getThemeColor } from '@/features/health/hooks/health_hooks';
  7. import { rpxToPx } from '@/utils/tools';
  8. import NewTimePicker from '../base/new_timepicker';
  9. import { IconCalendar, IconTarget } from '@/components/basic/Icons';
  10. import NewDurationPicker from '../base/new_durationpicker';
  11. import NewButton, { NewButtonType } from '../base/new_button';
  12. import dayjs from 'dayjs';
  13. import Card from './card';
  14. import CellFooter, { CellFooterType } from '../base/cell_footer';
  15. import CellFooterText from '../base/cell_footer_text';
  16. import ChooseDateTime from './choose_date_time';
  17. import { MainColorType } from '@/context/themes/color';
  18. import Taro from '@tarojs/taro';
  19. import { useTranslation } from 'react-i18next';
  20. let isYesterdayTarget = false
  21. export default function PostMomentTime(props: {
  22. title?: string,
  23. date?: string,
  24. time: string,
  25. isTemp: boolean,
  26. onChange: any,
  27. moment?: any,
  28. dismiss: any
  29. }) {
  30. const health = useSelector((state: any) => state.health);
  31. const [showDurationPicker, setShowDurationPicker] = useState(false)
  32. const [isYesterday, setIsYesterday] = useState(false)
  33. const [selDate, setSelDate] = useState(props.date ? props.date : dayjs().format('YYYY-MM-DD'))
  34. const [showMore, setShowMore] = useState(false)
  35. const [time, setTime] = useState(props.time)
  36. const [minutes, setMinutes] = useState(30)
  37. const { t } = useTranslation()
  38. function durationTime() {
  39. var hour = Math.floor(minutes / 60)
  40. var minute = minutes % 60
  41. var str = ''
  42. if (hour > 0) {
  43. if (global.language == 'en') {
  44. str = hour + (hour == 1 ? ' hr ' : ' hrs ')
  45. }
  46. else {
  47. str = hour + '小时'
  48. }
  49. }
  50. if (minute > 0) {
  51. if (global.language == 'en') {
  52. str += minute + ' mins'
  53. }
  54. else {
  55. str += minute + '分钟'
  56. }
  57. }
  58. if (hour == 0 && minute == 0) {
  59. if (global.language == 'en') {
  60. str = '0 mins'
  61. }
  62. else {
  63. str = '0分钟'
  64. }
  65. }
  66. return str
  67. }
  68. function endTime() {
  69. var now = new Date()
  70. var hour = parseInt(time.split(':')[0] + '')
  71. var minute = parseInt(time.split(':')[1] + '')
  72. now.setHours(hour)
  73. now.setMinutes(minute)
  74. var timestamp = now.getTime()
  75. if (isYesterday) {
  76. timestamp = timestamp - 24 * 3600 * 1000
  77. }
  78. timestamp = timestamp + minutes * 60 * 1000
  79. const today = dayjs();
  80. const dt = dayjs(timestamp);
  81. var strTime = dt.format('HH:mm ')
  82. const yesterday = today.subtract(1, 'day');
  83. const tomorrow = today.subtract(-1, 'day');
  84. if (dt.isSame(today, 'day')) {
  85. return strTime + 'Today';
  86. } else if (dt.isSame(yesterday, 'day')) {
  87. return strTime + 'Yesterday';
  88. } else if (dt.isSame(tomorrow, 'day')) {
  89. return strTime + 'Tomorrow';
  90. } else {
  91. return strTime + dt.format('MM-DD');
  92. }
  93. }
  94. function durationContent() {
  95. return <View style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
  96. <Card>
  97. <View style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
  98. <View className='picker_time_card_header'>
  99. <View style={{ width: rpxToPx(40) }} />
  100. <Text>Duration</Text>
  101. <View style={{ flex: 1 }} />
  102. <NewButton
  103. type={showDurationPicker ? NewButtonType.alpha : NewButtonType.gray}
  104. color={getThemeColor(health.mode)}
  105. title={durationTime()}
  106. height={rpxToPx(84)}
  107. fontNormal
  108. onClick={() => {
  109. setShowDurationPicker(true)
  110. }}
  111. />
  112. <View style={{ width: rpxToPx(28) }} />
  113. <View className='border_footer_line' style={{ left: rpxToPx(40) }} />
  114. </View>
  115. {
  116. showDurationPicker && <NewDurationPicker
  117. value={minutes}
  118. color={getThemeColor(health.mode)}
  119. onChange={(v) => {
  120. setMinutes(v)
  121. }} />
  122. }
  123. </View>
  124. </Card>
  125. <CellFooter
  126. type={CellFooterType.center}
  127. >
  128. <CellFooterText text={`Expect to finish at ${endTime()}`} />
  129. </CellFooter>
  130. </View>
  131. }
  132. function getMinTimestamp() {
  133. var scenario = getScenario(health.windows, health.mode)
  134. return scenario.picker_min_timestamp
  135. }
  136. /*
  137. type={expandIndex == index ? NewButtonType.alpha : NewButtonType.gray}
  138. color={iFast ? MainColorType.fast : MainColorType.sleep}
  139. */
  140. return <NewModal
  141. title={props.title ?? '开始时间'}
  142. dismiss={props.dismiss}
  143. confirm={() => {
  144. var date = new Date(selDate + ' ' + time + ':00')
  145. var now = new Date()
  146. if (date.getTime() > now.getTime()) {
  147. setTime(dayjs(now.getTime()).format('HH:mm'))
  148. Taro.showToast({
  149. title: t('health.future_time_limit'),
  150. icon: 'none'
  151. })
  152. return
  153. }
  154. props.onChange({
  155. date: selDate,
  156. time: time,
  157. duration: minutes,
  158. isYesterday: isYesterday
  159. })
  160. }}
  161. themeColor={getThemeColor(health.mode)}>
  162. <Card>
  163. <ChooseDateTime title={null}
  164. disable={false}
  165. color={getThemeColor(health.mode)}
  166. expand={!showDurationPicker}
  167. choose={() => {
  168. setShowDurationPicker(false)
  169. }}
  170. time={time}
  171. // timeChange={(e) => {
  172. // setTime(e)
  173. // }}
  174. minTimestamp={getMinTimestamp()}
  175. // footerTitle={scheduleTime()}
  176. enterTimestamp={global.set_time}
  177. targetTimestamp={props.moment && props.moment.target ? props.moment.target.timestamp : new Date().getTime()}
  178. // tapFooter={() => {
  179. // if (time == dayjs(props.moment.target.timestamp).format('HH:mm')) {
  180. // setSelDate(dayjs(global.set_time).format('YYYY-MM-DD'))
  181. // setTime(dayjs(global.set_time).format('HH:mm'))
  182. // }
  183. // else {
  184. // setSelDate(dayjs(props.moment.target.timestamp).format('YYYY-MM-DD'))
  185. // setTime(dayjs(props.moment.target.timestamp).format('HH:mm'))
  186. // }
  187. // }}
  188. date={selDate}
  189. change={(e) => {
  190. setSelDate(e[0])
  191. setTime(e[1])
  192. }}
  193. // dateChange={(e) => {
  194. // setSelDate(e)
  195. // }}
  196. />
  197. </Card>
  198. {/* <Card>
  199. <View style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
  200. <View className='picker_time_card'>
  201. <View className='picker_time_card_header'>
  202. <View style={{ flex: 1 }} />
  203. <NewButton
  204. type={NewButtonType.gray}
  205. title={isYesterday ? 'Yesterday' : 'Today'}
  206. height={rpxToPx(84)}
  207. onClick={() => {
  208. setIsYesterday(!isYesterday)
  209. }}
  210. />
  211. <View style={{ width: rpxToPx(12) }} />
  212. <NewButton
  213. type={!showDurationPicker ? NewButtonType.alpha : NewButtonType.gray}
  214. color={getThemeColor(health.mode)}
  215. title={time}
  216. height={rpxToPx(84)}
  217. onClick={() => {
  218. setShowDurationPicker(false)
  219. }}
  220. />
  221. <View style={{ flex: 1 }} />
  222. {
  223. !showDurationPicker && <View className='border_footer_line' style={{
  224. left: rpxToPx(40),
  225. right: rpxToPx(40)
  226. }} />
  227. }
  228. </View>
  229. {
  230. !showDurationPicker && <NewTimePicker time={time} onChange={(e) => {
  231. setTime(e)
  232. }} color={getThemeColor(health.mode)} />
  233. }
  234. {
  235. !props.isTemp && !showDurationPicker && <View className='picker_time_card_footer' onClick={() => {
  236. if (time == dayjs(props.moment.target.timestamp).format('HH:mm')) {
  237. setIsYesterday(false)
  238. setTime(dayjs(global.set_time).format('HH:mm'))
  239. }
  240. else {
  241. setIsYesterday(isYesterdayTarget)
  242. setTime(dayjs(props.moment.target.timestamp).format('HH:mm'))
  243. }
  244. }}>
  245. <IconCalendar width={rpxToPx(24)} color='#5C7099' />
  246. <Text style={{ color: '#5C7099', marginLeft: rpxToPx(12), fontSize: rpxToPx(26) }}>{scheduleTime()}</Text>
  247. </View>
  248. }
  249. </View>
  250. </View>
  251. </Card> */}
  252. <View style={{ marginTop: rpxToPx(36), display: 'flex', flexDirection: 'column', alignItems: showMore ? 'flex-start' : 'center' }}>
  253. {
  254. showMore ? durationContent() :
  255. <NewButton
  256. onClick={() => setShowMore(true)}
  257. type={NewButtonType.link}
  258. title={global.language == 'en' ? 'Show More' : '查看更多'}
  259. />
  260. }
  261. </View>
  262. </NewModal>
  263. }