SetSchedule.weapp.tsx 15 KB

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