OpenContacts/lib/models/friend.dart

143 lines
3.9 KiB
Dart
Raw Normal View History

2023-04-29 15:26:12 -04:00
import 'dart:developer';
2023-05-01 16:00:56 -04:00
import 'package:contacts_plus_plus/models/session.dart';
2023-05-01 13:13:40 -04:00
import 'package:contacts_plus_plus/models/user_profile.dart';
2023-05-05 10:39:40 -04:00
import 'package:flutter/material.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 String ownerId;
2023-04-29 13:18:46 -04:00
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
Friend({required this.id, required this.username, required this.ownerId, required this.userStatus, required this.userProfile,
2023-04-30 17:14:29 -04:00
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"],
ownerId: map["ownerId"] ?? map["id"],
2023-04-30 07:39:09 -04:00
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
}
Map toMap({bool shallow=false}) {
return {
"id": id,
"username": username,
"ownerId": ownerId,
"userStatus": userStatus.toMap(shallow: shallow),
"profile": userProfile.toMap(),
"friendStatus": friendStatus.name,
};
}
2023-04-29 15:26:12 -04:00
@override
2023-05-03 14:03:46 -04:00
int compareTo(covariant Friend other) {
return username.compareTo(other.username);
2023-04-29 15:26:12 -04:00
}
2023-04-29 13:18:46 -04:00
}
2023-04-30 17:14:29 -04:00
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 {
offline,
2023-05-05 10:39:40 -04:00
invisible,
2023-04-29 15:26:12 -04:00
away,
busy,
2023-04-30 17:14:29 -04:00
online;
2023-05-05 10:39:40 -04:00
static final List<Color> _colors = [
Colors.black54,
Colors.white54,
Colors.yellow,
Colors.red,
Colors.green,
];
Color get color => _colors[index];
2023-04-30 17:14:29 -04:00
factory OnlineStatus.fromString(String? text) {
return OnlineStatus.values.firstWhere((element) => element.name.toLowerCase() == text?.toLowerCase(),
2023-05-05 10:39:40 -04:00
orElse: () => OnlineStatus.offline,
2023-04-30 17:14:29 -04:00
);
}
2023-05-03 12:43:06 -04:00
int compareTo(OnlineStatus other) {
if (this == other) return 0;
if (this == OnlineStatus.online) return -1;
if (other == OnlineStatus.online) return 1;
if (this == OnlineStatus.away) return -1;
if (other == OnlineStatus.away) return 1;
if (this == OnlineStatus.busy) return -1;
if (other == OnlineStatus.busy) return 1;
return 0;
}
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;
final String neosVersion;
2023-04-29 13:18:46 -04:00
UserStatus({required this.onlineStatus, required this.lastStatusChange, required this.activeSessions,
required this.neosVersion,
});
2023-04-29 15:26:12 -04:00
factory UserStatus.empty() => UserStatus(
2023-05-05 10:39:40 -04:00
onlineStatus: OnlineStatus.offline,
lastStatusChange: DateTime.now(),
activeSessions: [],
neosVersion: "",
);
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
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(),
neosVersion: map["neosVersion"] ?? "",
2023-04-29 15:26:12 -04:00
);
}
Map toMap({bool shallow=false}) {
return {
"onlineStatus": onlineStatus.index,
"lastStatusChange": lastStatusChange.toIso8601String(),
"activeSessions": shallow ? [] : activeSessions.map((e) => e.toMap(),),
"neosVersion": neosVersion,
};
}
2023-05-05 10:39:40 -04:00
UserStatus copyWith({OnlineStatus? onlineStatus, DateTime? lastStatusChange, List<Session>? activeSessions,
String? neosVersion
})
2023-05-05 10:39:40 -04:00
=> UserStatus(
onlineStatus: onlineStatus ?? this.onlineStatus,
lastStatusChange: lastStatusChange ?? this.lastStatusChange,
activeSessions: activeSessions ?? this.activeSessions,
neosVersion: neosVersion ?? this.neosVersion,
2023-05-05 10:39:40 -04:00
);
2023-04-29 13:18:46 -04:00
}