import { View, Text, Image, PageContainer } from "@tarojs/components";
import './Metric.scss'
import { useDispatch, useSelector } from "react-redux";
import { useEffect, useRef, useState } from "react";
import Taro from "@tarojs/taro";
import { metricCards, metricFollows, metricGroups, uploadMetric, uploadSteps } from "@/services/trackSomething";
import { TimeFormatter } from "@/utils/time_format";
import MetricItem from "./MetricItem";
import NoData from "@/components/view/NoData";
import Layout from "@/components/layout/layout";
import { MetricModalType, ModalType, NaviBarTitleShowType, TemplateType } from "@/utils/types";
import { useTranslation } from "react-i18next";
import { jumpPage } from "@/features/trackTimeDuration/hooks/Common";
import TitleView from "@/features/trackTimeDuration/components/TitleView";
import { setTabbarStatus } from "@/store/common";
import MetricModalChoose from "./MetricModalChoose";
import MetricModalOrder from './MetricModalOrder';
import MetricModalAdd from "./MetricModalAdd";
import MetricModalTime from "./MetricModalTime";
import Modal from "@/components/layout/Modal";
import { rpxToPx } from "@/utils/tools";
import { AtActivityIndicator } from "taro-ui";
let useNavigation;
if (process.env.TARO_ENV == 'rn') {
useNavigation = require("@react-navigation/native").useNavigation
}
export default function Component(props: any) {
const { t } = useTranslation()
const user = useSelector((state: any) => state.user);
const [list, setList] = useState([])
const [metricItem, setMetricItem] = useState({})
const [strTime, setStrTime] = useState('')
const [time, setTime] = useState(0)
const [showErrorPage, setErrorPage] = useState(false)
const [setupTime, setSetupTime] = useState(0)
const [triggered, setTriggered] = useState(true)
const [count, setCount] = useState(0)
const [showPageContainer, setShowPageContainer] = useState(false)
const [modalType, setModalType] = useState(MetricModalType.none)
const [themeColor, setThemeColor] = useState('#00ffff')
const [groups, setGroups] = useState([])
const [orignalGroups, setOrignalGroups] = useState([])
const [limits, setLimits] = useState(null)
const [orders, setOrders] = useState([])
const [newOrders, setNewOrders] = useState([])
const [resultOrders, setResultOrders] = useState([])
const [tempMetricItem, setTempMetricItem] = useState(null)
const [loaded, setLoaded] = useState(false)
const dispatch = useDispatch();
let navigation;
if (useNavigation) {
navigation = useNavigation()
}
//未登录<->已登录 状态切换时,执行一次授权检查
useEffect(() => {
getCards();
getGroups();
const now = new Date();
const nextMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0);
const timeUntilMidnight = nextMidnight.getTime() - now.getTime();
setTimeout(() => {
setCount(count + 1)
}, timeUntilMidnight);
}, [user.isLogin])
const openModal = () => {
setSetupTime(new Date().getTime())
setModalType(MetricModalType.add)
setShowPageContainer(true)
};
global.refreshMetric = () => {
getCards()
}
function getCards() {
setTriggered(true)
metricCards().then(res => {
Taro.stopPullDownRefresh()
setErrorPage(false)
setList((res as any).cards)
setTriggered(false)
if ((res as any).cards.length > 0) {
var obj = (res as any).cards[0]
setThemeColor(obj.theme_color)
}
var list: any = [];
(res as any).cards.map(item => {
list.push({
name: item.name,
code: item.code,
is_following: true
})
})
setOrders(list)
setResultOrders(list)
setLoaded(true)
}).catch(e => {
Taro.stopPullDownRefresh()
if (list.length == 0) {
setErrorPage(true)
}
setTriggered(false)
setLoaded(false)
})
}
function getGroups() {
metricGroups().then(res => {
var array = (res as any).groups
setOrignalGroups(JSON.parse(JSON.stringify(array)))
setGroups(array)
setLimits((res as any).num_options_limit)
setNewOrders([])
})
}
//ts 把数组items: [{code: "_walk", value: 2180},{code: "_walk", value: 4444}]中的value取出来,/分割,组成字符串,如2180/4444
function getValues(items) {
var values = ''
items.map((item, index) => {
if (index == 0) {
values = item.value
}
else {
values = values + '/' + item.value
}
})
return values
}
function goDetail(item) {
if (user.isLogin) {
if (!item.latest_record) {
return
}
global.selMetricItem = item
jumpPage('/pages/common/RecordsHistory?type=metric&refreshList=getCards&code='
+ item.code + `&title=${item.name}` + '&themeColor=' + item.theme_color, 'RecordsHistory', navigation, {
type: 'metric',
refreshList: 'getCards',
code: item.code,
title: item.name,
themeColor: item.theme_color
})
}
else {
jumpPage('/pages/account/ChooseAuth', 'ChooseAuth', navigation)
}
}
function record(item: any) {
if (user.isLogin) {
//check data
var schemas = item.schemas
for (var i = 0; i < schemas.length; i++) {
var obj = schemas[i]
if ((!obj.min && obj.min != 0) || !obj.max || !obj.step || (!obj.default_value && obj.default_value != 0)) {
Taro.showToast({
title: t('feature.common.maintain'),
icon: 'none'
})
return;
}
}
var now = new Date();
// var t = (now.getHours() < 10 ? '0' + now.getHours() : now.getHours()) + ":" + (now.getMinutes() < 10 ? '0' + now.getMinutes() : now.getMinutes());
// setStrTime(t)
setStrTime(TimeFormatter.dateTimeFormate(now.getTime()))
setTime(now.getTime())
setMetricItem(item)
openModal()
}
else {
jumpPage('/pages/account/ChooseAuth', 'ChooseAuth', navigation)
}
}
function chooseTime(e) {
setTime(e);
setStrTime(TimeFormatter.dateTimeFormate(e))
}
const limitDay = 500
const limit = new Date().getTime() - limitDay * 3600 * 1000 * 24;
//获取参考值
function getTargetValue(item) {
for (var i = 0; i < item.references.length; i++) {
if (item.references[i].selected) {
for (var j = 0; j < item.references[i].categories.length; j++) {
if (item.references[i].categories[j].is_default) {
return item.references[i].categories[j].value_range
}
}
}
}
return null
}
function detail() {
if (!loaded){
return
{/* */}
}
return
{
list.map((item: any, index: number) => {
var unit = ''
var value = t('feature.track_something.metric.no_record')
var desc = t('feature.track_something.metric.check_unlock_data')
var showDetail = false;
if (item.latest_record) {
if (item.type == 'composite') {
unit = item.latest_record.unit ? item.latest_record.unit : ''
value = item.latest_record.value
}
else {
unit = item.schemas[0].default_unit
value = getValues(item.latest_record.items)
}
desc = TimeFormatter.dateDescription(item.latest_record.timestamp, true)
showDetail = true
}
if (!user.isLogin) {
value = t('feature.track_something.metric.un_login')
desc = t('feature.track_something.metric.login_can_check')
}
if (getTargetValue(item)) {
desc = getTargetValue(item)
}
// desc = '90~140/60~90 mmHg'
return { goDetail(item) }}
onClick={() => { record(item) }}
showTag={item.type == 'composite'}
tagName={t('feature.track_something.metric.composite')}
/>
})
}
{
user.isLogin && list.length > 0 &&
{t('feature.workout.add_more')}
}
{
process.env.TARO_ENV=='weapp'?:
}
}
function addBtnClick() {
Taro.showActionSheet({
itemList: [t('feature.track_something.metric.choose_metric'),
t('feature.track_something.metric.order')]
})
.then(res => {
switch (res.tapIndex) {
case 0:
chooseMore()
break;
case 1:
global.metricAdd = false
setModalType(MetricModalType.order)
setShowPageContainer(true)
break;
}
})
.catch(err => {
console.log(err.errMsg)
})
}
function chooseMore() {
global.metricAdd = true
setModalType(MetricModalType.choose)
setShowPageContainer(true)
}
function headerView() {
return
}
function metricModalContent() {
global.set_time = new Date().getTime()
switch (modalType) {
case MetricModalType.choose:
return
case MetricModalType.order:
return
case MetricModalType.add:
return {
var temp = JSON.parse(JSON.stringify(tempItem))
temp.schemas.map(item => {
if (item.tempValue) {
item.default_value = item.tempValue
}
})
setTempMetricItem(temp)
setModalType(MetricModalType.time)
}}
cancel={modalAddCancel}
confirm={modalAddConfirm} />
case MetricModalType.time:
return {
setModalType(MetricModalType.add)
}}
confirm={(e) => {
chooseTime(e)
setModalType(MetricModalType.add)
}}
/>
}
return
}
function modalCancel() {
setShowPageContainer(false)
onPageContainerCancel()
}
function modalConfirm(datas, newOrders, resultOrders, groups) {
setOrders(datas)
setGroups(groups)
setNewOrders(newOrders)
setResultOrders(resultOrders)
setModalType(MetricModalType.order)
}
function modalOrderCancel() {
if (global.metricAdd) {
setModalType(MetricModalType.choose)
}
else {
setShowPageContainer(false)
onPageContainerCancel()
}
}
function modalOrderConfirm(datas) {
var array: any = []
datas.map(item => {
array.push(item.code)
})
metricFollows({ codes: array }).then(res => {
getCards()
getGroups()
setList((res as any).cards)
// setOrignalGroups(groups)
})
setShowPageContainer(false)
}
function modalAddCancel() {
setShowPageContainer(false)
onPageContainerCancel()
}
function modalAddConfirm(result) {
setShowPageContainer(false)
var date = new Date(time)
var strDate = (date.getFullYear() + '') + (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : (date.getMonth() + 1)) + (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
var array: any[] = [];
result.schemas.map((item, index) => {
array.push({
code: item.code,
value: item.tempValue && item.tempValue > 0 ? item.tempValue : item.default_value
})
})
var params = {
code: result.code,
timestamp: time,
date: strDate,
items: array,
extra: {
set_time: setupTime,
confirm_time: new Date().getTime()
}
}
global.postBtnUpdateStatus('normal');
uploadMetric(params).then(res => {
// getCards();
result.schemas.map((item, index) => {
item.tempValue = ''
})
list.map((item, index) => {
if ((item as any).code == (res as any).code) {
(item as any).latest_record = (res as any).latest_record;
(item as any).schemas = (res as any).schemas;
}
})
setList(JSON.parse(JSON.stringify(list)))
global.postBtnUpdateStatus('idle');
setTimeout(() => {
setCount(count + 1)
}, 31000)
getCards()
})
}
function onPageContainerCancel() {
if (modalType == MetricModalType.choose || modalType == MetricModalType.order) {
var array: any = [];
list.map(item => {
array.push({
name: (item as any).name,
code: (item as any).code,
is_following: true
})
})
setOrders(array)
setNewOrders([])
setGroups(JSON.parse(JSON.stringify(orignalGroups)))
// setGroups(orignalGroups)
}
else {
setTempMetricItem(null)
}
}
function modalContent() {
if (showPageContainer) {
if (process.env.TARO_ENV == 'weapp') {
return {
onPageContainerCancel()
setShowPageContainer(false)
}} confirm={() => { }}>
{
metricModalContent()
}
}
else if (process.env.TARO_ENV == 'rn') {
return { setShowPageContainer(false); setModalType(MetricModalType.none) }}
onBeforeEnter={() => { dispatch(setTabbarStatus(false)); Taro.hideTabBar() }}
onBeforeLeave={() => { dispatch(setTabbarStatus(true)); Taro.showTabBar() }}
>
{
metricModalContent()
}
}
}
return
}
return
{ getCards() }} /> : detail()}
title={t('page.metric.title')}
type={TemplateType.customHeader}
header={headerView()}
refresh={() => { getCards() }}
triggered={triggered}
titleShowStyle={NaviBarTitleShowType.scrollToShow}
showPullToRefresh={true}
/>
{
modalContent()
}
}