|
|
@@ -0,0 +1,258 @@
|
|
|
+import { createSchedule, getLabelsEvent, getSchedules } from "@/services/health";
|
|
|
+import { View, Text, Image } from "@tarojs/components";
|
|
|
+import { useRouter } from "@tarojs/taro";
|
|
|
+import { useEffect, useState } from "react";
|
|
|
+import { useSelector } from "react-redux";
|
|
|
+import './schedules.scss';
|
|
|
+import { rpxToPx } from "@/utils/tools";
|
|
|
+import { getThemeColor } from "@/features/health/hooks/health_hooks";
|
|
|
+import { jumpPage } from "@/features/trackTimeDuration/hooks/Common";
|
|
|
+import Modal from "@/components/layout/Modal.weapp";
|
|
|
+import TimePicker from "@/features/common/TimePicker";
|
|
|
+import showAlert from "@/components/basic/Alert";
|
|
|
+
|
|
|
+let useRoute;
|
|
|
+let useNavigation;
|
|
|
+let scenario = '';
|
|
|
+if (process.env.TARO_ENV == 'rn') {
|
|
|
+ useRoute = require("@react-navigation/native").useRoute
|
|
|
+ useNavigation = require("@react-navigation/native").useNavigation
|
|
|
+}
|
|
|
+
|
|
|
+export default function Schedules() {
|
|
|
+ let navigation, showActionSheetWithOptions;
|
|
|
+
|
|
|
+ let router
|
|
|
+ if (useNavigation) {
|
|
|
+ navigation = useNavigation()
|
|
|
+ }
|
|
|
+
|
|
|
+ if (process.env.TARO_ENV == 'rn') {
|
|
|
+ router = useRoute()
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ router = useRouter()
|
|
|
+ }
|
|
|
+ const [list, setList] = useState<any>([])
|
|
|
+ const [labels, setLabels] = useState<any>([])
|
|
|
+ const [errors, setErrors] = useState<any>(router.params.errors ? JSON.parse(router.params.errors) : [])
|
|
|
+ const [showTimePicker, setShowTimePicker] = useState(false)
|
|
|
+ const health = useSelector((state: any) => state.health);
|
|
|
+ const [selItem, setSelItem] = useState<any>(null)
|
|
|
+ const [selIndex, setSelIndex] = useState(-1)
|
|
|
+ const selMode = router.params.mode;
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (selMode == '' && router.params.schedules) {
|
|
|
+ setList(JSON.parse(router.params.schedules))
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ schedules()
|
|
|
+ }
|
|
|
+
|
|
|
+ }, [])
|
|
|
+
|
|
|
+ global.refreshSchedules = () => {
|
|
|
+ schedules()
|
|
|
+ }
|
|
|
+
|
|
|
+ function schedules() {
|
|
|
+ let windows = ''
|
|
|
+ switch (selMode) {
|
|
|
+ case 'FAST':
|
|
|
+ windows = 'FAST,EAT';
|
|
|
+ break
|
|
|
+ case 'EAT':
|
|
|
+ windows = 'EAT,FAST';
|
|
|
+ break
|
|
|
+ case 'SLEEP':
|
|
|
+ windows = 'SLEEP,ACTIVE';
|
|
|
+ break
|
|
|
+ case 'ACTIVE':
|
|
|
+ windows = 'ACTIVE,SLEEP';
|
|
|
+ break
|
|
|
+ case 'DAY':
|
|
|
+ windows = 'DAY,NIGHT';
|
|
|
+ break
|
|
|
+ case 'NIGHT':
|
|
|
+ windows = 'ACTIVE,DAY';
|
|
|
+ break
|
|
|
+ }
|
|
|
+ getSchedules({ window: windows }).then(res => {
|
|
|
+ setList((res as any).data)
|
|
|
+ }).catch(e => {
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ getLabelsEvent({ window: health.mode }).then(res => {
|
|
|
+ setLabels((res as any).labels)
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ function getTitle() {
|
|
|
+ switch (selMode) {
|
|
|
+ case 'FAST':
|
|
|
+ return '断食和进食';
|
|
|
+ case 'EAT':
|
|
|
+ return '进食和断食';
|
|
|
+ case 'SLEEP':
|
|
|
+ return '睡眠和活动';
|
|
|
+ case 'ACTIVE':
|
|
|
+ return '活动和睡眠';
|
|
|
+ case 'DAY':
|
|
|
+ return '白天和夜晚';
|
|
|
+ case 'NIGHT':
|
|
|
+ return '夜晚和白天';
|
|
|
+ }
|
|
|
+ return '全部'
|
|
|
+ }
|
|
|
+
|
|
|
+ function modalContent() {
|
|
|
+ const strTime = selItem.time
|
|
|
+
|
|
|
+ var title = selItem.title
|
|
|
+ var color = getThemeColor(selItem.window)
|
|
|
+
|
|
|
+ return <TimePicker time={strTime}
|
|
|
+ color={color}
|
|
|
+ title={title}
|
|
|
+ confirm={(e) => {
|
|
|
+ selItem.time = e
|
|
|
+ setSelItem(selItem)
|
|
|
+ setShowTimePicker(false)
|
|
|
+ var array = JSON.parse(JSON.stringify(list))
|
|
|
+ array[selIndex].time = e
|
|
|
+ setList(array)
|
|
|
+ checkData(array)
|
|
|
+ // confirmPickerTime(e)
|
|
|
+ }}
|
|
|
+ cancel={() => {
|
|
|
+ setShowTimePicker(false)
|
|
|
+ }} />
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkData(array) {
|
|
|
+ createSchedule({
|
|
|
+ schedules: array,
|
|
|
+ // only_check: true
|
|
|
+ }).then(res => {
|
|
|
+
|
|
|
+
|
|
|
+ if ((res as any).result) {
|
|
|
+ setErrors([])
|
|
|
+ setList((res as any).schedules)
|
|
|
+ global.refreshWindow()
|
|
|
+ if (global.refreshSchedules) {
|
|
|
+ global.refreshSchedules()
|
|
|
+ }
|
|
|
+ // if (global.refreshSchedules2) {
|
|
|
+ // global.refreshSchedules2()
|
|
|
+ // }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ var array = (res as any).conflict_windows;
|
|
|
+ var showMore = false;
|
|
|
+ if (array.length > 2) {
|
|
|
+ showMore = true;
|
|
|
+ }
|
|
|
+ else if (array.length == 1) {
|
|
|
+ showMore = false;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // 判断是否同时存在 FAST 和 EAT
|
|
|
+ const containsFastAndEat = array.includes('FAST') && array.includes('EAT');
|
|
|
+
|
|
|
+ // 判断是否同时存在 SLEEP 和 ACTIVE
|
|
|
+ const containsSleepAndActive = array.includes('SLEEP') && array.includes('ACTIVE');
|
|
|
+
|
|
|
+ // 最终结果
|
|
|
+ const result = containsFastAndEat || containsSleepAndActive;
|
|
|
+ showMore = !result;
|
|
|
+ }
|
|
|
+ if (selMode != '' && showMore) {
|
|
|
+ showAlert({
|
|
|
+ title: '弹窗标题',
|
|
|
+ content: '冲突描述',
|
|
|
+ showCancel: false,
|
|
|
+ confirm: () => {
|
|
|
+ jumpPage(`./schedules?mode=&schedules=${JSON.stringify((res as any).schedules)}&errors=${JSON.stringify((res as any).error_messages)}`)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ setList((res as any).schedules)
|
|
|
+ setErrors((res as any).error_messages ? (res as any).error_messages : [])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return <View>
|
|
|
+ <View style={{ display: 'flex', flexDirection: 'column' }}>
|
|
|
+ <View className='schedule_header_title'>{getTitle()}</View>
|
|
|
+ {
|
|
|
+ errors.map((item, index) => {
|
|
|
+ return <View key={index} className='error_tip'>{item}</View>
|
|
|
+ })
|
|
|
+ }
|
|
|
+ {/* {
|
|
|
+ errors.length == 0 && <View className='success_tip'>时间冲突已解决,并保存</View>
|
|
|
+ } */}
|
|
|
+ <View style={{ backgroundColor: '#fff' }}>
|
|
|
+ {
|
|
|
+ list.map((obj, i) => {
|
|
|
+ return <View className='schedule_item' key={i} style={{
|
|
|
+ width: rpxToPx(750),
|
|
|
+ boxSizing: 'border-box',
|
|
|
+ backgroundColor: obj.window == selMode ? getThemeColor(selMode) + '08' : '#fff'
|
|
|
+
|
|
|
+ }}>
|
|
|
+ <View className='item_left2'>
|
|
|
+ <View className='item_index'>
|
|
|
+ <View className="index_point" style={{ backgroundColor: getThemeColor(obj.window) }} />
|
|
|
+ </View>
|
|
|
+ <Text className='item_name'>{obj.title}</Text>
|
|
|
+ <View style={{ flex: 1 }} />
|
|
|
+ {
|
|
|
+ obj.is_conflict && <Text className="conflict_tip">时间冲突,请调整</Text>
|
|
|
+ }
|
|
|
+ {
|
|
|
+ !obj.is_all_day && <View className='edit_item_time' onClick={() => {
|
|
|
+ setSelIndex(i)
|
|
|
+ setSelItem(obj)
|
|
|
+ setShowTimePicker(true)
|
|
|
+ }} style={{
|
|
|
+ backgroundColor: obj.window == selMode ? getThemeColor(selMode) + '1A' : '#B2B2B21A',
|
|
|
+ color: obj.window == selMode ? getThemeColor(selMode) : '#000'
|
|
|
+ }}>{obj.time}</View>
|
|
|
+ }
|
|
|
+
|
|
|
+ {
|
|
|
+ i < list.length - 1 && <View className='item_line' />
|
|
|
+ }
|
|
|
+ </View>
|
|
|
+ </View>
|
|
|
+ })
|
|
|
+ }
|
|
|
+ </View>
|
|
|
+ {
|
|
|
+ selMode != '' && <Text onClick={() => {
|
|
|
+ jumpPage('/_health/pages/schedules?mode=')
|
|
|
+ }}>查看全部</Text>
|
|
|
+ }
|
|
|
+ {
|
|
|
+ showTimePicker && <Modal
|
|
|
+ testInfo={null}
|
|
|
+ dismiss={() => {
|
|
|
+ setShowTimePicker(false)
|
|
|
+ }}
|
|
|
+ confirm={() => { }}>
|
|
|
+ {
|
|
|
+ modalContent()
|
|
|
+ }
|
|
|
+ </Modal>
|
|
|
+ }
|
|
|
+ </View>
|
|
|
+ </View>
|
|
|
+}
|