user_preferences_storage.dart
2.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import 'dart:convert';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/local/user_preferences.dart';
import '../models/user/user_models.dart';
import '../models/vip/vip_info.dart';
/// Persists [UserPreferences] as JSON.
class UserPreferencesStorage {
UserPreferencesStorage(this._prefs);
final SharedPreferences _prefs;
static const _storageKey = 'double_feel_user_preferences_json';
final Rx<UserPreferences> preferences = UserPreferences.empty.obs;
Future<UserPreferencesStorage> init() async {
await _load();
return this;
}
// bool get isBound => (preferences.value.partnerUserInfo?.id ?? 0) > 0;
String get accessToken => preferences.value.accessToken;
String get rongcloudToken => preferences.value.rongcloudToken;
Future<void> _load() async {
final raw = _prefs.getString(_storageKey);
if (raw == null || raw.isEmpty) {
preferences.value = UserPreferences.empty;
return;
}
try {
final map = jsonDecode(raw) as Map<String, dynamic>;
preferences.value = UserPreferences.fromJson(map);
} catch (_) {
preferences.value = UserPreferences.empty;
}
}
Future<void> _persist(UserPreferences value) async {
preferences.value = value;
await _prefs.setString(_storageKey, jsonEncode(value.toJson()));
}
Future<void> update(UserPreferences value) => _persist(value);
Future<void> updateAccessToken(String token) async {
await _persist(preferences.value.copyWith(accessToken: token));
}
Future<void> updateRongcloudToken(String token) async {
await _persist(preferences.value.copyWith(rongcloudToken: token));
}
Future<void> updateMeUserInfo(UserInfoResponse info) async {
await _persist(preferences.value.copyWith(meUserInfo: info));
}
Future<void> updatePartnerUserInfo(UserInfoResponse info) async {
await _persist(preferences.value.copyWith(partnerUserInfo: info));
}
Future<void> updateBothUserInfo({
UserInfoResponse? me,
UserInfoResponse? partner,
}) async {
await _persist(
preferences.value.copyWith(
meUserInfo: me ?? preferences.value.meUserInfo,
partnerUserInfo: partner ?? preferences.value.partnerUserInfo,
),
);
}
Future<void> updateVipInfo(UserPreferencesVipInfo vipInfo) async {
await _persist(preferences.value.copyWith(vipInfo: vipInfo));
}
Future<void> updateFromLogin({
required String accessToken,
UserInfoResponse? me,
UserInfoResponse? partner,
VipInfo? vip,
}) async {
await _persist(
UserPreferences(
accessToken: accessToken,
meUserInfo: me,
partnerUserInfo: partner,
vipInfo: vip != null ? UserPreferencesVipInfo.fromVipInfo(vip) : null,
),
);
}
Future<void> clearPartnerUserInfo() async {
await _persist(preferences.value.copyWith(clearPartner: true));
}
Future<void> clear() async {
await _prefs.remove(_storageKey);
preferences.value = UserPreferences.empty;
}
}