import { View, Text, Image, Switch } from "@tarojs/components";
import { bigRingRadius, dotIsOuterRange, getBgRing, getCommon, getDot, getReal, getSchedule, getTarget, ringWidth, smallRingRadius, thirdRingRadius } from "@/features/trackTimeDuration/hooks/RingData";
import { RealRing, CurrentDot } from "@/features/trackTimeDuration/components/Rings";
import { ColorType } from "@/context/themes/color";
import { useDispatch, useSelector } from "react-redux";
import Rings from "@/features/trackTimeDuration/components/Rings";
import { jumpPage } from "@/features/trackTimeDuration/hooks/Common";
import { rpxToPx } from "@/utils/tools";
import { useEffect, useState } from "react";
import Taro, { useDidHide, useDidShow } from "@tarojs/taro";
import './Discovery.scss'
import { useTranslation } from "react-i18next";
import { TimeFormatter } from "@/utils/time_format";
import { getPerm, uploadPerm } from "@/services/user";
import Box from "@/components/layout/Box";
import { getPlans, setPlan } from "@/services/trackTimeDuration";
import DayNightCard from "@/features/trackTimeDuration/components/DayNightCard";
import { clearDayStore } from "@/store/day";
import { AtActivityIndicator } from "taro-ui";
import NoData from "@/components/view/NoData";
// import AtActivityIndicator from "taro-ui/types/activity-indicator";
let useNavigation;
if (process.env.TARO_ENV == 'rn') {
useNavigation = require("@react-navigation/native").useNavigation
}
let pauseTimer = false
const defaultValue = `{"scenarios":[{"name":"FAST","count":0,"schedule":{"fast":{"start_time":"15:00","end_time":"08:00"}}},{"name":"SLEEP","count":0,"schedule":{"sleep":{"start_time":"22:00","end_time":"07:00"}}},{"name":"FAST_SLEEP","count":0,"schedule":{"fast":{"start_time":"15:00","end_time":"08:00"},"sleep":{"start_time":"22:00","end_time":"07:00"}}}],"select_count":0,"theme_color":{"fast":"#00FFFF","sleep":"#8183FF"}}`
export default function Discovery() {
const user = useSelector((state: any) => state.user);
const day = useSelector((state: any) => state.day);
const ring = useSelector((state: any) => state.ring);
const [schedule, setSchedule] = useState(null)
const [count, setCount] = useState(0)
const [loaded, setLoaded] = useState(false)
const [showErrorPage, setErrorPage] = useState(false)
const dispatch = useDispatch();
const { t } = useTranslation()
let navigation;
let timeStamp = new Date().getTime()
if (useNavigation) {
navigation = useNavigation()
}
useEffect(() => {
setInterval(() => {
if (global.pauseIndexTimer || pauseTimer) {
return
}
setCount((prevCounter) => prevCounter + 1)
}, 1000)
}, [])
useDidShow(() => {
setCount(pre => pre + 1)
//resume timer
pauseTimer = false
})
useDidHide(() => {
//pause timer
pauseTimer = true
})
useEffect(() => {
if (!user.isLogin) {
dispatch(clearDayStore());
}
}, [user.isLogin])
// useEffect(() => {
// setSchedule(global.homeData.scenarios)
// }, [global.homeData])
useEffect(() => {
getPlanData()
setCount(pre => pre + 1)
}, [user.isLogin])
function getPlanData() {
getPlans().then(res => {
setSchedule((res as any).scenarios)
setLoaded(true)
setErrorPage(false)
}).catch(e => {
setSchedule(JSON.parse(defaultValue))
setLoaded(true)
setErrorPage(true)
})
}
function getFoodTime() {
if (ring.schedule) {
return [ring.schedule.fast.end_time, ring.schedule.fast.start_time]
}
var obj;
(schedule as any).map(item => {
if (item.name == 'FAST') {
obj = item
}
})
if (!obj) {
console.log('报错', schedule)
return ['16:00', '08:00'];
}
return [obj.schedule.fast.end_time, obj.schedule.fast.start_time]
}
function getActivityTime() {
if (ring.schedule) {
return [ring.schedule.sleep.end_time, ring.schedule.sleep.start_time]
}
var obj;
(schedule as any).map(item => {
if (item.name == 'SLEEP') {
obj = item
}
})
return [obj.schedule.sleep.end_time, obj.schedule.sleep.start_time]
}
function bigRing() {
var common = getCommon(null, true)
common.radius = bigRingRadius;
common.lineWidth = ringWidth;
var bgRing = getBgRing()
const targetRing: RealRing = {
color: (ring.current_record && ring.current_record.scenario == 'SLEEP') ? ColorType.activity + '66' : ColorType.food + '66',
startArc: 0,
durationArc: 2
}
var list = getFoodTime()
var start;
var end;
if (ring.current_record && ring.current_record.scenario == 'SLEEP') {
var list2 = getActivityTime()
start = parseInt(list2[0].split(':')[0]) * 60 + parseInt(list2[0].split(':')[1])
end = parseInt(list2[1].split(':')[0]) * 60 + parseInt(list2[1].split(':')[1])
if (ring.current_record.status != 'WAIT_FOR_START') {
var startDate = new Date(ring.current_record.sleep.target_start_time)
var endDate = new Date(ring.current_record.sleep.target_end_time)
end = startDate.getHours() * 60 + startDate.getMinutes()
start = endDate.getHours() * 60 + endDate.getMinutes()
}
}
else {
start = parseInt(list[0].split(':')[0]) * 60 + parseInt(list[0].split(':')[1])
end = parseInt(list[1].split(':')[0]) * 60 + parseInt(list[1].split(':')[1])
if (ring.current_record && ring.current_record.status != 'WAIT_FOR_START') {
var startDate = new Date(ring.current_record.fast.target_start_time)
var endDate = new Date(ring.current_record.fast.target_end_time)
end = startDate.getHours() * 60 + startDate.getMinutes()
start = endDate.getHours() * 60 + endDate.getMinutes()
}
}
if (end < start) {
end += 24 * 60
}
var duration = end - start
targetRing.startArc = (start * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0;
targetRing.durationArc = (duration * 60) / (24 * 3600) * 2 * Math.PI;
var currentDot = getDot(null, false)
var date = new Date()
var minutes = date.getHours() * 60 + date.getMinutes()
if (minutes < start) {
minutes += 1440
}
currentDot.color = ColorType.food
var now = new Date()
var t = now.getHours() * 60 + now.getMinutes()
var duration2 = t - start
if (duration2 < 0) {
duration2 += 24 * 60
}
let realRing: RealRing = {
color: ColorType.food,
startArc: (start * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0,
durationArc: (duration2 * 60) / (24 * 3600) * 2 * Math.PI
}
if (ring.current_record && ring.current_record.scenario == 'SLEEP') {
realRing.color = ColorType.activity
currentDot.color = ColorType.activity
}
if (!user.isLogin) {
currentDot = null
realRing = null
}
if (ring.current_record.status == 'ONGOING1') {
realRing = null
}
return
}
function smallRing() {
var common = getCommon(null, false)
common.radius = smallRingRadius;
common.lineWidth = ringWidth;
var bgRing = getBgRing()
const realRingBig: RealRing = {
color: ColorType.activity + '66',
startArc: 0,
durationArc: 2
}
var list = getActivityTime()
var start = parseInt(list[0].split(':')[0]) * 60 + parseInt(list[0].split(':')[1])
var end = parseInt(list[1].split(':')[0]) * 60 + parseInt(list[1].split(':')[1])
if (ring.current_record) {
if (ring.current_record.scenario == 'SLEEP') {
if (ring.current_record.status == 'ONGOING') {
var startDate = new Date(ring.current_record.sleep.target_start_time)
var endDate = new Date(ring.current_record.sleep.target_end_time)
end = startDate.getHours() * 60 + startDate.getMinutes()
start = endDate.getHours() * 60 + endDate.getMinutes()
}
}
else {
if (ring.current_record.status == 'ONGOING2') {
var startDate = new Date(ring.current_record.sleep.target_start_time)
var endDate = new Date(ring.current_record.sleep.target_end_time)
end = startDate.getHours() * 60 + startDate.getMinutes()
start = endDate.getHours() * 60 + endDate.getMinutes()
}
else if (ring.current_record.status == 'ONGOING3') {
//睡眠已完成时,睡眠小于24小时,使用真实的real_end_time-real_start_time
//大于24小时,使用real_end_time+sleep_duration
if (ring.current_record.sleep.real_end_time - ring.current_record.sleep.real_start_time < 24 * 3600 * 1000) {
var startDate = new Date(ring.current_record.sleep.real_start_time)
var endDate = new Date(ring.current_record.sleep.real_end_time)
end = startDate.getHours() * 60 + startDate.getMinutes()
start = endDate.getHours() * 60 + endDate.getMinutes()
}
else {
var startDate = new Date(ring.current_record.sleep.real_end_time)
var durationTemp = end - start//ring.current_record.sleep.target_end_time-ring.current_record.sleep.target_start_time
if (durationTemp < 0) {
durationTemp += 24 * 60
}
var endDate = new Date(startDate.getTime() + durationTemp * 60 * 1000)
start = startDate.getHours() * 60 + startDate.getMinutes()
end = endDate.getHours() * 60 + endDate.getMinutes()
}
}
}
}
if (end < start) {
end += 24 * 60
}
var duration = end - start
realRingBig.startArc = (start * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0;
realRingBig.durationArc = (duration * 60) / (24 * 3600) * 2 * Math.PI;
var currentDot = getDot(null, false)
var date = new Date()
var minutes = date.getHours() * 60 + date.getMinutes()
if (minutes < start) {
minutes += 1440
}
currentDot.color = ColorType.activity
var now = new Date()
var t = now.getHours() * 60 + now.getMinutes()
var duration2 = t - start
if (duration2 < 0) {
duration2 += 24 * 60
}
let realRing: RealRing = {
color: ColorType.activity,
startArc: (start * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0,
durationArc: (duration2 * 60) / (24 * 3600) * 2 * Math.PI
}
if (!user.isLogin) {
currentDot = null
realRing = null
}
if (ring.current_record.status == 'ONGOING2') {
realRing = null
}
return
}
function dayRing() {
var common = getCommon(null, true)
common.radius = thirdRingRadius;
common.lineWidth = ringWidth;
var bgRing = getBgRing()
const realRingBig: RealRing = {
color: ColorType.day + '66',
startArc: 0,
durationArc: 2
}
var sunRise = 6 * 60
var sunSet = 18 * 60
var sunRiseObj = day.dayRingSunrise
var sunSetObj = day.dayRingSunset
sunRise = parseInt(sunRiseObj.split(':')[0]) * 60 + parseInt(sunRiseObj.split(':')[1])
sunSet = parseInt(sunSetObj.split(':')[0]) * 60 + parseInt(sunSetObj.split(':')[1])
var duration = sunSet - sunRise
realRingBig.startArc = (sunRise * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0;
realRingBig.durationArc = (duration * 60) / (24 * 3600) * 2 * Math.PI;
var currentDot = getDot(null, false)
var date = new Date()
var minutes = date.getHours() * 60 + date.getMinutes()
if (minutes < sunRise) {
minutes += 1440
}
currentDot.color = ColorType.day
var now = new Date()
var t = now.getHours() * 60 + now.getMinutes()
var duration2 = t - sunRise
if (duration2 < 0) {
duration2 += 24 * 60
}
var realRing: RealRing = {
color: ColorType.day,
startArc: (sunRise * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0,
durationArc: (duration2 * 60) / (24 * 3600) * 2 * Math.PI
}
if (day.dayRingDate) {
if (new Date(day.dayRingDate).getDate() != new Date().getDate()) {
realRing = null;
}
}
if (!user.isLogin) {
currentDot = null
realRing = null
}
return
}
function goAcitivity() {
if (user.isLogin) {
jumpPage('/pages/workout/Workout', 'Workout', navigation)
return
}
jumpPage('/pages/account/ChooseAuth', 'ChooseAuth', navigation)
}
function goFood() {
if (user.isLogin) {
jumpPage('/pages/food/Food', 'Food', navigation)
return
}
jumpPage('/pages/account/ChooseAuth', 'ChooseAuth', navigation)
}
function dayDuration() {
var sunRiseObj = day.dayRingSunrise
var sunSetObj = day.dayRingSunset
var sunRise = 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 = (sunSet - sunRise) * 60 * 1000
return TimeFormatter.calculateTimeDifference(new Date().getTime(), new Date().getTime() + duration);
}
function eatDuration() {
var list = getFoodTime()
var start = parseInt(list[0].split(':')[0]) * 60 + parseInt(list[0].split(':')[1])
var end = parseInt(list[1].split(':')[0]) * 60 + parseInt(list[1].split(':')[1])
if (ring.current_record && ring.current_record.status != 'WAIT_FOR_START' && ring.current_record.scenario != 'SLEEP') {
var startDate = new Date(ring.current_record.fast.target_start_time)
var endDate = new Date(ring.current_record.fast.target_end_time)
end = startDate.getHours() * 60 + startDate.getMinutes()
start = endDate.getHours() * 60 + endDate.getMinutes()
}
if (end < start) {
end += 24 * 60
}
var duration = (end - start) * 60 * 1000
return TimeFormatter.calculateTimeDifference(new Date().getTime(), new Date().getTime() + duration);
}
function activityDuration() {
var list = getActivityTime()
var start = parseInt(list[0].split(':')[0]) * 3600 + parseInt(list[0].split(':')[1]) * 60
var end = parseInt(list[1].split(':')[0]) * 3600 + parseInt(list[1].split(':')[1]) * 60
if (ring.current_record) {
if (ring.current_record.scenario == 'SLEEP') {
if (ring.current_record.status == 'ONGOING') {
var startDate = new Date(ring.current_record.sleep.target_start_time)
var endDate = new Date(ring.current_record.sleep.target_end_time)
end = startDate.getHours() * 3600 + startDate.getMinutes() * 60 + startDate.getSeconds()
start = endDate.getHours() * 3600 + endDate.getMinutes() * 60 + endDate.getSeconds()
}
}
else {
if (ring.current_record.status == 'ONGOING2') {
var startDate = new Date(ring.current_record.sleep.target_start_time)
var endDate = new Date(ring.current_record.sleep.target_end_time)
end = startDate.getHours() * 3600 + startDate.getMinutes() * 60 + startDate.getSeconds()
start = endDate.getHours() * 3600 + endDate.getMinutes() * 60 + endDate.getSeconds()
}
else if (ring.current_record.status == 'ONGOING3') {
//睡眠已完成时,睡眠小于24小时,使用真实的real_end_time-real_start_time
//大于24小时,使用real_end_time+sleep_duration
if (ring.current_record.sleep.real_end_time - ring.current_record.sleep.real_start_time < 24 * 3600 * 1000) {
var startDate = new Date(ring.current_record.sleep.real_start_time)
var endDate = new Date(ring.current_record.sleep.real_end_time)
end = startDate.getHours() * 3600 + startDate.getMinutes() * 60 + startDate.getSeconds()
start = endDate.getHours() * 3600 + endDate.getMinutes() * 60 + endDate.getSeconds()
}
else {
var startDate = new Date(ring.current_record.sleep.real_end_time)
var durationTemp = start - end//ring.current_record.sleep.target_end_time-ring.current_record.sleep.target_start_time
if (durationTemp < 0) {
durationTemp += 24 * 3600
}
var endDate = new Date(startDate.getTime() + durationTemp * 1000)
end = startDate.getHours() * 3600 + startDate.getMinutes() * 60 + startDate.getSeconds()
start = endDate.getHours() * 3600 + endDate.getMinutes() * 60 + endDate.getSeconds()
debugger
console.log('active', end, start, durationTemp)
}
}
}
}
if (end < start) {
end += 24 * 3600
}
var duration = (end - start) * 1000
return TimeFormatter.calculateTimeDifference(new Date().getTime(), new Date().getTime() + duration);
}
function rings() {
return
{
bigRing()
}
{
ring.current_record && ring.current_record.scenario == 'FAST_SLEEP' &&
{
smallRing()
}
}
{
day.showDayRing && false &&
{
dayRing()
}
}
}
if (!loaded) {
return
}
return
{
schedule && rings()
}
{schedule &&
{
day.showDayRing && false && {t('feature.common.day')}
}
{
day.showDayRing && false &&
{dayDuration()}
}
{
ring.current_record && ring.current_record.scenario != 'SLEEP' && 进食
}
{
ring.current_record && ring.current_record.scenario != 'SLEEP' && {eatDuration()}
}
{
ring.current_record && ring.current_record.scenario != 'FAST' && 活动
}
{
ring.current_record && ring.current_record.scenario != 'FAST' && {activityDuration()}
}
}
{t('page.food.title')}
{t('page.workout.title')}
{
showErrorPage && { getPlanData() }} />
}
}