|
|
@@ -1,743 +0,0 @@
|
|
|
-import Box from "@/components/layout/Box";
|
|
|
-import Header from "@/components/layout/Header";
|
|
|
-import Modal from "@/components/layout/Modal.weapp";
|
|
|
-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, { usePageScroll } 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 { getTimezone, getTimezoneId, kIsIOS, rpxToPx } from "@/utils/tools";
|
|
|
-import { useDispatch, useSelector } from "react-redux";
|
|
|
-import { setSelID } from "@/store/common";
|
|
|
-import CircadianDetailPopup from "./CircadianDetailPopup";
|
|
|
-import dayjs from 'dayjs'
|
|
|
-import '@/utils/ring_card.scss';
|
|
|
-import showAlert from "@/components/basic/Alert";
|
|
|
-// 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
|
|
|
-
|
|
|
-const utc = require('dayjs/plugin/utc')
|
|
|
-const timezone = require('dayjs/plugin/timezone')
|
|
|
-var advanced = require("dayjs/plugin/advancedFormat")
|
|
|
-
|
|
|
-dayjs.extend(utc)
|
|
|
-dayjs.extend(timezone)
|
|
|
-dayjs.extend(advanced)
|
|
|
-
|
|
|
-
|
|
|
-// let disableDismiss = false
|
|
|
-//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, disableDelete?: boolean }) => {
|
|
|
- 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 [disableDismiss, setDisableDismiss] = 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 currentTZ = getTimezone()
|
|
|
- var isDiff = false;
|
|
|
- var isMulti = false;
|
|
|
- var tempTZ = '';
|
|
|
- if (props.data.fast) {
|
|
|
- if (props.data.fast.real_start_timezone && props.data.fast.real_start_timezone.gmt) {
|
|
|
- tempTZ = props.data.fast.real_start_timezone.gmt
|
|
|
- if (props.data.fast.real_start_timezone.gmt != currentTZ) {
|
|
|
- isDiff = true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (props.data.fast.real_end_timezone && props.data.fast.real_end_timezone.gmt) {
|
|
|
- if (tempTZ != props.data.fast.real_end_timezone.gmt) {
|
|
|
- isMulti = true
|
|
|
- }
|
|
|
- if (props.data.fast.real_end_timezone.gmt != currentTZ) {
|
|
|
- isDiff = true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if (props.data.sleep) {
|
|
|
- if (props.data.sleep.real_start_timezone && props.data.sleep.real_start_timezone.gmt) {
|
|
|
- if (tempTZ == '') {
|
|
|
- tempTZ = props.data.sleep.real_start_timezone.gmt
|
|
|
- }
|
|
|
- else if (tempTZ != props.data.sleep.real_start_timezone.gmt) {
|
|
|
- isMulti = true
|
|
|
- }
|
|
|
- if (props.data.sleep.real_start_timezone.gmt != currentTZ) {
|
|
|
- isDiff = true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (props.data.sleep.real_end_timezone && props.data.sleep.real_end_timezone.gmt) {
|
|
|
- if (tempTZ != props.data.sleep.real_end_timezone.gmt) {
|
|
|
- isMulti = true
|
|
|
- }
|
|
|
- if (props.data.sleep.real_end_timezone.gmt != currentTZ) {
|
|
|
- isDiff = true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- setDiffTimeZone(isDiff)
|
|
|
- setMultiTimeZone(isMulti)
|
|
|
- }
|
|
|
-
|
|
|
- function tapDel() {
|
|
|
- showAlert({
|
|
|
- title: t('feature.common.modal.delete_item_title'),
|
|
|
- content: t('feature.common.modal.delete_item_content'),
|
|
|
- showCancel: true,
|
|
|
- confirm: () => {
|
|
|
- del();
|
|
|
- },
|
|
|
- cancel: () => {
|
|
|
- setShowDel(false)
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
- function del() {
|
|
|
- var id = props.data.id
|
|
|
- delRecord(id
|
|
|
- ).then(res => {
|
|
|
- // global.refreshTime()
|
|
|
- global.refreshStreaks()
|
|
|
- global.indexPageRefresh()
|
|
|
- Taro.showToast({
|
|
|
- title: t('page.records_history.del_success')
|
|
|
- })
|
|
|
- dispatch(setSelID(-1))
|
|
|
- if (global.checkAccess) {
|
|
|
- const currentStatus = (res as any).access.current.qualification.status
|
|
|
- const preStatus = (res as any).access.previous.qualification.status
|
|
|
- if (currentStatus == 'NOT_QUALIFIED' && preStatus == 'NOT_QUALIFIED'){
|
|
|
-
|
|
|
- }
|
|
|
- else {
|
|
|
- global.checkAccess((res as any).access)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (global.delFastSleep)
|
|
|
- global.delFastSleep(props.data)
|
|
|
-
|
|
|
- if (global.delFastSleep2)
|
|
|
- global.delFastSleep2(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 <View style={{ display: 'flex', flexDirection: 'column' }}>
|
|
|
- <TimelineStage data={props.data} title={t('feature.track_time_duration.record_fast_sleep.pop_title')}
|
|
|
- subTitle={subTitle(timestamp)} first_real_check_time={timestamp} diffTimeZone={diffTimeZone} multiTimeZone={multiTimeZone} />
|
|
|
- </View>
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- function showDetail(e) {
|
|
|
- if (showDel) {
|
|
|
- setShowDel(false);
|
|
|
- return
|
|
|
- }
|
|
|
- dispatch(setSelID(-1))
|
|
|
-
|
|
|
- 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 <Rings common={common} bgRing={bgRing} canvasId={canvasId} realRing={realRing} />
|
|
|
- }
|
|
|
- else {
|
|
|
- var currentDot1 = getDot(record, true)
|
|
|
- var targetBigRing1 = getTarget(record, true)
|
|
|
- if (record.status == 'ONGOING') {
|
|
|
- var realRing1 = getReal(record, true, false)
|
|
|
-
|
|
|
- return <Rings common={common} bgRing={bgRing} currentDot={currentDot1} realRing={realRing1} targetRing={targetBigRing1} canvasId={canvasId} />
|
|
|
- }
|
|
|
- if (record.status == 'WAIT_FOR_START') {
|
|
|
- return <Rings common={common} bgRing={bgRing} currentDot={currentDot1} canvasId={canvasId} />
|
|
|
- }
|
|
|
- if (record.status == 'NOT_COMPLETED') {
|
|
|
-
|
|
|
- return <Rings common={common} bgRing={bgRing} currentDot={currentDot1} canvasId={canvasId} />
|
|
|
- }
|
|
|
- var realRing1 = getReal(record, true, false)
|
|
|
- return <Rings common={common} bgRing={bgRing} realRing={realRing1} currentDot={currentDot1} targetRing={targetBigRing1} canvasId={canvasId} />
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- 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 <Rings common={common} bgRing={bgRing} canvasId={stageCanvasId} stageList={list} realRing={realRing} />
|
|
|
- }
|
|
|
-
|
|
|
- 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 <Rings common={common} bgRing={bgRing} canvasId={canvasId + 'small'} realRing={realRing} />
|
|
|
- }
|
|
|
- else if (record.sleep.status == 'NOT_COMPLETED') {
|
|
|
- realRing.durationArc = 0.01
|
|
|
- showReal = true
|
|
|
- // return <Rings common={common} bgRing={bgRing} canvasId={canvasId + 'small'} realRing={realRing} />
|
|
|
- }
|
|
|
- else if (record.sleep.status == 'COMPLETED') {
|
|
|
- realRing = getReal(record, false, true)
|
|
|
- showReal = true
|
|
|
- // return <Rings common={common} bgRing={bgRing} canvasId={canvasId + 'small'} realRing={realRing} />
|
|
|
- }
|
|
|
- return <Rings common={common} bgRing={bgRing} canvasId={canvasId + 'small'} realRing={showReal ? realRing : null} />
|
|
|
- // if (record.sleep.status == 'WAIT_FOR_END') {
|
|
|
- // realRing.durationArc = durationArc(record.sleep.target_start_time, (new Date()).getTime())
|
|
|
- // return <Rings common={common} bgRing={bgRing} canvasId={canvasId + 'small'} realRing={realRing} />
|
|
|
- // }
|
|
|
- // else if (record.sleep.status == 'NOT_COMPLETED') {
|
|
|
- // realRing.durationArc = 0.01
|
|
|
- // return <Rings common={common} bgRing={bgRing} canvasId={canvasId + 'small'} realRing={realRing} />
|
|
|
- // }
|
|
|
- // else if (record.sleep.status == 'COMPLETED') {
|
|
|
- // realRing = getReal(record, false, true)
|
|
|
- // return <Rings common={common} bgRing={bgRing} canvasId={canvasId + 'small'} realRing={realRing} />
|
|
|
- // }
|
|
|
- // return <Rings common={common} bgRing={bgRing} canvasId={canvasId + 'small'} />
|
|
|
- }
|
|
|
- else {
|
|
|
-
|
|
|
- var currentDot = getDot(record, false)
|
|
|
- var targetRing = getTarget(record, false)
|
|
|
- if (record.status == 'ONGOING2') {
|
|
|
- var realRing = getReal(record, false, false)
|
|
|
- return <Rings common={common} bgRing={bgRing} realRing={realRing} currentDot={currentDot} targetRing={targetRing} canvasId={canvasId + 'small'} />
|
|
|
- }
|
|
|
- if (record.status == 'ONGOING3') {
|
|
|
- currentDot.color = 'rgba(0, 255, 255, 0.5)'
|
|
|
- }
|
|
|
- return <Rings common={common} bgRing={bgRing} currentDot={currentDot} canvasId={canvasId + 'small'} />
|
|
|
- }
|
|
|
- }
|
|
|
- return null
|
|
|
- }
|
|
|
-
|
|
|
- function rings() {
|
|
|
- return <View style={{ position: 'relative', zIndex: 1 }}>
|
|
|
- {
|
|
|
- bigRing()
|
|
|
- }
|
|
|
- <View style={{ display: 'flex', position: 'absolute', left: 0, right: 0, top: 0, bottom: 0, alignItems: 'center', justifyContent: 'center' }}>
|
|
|
- {
|
|
|
- smallRing()
|
|
|
- }
|
|
|
- </View>
|
|
|
- </View>
|
|
|
- }
|
|
|
-
|
|
|
- function recordTime() {
|
|
|
- var timestamp = props.data.first_real_check_time
|
|
|
- if (props.data.first_timezone && props.data.first_timezone.gmt) {
|
|
|
- timestamp = TimeFormatter.transferTimestamp(timestamp, props.data.first_timezone.gmt)
|
|
|
- }
|
|
|
- return TimeFormatter.dateDescription(timestamp, true)
|
|
|
- }
|
|
|
-
|
|
|
- function getArrowText() {
|
|
|
- var timeZoneFormatted = getTimezone()
|
|
|
-
|
|
|
- if (multiTimeZone) {
|
|
|
- if (props.data.first_timezone && props.data.first_timezone.id) {
|
|
|
- if (kIsIOS) {
|
|
|
- if (props.data.first_timezone.id == getTimezoneId()) {
|
|
|
- return recordTime()
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- if (props.data.first_timezone.gmt == timeZoneFormatted) {
|
|
|
- return recordTime()
|
|
|
- }
|
|
|
- }
|
|
|
- if (global.language == 'en') {
|
|
|
- return TimeFormatter.tzTimeFormateLocalTime(props.data.first_real_check_time, props.data.first_timezone.id, 'MMM D z')
|
|
|
- // return dayjs(props.data.first_real_check_time).tz(props.data.first_timezone.id).format('MMM D z')
|
|
|
- }
|
|
|
- else {
|
|
|
- return TimeFormatter.tzTimeFormateLocalTime(props.data.first_real_check_time, props.data.first_timezone.id, 'M月D日 z')
|
|
|
- // return dayjs(props.data.first_real_check_time).tz(props.data.first_timezone.id).format('M月D日 z')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (props.data.first_timezone.gmt == timeZoneFormatted) {
|
|
|
- return recordTime()
|
|
|
- }
|
|
|
- return recordTime() + ' ' + props.data.first_timezone.gmt
|
|
|
- // return t('feature.common.multi_timezones')
|
|
|
- }
|
|
|
- if (diffTimeZone) {
|
|
|
- if (props.data.first_timezone.id) {
|
|
|
- if (kIsIOS) {
|
|
|
- if (props.data.first_timezone.id == getTimezoneId()) {
|
|
|
- return recordTime()
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- if (props.data.first_timezone.gmt == timeZoneFormatted) {
|
|
|
- return recordTime()
|
|
|
- }
|
|
|
- }
|
|
|
- if (global.language == 'en') {
|
|
|
- return TimeFormatter.tzTimeFormateLocalTime(props.data.first_real_check_time, props.data.first_timezone.id, 'MMM D z')
|
|
|
- // return dayjs(props.data.first_real_check_time).tz(props.data.first_timezone.id).format('MMM D z')
|
|
|
- }
|
|
|
- else {
|
|
|
- return TimeFormatter.tzTimeFormateLocalTime(props.data.first_real_check_time, props.data.first_timezone.id, 'M月D日 z')
|
|
|
- // return dayjs(props.data.first_real_check_time).tz(props.data.first_timezone.id).format('M月D日 z')
|
|
|
- }
|
|
|
- }
|
|
|
- if (props.data.first_timezone.gmt == timeZoneFormatted) {
|
|
|
- return recordTime()
|
|
|
- }
|
|
|
- return recordTime() + ' ' + props.data.first_timezone.gmt
|
|
|
- // 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 <View style={{ zIndex: 10000 }}>
|
|
|
- <View style={{ display: 'flex', flexDirection: 'row', alignItems: 'center', position: 'relative' }}>
|
|
|
- {bigMoreRing()}
|
|
|
- <View style={{ display: 'flex', position: 'absolute', left: 0, width: 99, top: 0, height: 99, alignItems: 'center', justifyContent: 'center', zIndex: 10000 }}>
|
|
|
- <Rings common={common} bgRing={bgRing} canvasId={stageCanvasId + 'small'} realRing={realRing} />
|
|
|
- </View>
|
|
|
- <View className="duration_bg">
|
|
|
- {
|
|
|
- <Text className="duration_title">{t('feature.track_time_duration.record_fast_sleep.item.fast')}</Text>
|
|
|
- }
|
|
|
- {
|
|
|
- <Text className="duration_value" style={{ color: global.fastColor ? global.fastColor : ColorType.fast }}>{getStageDuration()}</Text>
|
|
|
- }
|
|
|
- {
|
|
|
- <Text className="duration_title">{t('feature.track_time_duration.record_fast_sleep.item.sleep')}</Text>
|
|
|
- }
|
|
|
- {
|
|
|
- <Text className="duration_value" style={{ color: global.sleepColor ? global.sleepColor : ColorType.sleep }}>{getDuration(record.sleep)}</Text>
|
|
|
- }
|
|
|
- </View>
|
|
|
- </View>
|
|
|
- <View style={{ flex: 1, marginLeft: -rpxToPx(46), marginRight: -rpxToPx(46), marginTop: 20 }}>
|
|
|
-
|
|
|
- <View className={selIndex == 0 ? "single_check_sel" : "single_check_nor"} onClick={(e) => { tapStage(e, 0) }}>
|
|
|
- <Text className={selIndex == 0 ? "single_check_text_sel" : "single_check_text_nor"}>{t('feature.track_time_duration.stage.a')}</Text>
|
|
|
- {
|
|
|
- selIndex == 0 && <Image src={require('@assets/images/check_black.png')} className="single_checked" />
|
|
|
- }
|
|
|
- </View>
|
|
|
- <View className={selIndex == 1 ? "single_check_sel" : "single_check_nor"} onClick={(e) => { tapStage(e, 1) }}>
|
|
|
- <Text className={selIndex == 1 ? "single_check_text_sel" : "single_check_text_nor"}>{t('feature.track_time_duration.stage.b')}</Text>
|
|
|
- {
|
|
|
- selIndex == 1 && <Image src={require('@assets/images/check_black.png')} className="single_checked" />
|
|
|
- }
|
|
|
- </View>
|
|
|
- <View className={selIndex == 2 ? "single_check_sel" : "single_check_nor"} onClick={(e) => { tapStage(e, 2) }}>
|
|
|
- <Text className={selIndex == 2 ? "single_check_text_sel" : "single_check_text_nor"}>{t('feature.track_time_duration.stage.c')}</Text>
|
|
|
- {
|
|
|
- selIndex == 2 && <Image src={require('@assets/images/check_black.png')} className="single_checked" />
|
|
|
- }
|
|
|
- </View>
|
|
|
- </View>
|
|
|
- </View>
|
|
|
- }
|
|
|
-
|
|
|
- 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 <View style={{ display: 'flex', flexDirection: 'column', margin: rpxToPx(8), boxSizing: 'border-box' }}>
|
|
|
- <View className="fast_sleep_item1">
|
|
|
- {
|
|
|
- rings()
|
|
|
- }
|
|
|
- <View className="duration_bg">
|
|
|
- {
|
|
|
- showFast && <Text className="duration_title">{t('feature.track_time_duration.record_fast_sleep.item.fast')}</Text>
|
|
|
- }
|
|
|
- {
|
|
|
- showFast && <Text className="duration_value" style={{ color: global.fastColor ? global.fastColor : ColorType.fast }}>{fastDuration}</Text>
|
|
|
- }
|
|
|
- {
|
|
|
- showSleep && <Text className="duration_title">{t('feature.track_time_duration.record_fast_sleep.item.sleep')}</Text>
|
|
|
- }
|
|
|
- {
|
|
|
- showSleep && <Text className="duration_value" style={{ color: global.sleepColor ? global.sleepColor : ColorType.sleep }}>{sleepDuration}</Text>
|
|
|
- }
|
|
|
- </View>
|
|
|
- <View className="record_arrow_bg" style={{ backgroundColor: global.isDebug ? 'red' : 'transparent' }}>
|
|
|
- <View style={{ flex: 1 }} />
|
|
|
- <Text className='recordTime'>{getArrowText()}</Text>
|
|
|
- <Image className="arrow2" src={require('@/assets/images/arrow3.png')} />
|
|
|
- </View>
|
|
|
-
|
|
|
- </View>
|
|
|
-
|
|
|
- </View>
|
|
|
- }
|
|
|
-
|
|
|
- function touchStart(e) {
|
|
|
- if (process.env.TARO_ENV == 'rn' || props.disableDelete) {
|
|
|
- return
|
|
|
- }
|
|
|
- startX = e.touches[0].clientX
|
|
|
- startY = e.touches[0].clientY
|
|
|
- setDisableDismiss(true)
|
|
|
- // disableDismiss = true
|
|
|
- }
|
|
|
-
|
|
|
- function touchMove(e) {
|
|
|
- if (process.env.TARO_ENV == 'rn' || props.disableDelete) {
|
|
|
- return
|
|
|
- }
|
|
|
- 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 < -80) {
|
|
|
- setShowDel(true)
|
|
|
-
|
|
|
- dispatch(setSelID(props.data.id))
|
|
|
- global.selId = props.data.id
|
|
|
- }
|
|
|
- else if (deltaX > 80) {
|
|
|
- setShowDel(false)
|
|
|
- // global.selId = -1
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- function touchEnd(e) {
|
|
|
- if (process.env.TARO_ENV == 'rn' || props.disableDelete) {
|
|
|
- return
|
|
|
- }
|
|
|
- startX = 0
|
|
|
- setDisableDismiss(false)
|
|
|
- }
|
|
|
-
|
|
|
- usePageScroll((e) => {
|
|
|
- if (showDel && !disableDismiss) {
|
|
|
- console.log(disableDismiss)
|
|
|
- // setShowDel(false)
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- function modalContent() {
|
|
|
- return <Modal
|
|
|
- testInfo={null}
|
|
|
- dismiss={() => {
|
|
|
- setShowDetailModal(false)
|
|
|
- }}
|
|
|
- confirm={() => { }}>
|
|
|
- {
|
|
|
- <CircadianDetailPopup
|
|
|
- record={record}
|
|
|
- onClose={() => setShowDetailModal(false)} />
|
|
|
- }
|
|
|
- </Modal>
|
|
|
- }
|
|
|
-
|
|
|
- return <View style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
|
|
|
- <View style={{ position: 'absolute', left: 0, top: 0, width: 0, height: 0, opacity: 0 }}>{count}</View>
|
|
|
- <View className='time_operate_item'
|
|
|
- onTouchStart={touchStart}
|
|
|
- onTouchMove={touchMove}
|
|
|
- onTouchEnd={touchEnd}
|
|
|
- >
|
|
|
- <RecordItem canDel={record.status == 'COMPLETED'}
|
|
|
- delete={del}
|
|
|
- disableDelete={props.disableDelete}
|
|
|
- onClick={showDetail}
|
|
|
- >{recordDetail()}
|
|
|
- </RecordItem>
|
|
|
- {
|
|
|
- process.env.TARO_ENV == 'weapp' && <View className={showDel ? 'btnDelete btnDeleteAni' : 'btnDelete'} onClick={tapDel}>{t('feature.track_time_duration.record_fast_sleep.delete')}</View>
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- </View>
|
|
|
- {/* {
|
|
|
- (props.type == 'record' || props.type == 'latest') &&
|
|
|
- record.scenario == 'FAST_SLEEP' &&
|
|
|
- record.sleep.status == 'COMPLETED' &&
|
|
|
- <View className="more_stage" onClick={(e) => {
|
|
|
- e.stopPropagation()
|
|
|
- setShowMoreModal(true)
|
|
|
- }}>
|
|
|
- <Text className="more_stage_text">{showMore ? '隐藏更多' : '显示更多'}</Text>
|
|
|
- </View>
|
|
|
- } */}
|
|
|
- {
|
|
|
- showDetailModal && modalContent()
|
|
|
- // showDetailModal && <Modal children={schedules()}
|
|
|
- // modalType={ModalType.center}
|
|
|
- // dismiss={() => setShowDetailModal(false)}
|
|
|
- // confirm={() => { }} />
|
|
|
- }
|
|
|
- {
|
|
|
- showMoreModal && <Modal children={moreStage()}
|
|
|
- modalType={ModalType.center}
|
|
|
- dismiss={() => setShowMoreModal(false)}
|
|
|
- confirm={() => { }} />
|
|
|
- }
|
|
|
- </View>
|
|
|
-})
|
|
|
-
|
|
|
-export default RecordFastSleep;
|