diff --git a/lib/models/subscription.dart b/lib/models/subscription.dart new file mode 100644 index 000000000..bd52a82a7 --- /dev/null +++ b/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 toMap() { + return { + 'id': id, + 'billingPlanID': billingPlanID, + 'validTill': validTill, + }; + } + + factory Subscription.fromMap(Map 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; +} diff --git a/lib/services/billing_service.dart b/lib/services/billing_service.dart index 6bd27907d..ca8e18151 100644 --- a/lib/services/billing_service.dart +++ b/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> _future; + Future init() async { + _prefs = await SharedPreferences.getInstance(); + } + Future> 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 setSubscription(Subscription subscription) async { + await _prefs.setString( + subscriptionKey, subscription == null ? null : subscription.toJson()); + } } diff --git a/lib/services/user_service.dart b/lib/services/user_service.dart index ee2276107..a0899c674 100644 --- a/lib/services/user_service.dart +++ b/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)); + } } }