Leon il y a 2 ans
Parent
commit
9487482aee

+ 1 - 0
package.json

@@ -87,6 +87,7 @@
 		"i18next-browser-languagedetector": "^7.1.0",
 		"jcore-react-native": "^2.1.5",
 		"jpush-react-native": "^3.0.6",
+		"mathjs": "^12.3.0",
 		"react": "^18.1.0",
 		"react-dom": "^18.1.0",
 		"react-i18next": "^13.2.2",

+ 2 - 1
src/context/locales/en.js

@@ -371,7 +371,8 @@ export default {
                 check_unlock_data: 'Record to Unlock Trends',
                 choose_metric: 'Choose Metric',
                 choose_metric_desc: 'Select metrics based on your needs.',
-                order: 'Adjust Order'
+                order: 'Adjust Order',
+                composite:'Composite'
 
             },
             werun_auth: {

+ 2 - 2
src/context/locales/zh.js

@@ -375,8 +375,8 @@ export default {
                 check_unlock_data: '记录解锁趋势',
                 choose_metric: '选择指标项',
                 choose_metric_desc:'按需选择自己常用的指标',
-                order: '调整排序'
-
+                order: '调整排序',
+                composite:'复合'
             },
             werun_auth: {
                 modal_open_setting_title: '提示',

+ 1 - 1
src/features/trackSomething/components/ActivityHistory.tsx

@@ -110,7 +110,7 @@ export default function Component(props: { records: any[] }) {
     }
 
     
-    var lastYearStr = '2025年'
+    var lastYearStr = '2050年'
 
     return <View style={{ display: 'flex', flexDirection: 'column' }}>
 

+ 13 - 2
src/features/trackSomething/components/Metric.tsx

@@ -207,8 +207,15 @@ export default function Component(props: any) {
                         var desc = t('feature.track_something.metric.check_unlock_data')
                         var showDetail = false;
                         if (item.latest_record) {
-                            unit = item.schemas[0].default_unit
-                            value = getValues(item.latest_record.items)
+
+                            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
                         }
@@ -231,6 +238,8 @@ export default function Component(props: any) {
                             themeColor={item.theme_color}
                             onClickDetail={() => { goDetail(item) }}
                             onClick={() => { record(item) }}
+                            showTag={item.type == 'composite'}
+                            tagName={t('feature.track_something.metric.composite')}
                         />
                     })
                 }
@@ -419,6 +428,8 @@ export default function Component(props: any) {
                 setCount(count + 1)
             }, 31000)
 
+            getCards()
+
         })
     }
 

+ 5 - 31
src/features/trackSomething/components/MetricHistory.tsx

@@ -17,28 +17,6 @@ export default function Component(props: { records: any[] }) {
         setList(props.records)
     }, [props.records])
 
-    function formateDate(date: string) {
-        //yyyyMMdd转换成日期,如果是今天,返回今天,如果是昨天,返回昨天,如果是昨天之前,返回日期
-        const dt = new Date(date.substring(0, 4) + '/' +
-            date.substring(4, 6) + '/' +
-            date.substring(6));
-
-        const now = new Date();
-
-        const diff = now.getTime() - dt.getTime();
-        const day = 1000 * 60 * 60 * 24;
-
-        if (diff < day) {
-            return TimeFormatter.getTodayUnit();
-        } else if (diff < 2 * day) {
-            return TimeFormatter.getYesterdayUnit();
-        } else {
-            return date.substring(0, 4) + '-' +
-                date.substring(4, 6) + '-' +
-                date.substring(6)//dt.toISOString().slice(0, 10);
-        }
-    }
-
     function formateHourMinutes(timestamp: number) {
         var date = new Date(timestamp)
         var hour = date.getHours()
@@ -118,7 +96,7 @@ export default function Component(props: { records: any[] }) {
         }
     }
 
