diff --git a/lib/services/collections_service.dart b/lib/services/collections_service.dart index d8829c47b..0c63812c4 100644 --- a/lib/services/collections_service.dart +++ b/lib/services/collections_service.dart @@ -145,21 +145,27 @@ class CollectionsService { }); } - Future share(int collectionID, String email, String publicKey) { + Future share(int collectionID, String email, String publicKey) async { final encryptedKey = CryptoUtil.sealSync( getCollectionKey(collectionID), Sodium.base642bin(publicKey)); - return _dio - .post( - Configuration.instance.getHttpEndpoint() + "/collections/share", - data: { - "collectionID": collectionID, - "email": email, - "encryptedKey": Sodium.bin2base64(encryptedKey), - }, - options: Options( - headers: {"X-Auth-Token": Configuration.instance.getToken()}), - ) - .then((value) => SyncService.instance.syncWithRemote(silently: true)); + try { + await _dio.post( + Configuration.instance.getHttpEndpoint() + "/collections/share", + data: { + "collectionID": collectionID, + "email": email, + "encryptedKey": Sodium.bin2base64(encryptedKey), + }, + options: Options( + headers: {"X-Auth-Token": Configuration.instance.getToken()}), + ); + } on DioError catch (e) { + if (e.response.statusCode == 402) { + throw SharingNotPermittedForFreeAccountsError(); + } + throw e; + } + SyncService.instance.syncWithRemote(silently: true); } Future unshare(int collectionID, String email) { @@ -434,3 +440,5 @@ class AddFilesRequest { @override int get hashCode => collectionID.hashCode ^ files.hashCode; } + +class SharingNotPermittedForFreeAccountsError extends Error {} diff --git a/lib/ui/share_collection_widget.dart b/lib/ui/share_collection_widget.dart index 55d54de16..848fbe8a5 100644 --- a/lib/ui/share_collection_widget.dart +++ b/lib/ui/share_collection_widget.dart @@ -13,6 +13,7 @@ import 'package:photos/services/sync_service.dart'; import 'package:photos/services/user_service.dart'; import 'package:photos/ui/common_elements.dart'; import 'package:photos/ui/loading_widget.dart'; +import 'package:photos/ui/subscription_page.dart'; import 'package:photos/utils/dialog_util.dart'; import 'package:photos/utils/email_util.dart'; import 'package:photos/utils/share_util.dart'; @@ -212,7 +213,42 @@ class _SharingDialogState extends State { }); } catch (e) { await dialog.hide(); - showGenericErrorDialog(context); + if (e is SharingNotPermittedForFreeAccountsError) { + AlertDialog alert = AlertDialog( + title: Text("sorry"), + content: Text( + "sharing is not permitted for free accounts, please subscribe"), + actions: [ + FlatButton( + child: Text("subscribe"), + onPressed: () { + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (BuildContext context) { + return SubscriptionPage(); + }, + ), + ); + }, + ), + FlatButton( + child: Text("ok"), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + + showDialog( + context: context, + builder: (BuildContext context) { + return alert; + }, + ); + } else { + showGenericErrorDialog(context); + } } } }