You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
3.0 KiB
Dart

2 years ago
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:isekai_wiki/global.dart';
2 years ago
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class UserInfo {
int userId;
String userName;
String? nickName;
String? avatarUrl;
UserInfo({required this.userId, required this.userName, this.nickName, this.avatarUrl});
2 years ago
factory UserInfo.fromJson(Map<String, dynamic> json) => _$UserInfoFromJson(json);
2 years ago
Map<String, dynamic> toJson() => _$UserInfoToJson(this);
}
class UserController extends GetxController {
bool _ignoreSave = false;
2 years ago
var loginRequestToken = "".obs;
2 years ago
var userId = 0.obs;
2 years ago
var userName = "".obs;
var nickName = "".obs;
var avatarUrl = "".obs;
bool get isLoggedIn {
return userId.value > 0;
}
2 years ago
String get getDisplayName {
return nickName.isNotEmpty ? nickName.string : userName.string;
}
@override
void onInit() async {
super.onInit();
2 years ago
loadFromStorage();
ever(loginRequestToken, (String token) {
saveToStorage();
});
2 years ago
}
/// 更新用户资料,并检测登录状态
Future<void> updateProfile() async {}
/// 从本地存储读取
void loadFromStorage() {
2 years ago
try {
final prefs = Global.sharedPreferences!;
2 years ago
var userInfoJson = prefs.getString("userInfo");
if (userInfoJson == null) return;
var userInfoObject = jsonDecode(userInfoJson);
if (userInfoObject == null) return;
var userInfo = UserInfo.fromJson(userInfoObject);
_ignoreSave = true;
2 years ago
userId.value = userInfo.userId;
userName.value = userInfo.userName;
nickName.value = userInfo.nickName ?? "";
avatarUrl.value = userInfo.avatarUrl ?? "";
_ignoreSave = false;
var savedLoginRequestToken = prefs.getString("loginRequestToken");
if (savedLoginRequestToken != null) {
_ignoreSave = true;
loginRequestToken.value = savedLoginRequestToken;
_ignoreSave = false;
}
2 years ago
} catch (ex) {
if (kDebugMode) {
print(ex);
}
} finally {
_ignoreSave = false;
2 years ago
}
}
/// 保存到本地存储
void saveToStorage() {
if (_ignoreSave) return;
final prefs = Global.sharedPreferences!;
2 years ago
var userInfo = UserInfo(
userId: userId.value,
userName: userName.value,
nickName: nickName.isNotEmpty ? nickName.value : null,
avatarUrl: avatarUrl.isNotEmpty ? avatarUrl.value : null,
);
var userInfoJson = jsonEncode(userInfo.toJson());
prefs.setString("userInfo", userInfoJson);
if (loginRequestToken.isNotEmpty) {
prefs.setString("loginRequestToken", loginRequestToken.value);
} else if (prefs.containsKey("loginRequestToken")) {
prefs.remove("loginRequestToken");
}
}
/// 开始登录流程
/// 从服务器获取loginRequestToken
Future<bool> startAuthFlow() async {
return false;
}
// 尝试通过登录请求Token完成登录
Future<void> attemptFinishAuth() async {
if (loginRequestToken.isEmpty) return;
2 years ago
}
}