Showing
4 changed files
with
35 additions
and
41 deletions
| @@ -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; |
-
Please register or login to post a comment