friends_repository.dart
4 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import 'package:doublefeel_flutter/core/network/api/friend_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/data/models/friend/friend_models.dart'
as api_models;
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:intl/intl.dart';
import '../models/friend_health_data.dart';
import '../models/friend_stress_state.dart';
abstract class FriendsRepository {
Future<List<FriendHealthData>> getFriends({bool withHealthData = true});
Future<FriendListData> getFriendList({bool withHealthData = true});
Future<void> updateRemark(int userId, String remark);
Future<void> selectWatchFaceFriend(int userId);
Future<void> deleteFriend(int userId);
}
class FriendListData {
const FriendListData({
required this.friends,
required this.selfHealthData,
});
final List<FriendHealthData> friends;
final SelfFriendHealthData? selfHealthData;
}
class FriendsRepositoryImpl implements FriendsRepository {
const FriendsRepositoryImpl(this._friendApi);
final FriendApi _friendApi;
@override
Future<List<FriendHealthData>> getFriends(
{bool withHealthData = true}) async {
final data = await getFriendList(withHealthData: withHealthData);
return data.friends;
}
@override
Future<FriendListData> getFriendList({bool withHealthData = true}) async {
return switch (await _friendApi.friendList(withHealthData)) {
AppSuccess(:final data) => FriendListData(
friends: data.list.map(_mapFriend).toList(),
selfHealthData: _mapSelfHealthData(data.healthData),
),
AppFailure(:final error) => throw error,
};
}
@override
Future<void> deleteFriend(int userId) async {
switch (await _friendApi.deleteFriend(userId)) {
case AppSuccess():
return;
case AppFailure(:final error):
throw error;
}
}
@override
Future<void> selectWatchFaceFriend(int userId) async {
switch (await _friendApi.updateFriend(userId, showInDial: 1)) {
case AppSuccess():
return;
case AppFailure(:final error):
throw error;
}
}
@override
Future<void> updateRemark(int userId, String remark) async {
switch (await _friendApi.updateFriend(userId, remarkName: remark)) {
case AppSuccess():
return;
case AppFailure(:final error):
throw error;
}
}
FriendHealthData _mapFriend(api_models.FriendItem friend) {
final healthData = friend.healthData;
final nickname = friend.friendNickname?.trim();
final remark = friend.remarkName?.trim();
return FriendHealthData(
friendItem: friend,
userId: friend.friendUserId,
avatarUrl: friend.avatar,
name: nickname == null || nickname.isEmpty
? l10n.friendsUnknownFriend
: nickname,
remark: remark == null || remark.isEmpty ? null : remark,
updatedAt: _updatedAt(healthData?.lastDataTime ?? friend.updateTime),
sleepQualityScore: healthData?.sleepEvaluate,
steps: healthData?.totalSteps == null
? null
: l10n.friendsStepCount(healthData!.totalSteps!),
stressState: FriendStressState.fromValue(healthData?.hrvState),
isOnWatchFace: friend.isShowInDial,
);
}
SelfFriendHealthData? _mapSelfHealthData(
api_models.FriendHealthData? healthData,
) {
if (healthData == null) return null;
return SelfFriendHealthData(
updatedAt: _updatedAt(healthData.lastDataTime),
sleepQualityScore: healthData.sleepEvaluate,
steps: healthData.totalSteps == null
? null
: l10n.friendsStepCount(healthData.totalSteps!),
stressState: FriendStressState.fromValue(healthData.hrvState),
);
}
String _updatedAt(num? timestamp) {
if (timestamp == null) return l10n.friendsWaitingForData;
final milliseconds =
timestamp < 1000000000000 ? timestamp * 1000 : timestamp;
final time = DateTime.fromMillisecondsSinceEpoch(milliseconds.toInt());
return l10n.friendsUpdatedAt(DateFormat('HH:mm').format(time));
}
}