diff --git a/lib/core/constants.dart b/lib/core/constants.dart index 6678521fc..1f9ae0754 100644 --- a/lib/core/constants.dart +++ b/lib/core/constants.dart @@ -55,3 +55,5 @@ const int intMaxValue = 9223372036854775807; const double restrictedMaxWidth = 430; const double mobileSmallThreshold = 336; + +const deviceLimits = [50, 25, 10, 5, 2, 1]; diff --git a/lib/ui/sharing/manage_links_widget.dart b/lib/ui/sharing/manage_links_widget.dart index ce87b8f29..c71dd5a2f 100644 --- a/lib/ui/sharing/manage_links_widget.dart +++ b/lib/ui/sharing/manage_links_widget.dart @@ -16,9 +16,11 @@ import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/divider_widget.dart'; import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/components/menu_section_description_widget.dart'; +import 'package:photos/ui/viewer/actions/picker_widget.dart'; import 'package:photos/utils/crypto_util.dart'; import 'package:photos/utils/date_time_util.dart'; import 'package:photos/utils/dialog_util.dart'; +import 'package:photos/utils/navigation_util.dart'; import 'package:photos/utils/toast_util.dart'; import 'package:tuple/tuple.dart'; @@ -138,7 +140,8 @@ class _ManageSharedLinkWidgetState extends State { alignCaptionedTextToLeft: true, isBottomBorderRadiusRemoved: true, onTap: () async { - await _showDeviceLimitPicker(); + // await _showDeviceLimitPicker(); + routeToPage(context, PickerWidget(widget.collection!)); }, surfaceExecutionStates: false, ), diff --git a/lib/ui/viewer/actions/picker_widget.dart b/lib/ui/viewer/actions/picker_widget.dart new file mode 100644 index 000000000..13f051252 --- /dev/null +++ b/lib/ui/viewer/actions/picker_widget.dart @@ -0,0 +1,149 @@ +import 'package:flutter/material.dart'; +import 'package:photos/core/constants.dart'; +import 'package:photos/models/collection.dart'; +import 'package:photos/services/collections_service.dart'; +import 'package:photos/theme/ente_theme.dart'; +import 'package:photos/ui/components/captioned_text_widget.dart'; +import 'package:photos/ui/components/divider_widget.dart'; +import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; +import 'package:photos/ui/components/title_bar_title_widget.dart'; +import 'package:photos/ui/components/title_bar_widget.dart'; +import 'package:photos/utils/dialog_util.dart'; +import 'package:photos/utils/separators_util.dart'; + +class PickerWidget extends StatelessWidget { + final Collection collection; + const PickerWidget(this.collection, {super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: CustomScrollView( + slivers: [ + const TitleBarWidget( + flexibleSpaceTitle: TitleBarTitleWidget( + title: "Device Limit", + ), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ClipRRect( + borderRadius: + const BorderRadius.all(Radius.circular(8)), + child: ItemsWidget(collection), + ) + ], + ), + ); + }, + childCount: 1, + ), + ), + ], + ), + ); + } +} + +class ItemsWidget extends StatefulWidget { + final Collection collection; + const ItemsWidget(this.collection, {super.key}); + + @override + State createState() => _ItemsWidgetState(); +} + +class _ItemsWidgetState extends State { + late int currentDeviceLimit; + List items = []; + bool isCustomLimit = false; + @override + void initState() { + currentDeviceLimit = widget.collection.publicURLs!.first!.deviceLimit; + if (!deviceLimits.contains(currentDeviceLimit)) { + isCustomLimit = true; + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + items.clear(); + if (isCustomLimit) { + items.add( + MenuItemWidget( + key: ValueKey(currentDeviceLimit), + menuItemColor: getEnteColorScheme(context).fillFaint, + captionedTextWidget: CaptionedTextWidget( + title: "$currentDeviceLimit", + ), + trailingIcon: Icons.check, + alignCaptionedTextToLeft: true, + isTopBorderRadiusRemoved: true, + isBottomBorderRadiusRemoved: true, + ), + ); + isCustomLimit = false; + } + // else { + // items.clear(); + // } + for (int deviceLimit in deviceLimits) { + items.add( + MenuItemWidget( + key: ValueKey(deviceLimit), + menuItemColor: getEnteColorScheme(context).fillFaint, + captionedTextWidget: CaptionedTextWidget( + title: "$deviceLimit", + ), + trailingIcon: currentDeviceLimit == deviceLimit ? Icons.check : null, + alignCaptionedTextToLeft: true, + isTopBorderRadiusRemoved: true, + isBottomBorderRadiusRemoved: true, + showOnlyLoadingState: true, + onTap: () async { + await _updateUrlSettings(context, { + 'deviceLimit': deviceLimit, + }).then( + (value) => setState(() { + currentDeviceLimit = deviceLimit; + }), + ); + }, + ), + ); + } + items = addSeparators( + items, + DividerWidget( + dividerType: DividerType.menuNoIcon, + bgColor: getEnteColorScheme(context).fillFaint, + ), + ); + return Column( + mainAxisSize: MainAxisSize.min, + children: items, + ); + } + + Future _updateUrlSettings( + BuildContext context, + Map prop, + ) async { + try { + await CollectionsService.instance.updateShareUrl(widget.collection, prop); + } catch (e) { + showGenericErrorDialog(context: context); + rethrow; + } + } +}