user_details.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import 'dart:math';
  2. import 'package:collection/collection.dart';
  3. import 'package:equatable/equatable.dart';
  4. import 'package:photos/models/subscription.dart';
  5. class UserDetails extends Equatable {
  6. final String email;
  7. final int usage;
  8. final int fileCount;
  9. final int sharedCollectionsCount;
  10. final Subscription subscription;
  11. final FamilyData? familyData;
  12. const UserDetails(
  13. this.email,
  14. this.usage,
  15. this.fileCount,
  16. this.sharedCollectionsCount,
  17. this.subscription,
  18. this.familyData,
  19. );
  20. @override
  21. List<Object?> get props => [
  22. email,
  23. usage,
  24. fileCount,
  25. sharedCollectionsCount,
  26. subscription,
  27. familyData
  28. ];
  29. bool isPartOfFamily() {
  30. return familyData?.members?.isNotEmpty ?? false;
  31. }
  32. bool isFamilyAdmin() {
  33. assert(isPartOfFamily(), "verify user is part of family before calling");
  34. final FamilyMember currentUserMember = familyData!.members!
  35. .firstWhere((element) => element.email.trim() == email.trim());
  36. return currentUserMember.isAdmin;
  37. }
  38. // getFamilyOrPersonalUsage will return total usage for family if user
  39. // belong to family group. Otherwise, it will return storage consumed by
  40. // current user
  41. int getFamilyOrPersonalUsage() {
  42. return isPartOfFamily() ? familyData!.getTotalUsage() : usage;
  43. }
  44. int getFreeStorage() {
  45. return max(
  46. isPartOfFamily()
  47. ? (familyData!.storage - familyData!.getTotalUsage())
  48. : (subscription.storage - (usage)),
  49. 0,
  50. );
  51. }
  52. int getTotalStorage() {
  53. return isPartOfFamily() ? familyData!.storage : subscription.storage;
  54. }
  55. factory UserDetails.fromMap(Map<String, dynamic> map) {
  56. return UserDetails(
  57. map['email'] as String,
  58. map['usage'] as int,
  59. (map['fileCount'] ?? 0) as int,
  60. (map['sharedCollectionsCount'] ?? 0) as int,
  61. Subscription.fromMap(map['subscription']),
  62. FamilyData.fromMap(map['familyData']),
  63. );
  64. }
  65. }
  66. class FamilyMember {
  67. final String email;
  68. final int usage;
  69. final String id;
  70. final bool isAdmin;
  71. FamilyMember(this.email, this.usage, this.id, this.isAdmin);
  72. factory FamilyMember.fromMap(Map<String, dynamic> map) {
  73. return FamilyMember(
  74. (map['email'] ?? '') as String,
  75. map['usage'] as int,
  76. map['id'] as String,
  77. map['isAdmin'] as bool,
  78. );
  79. }
  80. }
  81. class FamilyData {
  82. final List<FamilyMember>? members;
  83. // Storage available based on the family plan
  84. final int storage;
  85. final int expiryTime;
  86. FamilyData(this.members, this.storage, this.expiryTime);
  87. int getTotalUsage() {
  88. return members!.map((e) => e.usage).toList().sum;
  89. }
  90. static fromMap(Map<String, dynamic>? map) {
  91. if (map == null) return null;
  92. assert(map['members'] != null && map['members'].length >= 0);
  93. final members = List<FamilyMember>.from(
  94. map['members'].map((x) => FamilyMember.fromMap(x)),
  95. );
  96. return FamilyData(
  97. members,
  98. map['storage'] as int,
  99. map['expiryTime'] as int,
  100. );
  101. }
  102. }
  103. class FilesCount {
  104. final Map<int, int> filesCount;
  105. FilesCount(this.filesCount);
  106. int get total => images + videos + livePhotos + (filesCount[-1] ?? 0);
  107. int get photos => images + livePhotos;
  108. int get images => filesCount[0] ?? 0;
  109. int get videos => filesCount[1] ?? 0;
  110. int get livePhotos => filesCount[2] ?? 0;
  111. }