import { View, Text, Image } from "@tarojs/components"; import { dotIsOuterRange, getBgRing, getCommon, getDot, getReal, getSchedule, getTarget, timeTotimestamp } from "../hooks/RingData"; import { RealRing, CurrentDot } from "@/features/trackTimeDuration/components/Rings"; import Rings from "./Rings"; import './IndexItem.scss' import { useTranslation } from "react-i18next"; import { ColorType } from "@/context/themes/color"; import { jumpPage } from "@/features/trackTimeDuration/hooks/Common"; import { TimeFormatter } from "@/utils/time_format"; import { useSelector } from "react-redux"; import { useEffect, useState } from "react"; import Taro from "@tarojs/taro"; import Modal from "@/components/layout/Modal.weapp"; import { ModalType } from "@/utils/types"; import TimelineStage from "./TimelineStage"; let useNavigation; if (process.env.TARO_ENV == 'rn') { useNavigation = require("@react-navigation/native").useNavigation } let popTimer; let currentRecordTemp; export default function Component(props: { type: string, data: any, time: any, showStage?: boolean }) { const { t } = useTranslation() const [record, setRecord] = useState(props.data.current_record); const user = useSelector((state: any) => state.user); const dayNight = useSelector((state: any) => state.dayNight); const [stageList, setStageList] = useState([true, false, false]) const [isStageMode, setIsStageMode] = useState(false) let navigation; if (useNavigation) { navigation = useNavigation() } useEffect(() => { setRecord(props.data.current_record) currentRecordTemp = props.data.current_record }, [props.data]) useEffect(() => { if (props.type == 'FAST_SLEEP') { global.updateMixItem = (data) => { setStageList(data) } global.changeMixIndex = (index) => { setIsStageMode(index == 1) } } }, []) function durationArc(start_time: number, end_time: number) { var duration = (end_time - start_time) / 1000; return duration / (24 * 3600) * 2 * Math.PI; } const startArc = (time: number) => { var date = new Date(time); var hour = date.getHours(); var minute = date.getMinutes(); var second = date.getSeconds(); return (hour * 3600 + minute * 60 + second) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0; } function bigRing() { var common = getCommon(null, true) common.radius = 42; common.lineWidth = 9; var bgRing = getBgRing() var currentDot1 = getDot(record, true) var targetBigRing1 = getTarget(record, true) if (record.status == 'ONGOING') { var realRing1 = getReal(record, true, false) return } if (record.status == 'WAIT_FOR_START') { var realRing1 = getSchedule(props.data.scenario, props.type != 'SLEEP', true, true)//getSchedule(record, props.type != 'SLEEP', true) var list: any = [] if (props.type == 'FAST_SLEEP') { realRing1.color = ColorType.fast + '66' if (dotIsOuterRange(true, record.fast)) { currentDot1.color = ColorType.ring } var detail = timeTotimestamp(props.data.scenario) if (stageList[0]) { const realRingBig: RealRing = { color: global.fastColor ? global.fastColor : ColorType.fast, startArc: startArc(detail.fast.target_start_time), durationArc: durationArc(detail.fast.target_start_time, detail.sleep.target_start_time) } list.push(realRingBig) } if (stageList[1]) { const realRingBig: RealRing = { color: global.fastColor ? global.fastColor : ColorType.fast, startArc: startArc(detail.sleep.target_start_time), durationArc: durationArc(detail.sleep.target_start_time, detail.sleep.target_end_time) } list.push(realRingBig) } if (stageList[2]) { const realRingBig: RealRing = { color: global.fastColor ? global.fastColor : ColorType.fast, startArc: startArc(detail.sleep.target_end_time), durationArc: durationArc(detail.sleep.target_end_time, detail.fast.target_end_time) } list.push(realRingBig) } } if (!isStageMode) { list = [] } return } var realRing1 = getReal(record, true, false) return } function smallRing() { var common = getCommon(null, false) common.radius = 28; common.lineWidth = 9; var bgRing = getBgRing() var realRing = getReal(record, false, false) if (props.type == 'SLEEP' || props.type == 'FAST_SLEEP') { if (record.sleep.status == 'WAIT_FOR_END') { var targetBigRing1 = getTarget(record, false) targetBigRing1.color = ColorType.sleep + '66' var currentDot = getDot(record, false) realRing.durationArc = durationArc(record.sleep.target_start_time, (new Date()).getTime()) return } else if (record.status == 'WAIT_FOR_START' || record.status == 'ONGOING1') { realRing = getSchedule(props.data.scenario, false, true, true)//getSchedule(record, false, true) var currentDot = getDot(record, false) if (dotIsOuterRange(true, record.sleep)) { currentDot.color = ColorType.ring } return } else if (record.sleep.status == 'NOT_COMPLETED') { realRing.durationArc = 0.01 var currentDot = getDot(record, false) return } else if (record.sleep.status == 'COMPLETED') { realRing = getReal(record, false, true) return } else if (record.sleep.status == 'ONGOING2') { var currentDot = getDot(record, false) return } return } else { var currentDot = getDot(record, false) var targetRing = getTarget(record, false) if (record.status == 'ONGOING2') { var realRing = getReal(record, false, false) return } if (record.status == 'ONGOING3') { currentDot.color = 'rgba(0, 255, 255, 0.5)' } return } } function dayRing() { var common = getCommon(null, true) common.radius = 56; common.lineWidth = 9; var bgRing = getBgRing() const realRingBig: RealRing = { color: ColorType.night + '66', startArc: 0, durationArc: 2 } var sunRise = 24 * 60 + 6 * 60 var sunSet = 18 * 60 if (dayNight.gpsInfo && user.test_user) { var sunRiseObj = dayNight.gpsInfo.daylights[0].sunrise var sunSetObj = dayNight.gpsInfo.daylights[0].sunset sunRise = 24 * 60 + parseInt(sunRiseObj.split(':')[0]) * 60 + parseInt(sunRiseObj.split(':')[1]) sunSet = parseInt(sunSetObj.split(':')[0]) * 60 + parseInt(sunSetObj.split(':')[1]) if (sunSetObj.indexOf('PM') != -1) { sunSet += 12 * 60 } } var duration = sunRise - sunSet realRingBig.startArc = (sunSet * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0; realRingBig.durationArc = (duration * 60) / (24 * 3600) * 2 * Math.PI; var currentDot = getDot(record, false) if (dotIsOuterRange(false, null, { sunrise: dayNight.sunRise, sunset: dayNight.sunSet })) { currentDot.color = ColorType.ring } else { currentDot.color = ColorType.night + '66' } return } function rings() { return { bigRing() } { props.type == 'FAST_SLEEP' && { smallRing() } } { props.type == 'FAST_SLEEP' && !props.showStage && user.isLogin && global.showNightRing === true && { dayRing() } } } function getDuration(obj) { if (!obj) { } if (obj.status == 'NOT_STARTED' || obj.status == 'NOT_COMPLETED') { return '' } var start = obj.real_start_time var end = obj.real_end_time if (!end) { end = (new Date()).getTime() } if (obj.status == 'WAIT_FOR_START') { start = obj.target_start_time end = obj.target_end_time } return TimeFormatter.durationFormate(start, end) // return TimeFormatter.calculateTimeDifference(start, end) } function fastDuration() { if (record.fast.status == 'WAIT_FOR_END') { return TimeFormatter.formateTimeDifference(record.fast.real_start_time, new Date().getTime(), false) } if (isStageMode && record.scenario == 'FAST_SLEEP') { if (stageList[0]) { return TimeFormatter.durationFormate(record.fast.target_start_time, record.sleep.target_start_time) } if (stageList[1]) { return TimeFormatter.durationFormate(record.sleep.target_start_time, record.sleep.target_end_time) } if (stageList[2]) { return TimeFormatter.durationFormate(record.sleep.target_end_time, record.fast.target_end_time) } } return getDuration(record.fast) } function sleepDuration() { if (record.sleep.status == 'WAIT_FOR_END') { return TimeFormatter.formateTimeDifference(record.sleep.real_start_time, new Date().getTime(), false) } return getDuration(record.sleep) } function goClock() { if (!user.isLogin) { jumpPage('/pages/account/ChooseAuth', 'ChooseAuth', navigation) return } if (props.showStage) { return } var node = schedules() global.showIndexModal3(true, node, null); popTimer = setInterval(() => { var node = schedules() global.showIndexModal3(true, node, null); }, 1000) global.popTimer = popTimer } function nightDuration() { if (dayNight.gpsInfo && dayNight.isMember) { var sunRiseObj = dayNight.gpsInfo.daylights[0].sunrise var sunSetObj = dayNight.gpsInfo.daylights[0].sunset var sunRise = 24 * 60 + parseInt(sunRiseObj.split(':')[0]) * 60 + parseInt(sunRiseObj.split(':')[1]) var sunSet = parseInt(sunSetObj.split(':')[0]) * 60 + parseInt(sunSetObj.split(':')[1]) if (sunSetObj.indexOf('PM') != -1) { sunSet += 12 * 60 } var duration = (sunRise - sunSet) * 60 * 1000 return TimeFormatter.calculateTimeDifference(new Date().getTime(), new Date().getTime() + duration); } else { return '12小时' } } function schedules() { var timestamp = new Date().getTime()//props.data.first_real_check_time return } function fastPicker() { var node = schedules() global.showIndexModal2(true, node, null); popTimer = setInterval(() => { var node = schedules() global.showIndexModal2(true, node, null); }, 1000) global.popTimer = popTimer } function sleepPicker(e) { if (record.status == 'ONGOING3') { return; } if (record.status == 'WAIT_FOR_START') { Taro.showToast({ title: t('feature.track_time_duration.common.start_fasting_first'), icon: 'none' }) return; } var node = schedules() global.showIndexModal2(true, node, null); popTimer = setInterval(() => { var node = schedules() global.showIndexModal2(true, node, null); }, 1000) global.popTimer = popTimer } return { rings() } { props.type == 'FAST_SLEEP' && !props.showStage && user.isLogin && global.showNightRing === true && {t('feature.common.overnight')} } { props.type == 'FAST_SLEEP' && !props.showStage && user.isLogin && global.showNightRing === true && {nightDuration()} } { (props.type == 'FAST' || props.type == 'FAST_SLEEP') && {t('feature.track_time_duration.record_fast_sleep.item.fast')} } { (props.type == 'FAST' || props.type == 'FAST_SLEEP') && {fastDuration()} } { (props.type == 'SLEEP' || props.type == 'FAST_SLEEP') && {t('feature.track_time_duration.record_fast_sleep.item.sleep')} } { (props.type == 'SLEEP' || props.type == 'FAST_SLEEP') && {sleepDuration()} } {/* */} {/* {getArrowText()} */} {/* */} }