SetSchedule.weapp.tsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. import Buttons from "@/components/basic/Buttons";
  2. import { setPlan } from "@/services/trackTimeDuration";
  3. import { setScenario, setStep } from "@/store/scenario";
  4. import { View, Text, PageContainer } from "@tarojs/components";
  5. import "./SetSchedule.scss";
  6. import Taro, { useDidShow, useReady } from "@tarojs/taro";
  7. import { useEffect, useRef, useState } from "react";
  8. import { useDispatch, useSelector } from "react-redux";
  9. import Footer from "@/components/layout/Footer";
  10. import PickerViews from "@/components/input/PickerViews";
  11. import { durationDatas, durationIndex, durationTime, pickerDurations } from "../hooks/Console";
  12. import { TimeFormatter } from "@/utils/time_format";
  13. import Modal from "@/components/layout/Modal";
  14. import Dial from './Dial';
  15. import TimePicker from "@/features/common/TimePicker";
  16. import { SetScheduleBtn } from "@/features/common/SpecBtns";
  17. import Layout from "@/components/layout/layout";
  18. import { NaviBarTitleShowType, TemplateType } from "@/utils/types";
  19. import { useTranslation } from "react-i18next";
  20. import { ColorType } from "@/context/themes/color";
  21. import TitleView from "./TitleView";
  22. import { jumpPage } from "../hooks/Common";
  23. export default function Component() {
  24. const isFastFirst = true;
  25. const { t } = useTranslation()
  26. const dispatch = useDispatch();
  27. const canvasRef = useRef(null);
  28. const [scenario] = useState(useSelector((state: any) => state.scenario))
  29. // const scenario = useSelector((state: any) => state.scenario);
  30. const common = useSelector((state: any) => state.common);
  31. const [isOpen, setIsOpen] = useState(false)
  32. const [isTimeOpen, setIsTimeOpen] = useState(false)
  33. const [btnDisable, setBtnDisable] = useState(false)
  34. const pickerRef = useRef<any>(null);
  35. // const [count,setCount] = useState(0)
  36. const [beginChange, setBeginChange] = useState(true)
  37. const [operateType, setOperateType] = useState(0)
  38. const [isModalTimePicker,setIsModalTimePicker] = useState(false)
  39. var scheduleObj: { start_time: any; end_time: any; };
  40. if (scenario.name == 'FAST') {
  41. scheduleObj = scenario.schedule.fast
  42. }
  43. else if (scenario.name == 'SLEEP') {
  44. scheduleObj = scenario.schedule.sleep
  45. }
  46. else {
  47. if (scenario.step == 'fast') {
  48. scheduleObj = scenario.schedule.fast
  49. }
  50. else {
  51. scheduleObj = scenario.schedule.sleep
  52. }
  53. }
  54. const [startTime, setStartTime] = useState(scheduleObj.start_time)
  55. const [endTime, setEndTime] = useState(scheduleObj.end_time)
  56. global.startTime = startTime
  57. global.endTime = endTime
  58. const [pickerValue, setPickerValue] = useState(durationIndex(scheduleObj.start_time, scheduleObj.end_time, common))
  59. const [hours, setHours] = useState(durationTime(scheduleObj.start_time, scheduleObj.end_time)[0])
  60. const [minutes, setMinutes] = useState(durationTime(scheduleObj.start_time, scheduleObj.end_time)[1])
  61. const [chooseStart, setChooseStart] = useState(true)
  62. const [count, setCount] = useState(0)
  63. useReady(() => {
  64. if (global.schedule_fast && scenario.step == 'fast') {
  65. scheduleObj = global.schedule_fast
  66. }
  67. if (global.schedule_sleep && scenario.step == 'sleep') {
  68. scheduleObj = global.schedule_sleep
  69. }
  70. setStartTime(scheduleObj.start_time)
  71. setEndTime(scheduleObj.end_time)
  72. setPickerValue(durationIndex(scheduleObj.start_time, scheduleObj.end_time, common))
  73. setHours(durationTime(scheduleObj.start_time, scheduleObj.end_time)[0])
  74. setMinutes(durationTime(scheduleObj.start_time, scheduleObj.end_time)[1])
  75. // var title = scenario.step == 'fast' ? 'Fast schedule' : 'Sleep schedule'
  76. // Taro.setNavigationBarTitle({
  77. // title: title
  78. // })
  79. })
  80. useEffect(() => {
  81. if (isOpen || isTimeOpen) {
  82. global.disableCanvasGesture = true
  83. }
  84. else {
  85. global.disableCanvasGesture = false
  86. }
  87. }, [isOpen, isTimeOpen])
  88. useDidShow(() => {
  89. setCount(count + 1)
  90. })
  91. function start() {
  92. if (scenario.name == 'FAST' || scenario.name == 'SLEEP') {
  93. setBtnDisable(true)
  94. setPlan({
  95. scenario: scenario.name,
  96. schedule: scenario.name == 'FAST' ? {
  97. fast: {
  98. start_time: startTime,
  99. end_time: endTime,
  100. }
  101. } : {
  102. sleep: {
  103. start_time: startTime,
  104. end_time: endTime,
  105. }
  106. }
  107. }).then(res => {
  108. setBtnDisable(false)
  109. global.checkData()
  110. Taro.navigateBack({ delta: 3 })
  111. }).catch(e => {
  112. setBtnDisable(false)
  113. })
  114. }
  115. else {
  116. if ((scenario.step == 'fast' && isFastFirst) || (scenario.step == 'sleep' && !isFastFirst)) {
  117. var obj = JSON.parse(JSON.stringify(scenario))
  118. if (isFastFirst) {
  119. obj.schedule.fast = {
  120. start_time: startTime,
  121. end_time: endTime,
  122. }
  123. dispatch(setStep('sleep'))
  124. dispatch(setScenario(obj))
  125. }
  126. else {
  127. obj.schedule.sleep = {
  128. start_time: startTime,
  129. end_time: endTime,
  130. }
  131. dispatch(setStep('fast'))
  132. dispatch(setScenario(obj))
  133. }
  134. saveTempCache(startTime, endTime)
  135. jumpPage('/pages/clock/SetSchedule')
  136. }
  137. else {
  138. commit()
  139. }
  140. }
  141. }
  142. function saveTempCache(strStart, strEnd) {
  143. if (scenario.step == 'fast') {
  144. global.schedule_fast = {
  145. start_time: strStart,
  146. end_time: strEnd,
  147. }
  148. }
  149. if (scenario.step == 'sleep') {
  150. global.schedule_sleep = {
  151. start_time: strStart,
  152. end_time: strEnd,
  153. }
  154. }
  155. }
  156. function commit() {
  157. setBtnDisable(true)
  158. setPlan({
  159. scenario: scenario.name,
  160. schedule: {
  161. fast: {
  162. start_time: isFastFirst ? scenario.schedule.fast.start_time : startTime,
  163. end_time: isFastFirst ? scenario.schedule.fast.end_time : endTime,
  164. }, sleep: {
  165. start_time: !isFastFirst ? scenario.schedule.sleep.start_time : startTime,
  166. end_time: !isFastFirst ? scenario.schedule.sleep.end_time : endTime,
  167. }
  168. }
  169. }).then(res => {
  170. setBtnDisable(false)
  171. dispatch(setStep('fast'))
  172. global.checkData()
  173. Taro.navigateBack({ delta: 4 })
  174. }).catch(e => {
  175. setBtnDisable(false)
  176. })
  177. }
  178. function onStartTimeChange(e: string) {
  179. setIsTimeOpen(false)
  180. setBeginChange(true)
  181. setStartTime(e)
  182. setPickerValue(durationIndex(e, endTime, common))
  183. setHours(durationTime(e, endTime)[0])
  184. setMinutes(durationTime(e, endTime)[1])
  185. saveTempCache(e, endTime);
  186. global.updateDial(e, endTime)
  187. }
  188. function onEndTimeChange(e: string) {
  189. setIsTimeOpen(false)
  190. setBeginChange(false)
  191. setEndTime(e)
  192. setPickerValue(durationIndex(startTime, e, common))
  193. setHours(durationTime(startTime, e)[0])
  194. setMinutes(durationTime(startTime, e)[1])
  195. saveTempCache(startTime, e);
  196. console.log(e)
  197. global.updateDial(startTime, e)
  198. }
  199. function showPicker() {
  200. setIsOpen(true)
  201. }
  202. function durationChange(e) {
  203. var count = (e[0] + common.duration.min) * 60 + e[1] * common.duration.step
  204. var h = parseInt(count / 60)
  205. var m = count % 60
  206. setHours(h)
  207. setMinutes(m)
  208. setPickerValue(e)
  209. setIsOpen(false)
  210. if (beginChange) {
  211. var strEnd = TimeFormatter.calculateTimeByTimeRange(count, startTime, true)
  212. setEndTime(strEnd);
  213. saveTempCache(startTime, strEnd)
  214. global.updateDial(startTime, strEnd)
  215. }
  216. else {
  217. var strStart = TimeFormatter.calculateTimeByTimeRange(count, endTime, false)
  218. setStartTime(strStart);
  219. saveTempCache(strStart, endTime)
  220. global.updateDial(strStart, endTime)
  221. }
  222. }
  223. global.startDuration = (type) => {
  224. setOperateType(type)
  225. }
  226. global.updateDuration = (start, end) => {
  227. var startCount = parseInt(start.split(':')[0]) * 60 + parseInt(start.split(':')[1])
  228. var endCount = parseInt(end.split(':')[0]) * 60 + parseInt(end.split(':')[1])
  229. if (operateType == 1 && startCount % 30 == 0) {
  230. Taro.vibrateShort({
  231. type: 'medium',
  232. })
  233. }
  234. else if (operateType == 2 && endCount % 30 == 0) {
  235. Taro.vibrateShort({
  236. type: 'medium',
  237. })
  238. }
  239. else if (operateType == 3 && (startCount % 30 == 0 || endCount % 30 == 0)) {
  240. Taro.vibrateShort({
  241. type: 'medium',
  242. })
  243. }
  244. setStartTime(start)
  245. setEndTime(end)
  246. setPickerValue(durationIndex(start, end, common))
  247. setHours(durationTime(start, end)[0])
  248. setMinutes(durationTime(start, end)[1])
  249. saveTempCache(start, end)
  250. }
  251. global.endDuration = () => {
  252. setOperateType(0)
  253. }
  254. function layoutContent() {
  255. return <PickerViews ref={pickerRef}
  256. onChange={durationChange}
  257. items={durationDatas(common)}
  258. value={pickerValue} height={200}
  259. title={scenario.step == 'fast' ?
  260. t('feature.track_time_duration.dial.picker_fast_schedule_duration') :
  261. t('feature.track_time_duration.dial.picker_sleep_schedule_duration')}
  262. themeColor={scenario.step == 'fast' ? global.fastColor ? global.fastColor : ColorType.fast : global.sleepColor ? global.sleepColor : ColorType.sleep}
  263. showBtns={true} onCancel={() => { setIsOpen(false) }} />
  264. }
  265. function pickerTitle() {
  266. if (scenario.step == 'fast') {
  267. if (chooseStart) {
  268. return t('feature.track_time_duration.dial.picker_fast_schedule_start_time');
  269. }
  270. return t('feature.track_time_duration.dial.picker_fast_schedule_end_time');
  271. }
  272. else {
  273. if (chooseStart) {
  274. return t('feature.track_time_duration.dial.picker_sleep_schedule_start_time');
  275. }
  276. return t('feature.track_time_duration.dial.picker_sleep_schedule_end_time');
  277. }
  278. }
  279. function timeContent() {
  280. return <TimePicker time={chooseStart ? startTime : endTime}
  281. color={scenario.step == 'fast' ? global.fastColor ? global.fastColor : ColorType.fast : global.sleepColor ? global.sleepColor : ColorType.sleep}
  282. title={pickerTitle()}
  283. confirm={chooseStart ? onStartTimeChange : onEndTimeChange}
  284. cancel={() => { setIsTimeOpen(false) }} />
  285. }
  286. function detail() {
  287. return <View >
  288. {/* <Text className="subtitle">{t('page.set_schedule.fast_subtitle')}</Text> */}
  289. <TitleView title={scenario.step == 'fast' ? t('page.set_schedule.fast_title') : t('page.set_schedule.sleep_title')}
  290. subTitle={t('page.set_schedule.fast_subtitle')}
  291. titleColor={scenario.step == 'fast' ? global.fastColor ? global.fastColor : ColorType.fast : global.sleepColor ? global.sleepColor : ColorType.sleep}
  292. />
  293. <View className="box">
  294. <View className="header" style={{ backgroundColor: global.isDebug ? '#EEC01F' : 'transparent' }}>
  295. <View className="item1" style={{ opacity: operateType == 1 || operateType == 3 ? 1 : 0.4, backgroundColor: global.isDebug ? 'pink' : 'transparent' }} onClick={() => {
  296. setIsModalTimePicker(true)
  297. setChooseStart(true)
  298. setIsTimeOpen(true)
  299. }}>
  300. <Text className="item_title schedule_text_key">{t('feature.track_time_duration.dial.start_time')}</Text>
  301. <Text className="item_text schedule_text_value">{startTime}</Text>
  302. </View>
  303. <View style={{ width: 23 }} />
  304. <View className="item1" style={{ opacity: operateType == 2 || operateType == 3 ? 1 : 0.4, backgroundColor: global.isDebug ? 'pink' : 'transparent' }} onClick={() => {
  305. setIsModalTimePicker(true)
  306. setChooseStart(false)
  307. setIsTimeOpen(true)
  308. }}>
  309. <Text className="item_title schedule_text_key">{t('feature.track_time_duration.dial.end_time')}</Text>
  310. <Text className="item_text schedule_text_value">{endTime}</Text>
  311. </View>
  312. </View>
  313. <View className="dial_bg" style={{ backgroundColor: global.isDebug ? 'pink' : 'transparent' }}>
  314. <Dial ref={canvasRef} />
  315. </View>
  316. <View className="duration_bg" style={{ opacity: operateType == 1 || operateType == 2 ? 1 : 0.4, backgroundColor: global.isDebug ? 'pink' : 'transparent' }} onClick={() => { setIsModalTimePicker(false);setIsOpen(true) }}>
  317. <Text className="duration_title schedule_text_key">{t('feature.track_time_duration.dial.duration')}</Text>
  318. <Text className="duration_value schedule_text_value" >{hours > 0 ? hours + '小时' : ''}{minutes > 0 ? minutes + '分钟' : ''}</Text>
  319. </View>
  320. </View>
  321. <Footer>
  322. <SetScheduleBtn title={(scenario.step == 'fast' && scenario.name == 'FAST_SLEEP') ? t('feature.common.btn_set_and_next') : t('feature.common.btn_set_and_done')}
  323. lowLight={operateType != 0}
  324. isFast={scenario.step == 'fast'}
  325. disable={btnDisable}
  326. onClick={() => start()} />
  327. </Footer>
  328. {/* <PageContainer style={{ backgroundColor: '#1c1c1c' }}
  329. overlayStyle='background-color:rgba(0,0,0,0.9)'
  330. custom-style='background-color:#1c1c1c'
  331. closeOnSlideDown={false}
  332. onAfterLeave={() => { setIsOpen(false); setIsTimeOpen(false) }}
  333. show={isOpen || isTimeOpen} round={true} overlay={true} position='bottom'
  334. >
  335. {
  336. isModalTimePicker?timeContent():layoutContent()
  337. }
  338. </PageContainer> */}
  339. {
  340. isOpen && <Modal children={layoutContent()} dismiss={() => setIsOpen(false)} confirm={() => {
  341. setIsOpen(false)
  342. durationChange(pickerRef.current.getConfirmData())
  343. }} />
  344. }
  345. {
  346. isTimeOpen && <Modal children={timeContent()} dismiss={() => setIsTimeOpen(false)} confirm={() => {
  347. setIsTimeOpen(false)
  348. }} />
  349. }
  350. </View>
  351. }
  352. return <Layout
  353. titleColor={scenario.step == 'fast' ? global.fastColor ? global.fastColor : ColorType.fast : global.sleepColor ? global.sleepColor : ColorType.sleep}
  354. title={scenario.step == 'fast' ? t('page.set_schedule.fast_title') : t('page.set_schedule.sleep_title')}
  355. titleShowStyle={NaviBarTitleShowType.scrollToShow} type={TemplateType.customHeader}>
  356. {
  357. detail()
  358. }
  359. </Layout>;
  360. }