diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index 9d8d15a2..3c74c515 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -850,5 +850,9 @@ "zero": "No invitation", "one": "{} available invitation", "other": "{} available invitations" - } + }, + "failedToLoadUserInfo": "Failed to load user info", + "failedToLoadUserInfoNetwork": "It seems be network issue, you can tap the button below to try again.", + "failedToLoadUserInfoUnauthorized": "It seems your session has been logged out or not available anymore, you can still try agian to fetch the user info if you want.", + "okay": "Okay" } diff --git a/assets/i18n/zh-CN.json b/assets/i18n/zh-CN.json index 335f219f..668220ed 100644 --- a/assets/i18n/zh-CN.json +++ b/assets/i18n/zh-CN.json @@ -824,5 +824,9 @@ "zero": "无邀请", "one": "{} 个可用邀请", "other": "{} 个可用邀请" - } + }, + "failedToLoadUserInfo": "加载用户信息失败", + "failedToLoadUserInfoNetwork": "这看起来是个网络问题,你可以按下面的按钮来重试", + "failedToLoadUserInfoUnauthorized": "看来您的会话已被注销或不再可用,如果您愿意,您仍然可以再次尝试获取用户信息。", + "okay": "了解" } diff --git a/lib/pods/userinfo.dart b/lib/pods/userinfo.dart index 6e6b220c..2e917a8a 100644 --- a/lib/pods/userinfo.dart +++ b/lib/pods/userinfo.dart @@ -1,6 +1,11 @@ +import 'dart:convert'; import 'dart:developer'; +import 'package:dio/dio.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_platform_alert/flutter_platform_alert.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/account.dart'; @@ -13,6 +18,11 @@ class UserInfoNotifier extends StateNotifier> { UserInfoNotifier(this._ref) : super(const AsyncValue.data(null)); Future fetchUser() async { + final token = _ref.watch(tokenProvider); + if (token == null) { + log('[UserInfo] No token found, not going to fetch...'); + return; + } try { final client = _ref.read(apiClientProvider); final response = await client.get('/id/accounts/me'); @@ -20,6 +30,44 @@ class UserInfoNotifier extends StateNotifier> { state = AsyncValue.data(user); FirebaseAnalytics.instance.setUserId(id: user.id); } catch (error, stackTrace) { + if (!kIsWeb) { + if (error is DioException) { + FlutterPlatformAlert.showCustomAlert( + windowTitle: 'failedToLoadUserInfo'.tr(), + text: [ + (error.response?.statusCode == 401 + ? 'failedToLoadUserInfoUnauthorized' + : 'failedToLoadUserInfoNetwork') + .tr() + .trim(), + error.response?.headers.toString(), + jsonEncode(error.response?.data), + ].join('\n\n'), + iconStyle: IconStyle.error, + neutralButtonTitle: 'retry'.tr(), + negativeButtonTitle: 'okay'.tr(), + ).then((value) { + if (value == CustomButton.neutralButton) { + fetchUser(); + } + }); + } + FlutterPlatformAlert.showCustomAlert( + windowTitle: 'failedToLoadUserInfo'.tr(), + text: + [ + 'failedToLoadUserInfoNetwork'.tr(), + error.toString(), + ].join('\n\n').trim(), + iconStyle: IconStyle.error, + neutralButtonTitle: 'retry'.tr(), + negativeButtonTitle: 'okay'.tr(), + ).then((value) { + if (value == CustomButton.neutralButton) { + fetchUser(); + } + }); + } log( "[UserInfo] Failed to fetch user info...", name: 'UserInfoNotifier',