Przeglądaj źródła

Persist subscription plan returned by the server

Vishnu Mohandas 4 lat temu
rodzic
commit
540cea31df

+ 65 - 0
lib/models/subscription.dart

@@ -0,0 +1,65 @@
+import 'dart:convert';
+
+class Subscription {
+  final String id;
+  final String billingPlanID;
+  final int validTill;
+
+  Subscription({
+    this.id,
+    this.billingPlanID,
+    this.validTill,
+  });
+
+  Subscription copyWith({
+    String id,
+    String billingPlanID,
+    int validTill,
+  }) {
+    return Subscription(
+      id: id ?? this.id,
+      billingPlanID: billingPlanID ?? this.billingPlanID,
+      validTill: validTill ?? this.validTill,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'id': id,
+      'billingPlanID': billingPlanID,
+      'validTill': validTill,
+    };
+  }
+
+  factory Subscription.fromMap(Map<String, dynamic> map) {
+    if (map == null) return null;
+
+    return Subscription(
+      id: map['id'],
+      billingPlanID: map['billingPlanID'],
+      validTill: map['validTill'],
+    );
+  }
+
+  String toJson() => json.encode(toMap());
+
+  factory Subscription.fromJson(String source) =>
+      Subscription.fromMap(json.decode(source));
+
+  @override
+  String toString() =>
+      'Subscription(id: $id, billingPlanID: $billingPlanID, validTill: $validTill)';
+
+  @override
+  bool operator ==(Object o) {
+    if (identical(this, o)) return true;
+
+    return o is Subscription &&
+        o.id == id &&
+        o.billingPlanID == billingPlanID &&
+        o.validTill == validTill;
+  }
+
+  @override
+  int get hashCode => id.hashCode ^ billingPlanID.hashCode ^ validTill.hashCode;
+}

+ 22 - 0
lib/services/billing_service.dart

@@ -2,17 +2,25 @@ import 'package:logging/logging.dart';
 import 'package:photos/core/configuration.dart';
 import 'package:photos/core/network.dart';
 import 'package:photos/models/billing_plan.dart';
+import 'package:photos/models/subscription.dart';
+import 'package:shared_preferences/shared_preferences.dart';
 
 class BillingService {
   BillingService._privateConstructor() {}
 
   static final BillingService instance = BillingService._privateConstructor();
+  static const subscriptionKey = "subscription";
 
   final _logger = Logger("BillingService");
   final _dio = Network.instance.getDio();
 
+  SharedPreferences _prefs;
   Future<List<BillingPlan>> _future;
 
+  Future<void> init() async {
+    _prefs = await SharedPreferences.getInstance();
+  }
+
   Future<List<BillingPlan>> getBillingPlans() {
     if (_future == null) {
       _future = _dio
@@ -27,4 +35,18 @@ class BillingService {
     }
     return _future;
   }
+
+  Subscription getSubscription() {
+    final jsonValue = _prefs.getString(subscriptionKey);
+    if (jsonValue == null) {
+      return null;
+    } else {
+      return Subscription.fromJson(jsonValue);
+    }
+  }
+
+  Future<void> setSubscription(Subscription subscription) async {
+    await _prefs.setString(
+        subscriptionKey, subscription == null ? null : subscription.toJson());
+  }
 }

+ 7 - 0
lib/services/user_service.dart

@@ -10,6 +10,8 @@ import 'package:photos/db/public_keys_db.dart';
 import 'package:photos/events/user_authenticated_event.dart';
 import 'package:photos/models/key_attributes.dart';
 import 'package:photos/models/public_key.dart';
+import 'package:photos/models/subscription.dart';
+import 'package:photos/services/billing_service.dart';
 import 'package:photos/ui/ott_verification_page.dart';
 import 'package:photos/ui/password_entry_page.dart';
 import 'package:photos/ui/password_reentry_page.dart';
@@ -160,5 +162,10 @@ class UserService {
       await Configuration.instance
           .setKeyAttributes(KeyAttributes.fromMap(keyAttributes));
     }
+    final subscription = response.data["subscription"];
+    if (subscription != null) {
+      await BillingService.instance
+          .setSubscription(Subscription.fromMap(subscription));
+    }
   }
 }