import Box from "@/components/layout/Box"; import Header from "@/components/layout/Header"; import Modal from "@/components/layout/Modal"; import RecordItem from "@/features/common/RecordItem"; import { delRecord } from "@/services/trackTimeDuration"; import { ModalType } from "@/utils/types"; import { View, Text, Image, PageContainer } from "@tarojs/components"; import Taro from "@tarojs/taro"; import { useEffect, useState, memo } from "react"; import TimelineFastSleep from "./TimelineFastSleep"; import { TimeFormatter } from "@/utils/time_format"; import './RecordFastSleep.scss' import { bigRingRadius, getBgRing, getCommon, getDot, getReal, getTarget, ringWidth, smallRingRadius } from "../hooks/RingData"; import Rings from "./Rings"; import Segment from "@/components/navigation/Segment"; import Stage from "./Stage"; import CenterContentTitleModal from "@/features/common/CenterContentTitleModal"; import { useTranslation } from "react-i18next"; import { ColorType } from "@/context/themes/color"; import TimelineStage from "./TimelineStage"; import { jumpPage } from "../hooks/Common"; import { RealRing, CurrentDot } from "@/features/trackTimeDuration/components/Rings"; import { rpxToPx } from "@/utils/tools"; import { useDispatch, useSelector } from "react-redux"; import { setSelID } from "@/store/common"; import CircadianDetailPopup from "./CircadianDetailPopup"; // import { sqrt } from 'mathjs' let AppState; if (process.env.TARO_ENV == 'rn') { AppState = require("react-native").AppState } let stageCanvasId = new Date().getTime() let startX = 0 let startY = 0 //https://www.php.cn/faq/629819.html // export default function RecordFastSleep(props: { data: any, type: string, delSuccess?: Function, index: any }) { const RecordFastSleep = memo((props: { data: any, type: string, index: number }) => { const [count, setCount] = useState(0) const [showDetailModal, setShowDetailModal] = useState(false) const [segmentIndex, setSegmentIndex] = useState(0) const [diffTimeZone, setDiffTimeZone] = useState(false) const [multiTimeZone, setMultiTimeZone] = useState(false) const [showMore, setShowMore] = useState(false) const [selIndex, setSelIndex] = useState(0) const [showMoreModal, setShowMoreModal] = useState(false) const [showDel, setShowDel] = useState(false) const { t } = useTranslation() var canvasId = props.data.id const record = props.data; const common = useSelector((state: any) => state.common); const dispatch = useDispatch(); const handleAppStateChange = (nextAppState) => { checkTimezone() }; useEffect(() => { checkTimezone() if (process.env.TARO_ENV == 'rn') { AppState.addEventListener('change', handleAppStateChange); } if (record.scenario != 'FAST_SLEEP') { setShowMore(false) setSelIndex(0) } if (props.index==-20000){ global.refreshRecent = ()=>{ setCount((index)=>index+1) } setTimeout(()=>{ setCount((index)=>index+1) },100) } // console.log(sqrt(-4).toString()) }, [props.data]) useEffect(() => { if (common.recordSelID != props.data.id) { setShowDel(false) } }, [common.recordSelID]) function checkTimezone() { var split = new Date().toString().split(' '); var currentTZ = split[split.length - 2]; var isDiff = false; var isMulti = false; var tempTZ = ''; if (props.data.fast) { if (props.data.fast.real_start_time_zone) { tempTZ = props.data.fast.real_start_time_zone if (props.data.fast.real_start_time_zone != currentTZ) { isDiff = true } } if (props.data.fast.real_end_time_zone) { if (tempTZ != props.data.fast.real_end_time_zone) { isMulti = true } if (props.data.fast.real_end_time_zone != currentTZ) { isDiff = true } } } if (props.data.sleep) { if (props.data.sleep.real_start_time_zone) { if (tempTZ == '') { tempTZ = props.data.sleep.real_start_time_zone } else if (tempTZ != props.data.sleep.real_start_time_zone) { isMulti = true } if (props.data.sleep.real_start_time_zone != currentTZ) { isDiff = true } } if (props.data.sleep.real_end_time_zone) { if (tempTZ != props.data.sleep.real_end_time_zone) { isMulti = true } if (props.data.sleep.real_end_time_zone != currentTZ) { isDiff = true } } } setDiffTimeZone(isDiff) setMultiTimeZone(isMulti) } function del() { var id = props.data.id delRecord(id ).then(res => { // global.refreshTime() global.indexPageRefresh() Taro.showToast({ title: t('page.records_history.del_success') }) dispatch(setSelID(-1)) if (global.delFastSleep) global.delFastSleep(props.data) // props.delSuccess && props.delSuccess(props.data) // Taro.navigateBack() }) } function subTitle(timestamp) { if (multiTimeZone) { return t('feature.common.multi_timezones') } if (diffTimeZone) { return t('feature.common.different_timezone') } return TimeFormatter.getDateAndWeek(timestamp) } function schedules() { var timestamp = props.data.first_real_check_time return } function showDetail(e) { setShowDel(false); if (props.type == 'latest') { setSegmentIndex(0) global.segmentIndex = 0 setShowDetailModal(true) return; } setShowDetailModal(true) } function getDuration(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() } return TimeFormatter.durationFormate(start, end) // return TimeFormatter.calculateTimeDifference(start, end) } function getStageDuration() { var start, end; switch (selIndex) { case 0: start = record.fast.real_start_time end = record.sleep.real_start_time break case 1: start = record.sleep.real_start_time end = record.sleep.real_end_time break case 2: start = record.sleep.real_end_time end = record.fast.real_end_time break } return TimeFormatter.durationFormate(start, end) } function durationArc(start_time: number, end_time: number) { var duration = (end_time - start_time) / 1000; return duration / (24 * 3600) * 2 * Math.PI; } function bigRing() { var common = getCommon(null, true) common.radius = bigRingRadius; common.lineWidth = ringWidth; var bgRing = getBgRing() if (props.type == 'record' || props.type == 'latest') { var realRing = getReal(record, true, true) if (props.data.status == 'ONGOING3') { realRing.color = 'rgba(0,0,0,0)' } if ((props.data.scenario == 'FAST' && props.data.fast.status == "NOT_COMPLETED") || (props.data.scenario == 'SLEEP' && props.data.sleep.status == "NOT_COMPLETED")) { realRing.durationArc = 0.01 } if (props.data.scenario=='FAST_SLEEP' && props.data.fast.status == "NOT_COMPLETED"){ realRing.durationArc = 0.01 } return } else { 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') { return } if (record.status == 'NOT_COMPLETED') { return } var realRing1 = getReal(record, true, false) return } } function bigMoreRing() { var common = getCommon(null, true) common.radius = bigRingRadius; common.lineWidth = ringWidth; var bgRing = getBgRing() var realRing = getReal(record, true, true) realRing.color = ColorType.fast + '66' var list: any = [] if (record.scenario == 'FAST_SLEEP') { if (selIndex == 0) { const realRingBig: RealRing = { color: global.fastColor ? global.fastColor : ColorType.fast, startArc: startArc(record.fast.real_start_time), durationArc: durationArc(record.fast.real_start_time, record.sleep.real_start_time) } list.push(realRingBig) } if (selIndex == 1) { const realRingBig: RealRing = { color: global.fastColor ? global.fastColor : ColorType.fast, startArc: startArc(record.sleep.real_start_time), durationArc: durationArc(record.sleep.real_start_time, record.sleep.real_end_time) } list.push(realRingBig) } if (selIndex == 2) { const realRingBig: RealRing = { color: global.fastColor ? global.fastColor : ColorType.fast, startArc: startArc(record.sleep.real_end_time), durationArc: durationArc(record.sleep.real_end_time, record.fast.real_end_time) } list.push(realRingBig) } } return } 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 smallRing() { if (record.scenario == 'FAST_SLEEP') { var common = getCommon(null, false) common.radius = smallRingRadius; common.lineWidth = ringWidth; var bgRing = getBgRing() var realRing = getReal(record, false, false) if (props.type == 'record' || props.type == 'latest') { var showReal = false; if (record.sleep.status == 'WAIT_FOR_END') { realRing.durationArc = durationArc(record.sleep.target_start_time, (new Date()).getTime()) showReal = true // return } else if (record.sleep.status == 'NOT_COMPLETED') { realRing.durationArc = 0.01 showReal = true // return } else if (record.sleep.status == 'COMPLETED') { realRing = getReal(record, false, true) showReal = true // return } return // if (record.sleep.status == 'WAIT_FOR_END') { // realRing.durationArc = durationArc(record.sleep.target_start_time, (new Date()).getTime()) // return // } // else if (record.sleep.status == 'NOT_COMPLETED') { // realRing.durationArc = 0.01 // return // } // else if (record.sleep.status == 'COMPLETED') { // realRing = getReal(record, false, true) // 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 } } return null } function rings() { return { bigRing() } { smallRing() } } function recordTime() { var timestamp = props.data.first_real_check_time if (props.data.first_time_zone) { timestamp = TimeFormatter.transferTimestamp(timestamp, props.data.first_time_zone) } return TimeFormatter.dateDescription(timestamp, true) } function getArrowText() { if (multiTimeZone) { return t('feature.common.multi_timezones') } if (diffTimeZone) { return t('feature.common.different_timezone') } return recordTime() } function tapStage(e, index) { stageCanvasId = new Date().getTime() setSelIndex(index); // setCount(pre=>pre+1); e.stopPropagation() } function moreStage() { var common = getCommon(null, false) common.radius = smallRingRadius; common.lineWidth = ringWidth; var bgRing = getBgRing() var realRing = getReal(record, false, true) return {bigMoreRing()} { {t('feature.track_time_duration.record_fast_sleep.item.fast')} } { {getStageDuration()} } { {t('feature.track_time_duration.record_fast_sleep.item.sleep')} } { {getDuration(record.sleep)} } { tapStage(e, 0) }}> {t('feature.track_time_duration.stage.a')} { selIndex == 0 && } { tapStage(e, 1) }}> {t('feature.track_time_duration.stage.b')} { selIndex == 1 && } { tapStage(e, 2) }}> {t('feature.track_time_duration.stage.c')} { selIndex == 2 && } } function recordDetail() { var fastDuration = '' var sleepDuration = '' var showFast = false; var showSleep = false; if (record.scenario == 'FAST_SLEEP') { fastDuration = getDuration(record.fast) sleepDuration = getDuration(record.sleep) if (record.status == 'ONGOING3') { fastDuration = t('feature.common.wait_for_end') } if (record.status == 'COMPLETED' && record.fast.status=='NOT_COMPLETED'){ fastDuration = t('feature.common.not_completed') } if (record.sleep.status == "NOT_STARTED") { sleepDuration = t('feature.common.not_started') } else if (record.sleep.status == 'NOT_COMPLETED') { sleepDuration = t('feature.common.not_completed') } showFast = true showSleep = true } else if (record.scenario == 'FAST') { fastDuration = getDuration(record.fast) if (record.fast.status == 'NOT_COMPLETED') { fastDuration = t('feature.common.not_completed') } showFast = true } else { sleepDuration = getDuration(record.sleep) if (record.sleep.status == 'NOT_COMPLETED') { sleepDuration = t('feature.common.not_completed') } showSleep = true } return { rings() } { showFast && {t('feature.track_time_duration.record_fast_sleep.item.fast')} } { showFast && {fastDuration} } { showSleep && {t('feature.track_time_duration.record_fast_sleep.item.sleep')} } { showSleep && {sleepDuration} } {getArrowText()} } function touchStart(e) { startX = e.touches[0].clientX startY = e.touches[0].clientY } function touchMove(e) { let x = startX let y = startY let deltaX = e.touches[0].clientX - x let deltaY = e.touches[0].clientY - y if (Math.abs(deltaX) > Math.abs(deltaY)) { if (deltaX < -60) { setShowDel(true) dispatch(setSelID(props.data.id)) global.selId = props.data.id } else if (deltaX > 60) { setShowDel(false) // global.selId = -1 } } } function touchEnd(e) { startX = 0 } function modalContent() { if (process.env.TARO_ENV == 'weapp') { return { setShowDetailModal(false) }} confirm={() => { }}> { setShowDetailModal(false)} /> } } else if (process.env.TARO_ENV == 'rn') { return { }} onBeforeLeave={() => { }} onClick={() => { alert('b') }} onClickOverlay={() => { alert('a') }} onAfterLeave={() => { setShowDetailModal(false) }} show={showDetailModal} round={true} overlay={true} position='bottom' > { setShowDetailModal(false)} /> } } } return {count} {recordDetail()} {t('feature.track_time_duration.record_fast_sleep.delete')} {/* { (props.type == 'record' || props.type == 'latest') && record.scenario == 'FAST_SLEEP' && record.sleep.status == 'COMPLETED' && { e.stopPropagation() setShowMoreModal(true) }}> {showMore ? '隐藏更多' : '显示更多'} } */} { showDetailModal && modalContent() // showDetailModal && setShowDetailModal(false)} // confirm={() => { }} /> } { showMoreModal && setShowMoreModal(false)} confirm={() => { }} /> } }) export default RecordFastSleep;