import { View, Text, ScrollView } from "@tarojs/components";
import './MainCard.scss'
import { useEffect, useState } from "react";
import { rpxToPx } from "@/utils/tools";
import Rings, { RingCommon, BgRing, TargetRing, CurrentDot, RealRing } from "@/features/trackTimeDuration/components/Rings";
import dayjs from "dayjs";
import 'dayjs/locale/zh-cn';
import 'dayjs/locale/en';
import momentT from 'moment';
// import moment from 'moment-timezone'
import { MainColorType } from "@/context/themes/color";
import { useDispatch, useSelector } from "react-redux";
import Calendar from "@/features/health/calendar";
import { WindowStatusType, WindowType } from "@/utils/types";
import { durationArc, isCurrentTimeInRange, startArc } from "./util";
import { setMode } from "@/store/health";
import { getScenario, getWindowStatus } from "./hooks/health_hooks";
import { useTranslation } from "react-i18next";
import { useRouter } from "@tarojs/taro";
let useActionSheet;
let useRoute;
let useNavigation;
if (process.env.TARO_ENV == 'rn') {
useRoute = require("@react-navigation/native").useRoute
useNavigation = require("@react-navigation/native").useNavigation
useActionSheet = require('@expo/react-native-action-sheet').useActionSheet
}
export default function MainDayNightCard(props: {
count: number,
typeChanged: Function,
id: number,
onClick: Function,
scale: number
}) {
const health = useSelector((state: any) => state.health);
let router
let navigation;
if (useNavigation) {
navigation = useNavigation()
}
if (process.env.TARO_ENV == 'rn') {
router = useRoute()
}
else {
router = useRouter()
}
const { day } = health.windows.night_day
const isTempDay = () => {
if (router.params.window == 'DAY') {
return true
}
if (router.params.window == 'NIGHT') {
return false
}
if (isCurrentTimeInRange(day.period.start_time, day.period.end_time)) {
return true
}
return false
}
const [isDayMode, setIsDayMode] = useState(isTempDay)
const user = useSelector((state: any) => state.user);
const dispatch = useDispatch();
const {t} = useTranslation()
useEffect(() => {
const { day } = health.windows.night_day
if (isCurrentTimeInRange(day.period.start_time, day.period.end_time)) {
setIsDayMode(true)
}
else {
setIsDayMode(false)
}
}, [])
useEffect(() => {
if (health.selTab == 0) {
dispatch(setMode(isDayMode ? 'DAY' : 'NIGHT'))
}
}, [health.selTab, isDayMode])
useEffect(() => {
if (health.mode == 'DAY') {
debugger
setIsDayMode(true)
}
else if (health.mode == 'NIGHT') {
setIsDayMode(false)
}
}, [health.mode])
useEffect(() => {
dayjs.locale(global.language == 'en' ? 'en' : 'zh-cn');
require('moment/locale/en-gb')
require('moment/locale/zh-cn')
momentT.locale(global.language == 'en' ? 'en-gb' : 'zh-cn')
// moment.defineLocale(global.language == 'en' ? 'en-gb' : 'zh-cn', (momentT.localeData() as any)._config)
// moment.locale(global.language == 'en' ? 'en-gb' : 'zh-cn')
}, [props.count])
const common: RingCommon = {
useCase: 'ChooseScenario',
radius: 27,
lineWidth: 12,
isFast: true,
status: 'WAIT_FOR_START'
}
const bgRing: BgRing = {
color: MainColorType.ringBg
}
function getTargetArc() {
const { day, night } = health.windows.night_day
if (isDayMode) {
return durationArc(day.target.start_timestamp, day.target.end_timestamp)
}
return durationArc(night.target.start_timestamp, night.target.end_timestamp)
}
function getStartRealArc() {
const { day, night } = health.windows.night_day
const timestamp = new Date().getTime()
if (isDayMode) {
if (timestamp >= day.target.start_timestamp && timestamp <= day.target.end_timestamp)
return startArc(day.target.start_timestamp)
}
else {
if (timestamp >= night.target.start_timestamp && timestamp <= night.target.end_timestamp)
return startArc(night.target.start_timestamp)
}
return startArc(timestamp)
}
function getRealArc() {
const status = getWindowStatus(health.windows, isDayMode ? 'DAY' : 'NIGHT')
if (status == WindowStatusType.upcoming) {
const scenario = getScenario(health.windows, isDayMode ? 'DAY' : 'NIGHT')
return durationArc(new Date().getTime(), scenario.target.start_timestamp)
}
const { day, night } = health.windows.night_day
if (isDayMode) {
return durationArc(day.target.start_timestamp, new Date().getTime())
}
return durationArc(night.target.start_timestamp, new Date().getTime())
}
function getArc() {
const { day, night } = health.windows.night_day
if (isDayMode) {
return startArc(day.target.start_timestamp)
}
return startArc(night.target.start_timestamp)
}
function currentDot() {
if (health.mode == 'DAY' || health.mode == 'NIGHT') {
const status = getWindowStatus(health.windows, isDayMode ? 'DAY' : 'NIGHT')
return {
color: status == WindowStatusType.upcoming?'#B2B2B2':isDayMode ? MainColorType.day : MainColorType.night,
lineWidth: 4,
borderColor: '#F5F5F5',
offset: 0
}
}
return null;
}
function ring() {
var offset = 0
var hour = new Date().getHours()
var minute = new Date().getMinutes()
if (hour != new Date().getHours() || minute != new Date().getMinutes()) {
offset = hour * 60 + minute - new Date().getHours() * 60 - new Date().getMinutes()
}
var targetColor: string = isDayMode ? MainColorType.dayLight : MainColorType.nightLight
var realColor: string = isDayMode ? MainColorType.day : MainColorType.night
const status = getWindowStatus(health.windows, isDayMode ? 'DAY' : 'NIGHT')
if (status == WindowStatusType.upcoming) {
realColor = '#CCCCCC'
}
const targetRing: TargetRing = {
color: targetColor,
startArc: getArc(),//-Math.PI / 2,
durationArc: getTargetArc()
}
let realRing: RealRing = {
color: realColor,
startArc: getStartRealArc(),//-Math.PI / 2,
durationArc: getRealArc()
}
if (status == WindowStatusType.upcoming){
realRing = null
}
return
}
return props.onClick()} style={{ width: rpxToPx(634 / 3), display: 'flex', flexShrink: 0, flexDirection: 'column', alignItems: 'center', position: 'relative' }}>
{
ring()
}
{isDayMode ? t('health.window_day') : t('health.night')}
}