user_details.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import 'dart:convert';
  2. import 'dart:math';
  3. import 'package:collection/collection.dart';
  4. import 'package:photos/models/file_type.dart';
  5. import 'package:photos/models/subscription.dart';
  6. class UserDetails {
  7. final String email;
  8. final int usage;
  9. final int fileCount;
  10. final int sharedCollectionsCount;
  11. final Subscription subscription;
  12. final FamilyData? familyData;
  13. const UserDetails(
  14. this.email,
  15. this.usage,
  16. this.fileCount,
  17. this.sharedCollectionsCount,
  18. this.subscription,
  19. this.familyData,
  20. );
  21. bool isPartOfFamily() {
  22. return familyData?.members?.isNotEmpty ?? false;
  23. }
  24. bool isFamilyAdmin() {
  25. assert(isPartOfFamily(), "verify user is part of family before calling");
  26. final FamilyMember currentUserMember = familyData!.members!
  27. .firstWhere((element) => element.email.trim() == email.trim());
  28. return currentUserMember.isAdmin;
  29. }
  30. // getFamilyOrPersonalUsage will return total usage for family if user
  31. // belong to family group. Otherwise, it will return storage consumed by
  32. // current user
  33. int getFamilyOrPersonalUsage() {
  34. return isPartOfFamily() ? familyData!.getTotalUsage() : usage;
  35. }
  36. int getFreeStorage() {
  37. return max(
  38. isPartOfFamily()
  39. ? (familyData!.storage - familyData!.getTotalUsage())
  40. : (subscription.storage - (usage)),
  41. 0,
  42. );
  43. }
  44. int getTotalStorage() {
  45. return isPartOfFamily() ? familyData!.storage : subscription.storage;
  46. }
  47. factory UserDetails.fromMap(Map<String, dynamic> map) {
  48. return UserDetails(
  49. map['email'] as String,
  50. map['usage'] as int,
  51. (map['fileCount'] ?? 0) as int,
  52. (map['sharedCollectionsCount'] ?? 0) as int,
  53. Subscription.fromMap(map['subscription']),
  54. FamilyData.fromMap(map['familyData']),
  55. );
  56. }
  57. Map<String, dynamic> toMap() {
  58. return {
  59. 'email': email,
  60. 'usage': usage,
  61. 'fileCount': fileCount,
  62. 'sharedCollectionsCount': sharedCollectionsCount,
  63. 'subscription': subscription.toMap(),
  64. 'familyData': familyData?.toMap(),
  65. };
  66. }
  67. String toJson() => json.encode(toMap());
  68. factory UserDetails.fromJson(String source) =>
  69. UserDetails.fromMap(json.decode(source));
  70. }
  71. class FamilyMember {
  72. final String email;
  73. final int usage;
  74. final String id;
  75. final bool isAdmin;
  76. FamilyMember(
  77. this.email,
  78. this.usage,
  79. this.id,
  80. this.isAdmin,
  81. );
  82. factory FamilyMember.fromMap(Map<String, dynamic> map) {
  83. return FamilyMember(
  84. (map['email'] ?? '') as String,
  85. map['usage'] as int,
  86. map['id'] as String,
  87. map['isAdmin'] as bool,
  88. );
  89. }
  90. Map<String, dynamic> toMap() {
  91. return {
  92. 'email': email,
  93. 'usage': usage,
  94. 'id': id,
  95. 'isAdmin': isAdmin,
  96. };
  97. }
  98. String toJson() => json.encode(toMap());
  99. factory FamilyMember.fromJson(String source) =>
  100. FamilyMember.fromMap(json.decode(source));
  101. }
  102. class FamilyData {
  103. final List<FamilyMember>? members;
  104. // Storage available based on the family plan
  105. final int storage;
  106. final int expiryTime;
  107. FamilyData(
  108. this.members,
  109. this.storage,
  110. this.expiryTime,
  111. );
  112. int getTotalUsage() {
  113. return members!.map((e) => e.usage).toList().sum;
  114. }
  115. static fromMap(Map<String, dynamic>? map) {
  116. if (map == null) return null;
  117. assert(map['members'] != null && map['members'].length >= 0);
  118. final members = List<FamilyMember>.from(
  119. map['members'].map((x) => FamilyMember.fromMap(x)),
  120. );
  121. return FamilyData(
  122. members,
  123. map['storage'] as int,
  124. map['expiryTime'] as int,
  125. );
  126. }
  127. Map<String, dynamic> toMap() {
  128. return {
  129. 'members': members?.map((x) => x.toMap()).toList(),
  130. 'storage': storage,
  131. 'expiryTime': expiryTime,
  132. };
  133. }
  134. String toJson() => json.encode(toMap());
  135. factory FamilyData.fromJson(String source) =>
  136. FamilyData.fromMap(json.decode(source));
  137. }
  138. class FilesCount {
  139. final Map<FileType, int> filesCount;
  140. FilesCount(this.filesCount);
  141. int get total =>
  142. images + videos + livePhotos + (filesCount[getInt(FileType.other)] ?? 0);
  143. int get photos => images + livePhotos;
  144. int get images => filesCount[FileType.image] ?? 0;
  145. int get videos => filesCount[FileType.video] ?? 0;
  146. int get livePhotos => filesCount[FileType.livePhoto] ?? 0;
  147. }