ChooseScenario.tsx 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import { View, Text } from "@tarojs/components";
  2. import Buttons from '@/components/basic/Buttons';
  3. import Texts from '@/components/basic/Texts';
  4. import Rings from '@components/view/Rings';
  5. import Rings2, { BgRing, RingCommon, TargetRing } from './Rings';
  6. import Footer from '@/components/layout/Footer';
  7. import SingleSelect from '../../../components/input/SingleSelect';
  8. import { ComponentStatus, TextType } from "@utils/types";
  9. import { useTranslation } from 'react-i18next'
  10. import './ChooseScenario.scss'
  11. import { useState } from "react";
  12. import { useDidShow, useReady } from "@tarojs/taro";
  13. import Taro from "@tarojs/taro";
  14. import { useDispatch, useSelector } from "react-redux";
  15. import { setScenario, setScenarioName, setStep } from "@/store/scenario";
  16. import { getPlans } from "@/services/trackTimeDuration";
  17. export default function Component() {
  18. const isFastFirst = true;
  19. const { t } = useTranslation()
  20. const dispatch = useDispatch();
  21. const [selIndex, setSelIndex] = useState(-1)
  22. const [scenarios, setScenarios] = useState<any[]>([])
  23. const selScenario = useSelector((state: any) => state.scenario);
  24. const [count,setCount] = useState(0)
  25. useDidShow(()=>{
  26. setCount(count+1)
  27. })
  28. useReady(() => {
  29. if (selScenario) {
  30. if (selScenario.name == 'FAST_SLEEP') {
  31. dispatch(setStep(isFastFirst?'fast':'sleep'))
  32. setSelIndex(2)
  33. }
  34. else if (selScenario.name == 'SLEEP') {
  35. dispatch(setStep('sleep'))
  36. setSelIndex(1)
  37. }
  38. else {
  39. dispatch(setStep('fast'))
  40. setSelIndex(0)
  41. }
  42. }
  43. Taro.getStorage({key:'scenarios'}).then(res=>{
  44. if (res){
  45. setScenarios(JSON.parse(res.data as any))
  46. }
  47. })
  48. getPlans().then(res => {
  49. const data = res as { scenarios: any[] };
  50. Taro.setStorage({key:'scenarios', data:JSON.stringify(data.scenarios as any)})
  51. setScenarios(data.scenarios)
  52. })
  53. })
  54. function next() {
  55. Taro.navigateTo({
  56. url: '/pages/clock/SetSchedule'
  57. })
  58. }
  59. function footerContent() {
  60. var style = {}
  61. switch (selIndex) {
  62. case 0:
  63. style = { backgroundColor: '#AAFF00' }
  64. break;
  65. case 1:
  66. style = { backgroundColor: '#00FFFF' }
  67. break;
  68. case 2:
  69. style = {
  70. background: 'linear-gradient(to right, #AAFF00, #00FFFF)'
  71. }
  72. break;
  73. }
  74. return <View>
  75. <Buttons title='Next' onClick={next} btnStyle={{ ...style, width: 320 }} />
  76. </View>
  77. }
  78. function timeToArc(time: string) {
  79. var count: number = parseInt(time.split(':')[1]) + parseInt(time.split(':')[0]) * 60
  80. // count = count>720?count-720:count
  81. return (count as any) / 1440 * 2 * Math.PI - Math.PI / 2
  82. }
  83. function durationToArc(startTime: string, endTime: string) {
  84. var start: number = parseInt(startTime.split(':')[1]) + parseInt(startTime.split(':')[0]) * 60
  85. var end: number = parseInt(endTime.split(':')[1]) + parseInt(endTime.split(':')[0]) * 60
  86. if (end <= start) {
  87. end += 1440
  88. }
  89. return (end - start) / 1440 * 2 * Math.PI
  90. }
  91. // function getScheduleTarget(isFast: boolean) {
  92. // for (var i = 0; i < scenarios.length; i++) {
  93. // if (isFast && scenarios[i].name == 'FAST') {
  94. // if (global.schedule_fast){
  95. // return global.schedule_fast
  96. // }
  97. // return scenarios[i].schedule.fast
  98. // }
  99. // else if (!isFast && scenarios[i].name == 'SLEEP') {
  100. // if (global.schedule_sleep){
  101. // return global.schedule_sleep
  102. // }
  103. // return scenarios[i].schedule.sleep
  104. // }
  105. // else {
  106. // if (isFast){
  107. // if (global.schedule_fast){
  108. // return global.schedule_fast
  109. // }
  110. // return scenarios[i].schedule.fast
  111. // }
  112. // if (global.schedule_sleep){
  113. // return global.schedule_sleep
  114. // }
  115. // return scenarios[i].schedule.sleep
  116. // }
  117. // }
  118. // }
  119. function getScheduleTarget(isFast: boolean) {
  120. for (var i = 0; i < scenarios.length; i++) {
  121. if (isFast && scenarios[i].name == 'FAST') {
  122. if (global.schedule_fast){
  123. return global.schedule_fast
  124. }
  125. return scenarios[i].schedule.fast
  126. }
  127. else if (!isFast && scenarios[i].name == 'SLEEP') {
  128. if (global.schedule_sleep){
  129. return global.schedule_sleep
  130. }
  131. return scenarios[i].schedule.sleep
  132. }
  133. }
  134. }
  135. function items() {
  136. const array: any[] = []
  137. const common: RingCommon = {
  138. useCase: 'ChooseScenario',
  139. radius: 33,
  140. lineWidth: 8,
  141. isFast: true,
  142. status: 'WAIT_FOR_START'
  143. }
  144. const common2: RingCommon = {
  145. useCase: 'ChooseScenario',
  146. radius: 23,
  147. lineWidth: 6,
  148. isFast: true,
  149. status: 'WAIT_FOR_START'
  150. }
  151. const bgRing: BgRing = {
  152. color: '#262626'
  153. }
  154. const targetRing: TargetRing = {
  155. color: '#AAFF00',
  156. startArc: timeToArc((getScheduleTarget(true) as any).start_time),
  157. durationArc: durationToArc((getScheduleTarget(true) as any).start_time, (getScheduleTarget(true) as any).end_time)
  158. }
  159. const targetRing2: TargetRing = {
  160. color: '#00FFFF',
  161. startArc: timeToArc((getScheduleTarget(false) as any).start_time),
  162. durationArc: durationToArc((getScheduleTarget(false) as any).start_time, (getScheduleTarget(false) as any).end_time)
  163. }
  164. array.push(
  165. <View className="item_row" style={{ opacity: scenarios.length > 0 ? 1 : 0 }}>
  166. <Rings2 common={common} bgRing={bgRing} targetRing={targetRing} canvasId='0' />
  167. {/* <Rings radius={33} strokeWidth={8} color='#AAFF00' canvasId='0' /> */}
  168. <View className="item_txt_bg">
  169. <Text className="item_txt" style={{ color: '#AAFF00' }}>{t('page.choose_scenario.fast')}</Text>
  170. </View>
  171. </View>
  172. );
  173. array.push(
  174. <View className="item_row" style={{ opacity: scenarios.length > 0 ? 1 : 0 }}>
  175. <Rings2 common={common} bgRing={bgRing} targetRing={targetRing2} canvasId='1' />
  176. {/* <Rings radius={33} strokeWidth={8} color='#00FFFF' canvasId='1' /> */}
  177. <View className="item_txt_bg">
  178. <Text className="item_txt" style={{ color: '#00FFFF' }}>{t('page.choose_scenario.sleep')}</Text>
  179. </View>
  180. </View>
  181. )
  182. array.push(
  183. <View className="item_row" style={{ opacity: scenarios.length > 0 ? 1 : 0 }}>
  184. <View style={{ position: 'relative', zIndex: 1 }}>
  185. <Rings2 common={common} bgRing={bgRing} targetRing={targetRing} canvasId='3' />
  186. <View style={{ display: 'flex', position: 'absolute', left: 0, right: 0, top: 0, bottom: 0, alignItems: 'center', justifyContent: 'center' }}>
  187. {/* <Rings radius={23} strokeWidth={6} color='#00FFFF' canvasId='4' /> */}
  188. <Rings2 common={common2} bgRing={bgRing} targetRing={targetRing2} canvasId='4' />
  189. </View>
  190. </View>
  191. <View className="item_txt_bg">
  192. <Text className="item_txt" style={{ color: '#00FFFF' }}>{t('page.choose_scenario.fast_sleep')}</Text>
  193. </View>
  194. </View>
  195. )
  196. return array;
  197. }
  198. function handleItemSelect(index: number) {
  199. setSelIndex(index)
  200. dispatch(setScenario(scenarios[index]) as any)
  201. if (index == 0) {
  202. dispatch(setStep('fast'))
  203. }
  204. else if (index == 1) {
  205. dispatch(setStep('sleep'))
  206. }
  207. else {
  208. dispatch(setStep(isFastFirst?'fast':'sleep'))
  209. }
  210. // dispatch(setScenarioName(scenarios[index].scenario) as any)
  211. }
  212. return <View className="container">
  213. <Texts text={t('page.choose_scenario.title')} type={TextType.primary}></Texts>
  214. <Texts text={t('page.choose_scenario.sub_title')} type={TextType.secondary}></Texts>
  215. <View style={{ height: 20 }} />
  216. {
  217. scenarios.length>0&&<View style={{ position: 'relative', zIndex: 1 }}>
  218. <SingleSelect items={items()} itemSelect={handleItemSelect} selIndex={selIndex} />
  219. </View>
  220. }
  221. <Footer children={footerContent()} />
  222. </View>;
  223. }