post_moment_time.tsx 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 { 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. let isYesterdayTarget = false
  14. export default function PostMomentTime(props: {
  15. title?: string,
  16. time: string,
  17. isTemp: boolean,
  18. onChange: any,
  19. moment?: any,
  20. dismiss: any
  21. }) {
  22. const health = useSelector((state: any) => state.health);
  23. const [showDurationPicker, setShowDurationPicker] = useState(false)
  24. const [isYesterday, setIsYesterday] = useState(false)
  25. const [showMore, setShowMore] = useState(false)
  26. const [time, setTime] = useState(props.time)
  27. const [minutes, setMinutes] = useState(30)
  28. function durationTime() {
  29. var hour = Math.floor(minutes / 60)
  30. var minute = minutes % 60
  31. var str = ''
  32. if (hour > 0) {
  33. str = hour + '小时'
  34. }
  35. if (minute > 0) {
  36. str += minute + '分钟'
  37. }
  38. if (hour == 0 && minute == 0) {
  39. str = '0分钟'
  40. }
  41. return str
  42. }
  43. function endTime() {
  44. var now = new Date()
  45. var hour = parseInt(time.split(':')[0] + '')
  46. var minute = parseInt(time.split(':')[1] + '')
  47. now.setHours(hour)
  48. now.setMinutes(minute)
  49. var timestamp = now.getTime()
  50. if (isYesterday) {
  51. timestamp = timestamp - 24 * 3600 * 1000
  52. }
  53. timestamp = timestamp + minutes * 60 * 1000
  54. const today = dayjs();
  55. const dt = dayjs(timestamp);
  56. var strTime = dt.format('HH:mm ')
  57. const yesterday = today.subtract(1, 'day');
  58. const tomorrow = today.subtract(-1, 'day');
  59. if (dt.isSame(today, 'day')) {
  60. return strTime + 'Today';
  61. } else if (dt.isSame(yesterday, 'day')) {
  62. return strTime + 'Yesterday';
  63. } else if (dt.isSame(tomorrow, 'day')) {
  64. return strTime + 'Tomorrow';
  65. } else {
  66. return strTime + dt.format('MM-DD');
  67. }
  68. }
  69. function durationContent() {
  70. return <View className='picker_time_card'>
  71. <View className='picker_time_card_header'>
  72. <View style={{ width: rpxToPx(52) }} />
  73. <Text>Duration</Text>
  74. <View style={{ flex: 1 }} />
  75. <NewButton
  76. type={showDurationPicker ? NewButtonType.alpha : NewButtonType.gray}
  77. color={getThemeColor(health.mode)}
  78. title={durationTime()}
  79. height={rpxToPx(84)}
  80. onClick={() => {
  81. setShowDurationPicker(true)
  82. }}
  83. />
  84. <View style={{ width: rpxToPx(40) }} />
  85. </View>
  86. {
  87. showDurationPicker && <NewDurationPicker
  88. value={minutes}
  89. color={getThemeColor(health.mode)}
  90. onChange={(v) => {
  91. setMinutes(v)
  92. }} />
  93. }
  94. <View className='picker_time_card_footer'>
  95. <IconTarget width={rpxToPx(24)} color='#5C7099' />
  96. <Text style={{ color: '#5C7099', marginLeft: rpxToPx(12), fontSize: rpxToPx(26) }}>Expect to finish at {endTime()}</Text>
  97. </View>
  98. </View>
  99. }
  100. function scheduleTime() {
  101. if (props.moment) {
  102. var timestamp = props.moment.target.timestamp
  103. var time = parseInt(dayjs(timestamp).format('HHmm'))
  104. var now = parseInt(dayjs().format('HHmm'))
  105. if (time > now) {
  106. isYesterdayTarget = true
  107. return `Scheduled for ${dayjs(timestamp).format('HH:mm')} yesterday`
  108. }
  109. isYesterdayTarget = false
  110. return `Scheduled for ${dayjs(timestamp).format('HH:mm')} today`
  111. }
  112. return 'Scheduled for xxx today'
  113. }
  114. /*
  115. type={expandIndex == index ? NewButtonType.alpha : NewButtonType.gray}
  116. color={iFast ? MainColorType.fast : MainColorType.sleep}
  117. */
  118. return <NewModal
  119. title='开始时间'
  120. dismiss={props.dismiss}
  121. confirm={() => {
  122. props.onChange({
  123. time: time,
  124. duration: minutes,
  125. isYesterday: isYesterday
  126. })
  127. }}
  128. themeColor={getThemeColor(health.mode)}>
  129. <View style={{ flexDirection: 'column', display: 'flex', alignItems: 'center' }}>
  130. <View className='picker_time_card'>
  131. <View className='picker_time_card_header'>
  132. <View style={{ flex: 1 }} />
  133. <NewButton
  134. type={NewButtonType.gray}
  135. title={isYesterday ? 'Yesterday' : 'Today'}
  136. height={rpxToPx(84)}
  137. onClick={() => {
  138. setIsYesterday(!isYesterday)
  139. }}
  140. />
  141. <View style={{ width: rpxToPx(12) }} />
  142. <NewButton
  143. type={!showDurationPicker ? NewButtonType.alpha : NewButtonType.gray}
  144. color={getThemeColor(health.mode)}
  145. title={time}
  146. height={rpxToPx(84)}
  147. onClick={() => {
  148. setShowDurationPicker(false)
  149. }}
  150. />
  151. <View style={{ flex: 1 }} />
  152. {
  153. !showDurationPicker && <View className='border_footer_line' />
  154. }
  155. </View>
  156. {
  157. !showDurationPicker && <NewTimePicker time={time} onChange={(e) => {
  158. setTime(e)
  159. }} color={getThemeColor(health.mode)} />
  160. }
  161. {
  162. !props.isTemp && !showDurationPicker && <View className='picker_time_card_footer' onClick={() => {
  163. setIsYesterday(isYesterdayTarget)
  164. setTime(dayjs(props.moment.target.timestamp).format('HH:mm'))
  165. }}>
  166. <IconCalendar width={rpxToPx(24)} color='#5C7099' />
  167. <Text style={{ color: '#5C7099', marginLeft: rpxToPx(12), fontSize: rpxToPx(26) }}>{scheduleTime()}</Text>
  168. </View>
  169. }
  170. </View>
  171. <View style={{ marginBottom: rpxToPx(72), marginTop: rpxToPx(36) }}>
  172. {
  173. showMore ? durationContent() :
  174. <View
  175. onClick={() => setShowMore(true)}
  176. style={{
  177. flexDirection: 'row',
  178. width: rpxToPx(142),
  179. height: rpxToPx(72),
  180. display: 'flex',
  181. alignItems: 'center',
  182. justifyContent: 'center'
  183. }}>
  184. <Image style={{ width: rpxToPx(26), height: rpxToPx(26) }} src={require('@assets/_health/setting.png')} />
  185. <Text style={{ color: '#5C7099', marginLeft: rpxToPx(10) }}>More</Text>
  186. </View>
  187. }
  188. </View>
  189. </View>
  190. </NewModal>
  191. }