|
|
|
import 'dart:convert';
|
|
|
|
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:get/get.dart';
|
|
|
|
import 'package:isekai_wiki/global.dart';
|
|
|
|
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});
|
|
|
|
|
|
|
|
factory UserInfo.fromJson(Map<String, dynamic> json) => _$UserInfoFromJson(json);
|
|
|
|
|
|
|
|
Map<String, dynamic> toJson() => _$UserInfoToJson(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
class UserController extends GetxController {
|
|
|
|
bool _ignoreSave = false;
|
|
|
|
|
|
|
|
var loginRequestToken = "".obs;
|
|
|
|
|
|
|
|
var userId = 0.obs;
|
|
|
|
|
|
|
|
var userName = "".obs;
|
|
|
|
var nickName = "".obs;
|
|
|
|
var avatarUrl = "".obs;
|
|
|
|
|
|
|
|
bool get isLoggedIn {
|
|
|
|
return userId.value > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
String get getDisplayName {
|
|
|
|
return nickName.isNotEmpty ? nickName.string : userName.string;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void onInit() async {
|
|
|
|
super.onInit();
|
|
|
|
|
|
|
|
loadFromStorage();
|
|
|
|
|
|
|
|
ever(loginRequestToken, (String token) {
|
|
|
|
saveToStorage();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 更新用户资料,并检测登录状态
|
|
|
|
Future<void> updateProfile() async {}
|
|
|
|
|
|
|
|
/// 从本地存储读取
|
|
|
|
void loadFromStorage() {
|
|
|
|
try {
|
|
|
|
final prefs = Global.sharedPreferences!;
|
|
|
|
var userInfoJson = prefs.getString("userInfo");
|
|
|
|
if (userInfoJson == null) return;
|
|
|
|
|
|
|
|
var userInfoObject = jsonDecode(userInfoJson);
|
|
|
|
if (userInfoObject == null) return;
|
|
|
|
|
|
|
|
var userInfo = UserInfo.fromJson(userInfoObject);
|
|
|
|
|
|
|
|
_ignoreSave = true;
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
} catch (ex) {
|
|
|
|
if (kDebugMode) {
|
|
|
|
print(ex);
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
_ignoreSave = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 保存到本地存储
|
|
|
|
void saveToStorage() {
|
|
|
|
if (_ignoreSave) return;
|
|
|
|
|
|
|
|
final prefs = Global.sharedPreferences!;
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|