Commit 8ee5026f093162de44df0af6c497eea2e4805ac0

Authored by 常守达
1 parent 1016dd21

fix(today):验收修复

@@ -164,6 +164,20 @@ class TodayController extends GetMaterialController { @@ -164,6 +164,20 @@ class TodayController extends GetMaterialController {
164 if (!Get.find<UserStateService>().isVip) { 164 if (!Get.find<UserStateService>().isVip) {
165 getProductList(); 165 getProductList();
166 } 166 }
  167 + _healthApi.getHealthDataEverUploaded().then((data) {
  168 + switch (data) {
  169 + case AppSuccess(:final data):
  170 + if (data.startTime != null && data.startTime! > 0) {
  171 + final firstDayTime = DateUtils.dateOnly(
  172 + DateTime.fromMillisecondsSinceEpoch(data.startTime! * 1000),
  173 + );
  174 + if (firstDayTime.isBefore(firstSelectableDay.value)) {
  175 + firstSelectableDay.value = firstDayTime;
  176 + }
  177 + }
  178 + case AppFailure():
  179 + }
  180 + });
167 } 181 }
168 182
169 Future<void> checkHrvAdBannerVisible() async { 183 Future<void> checkHrvAdBannerVisible() async {
@@ -298,14 +312,13 @@ class TodayController extends GetMaterialController { @@ -298,14 +312,13 @@ class TodayController extends GetMaterialController {
298 if (showHealthDataAuthCardStatus.value == 1) { 312 if (showHealthDataAuthCardStatus.value == 1) {
299 return; 313 return;
300 } else if (showHealthDataAuthCardStatus.value == 0) { 314 } else if (showHealthDataAuthCardStatus.value == 0) {
301 - await Get.to(NoHealthDataNoPermissionPage(  
302 - onRequest: () =>  
303 - requestHealthAuthorization(isFromNoPermissionPage: true),  
304 - )); 315 + await requestHealthAuthorization(isFromNoPermissionPage: true);
305 checkHealthDataAuthCardVisible(); 316 checkHealthDataAuthCardVisible();
306 } else { 317 } else {
307 await Get.to(NoHealthDataPage( 318 await Get.to(NoHealthDataPage(
308 - onRefresh: requestHealthAuthorization, 319 + onRefresh: () {
  320 + refreshTab();
  321 + },
309 onHelp: () { 322 onHelp: () {
310 Get.toNamed(Routes.HELP); 323 Get.toNamed(Routes.HELP);
311 }, 324 },
@@ -332,36 +345,17 @@ class TodayController extends GetMaterialController { @@ -332,36 +345,17 @@ class TodayController extends GetMaterialController {
332 if (result.status == 1) { 345 if (result.status == 1) {
333 _calculateHealthDataWithoutLoading( 346 _calculateHealthDataWithoutLoading(
334 uploaded: () async { 347 uploaded: () async {
335 - await checkUploadedStatus(firstTime, result); 348 + showHealthDataAuthCardStatus.value = result.status;
336 }, 349 },
337 ); 350 );
338 } else { 351 } else {
339 unawaited(loadDataForDate(selectedDate.value)); 352 unawaited(loadDataForDate(selectedDate.value));
340 - await checkUploadedStatus(firstTime, result); 353 + showHealthDataAuthCardStatus.value = result.status;
341 } 354 }
342 } catch (e) {} 355 } catch (e) {}
343 } 356 }
344 } 357 }
345 358
346 - Future<void> checkUploadedStatus(  
347 - DateTime firstTime, HealthAuthorization result) async {  
348 - bool hasUploaded = false;  
349 - switch (await _healthApi.getHealthDataEverUploaded()) {  
350 - case AppSuccess(:final data):  
351 - hasUploaded = data.flag ?? false;  
352 - if (hasUploaded && data.startTime != null && data.startTime! > 0) {  
353 - final firstDayTime = DateUtils.dateOnly(  
354 - DateTime.fromMillisecondsSinceEpoch(data.startTime! * 1000),  
355 - );  
356 - if (firstDayTime.isBefore(firstTime)) {  
357 - firstSelectableDay.value = firstDayTime;  
358 - }  
359 - }  
360 - case AppFailure():  
361 - }  
362 - showHealthDataAuthCardStatus.value = !hasUploaded ? -1 : result.status;  
363 - }  
364 -  
365 void _calculateHealthDataWithoutLoading({VoidCallback? uploaded}) { 359 void _calculateHealthDataWithoutLoading({VoidCallback? uploaded}) {
366 unawaited( 360 unawaited(
367 (() async { 361 (() async {
@@ -544,12 +544,9 @@ class _LatestHrvCard extends StatelessWidget { @@ -544,12 +544,9 @@ class _LatestHrvCard extends StatelessWidget {
544 final state = controller.v2LatestHrv.value?.state; 544 final state = controller.v2LatestHrv.value?.state;
545 final stateStr = controller.v2LatestHrv.value?.stateString(); 545 final stateStr = controller.v2LatestHrv.value?.stateString();
546 final stateColor = controller.v2LatestHrv.value?.stateColor(context); 546 final stateColor = controller.v2LatestHrv.value?.stateColor(context);
547 - final tip = controller.v2LatestHrv.value?.tip; 547 + final tip = controller.v2LatestHrv.value?.tip ?? '';
548 548
549 - if (latestHrv == null ||  
550 - latestDataTime == null ||  
551 - state == null ||  
552 - tip == null) { 549 + if (latestHrv == null || latestDataTime == null || state == null) {
553 return const SizedBox.shrink(); 550 return const SizedBox.shrink();
554 } 551 }
555 552
@@ -383,7 +383,8 @@ class TodayHrvChartCard extends StatelessWidget { @@ -383,7 +383,8 @@ class TodayHrvChartCard extends StatelessWidget {
383 text: isWorkout == true ? '◉ ' : '○ ', 383 text: isWorkout == true ? '◉ ' : '○ ',
384 style: TextStyle( 384 style: TextStyle(
385 fontSize: 14, 385 fontSize: 14,
386 - color: _getColorByState(state), 386 + color:
  387 + isWorkout == true ? Color(0xFF78787D) : _getColorByState(state),
387 fontWeight: FontWeight.bold, 388 fontWeight: FontWeight.bold,
388 inherit: false, 389 inherit: false,
389 fontFamilyFallback: null, 390 fontFamilyFallback: null,
@@ -396,7 +397,9 @@ class TodayHrvChartCard extends StatelessWidget { @@ -396,7 +397,9 @@ class TodayHrvChartCard extends StatelessWidget {
396 : '${_getStatusByState(state)} ${_formatNumber(rod.toY)}%', 397 : '${_getStatusByState(state)} ${_formatNumber(rod.toY)}%',
397 style: TextStyle( 398 style: TextStyle(
398 fontSize: 18, 399 fontSize: 18,
399 - color: _getColorByState(state), 400 + color: isWorkout == true
  401 + ? const Color(0xFF78787D)
  402 + : _getColorByState(state),
400 fontWeight: FontWeight.bold, 403 fontWeight: FontWeight.bold,
401 ), 404 ),
402 ), 405 ),
@@ -1144,7 +1147,7 @@ class _StressBarChartState extends State<_StressBarChart> { @@ -1144,7 +1147,7 @@ class _StressBarChartState extends State<_StressBarChart> {
1144 ), 1147 ),
1145 if (customIndicator != null) 1148 if (customIndicator != null)
1146 customIndicator, // 将指示线移动到 Container (BarChart) 之后绘制,防止被盖住 1149 customIndicator, // 将指示线移动到 Container (BarChart) 之后绘制,防止被盖住
1147 - ...sleepWidgets, 1150 + if (widget.stressPoints.isNotEmpty) ...sleepWidgets,
1148 // 手绘 100、50、0 标签在对应的横线上方 1151 // 手绘 100、50、0 标签在对应的横线上方
1149 Positioned( 1152 Positioned(
1150 right: -5, 1153 right: -5,
@@ -1185,15 +1188,15 @@ class _StressBarChartState extends State<_StressBarChart> { @@ -1185,15 +1188,15 @@ class _StressBarChartState extends State<_StressBarChart> {
1185 const slotSec = 6 * 60; // 360 秒 = 6 分钟 1188 const slotSec = 6 * 60; // 360 秒 = 6 分钟
1186 final maxSec = widget.maxSeconds.round(); 1189 final maxSec = widget.maxSeconds.round();
1187 1190
1188 - // 按槽分组,记录每槽的最大 value 及对应的 state  
1189 - final slotMax = <int, ({int value, int? state})>{}; 1191 + // 按槽分组,记录每槽的最大 value 及对应的 state / isWorkout
  1192 + final slotMax = <int, ({int value, int? state, int? isWorkout})>{};
1190 for (final p in stressPoints) { 1193 for (final p in stressPoints) {
1191 final sec = TodayHrvChartCard._tsToSecondsFromMidnight(p.time).round(); 1194 final sec = TodayHrvChartCard._tsToSecondsFromMidnight(p.time).round();
1192 final slot = (sec / slotSec).round() * slotSec; 1195 final slot = (sec / slotSec).round() * slotSec;
1193 final v = p.value ?? 0; 1196 final v = p.value ?? 0;
1194 final existing = slotMax[slot]; 1197 final existing = slotMax[slot];
1195 if (existing == null || v > existing.value) { 1198 if (existing == null || v > existing.value) {
1196 - slotMax[slot] = (value: v, state: p.state); 1199 + slotMax[slot] = (value: v, state: p.state, isWorkout: p.isWorkout);
1197 } 1200 }
1198 } 1201 }
1199 1202
@@ -1211,7 +1214,9 @@ class _StressBarChartState extends State<_StressBarChart> { @@ -1211,7 +1214,9 @@ class _StressBarChartState extends State<_StressBarChart> {
1211 toY: entry != null ? entry.value.toDouble() : 0, 1214 toY: entry != null ? entry.value.toDouble() : 0,
1212 width: barWidth, 1215 width: barWidth,
1213 color: entry != null 1216 color: entry != null
1214 - ? widget.getColorByState(entry.state) 1217 + ? (entry.isWorkout == 1
  1218 + ? const Color(0xFF78787D)
  1219 + : widget.getColorByState(entry.state))
1215 : Colors.transparent, 1220 : Colors.transparent,
1216 borderRadius: BorderRadius.circular(barWidth / 2), 1221 borderRadius: BorderRadius.circular(barWidth / 2),
1217 ), 1222 ),
@@ -118,9 +118,6 @@ class LoginController extends GetxController { @@ -118,9 +118,6 @@ class LoginController extends GetxController {
118 @override 118 @override
119 void onInit() { 119 void onInit() {
120 super.onInit(); 120 super.onInit();
121 - LocalStorage.open().then((local) {  
122 - termsChecked.value = local.termsAgreed;  
123 - });  
124 121
125 phoneController.addListener(() { 122 phoneController.addListener(() {
126 phoneInput.value = phoneController.text; 123 phoneInput.value = phoneController.text;
@@ -147,6 +144,7 @@ class LoginController extends GetxController { @@ -147,6 +144,7 @@ class LoginController extends GetxController {
147 } else { 144 } else {
148 needTrackWelcomepage = true; 145 needTrackWelcomepage = true;
149 } 146 }
  147 + termsChecked.value = Get.find<LocalStorage>().termsAgreed;
150 } 148 }
151 149
152 bool needTrackWelcomepage = false; 150 bool needTrackWelcomepage = false;