-    var lastYearStr = '2025年'
+    var lastYearStr = '2050年'
     return <View style={{ display: 'flex', flexDirection: 'column' }}>
         {
             user.test_user && <Text style={{ color: '#fff', position: 'absolute', right: 50, top: 0 }} onClick={() => global.clearHistory()}>删除全部</Text>
@@ -139,18 +117,14 @@ export default function Component(props: { records: any[] }) {
                         item.records.map(record => {
                             return <RecordItem delete={() => deleteRecord(record)}>
                                 <View className="operate_item1">
-                                    {/* <View className="status_bg">
-                                       
-                                    </View>
-                                    <View style={{ width: 12 }} /> */}
-                                    <Text className="value" style={{ backgroundColor: global.isDebug ? 'red' : 'transparent' }}>{record.items[0].value}</Text>
+                                    <Text className="value" style={{ backgroundColor: global.isDebug ? 'red' : 'transparent' }}>{record.type=='composite'?record.value:record.items[0].value}</Text>
                                     {
-                                        record.items.length > 1 && <Text className="value">/{record.items[1].value}</Text>
+                                        record.type=='basic' && record.items.length > 1 && <Text className="value">/{record.items[1].value}</Text>
                                     }
                                     {
-                                        record.items.length > 2 && <Text className="value">/{record.items[2].value}</Text>
+                                        record.type=='basic' &&record.items.length > 2 && <Text className="value">/{record.items[2].value}</Text>
                                     }
-                                    <Text className="unit">{record.items[0].unit}</Text>
+                                    <Text className="unit">{record.type=='composite'?record.unit?record.unit:'':record.items[0].unit}</Text>
                                     <View style={{ flex: 1 }} />
                                     <Text className="time">{formateHourMinutes(record.timestamp)}</Text>
 

+ 7 - 2
src/features/trackSomething/components/MetricItem.tsx

@@ -17,6 +17,8 @@ export default function Component(props: {
     showBadge?: boolean,
     showDetail?: boolean,
     longClick?: Function,
+    showTag?:boolean,
+    tagName?:string
 }) {
 
     function clickBtn() {
@@ -42,9 +44,12 @@ export default function Component(props: {
                 style={{ color: props.themeColor }}
                 onClick={() => props.onClickDetail()}>{props.title}</Text>
             <View style={{ flex: 1 }} />
-            <View className="metric_tag_bg">
-                <Text className="metric_tag_text" style={{color:props.themeColor}}>复合</Text>
+            {
+                props.showTag && <View className="metric_tag_bg">
+                <Text className="metric_tag_text" style={{color:props.themeColor}}>{props.tagName}</Text>
             </View>
+            }
+            
         </View>
 
         <View className="metric_value_bg" onClick={() => props.onClickDetail()}>

+ 6 - 1
src/features/trackSomething/components/MetricModalChoose.tsx

@@ -161,7 +161,12 @@ export default function Component(props: {
                                             obj.is_following ? <IconRadioCheck width={16} color='#fff' /> : <IconRadio width={16} color='#fff' />
                                         }
 
-                                        <Text className='modal_item_text' style={{ color: color, marginLeft: 10 }}>{obj.name}</Text>
+                                        <Text className='modal_item_text' style={{ color: color, marginLeft: 10,marginRight:10 }}>{obj.name}</Text>
+                                        {
+                                            obj.type=='composite' && <View className="metric_tag_bg">
+                                                <Text className="metric_tag_text" style={{ color: color }}>{t('feature.track_something.metric.composite')}</Text>
+                                            </View>
+                                        }
                                         <View style={{ flex: 1 }} />
                                         {
                                             user.test_user && <Text style={{ color: '#fff' }}>{obj.is_following ? codeIndex(obj.code) : ''}</Text>

+ 75 - 48
src/features/trackTimeDuration/components/RecordFastSleep.tsx

@@ -19,42 +19,74 @@ import { useTranslation } from "react-i18next";
 import { ColorType } from "@/context/themes/color";
 import TimelineStage from "./TimelineStage";
 import { jumpPage } from "../hooks/Common";
+import { sqrt } from 'mathjs'
 
 export default function RecordFastSleep(props: { data: any, type: string, delSuccess?: Function }) {
     const [showDetailModal, setShowDetailModal] = useState(false)
     const [segmentIndex, setSegmentIndex] = useState(0)
     const [diffTimeZone, setDiffTimeZone] = useState(false)
+    const [multiTimeZone, setMultiTimeZone] = useState(false)
     const { t } = useTranslation()
     const canvasId = props.data.id
     const record = props.data;
 
     useEffect(() => {
+        checkTimezone()
+        console.log(sqrt(-4).toString())
+    }, [props.data])
+
+    function checkTimezone() {
         var split = new Date().toString().split(' ');
         var currentTZ = split[split.length - 2];
+        var isDiff = false;
+        var isMulti = false;
+        var tempTZ = '';
         if (props.data.fast) {
-            if (props.data.fast.real_start_time_zone && props.data.fast.real_start_time_zone != currentTZ) {
-                setDiffTimeZone(true)
-                return
+            if (props.data.fast.real_start_time_zone) {
+                tempTZ = props.data.fast.real_start_time_zone
+                if (props.data.fast.real_start_time_zone != currentTZ) {
+                    isDiff = true
+                }
             }
-            if (props.data.fast.real_end_time_zone && props.data.fast.real_end_time_zone != currentTZ) {
-                setDiffTimeZone(true)
-                return
+
+            if (props.data.fast.real_end_time_zone) {
+                if (tempTZ != props.data.fast.real_end_time_zone) {
+                    isMulti = true
+                }
+                if (props.data.fast.real_end_time_zone != currentTZ) {
+                    isDiff = true
+                }
             }
+
         }
 
         if (props.data.sleep) {
-            if (props.data.sleep.real_start_time_zone && props.data.sleep.real_start_time_zone != currentTZ) {
-                setDiffTimeZone(true)
-                return
+            if (props.data.sleep.real_start_time_zone){
+                if (tempTZ == '') {
+                    tempTZ = props.data.sleep.real_start_time_zone
+                }
+                else if (tempTZ != props.data.sleep.real_start_time_zone) {
+                    isMulti = true
+                }
+                if (props.data.sleep.real_start_time_zone != currentTZ) {
+                    isDiff = true
+                }
             }
-            if (props.data.sleep.real_end_time_zone && props.data.sleep.real_end_time_zone != currentTZ) {
-                setDiffTimeZone(true)
-                return
+
+            if (props.data.sleep.real_end_time_zone){
+                if (tempTZ != props.data.sleep.real_end_time_zone) {
+                    isMulti = true
+                }
+                if (props.data.sleep.real_end_time_zone != currentTZ) {
+                    isDiff = true
+                }
             }
+            
+            
         }
-        setDiffTimeZone(false)
-
-    }, [props.data])
+        setDiffTimeZone(isDiff)
+        setMultiTimeZone(isMulti)
+    }
     function del() {
         var id = props.data.id
         delRecord(id
@@ -68,37 +100,22 @@ export default function RecordFastSleep(props: { data: any, type: string, delSuc
         })
     }
 
+    function subTitle(timestamp) {
+        if (multiTimeZone) {
+            return 'Multiple time zones'
+        }
+        if (diffTimeZone) {
+            return 'Different time zone'
+        }
+        return TimeFormatter.getDateAndWeek(timestamp)
+    }
+
     function schedules() {
         var timestamp = props.data.first_real_check_time
 
-        // var split = new Date().toString().split(' ');
-        // var currentTZ = split[split.length - 2];
-        // var diffTimeZone = false
-        // if (props.data.fast) {
-        //     if (props.data.fast.real_start_time_zone && props.data.fast.real_start_time_zone != currentTZ) {
-        //         diffTimeZone = true
-        //     }
-        //     if (props.data.fast.real_end_time_zone && props.data.fast.real_end_time_zone != currentTZ) {
-        //         diffTimeZone = true
-        //     }
-        // }
-
-        // if (props.data.sleep) {
-        //     if (props.data.sleep.real_start_time_zone && props.data.sleep.real_start_time_zone != currentTZ) {
-        //         diffTimeZone = true
-        //     }
-        //     if (props.data.sleep.real_end_time_zone && props.data.sleep.real_end_time_zone != currentTZ) {
-        //         diffTimeZone = true
-        //     }
-        // }
-
-
-        // if (props.data.first_time_zone){
-        //     timestamp = TimeFormatter.transferTimestamp(timestamp,props.data.first_time_zone)
-        // }
         return <View style={{ display: 'flex', flexDirection: 'column' }}>
-            <TimelineStage data={props.data} title={t('feature.track_time_duration.record_fast_sleep.pop_title')} 
-            subTitle={diffTimeZone?'Multiple time zones':TimeFormatter.getDateAndWeek(timestamp)} first_real_check_time={timestamp}/>
+            <TimelineStage data={props.data} title={t('feature.track_time_duration.record_fast_sleep.pop_title')}
+                subTitle={subTitle(timestamp)} first_real_check_time={timestamp} />
         </View>
     }
 
@@ -131,7 +148,7 @@ export default function RecordFastSleep(props: { data: any, type: string, delSuc
         if (!end) {
             end = (new Date()).getTime()
         }
-        return TimeFormatter.durationFormate(start,end)
+        return TimeFormatter.durationFormate(start, end)
         // return TimeFormatter.calculateTimeDifference(start, end)
     }
 
@@ -223,14 +240,24 @@ export default function RecordFastSleep(props: { data: any, type: string, delSuc
         </View>
     }
 
-    function recordTime(){
+    function recordTime() {
         var timestamp = props.data.first_real_check_time
-        if (props.data.first_time_zone){
-            timestamp = TimeFormatter.transferTimestamp(timestamp,props.data.first_time_zone)
+        if (props.data.first_time_zone) {
+            timestamp = TimeFormatter.transferTimestamp(timestamp, props.data.first_time_zone)
         }
         return TimeFormatter.dateDescription(timestamp, true)
     }
 
+    function getArrowText() {
+        if (multiTimeZone) {
+            return 'Multiple time zones'
+        }
+        if (diffTimeZone) {
+            return 'Different time zone'
+        }
+        return recordTime()
+    }
+
     function recordDetail() {
         var fastDuration = ''
         var sleepDuration = ''
@@ -280,8 +307,8 @@ export default function RecordFastSleep(props: { data: any, type: string, delSuc
             </View>
             {/* <Image className="arrow1" src={require('@/assets/images/arrow.png')} /> */}
             <View className="record_arrow_bg" style={{ backgroundColor: global.isDebug ? 'red' : 'transparent' }}>
-                <View style={{flex:1}}/>
-                <Text className='recordTime'>{diffTimeZone?'Multiple time zones':recordTime()}</Text>
+                <View style={{ flex: 1 }} />
+                <Text className='recordTime'>{getArrowText()}</Text>
                 <Image className="arrow2" src={require('@/assets/images/arrow3.png')} />
             </View>
 

+ 57 - 0
yarn.lock

@@ -1213,6 +1213,13 @@
   dependencies:
     regenerator-runtime "^0.14.0"
 
+"@babel/runtime@^7.23.8":
+  version "7.23.9"
+  resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7"
+  integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==
+  dependencies:
+    regenerator-runtime "^0.14.0"
+
 "@babel/template@^7.0.0", "@babel/template@^7.22.15", "@babel/template@^7.22.5":
   version "7.22.15"
   resolved "https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
@@ -5703,6 +5710,11 @@ compare-versions@^3.4.0:
   resolved "https://registry.npmmirror.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62"
   integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==
 
+complex.js@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/complex.js/-/complex.js-2.1.1.tgz#0675dac8e464ec431fb2ab7d30f41d889fb25c31"
+  integrity sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==
+
 component-emitter@^1.2.1:
   version "1.3.0"
   resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
@@ -7188,6 +7200,11 @@ escape-html@~1.0.3:
   resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
   integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
 
+escape-latex@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1"
+  integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==
+
 escape-string-regexp@2.0.0:
   version "2.0.0"
   resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
@@ -8281,6 +8298,11 @@ forwarded@0.2.0:
   resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
   integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
 
+fraction.js@4.3.4:
+  version "4.3.4"
+  resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.4.tgz#b2bac8249a610c3396106da97c5a71da75b94b1c"
+  integrity sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==
+
 fragment-cache@^0.2.1:
   version "0.2.1"
   resolved "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
@@ -10104,6 +10126,11 @@ jake@^10.8.5:
     filelist "^1.0.4"
     minimatch "^3.1.2"
 
+javascript-natural-sort@^0.7.1:
+  version "0.7.1"
+  resolved "https://registry.npmmirror.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
+  integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==
+
 javascript-stringify@^2.0.1:
   version "2.1.0"
   resolved "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79"
@@ -11013,6 +11040,21 @@ math-random@^1.0.1:
   resolved "https://registry.npmmirror.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c"
   integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==
 
+mathjs@^12.3.0:
+  version "12.3.0"
+  resolved "https://registry.npmmirror.com/mathjs/-/mathjs-12.3.0.tgz#83fea1983325a47d711cca7c13317381597f4c8e"
+  integrity sha512-Mik+O8gbH14/1V2D/vdJNgu+qGXpF+2oeBJVBqN8nbOdZNuu4Nxw6aDbJ0QOkDSq/9bQ+AZpXoIxBuErRODS8w==
+  dependencies:
+    "@babel/runtime" "^7.23.8"
+    complex.js "^2.1.1"
+    decimal.js "^10.4.3"
+    escape-latex "^1.2.0"
+    fraction.js "4.3.4"
+    javascript-natural-sort "^0.7.1"
+    seedrandom "^3.0.5"
+    tiny-emitter "^2.1.0"
+    typed-function "^4.1.1"
+
 mathml-tag-names@^2.0.1, mathml-tag-names@^2.1.3:
   version "2.1.3"
   resolved "https://registry.npmmirror.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
@@ -14657,6 +14699,11 @@ scss-bundle@^3.0.2:
     sass "^1.23.7"
     tslib "^1.10.0"
 
+seedrandom@^3.0.5:
+  version "3.0.5"
+  resolved "https://registry.npmmirror.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
+  integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
+
 seek-bzip@^1.0.5:
   version "1.0.6"
   resolved "https://registry.npmmirror.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4"
@@ -15971,6 +16018,11 @@ tiny-case@^1.0.3:
   resolved "https://registry.npmmirror.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03"
   integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==
 
+tiny-emitter@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
+  integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
+
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -16284,6 +16336,11 @@ typed-array-length@^1.0.4:
     for-each "^0.3.3"
     is-typed-array "^1.1.9"
 
+typed-function@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/typed-function/-/typed-function-4.1.1.tgz#38ce3cae31f4f513bcb263563fdad27b2afa73e8"
+  integrity sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==
+
 typedarray-to-buffer@^3.1.5:
   version "3.1.5"
   resolved "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"