import { View } from "@tarojs/components" import { bigRingRadius, getBgRing, getCommon, getDot, ringWidth, thirdRingRadius } from "../trackTimeDuration/hooks/RingData"; import Rings from "@/features/trackTimeDuration/components/Rings"; import { RealRing } from '@/features/trackTimeDuration/components/Rings' import { ColorType } from "@/context/themes/color"; import { useEffect, useState } from "react"; import { TimeFormatter } from "@/utils/time_format"; import dayjs from 'dayjs' const utc = require('dayjs/plugin/utc') const timezone = require('dayjs/plugin/timezone') dayjs.extend(utc) dayjs.extend(timezone) export default function DayNightRing(props: { isNight: boolean, isThirdRing: boolean, canvasId: any, authInfo: any }) { const [authInfo, setAuthInfo] = useState(props.authInfo) useEffect(() => { setAuthInfo(props.authInfo) }, [props.authInfo]) function dayRing() { var common = getCommon(null, true) common.radius = props.isThirdRing ? thirdRingRadius : bigRingRadius; common.lineWidth = ringWidth; var bgRing = getBgRing() let realRingBig: RealRing = { color: ColorType.day + '66', startArc: 0, durationArc: 2 } var now = new Date().getTime() if (authInfo && authInfo.day_completed && now > authInfo.day_completed.sunset_ts) { realRingBig.color = ColorType.day var duration = (authInfo.day_completed.sunset_ts - authInfo.day_completed.sunrise_ts) / 1000 var time = authInfo.day_completed.sunrise time = time.substring(time.length - 8, time.length) var start = new Date('2024-01-01T' + time) realRingBig.startArc = (start.getHours() * 3600 + start.getMinutes() * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0; realRingBig.durationArc = (duration) / (24 * 3600) * 2 * Math.PI; return } var sunRise = 6 * 60 var sunSet = 18 * 60 if (global.dayObj) { sunRise = parseInt(global.dayObj.sunrise.time.split(':')[0]) * 60 + parseInt(global.dayObj.sunrise.time.split(':')[1]) sunSet = parseInt(global.dayObj.sunset.time.split(':')[0]) * 60 + parseInt(global.dayObj.sunset.time.split(':')[1]) } var duration = sunSet - sunRise if (global.dayObj) { duration = (global.dayObj.sunset.timestamp - global.dayObj.sunrise.timestamp) / 60000 } 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) if (authInfo && authInfo.timezone && authInfo.timezone.id) { var current1 = dayjs() var current = TimeFormatter.tzLocalTime(new Date().getTime(),authInfo.timezone.id)//dayjs().tz(authInfo.timezone.id) var offset = current.day() * 24 * 60 + current.hour() * 60 + current.minute() - current1.day() * 24 * 60 - current1.hour() * 60 - current1.minute() currentDot.offset = offset } var date = new Date(now) var minutes = date.getHours() * 60 + date.getMinutes() if (minutes < sunRise) { minutes += 1440 } currentDot.color = ColorType.day var t = date.getHours() * 60 + date.getMinutes() var duration2 = t - sunRise if (duration2 < 0) { duration2 += 24 * 60 } if (global.dayObj) { if (global.dayObj.sunrise.timestamp < now && global.dayObj.sunset.timestamp > now) { duration2 = (now - global.dayObj.sunrise.timestamp) / 60000 } else { duration2 = -1 } } 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 (duration2 == -1) { realRing = null } return } function nightRing() { var common = getCommon(null, true) common.radius = props.isThirdRing ? thirdRingRadius : bigRingRadius; common.lineWidth = ringWidth; var bgRing = getBgRing() let realRingBig: RealRing = { color: ColorType.night + '66', startArc: 0, durationArc: 2 } var currentDot = getDot(null, false) currentDot.color = ColorType.night if (authInfo && authInfo.timezone && authInfo.timezone.id) { var current1 = dayjs() var current = TimeFormatter.tzLocalTime(new Date().getTime(),authInfo.timezone.id)//dayjs().tz(authInfo.timezone.id) var offset = current.date() * 24 * 60 + current.hour() * 60 + current.minute() - current1.date() * 24 * 60 - current1.hour() * 60 - current1.minute() currentDot.offset = offset } var now1 = new Date().getTime() if (authInfo && authInfo.timezone) { now1 = TimeFormatter.transferTimestamp(now1, authInfo.timezone.gmt) } if (authInfo && authInfo.night_completed && new Date().getTime() > authInfo.night_completed.sunrise_ts) { var isCompleted = false; if (authInfo.day_completed && new Date().getTime() > authInfo.day_completed.sunset_ts) { isCompleted = true } realRingBig.color = ColorType.night var duration = (authInfo.night_completed.sunrise_ts - authInfo.night_completed.sunset_ts) / 1000 var time = authInfo.night_completed.sunset time = time.substring(time.length - 8, time.length) var start = new Date('2024-01-01T' + time) realRingBig.startArc = (start.getHours() * 3600 + start.getMinutes() * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0; realRingBig.durationArc = (duration) / (24 * 3600) * 2 * Math.PI; //已结束未更新暂停时,显示current_dot if (isCompleted) { currentDot = null } // if (!realRingBig.startArc){ // realRingBig = null // } return } var sunRise = 24 * 60 + 6 * 60 var sunSet = 18 * 60 if (global.nightObj) { sunRise = 24 * 60 + parseInt(global.nightObj.sunrise.time.split(':')[0]) * 60 + parseInt(global.nightObj.sunrise.time.split(':')[1]) sunSet = parseInt(global.nightObj.sunset.time.split(':')[0]) * 60 + parseInt(global.nightObj.sunset.time.split(':')[1]) } var duration = sunRise - sunSet if (global.nightObj) { duration = (global.nightObj.sunrise.timestamp - global.nightObj.sunset.timestamp) / 60000 // if (global.nightObj.sunrise.timestamp-new Date().getTime()>48*3600*1000){ // duration = 24*60 // } } realRingBig.startArc = (sunSet * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0; realRingBig.durationArc = (duration * 60) / (24 * 3600) * 2 * Math.PI; var now = new Date() var t1 = now.getHours() * 60 + now.getMinutes() var duration2 = t1 - sunSet if (duration2 < 0) { duration2 += 24 * 60 } if (global.nightObj) { if (global.nightObj.sunset.timestamp < now.getTime() && global.nightObj.sunrise.timestamp > now.getTime()) { duration2 = (now.getTime() - global.nightObj.sunset.timestamp) / 60000 } else { duration2 = -1 } } let realRing: RealRing = { color: ColorType.night, startArc: (sunSet * 60) / (24 * 3600) * 2 * Math.PI - Math.PI / 2.0, durationArc: (duration2 * 60) / (24 * 3600) * 2 * Math.PI } if (duration2 == -1) { realRing = null; } // if (night.nightRingDate) { // if (new Date(night.nightRingDate).getDate() == now.getDate() && now.getHours() < 12) { // realRing = null; // } // } // if (!user.isLogin) { // currentDot = null; // realRing = null; // } return duration ? null : realRing} currentDot={currentDot} canvasId={props.canvasId} /> } return props.isNight ? nightRing() : dayRing() }