friends_repository.dart
3.14 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
import 'package:doublefeel_flutter/app/modules/hrv_report/models/hrv_report_models.dart';
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';
abstract class FriendsRepository {
Future<List<FriendHealthData>> getFriends({bool withHealthData = true});
Future<void> updateRemark(int userId, String remark);
Future<void> selectWatchFaceFriend(int userId);
Future<void> deleteFriend(int userId);
}
class FriendsRepositoryImpl implements FriendsRepository {
const FriendsRepositoryImpl(this._friendApi);
final FriendApi _friendApi;
@override
Future<List<FriendHealthData>> getFriends(
{bool withHealthData = true}) async {
return switch (await _friendApi.friendList(withHealthData)) {
AppSuccess(:final data) => data.list.map(_mapFriend).toList(),
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 stressValue = healthData?.latestHrv;
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(friend.updateTime),
sleepQualityScore: healthData?.sleepEvaluate,
steps: healthData?.totalSteps == null
? null
: l10n.friendsStepCount(healthData!.totalSteps!),
statusText: stressValue == null
? l10n.friendsWaitingForData
: HrvStressLevel.fromRealtimeStress(stressValue).label,
stressValue: stressValue,
isOnWatchFace: friend.isShowInDial,
);
}
String _updatedAt(int? timestamp) {
if (timestamp == null) return l10n.friendsWaitingForData;
final milliseconds =
timestamp < 1000000000000 ? timestamp * 1000 : timestamp;
final time = DateTime.fromMillisecondsSinceEpoch(milliseconds);
return l10n.friendsUpdatedAt(DateFormat('HH:mm').format(time));
}
}