2023-04-29 15:26:12 -04:00
|
|
|
import 'dart:developer';
|
|
|
|
|
2023-04-30 07:39:09 -04:00
|
|
|
import 'package:contacts_plus/models/user_profile.dart';
|
2023-04-29 15:26:12 -04:00
|
|
|
|
|
|
|
class Friend extends Comparable {
|
2023-04-29 13:18:46 -04:00
|
|
|
final String id;
|
|
|
|
final String username;
|
|
|
|
final UserStatus userStatus;
|
2023-04-30 07:39:09 -04:00
|
|
|
final UserProfile userProfile;
|
2023-04-30 17:14:29 -04:00
|
|
|
final FriendStatus friendStatus;
|
2023-04-29 13:18:46 -04:00
|
|
|
|
2023-04-30 17:14:29 -04:00
|
|
|
Friend({required this.id, required this.username, required this.userStatus, required this.userProfile,
|
|
|
|
required this.friendStatus,
|
|
|
|
});
|
2023-04-29 15:26:12 -04:00
|
|
|
|
|
|
|
factory Friend.fromMap(Map map) {
|
2023-04-30 07:39:09 -04:00
|
|
|
return Friend(
|
|
|
|
id: map["id"],
|
|
|
|
username: map["friendUsername"],
|
|
|
|
userStatus: UserStatus.fromMap(map["userStatus"]),
|
2023-04-30 17:14:29 -04:00
|
|
|
userProfile: UserProfile.fromMap(map["profile"] ?? {}),
|
|
|
|
friendStatus: FriendStatus.fromString(map["friendStatus"]),
|
2023-04-30 07:39:09 -04:00
|
|
|
);
|
2023-04-29 15:26:12 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
int compareTo(other) {
|
|
|
|
if (userStatus.onlineStatus == other.userStatus.onlineStatus) {
|
|
|
|
return userStatus.lastStatusChange.compareTo(other.userStatus.lastStatusChange);
|
|
|
|
} else {
|
|
|
|
if (userStatus.onlineStatus == OnlineStatus.online) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-04-29 13:18:46 -04:00
|
|
|
}
|
|
|
|
|
2023-04-30 17:14:29 -04:00
|
|
|
class Session {
|
|
|
|
final String id;
|
|
|
|
final String name;
|
|
|
|
final List<SessionUser> sessionUsers;
|
|
|
|
final String thumbnail;
|
|
|
|
|
|
|
|
Session({required this.id, required this.name, required this.sessionUsers, required this.thumbnail});
|
|
|
|
|
|
|
|
factory Session.fromMap(Map map) {
|
|
|
|
return Session(
|
|
|
|
id: map["sessionId"],
|
|
|
|
name: map["name"],
|
|
|
|
sessionUsers: (map["sessionUsers"] as List? ?? []).map((entry) => SessionUser.fromMap(entry)).toList(),
|
|
|
|
thumbnail: map["thumbnail"]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class SessionUser {
|
|
|
|
final String id;
|
|
|
|
final String username;
|
|
|
|
final bool isPresent;
|
|
|
|
final int outputDevice;
|
|
|
|
|
|
|
|
SessionUser({required this.id, required this.username, required this.isPresent, required this.outputDevice});
|
|
|
|
|
|
|
|
factory SessionUser.fromMap(Map map) {
|
|
|
|
return SessionUser(
|
|
|
|
id: map["userID"],
|
|
|
|
username: map["username"],
|
|
|
|
isPresent: map["isPresent"],
|
|
|
|
outputDevice: map["outputDevice"],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
enum FriendStatus {
|
|
|
|
none,
|
|
|
|
searchResult,
|
|
|
|
requested,
|
|
|
|
ignored,
|
|
|
|
blocked,
|
|
|
|
accepted;
|
|
|
|
|
|
|
|
factory FriendStatus.fromString(String text) {
|
|
|
|
return FriendStatus.values.firstWhere((element) => element.name.toLowerCase() == text.toLowerCase(),
|
|
|
|
orElse: () => FriendStatus.none,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-29 13:18:46 -04:00
|
|
|
enum OnlineStatus {
|
2023-04-29 15:26:12 -04:00
|
|
|
unknown,
|
2023-04-29 13:18:46 -04:00
|
|
|
offline,
|
2023-04-29 15:26:12 -04:00
|
|
|
away,
|
|
|
|
busy,
|
2023-04-30 17:14:29 -04:00
|
|
|
online;
|
|
|
|
|
|
|
|
factory OnlineStatus.fromString(String? text) {
|
|
|
|
return OnlineStatus.values.firstWhere((element) => element.name.toLowerCase() == text?.toLowerCase(),
|
|
|
|
orElse: () => OnlineStatus.unknown,
|
|
|
|
);
|
|
|
|
}
|
2023-04-29 13:18:46 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
class UserStatus {
|
|
|
|
final OnlineStatus onlineStatus;
|
|
|
|
final DateTime lastStatusChange;
|
2023-04-30 17:14:29 -04:00
|
|
|
final List<Session> activeSessions;
|
2023-04-29 13:18:46 -04:00
|
|
|
|
2023-04-30 17:14:29 -04:00
|
|
|
|
|
|
|
UserStatus({required this.onlineStatus, required this.lastStatusChange, required this.activeSessions});
|
2023-04-29 15:26:12 -04:00
|
|
|
|
|
|
|
factory UserStatus.fromMap(Map map) {
|
|
|
|
final statusString = map["onlineStatus"] as String?;
|
2023-04-30 17:14:29 -04:00
|
|
|
final status = OnlineStatus.fromString(statusString);
|
2023-04-29 15:26:12 -04:00
|
|
|
if (status == OnlineStatus.unknown && statusString != null) {
|
|
|
|
log("Unknown OnlineStatus '$statusString' in response");
|
|
|
|
}
|
|
|
|
return UserStatus(
|
|
|
|
onlineStatus: status,
|
|
|
|
lastStatusChange: DateTime.parse(map["lastStatusChange"]),
|
2023-04-30 17:14:29 -04:00
|
|
|
activeSessions: (map["activeSessions"] as List? ?? []).map((e) => Session.fromMap(e)).toList(),
|
2023-04-29 15:26:12 -04:00
|
|
|
);
|
|
|
|
}
|
2023-04-29 13:18:46 -04:00
|
|
|
}
|