user_details.dart 2.7 KB

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