From 5792c2bae6402781cc7e321f857f1ad974a7f44e Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Sat, 17 Aug 2024 01:57:38 +0530 Subject: [PATCH 01/14] [mob][photos] Add New Album Card Widget for Collecting Photos --- mobile/assets/2.0x/create_new_album.png | Bin 0 -> 4124 bytes mobile/assets/2.0x/new_empty_album.png | Bin 0 -> 19217 bytes mobile/assets/3.0x/create_new_album.png | Bin 0 -> 6591 bytes mobile/assets/3.0x/new_empty_album.png | Bin 0 -> 29859 bytes mobile/assets/create_new_album.png | Bin 0 -> 1760 bytes mobile/assets/new_empty_album.png | Bin 0 -> 9682 bytes .../ui/settings/new_album_card_widget.dart | 182 ++++++++++++++++++ .../lib/ui/tabs/shared_collections_tab.dart | 2 + .../ui/viewer/gallery/collection_page.dart | 18 +- .../ui/viewer/gallery/empty_album_state.dart | 70 ++++--- .../viewer/gallery/empty_album_state_new.dart | 134 +++++++++++++ 11 files changed, 378 insertions(+), 28 deletions(-) create mode 100644 mobile/assets/2.0x/create_new_album.png create mode 100644 mobile/assets/2.0x/new_empty_album.png create mode 100644 mobile/assets/3.0x/create_new_album.png create mode 100644 mobile/assets/3.0x/new_empty_album.png create mode 100644 mobile/assets/create_new_album.png create mode 100644 mobile/assets/new_empty_album.png create mode 100644 mobile/lib/ui/settings/new_album_card_widget.dart create mode 100644 mobile/lib/ui/viewer/gallery/empty_album_state_new.dart diff --git a/mobile/assets/2.0x/create_new_album.png b/mobile/assets/2.0x/create_new_album.png new file mode 100644 index 0000000000000000000000000000000000000000..79ed8833bb4e77a50c1bd0040d0ec2581d8fdc98 GIT binary patch literal 4124 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 RBgucxs6w>Bm5SD({|Cpf&{O~b literal 0 HcmV?d00001 diff --git a/mobile/assets/2.0x/new_empty_album.png b/mobile/assets/2.0x/new_empty_album.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd3834a060dc3c884b3b2ccfad8bc80a2345a5a GIT binary patch literal 19217 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
  • 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 z z_6%nIU!NgMasD;$D-GJ}9>%NqB`y@2%Gmdfbp*9JpqExlXw5^~D_tkA(L%_6*-M6W z)Kc?hnQ<`nH0YiXYmUf86YHEH!YXjBl9?O^9-?8q1%!O zwbjtTAY6n;kFXE_)g~91QBSAKIPde}qPI(Uh zjqee{{`+8}iz;Tr-p~h+b{CHalCTUH3wegKM>_u2PLtR@2SuBAALw5v$j2Wu1&dq&jPtIljo<&+}qo0+&zNJIp*F= ze8j4O4c*>o#@L|Ojm0bo4;HfkbYlRt@RNUU z8~#qQepF{-SlgXK#7sxM!il(>Lr@e%qBdR+>T7}7*%B`Kuyb%MCGJ(8#7!^&Ny$Sf zDz`wq^=?=u_wQdgylNgErj#_pzAB z`g|+~_4;$3GJE;0$|V5UTs3*MPZGN4j1mk(Q}}Pl?8#Ghn*{)*did*}rGBmg-e#0R zH|@9!7al@g+;zM>n3EAzYBTBP*iYVTH5V-ZMxt#iSe8pBQ1q(GE?-832Z&1TOgg6_Cn?LPNsJ0FM7 zt1;bgP0=H!;FK!`+0e2VF{RY&?LW$~Np?}@7P7ReIowOCx@Tr^YT$pdHGi9{8W}It zs^?1^^qo`^nhwj%y!IWVNC57dGD4bKCEM|($DJ6ekV?UrH8ah^&=r+1Yv>BgJhW{KVRF-`>^ME z<|hl*;>~DBboDofld_th=I*$YPFVerOl!_<_b_KQuJRiZ6e|ub0ryL-%MsZv(9x zws?z^;pwH%V>WKXEe{gkw+Uj~pMU;&-~Rs>GA3$i_eufKlHol z{hw6p3mtMa(`1o*UB7F3(&gYi?|IK-qunrT@L`@u0}DN_WU~ej$>yCZ;CJ^o-u4Fi zIZgKa`Z;svbjPpPc-zjzkD8D&@YByH@gU!w2j--Q71QT?G#{^Rwi$cOx^cdzzDk3& zMQ*T{Y~5(GR|Top1R1Q767TMSp1MqiOWM(e8b?)TKO_R zOyGFl{7?3J?(yzYeIImsCBAQW$Sm=Fn<2E#Cb$Yqp19L6;kbGFBV|T>+4jDlqv;M4 zl<+gkdv7WpTovTItJ5IfLuy1;&|Mx9ZabRk zkW?D%B&(51?7r{kYrE@4@AJf`>x^XUMs4Mg&t)1TRR~H-I2;}@r-PSYetFn@Au7zt ze1ELT-p9nhOb5+|@7b+ex9-yaN%mZ`X3f%Lo@uH}zw}+^ap82Y-PqVz<384`=#Cyb zbZEp%*j(>4kJ%sJ?OqG)V;Ru+Fv_3I^)|E7IDW+yS4=eT?X2f{MyzzquQYv~Q+mJo z#oT%L@ZpGLIbCMXoY`r9**m&o_BP$q6`Og@Kb|;oV#}^wyGC7$mT4M{^?t8R(;?gG zG;iKK4YI4;*VW}_%9JU`O|~N{Ie7i`*U!$KJNMQ2{I$#}8qZL69XxpOaN^?=mWL6` zsV<{te(13wx0wy*VHqQ{afzmy|M6YdkDJpT^O?83_~MIa(>+(J<=Feabvb(JrI%7> zYceh4neO+#7oFzjv6_XhN}Psf`gNNBe z`{ROwDbKdoWhma;q$=IvZVJu)RmSeV021jAFA^Uz8*9HWU_7D*Yn+G&F(nnq5Lf{K zkQ_Bw0000!BftUx0PqoZ4 XuhA;WhUUdz00000NkvXXu0mjfNfl1> literal 0 HcmV?d00001 diff --git a/mobile/assets/3.0x/create_new_album.png b/mobile/assets/3.0x/create_new_album.png new file mode 100644 index 0000000000000000000000000000000000000000..94fe5819c796d17852bef320b2d0eb22c483dff9 GIT binary patch literal 6591 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 literal 0 HcmV?d00001 diff --git a/mobile/assets/3.0x/new_empty_album.png b/mobile/assets/3.0x/new_empty_album.png new file mode 100644 index 0000000000000000000000000000000000000000..a1be6b14a7f21d2cafb2795dc6300b95fed75af4 GIT binary patch literal 29859 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 literal 0 HcmV?d00001 diff --git a/mobile/lib/ui/settings/new_album_card_widget.dart b/mobile/lib/ui/settings/new_album_card_widget.dart new file mode 100644 index 0000000000..d398290c35 --- /dev/null +++ b/mobile/lib/ui/settings/new_album_card_widget.dart @@ -0,0 +1,182 @@ +import "package:figma_squircle/figma_squircle.dart"; +import 'package:flutter/material.dart'; +import "package:intl/intl.dart"; +import "package:logging/logging.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/collection/collection.dart"; +import "package:photos/models/collection/collection_items.dart"; +import "package:photos/services/collections_service.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/components/buttons/button_widget.dart"; +import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/viewer/gallery/collection_page.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/navigation_util.dart"; + +class NewAlbumCardWidget extends StatefulWidget { + const NewAlbumCardWidget({super.key}); + + @override + State createState() => _NewAlbumCardWidgetState(); +} + +class _NewAlbumCardWidgetState extends State { + Future _onTapCreateAlbum() async { + final String currentDate = + DateFormat('MMMM d, yyyy').format(DateTime.now()); + final result = await showTextInputDialog( + context, + title: "Name the album", + submitButtonLabel: S.of(context).create, + hintText: S.of(context).enterAlbumName, + alwaysShowSuccessState: false, + initialValue: currentDate, + textCapitalization: TextCapitalization.words, + onSubmit: (String text) async { + // indicates user cancelled the rename request + if (text.trim() == "") { + return; + } + + try { + final Collection c = + await CollectionsService.instance.createAlbum(text); + // ignore: unawaited_futures + routeToPage( + context, + CollectionPage( + isNewCollection: true, + CollectionWithThumbnail(c, null), + ), + ); + } catch (e, s) { + Logger("CreateNewAlbumIcon").severe("Failed to rename album", e, s); + rethrow; + } + }, + ); + if (result is Exception) { + await showGenericErrorDialog(context: context, error: result); + } + } + + @override + Widget build(BuildContext context) { + final textTheme = getEnteTextTheme(context); + final colorTheme = getEnteColorScheme(context); + return Stack( + children: [ + Positioned( + bottom: 22, + left: 14, + child: Container( + height: 125, + width: 125, + decoration: BoxDecoration( + borderRadius: + const BorderRadius.only(bottomLeft: Radius.circular(12)), + gradient: LinearGradient( + colors: [ + colorTheme.primary700.withOpacity(0.9), + colorTheme.backdropBase.withOpacity(0.6), + colorTheme.backdropBase, + ], + begin: Alignment.bottomLeft, + end: Alignment.topRight, + ), + ), + ), + ), + GestureDetector( + onTap: () => _onTapCreateAlbum(), + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 24), + child: Container( + decoration: ShapeDecoration( + color: colorTheme.backgroundElevated, + shadows: [ + BoxShadow( + color: colorTheme.textBase.withOpacity(0.1), + blurRadius: 4.0, + offset: const Offset(0, 1), + ), + ], + shape: SmoothRectangleBorder( + borderRadius: SmoothBorderRadius( + cornerRadius: 10.0, + cornerSmoothing: 1.0, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Collect photos", + style: textTheme.bodyBold, + ), + const SizedBox( + height: 16, + ), + Text( + "Create a link where your friends can upload photos in original quality.", + style: textTheme.smallMuted, + ), + const SizedBox( + height: 34, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + ButtonWidget( + buttonType: ButtonType.primary, + buttonSize: ButtonSize.small, + labelText: "Collect", + icon: Icons.add_photo_alternate_outlined, + shouldShowSuccessConfirmation: false, + shouldSurfaceExecutionStates: false, + onTap: () => _onTapCreateAlbum(), + ), + ], + ), + ], + ), + ), + ), + ), + ), + Positioned( + bottom: 24, + left: 16, + child: Container( + height: 90, + width: 90, + decoration: BoxDecoration( + borderRadius: + const BorderRadius.only(bottomLeft: Radius.circular(10)), + gradient: LinearGradient( + colors: [ + colorTheme.primary700.withOpacity(0.4), + colorTheme.backgroundElevated.withOpacity(0.6), + colorTheme.backgroundElevated, + ], + begin: Alignment.bottomLeft, + end: Alignment.topRight, + ), + ), + ), + ), + Positioned( + bottom: 25, + left: 20, + child: SizedBox( + child: Image.asset('assets/create_new_album.png'), + ), + ), + ], + ); + } +} diff --git a/mobile/lib/ui/tabs/shared_collections_tab.dart b/mobile/lib/ui/tabs/shared_collections_tab.dart index 2994a293c2..577884394f 100644 --- a/mobile/lib/ui/tabs/shared_collections_tab.dart +++ b/mobile/lib/ui/tabs/shared_collections_tab.dart @@ -17,6 +17,7 @@ import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; import "package:photos/ui/components/divider_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/settings/new_album_card_widget.dart"; import 'package:photos/ui/tabs/section_title.dart'; import "package:photos/ui/tabs/shared/all_quick_links_page.dart"; import "package:photos/ui/tabs/shared/empty_state.dart"; @@ -318,6 +319,7 @@ class _SharedCollectionsTabState extends State ], ) : const SizedBox.shrink(), + const NewAlbumCardWidget(), const SizedBox(height: 32), ], ), diff --git a/mobile/lib/ui/viewer/gallery/collection_page.dart b/mobile/lib/ui/viewer/gallery/collection_page.dart index e0288f238b..b2efa7eeca 100644 --- a/mobile/lib/ui/viewer/gallery/collection_page.dart +++ b/mobile/lib/ui/viewer/gallery/collection_page.dart @@ -13,6 +13,7 @@ import 'package:photos/models/selected_files.dart'; import 'package:photos/services/ignored_files_service.dart'; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; import "package:photos/ui/viewer/gallery/empty_album_state.dart"; +import "package:photos/ui/viewer/gallery/empty_album_state_new.dart"; import 'package:photos/ui/viewer/gallery/empty_state.dart'; import 'package:photos/ui/viewer/gallery/gallery.dart'; import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart'; @@ -22,11 +23,13 @@ class CollectionPage extends StatelessWidget { final CollectionWithThumbnail c; final String tagPrefix; final bool? hasVerifiedLock; + final bool isNewCollection; CollectionPage( this.c, { this.tagPrefix = "collection", this.hasVerifiedLock = false, + this.isNewCollection = false, Key? key, }) : super(key: key); @@ -86,8 +89,14 @@ class CollectionPage extends StatelessWidget { sortAsyncFn: () => c.collection.pubMagicMetadata.asc ?? false, showSelectAllByDefault: galleryType != GalleryType.sharedCollection, emptyState: galleryType == GalleryType.ownedCollection - ? EmptyAlbumState(c.collection) + ? EmptyAlbumState( + c.collection, + isNewCollection: isNewCollection, + ) : const EmptyState(), + footer: isNewCollection + ? const SizedBox(height: 20) + : const SizedBox(height: 212), ); return Scaffold( appBar: PreferredSize( @@ -99,6 +108,13 @@ class CollectionPage extends StatelessWidget { collection: c.collection, ), ), + floatingActionButton: isNewCollection + ? EmptyAlbumStateNew( + c.collection, + selectedFiles: _selectedFiles, + ) + : const SizedBox.shrink(), + floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, body: SelectionState( selectedFiles: _selectedFiles, child: Stack( diff --git a/mobile/lib/ui/viewer/gallery/empty_album_state.dart b/mobile/lib/ui/viewer/gallery/empty_album_state.dart index c90721a687..fdaffb2447 100644 --- a/mobile/lib/ui/viewer/gallery/empty_album_state.dart +++ b/mobile/lib/ui/viewer/gallery/empty_album_state.dart @@ -8,35 +8,51 @@ import "package:photos/utils/dialog_util.dart"; class EmptyAlbumState extends StatelessWidget { final Collection c; - const EmptyAlbumState(this.c, {super.key}); + final bool isNewCollection; + const EmptyAlbumState( + this.c, { + super.key, + this.isNewCollection = false, + }); @override Widget build(BuildContext context) { - return Stack( - children: [ - Center( - child: Opacity( - opacity: 0.5, - child: Image.asset('assets/loading_photos_background.png'), - ), - ), - Center( - child: ButtonWidget( - buttonType: ButtonType.primary, - buttonSize: ButtonSize.small, - labelText: S.of(context).addPhotos, - icon: Icons.add_photo_alternate_outlined, - shouldSurfaceExecutionStates: false, - onTap: () async { - try { - await showAddPhotosSheet(context, c); - } catch (e) { - await showGenericErrorDialog(context: context, error: e); - } - }, - ), - ), - ], - ); + return isNewCollection + ? Stack( + children: [ + Center( + child: Opacity( + opacity: 0.5, + child: Image.asset('assets/new_empty_album.png'), + ), + ), + ], + ) + : Stack( + children: [ + Center( + child: Opacity( + opacity: 0.5, + child: Image.asset('assets/loading_photos_background.png'), + ), + ), + Center( + child: ButtonWidget( + buttonType: ButtonType.primary, + buttonSize: ButtonSize.small, + labelText: S.of(context).addPhotos, + icon: Icons.add_photo_alternate_outlined, + shouldSurfaceExecutionStates: false, + onTap: () async { + try { + await showAddPhotosSheet(context, c); + } catch (e) { + await showGenericErrorDialog(context: context, error: e); + } + }, + ), + ), + ], + ); } } diff --git a/mobile/lib/ui/viewer/gallery/empty_album_state_new.dart b/mobile/lib/ui/viewer/gallery/empty_album_state_new.dart new file mode 100644 index 0000000000..d9944f9c99 --- /dev/null +++ b/mobile/lib/ui/viewer/gallery/empty_album_state_new.dart @@ -0,0 +1,134 @@ +import "package:fast_base58/fast_base58.dart"; +import "package:flutter/material.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/api/collection/public_url.dart"; +import "package:photos/models/collection/collection.dart"; +import "package:photos/models/selected_files.dart"; +import "package:photos/services/collections_service.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/components/buttons/button_widget.dart"; +import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/viewer/gallery/hooks/add_photos_sheet.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/share_util.dart"; + +class EmptyAlbumStateNew extends StatefulWidget { + final Collection c; + final SelectedFiles? selectedFiles; + const EmptyAlbumStateNew( + this.c, { + super.key, + this.selectedFiles, + }); + + @override + State createState() => _EmptyAlbumStateNewState(); +} + +class _EmptyAlbumStateNewState extends State { + final ValueNotifier _hasSelectedFilesNotifier = ValueNotifier(false); + + @override + void initState() { + super.initState(); + widget.selectedFiles?.addListener(_selectedFilesListener); + } + + @override + void dispose() { + _hasSelectedFilesNotifier.dispose(); + widget.selectedFiles!.removeListener(_selectedFilesListener); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final GlobalKey shareLinkAlbumButtonKey = GlobalKey(); + + Future getAlbumShareUrl() async { + final PublicURL url = widget.c.publicURLs!.firstOrNull!; + final String collectionKey = Base58Encode( + CollectionsService.instance.getCollectionKey(widget.c.id), + ); + return "${url.url}#$collectionKey"; + } + + return ValueListenableBuilder( + valueListenable: _hasSelectedFilesNotifier, + builder: (context, value, child) { + return AnimatedCrossFade( + firstCurve: Curves.easeInOutExpo, + secondCurve: Curves.easeInOutExpo, + sizeCurve: Curves.easeInOutExpo, + duration: const Duration(milliseconds: 300), + crossFadeState: !_hasSelectedFilesNotifier.value + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + firstChild: Stack( + children: [ + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 0, 24, 12), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + decoration: BoxDecoration( + color: getEnteColorScheme(context).backdropBase, + borderRadius: + const BorderRadius.all(Radius.circular(4)), + ), + child: ButtonWidget( + buttonType: ButtonType.secondary, + buttonSize: ButtonSize.large, + labelText: S.of(context).addPhotos, + icon: Icons.add_photo_alternate_outlined, + shouldSurfaceExecutionStates: false, + onTap: () async { + try { + await showAddPhotosSheet(context, widget.c); + } catch (e) { + await showGenericErrorDialog( + context: context, + error: e, + ); + } + }, + ), + ), + const SizedBox(height: 10), + ButtonWidget( + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + labelText: S.of(context).share, + icon: Icons.adaptive.share, + shouldSurfaceExecutionStates: false, + onTap: () async { + final String shareUrl = await getAlbumShareUrl(); + await shareAlbumLinkWithPlaceholder( + context, + widget.c, + shareUrl, + shareLinkAlbumButtonKey, + ); + }, + ), + ], + ), + ), + ), + ], + ), + secondChild: const SizedBox.shrink(), + ); + }, + ); + } + + _selectedFilesListener() { + _hasSelectedFilesNotifier.value = widget.selectedFiles!.files.isNotEmpty; + } +} From 70cc6a35d70ef22a84bacf0d12075bf72f97bfef Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Wed, 21 Aug 2024 13:36:54 +0530 Subject: [PATCH 02/14] [mob][photos] Used better names --- .../lib/ui/tabs/shared_collections_tab.dart | 4 +- ...art => collect_photos_bottom_buttons.dart} | 49 +++++++++++-------- .../gallery/collect_photos_card_widget.dart} | 14 +++--- .../ui/viewer/gallery/collection_page.dart | 14 +++--- .../ui/viewer/gallery/empty_album_state.dart | 6 +-- 5 files changed, 48 insertions(+), 39 deletions(-) rename mobile/lib/ui/viewer/gallery/{empty_album_state_new.dart => collect_photos_bottom_buttons.dart} (80%) rename mobile/lib/ui/{settings/new_album_card_widget.dart => viewer/gallery/collect_photos_card_widget.dart} (93%) diff --git a/mobile/lib/ui/tabs/shared_collections_tab.dart b/mobile/lib/ui/tabs/shared_collections_tab.dart index 577884394f..38441ae73a 100644 --- a/mobile/lib/ui/tabs/shared_collections_tab.dart +++ b/mobile/lib/ui/tabs/shared_collections_tab.dart @@ -17,11 +17,11 @@ import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; import "package:photos/ui/components/divider_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; -import "package:photos/ui/settings/new_album_card_widget.dart"; import 'package:photos/ui/tabs/section_title.dart'; import "package:photos/ui/tabs/shared/all_quick_links_page.dart"; import "package:photos/ui/tabs/shared/empty_state.dart"; import "package:photos/ui/tabs/shared/quick_link_album_item.dart"; +import "package:photos/ui/viewer/gallery/collect_photos_card_widget.dart"; import "package:photos/ui/viewer/gallery/collection_page.dart"; import "package:photos/utils/debouncer.dart"; import "package:photos/utils/navigation_util.dart"; @@ -319,7 +319,7 @@ class _SharedCollectionsTabState extends State ], ) : const SizedBox.shrink(), - const NewAlbumCardWidget(), + const CollectPhotosCardWidget(), const SizedBox(height: 32), ], ), diff --git a/mobile/lib/ui/viewer/gallery/empty_album_state_new.dart b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart similarity index 80% rename from mobile/lib/ui/viewer/gallery/empty_album_state_new.dart rename to mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart index d9944f9c99..b5dfc1e0a9 100644 --- a/mobile/lib/ui/viewer/gallery/empty_album_state_new.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart @@ -12,21 +12,22 @@ import "package:photos/ui/viewer/gallery/hooks/add_photos_sheet.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/share_util.dart"; -class EmptyAlbumStateNew extends StatefulWidget { - final Collection c; +class CollectPhotosBottomButtons extends StatefulWidget { + final Collection? c; final SelectedFiles? selectedFiles; - const EmptyAlbumStateNew( + const CollectPhotosBottomButtons( this.c, { super.key, this.selectedFiles, }); @override - State createState() => _EmptyAlbumStateNewState(); + State createState() => _EmptyAlbumStateNewState(); } -class _EmptyAlbumStateNewState extends State { +class _EmptyAlbumStateNewState extends State { final ValueNotifier _hasSelectedFilesNotifier = ValueNotifier(false); + final GlobalKey shareLinkAlbumButtonKey = GlobalKey(); @override void initState() { @@ -41,18 +42,27 @@ class _EmptyAlbumStateNewState extends State { super.dispose(); } + // Future _getAlbumShareUrl() async { + // try { + // final String collectionKey = Base58Encode( + // CollectionsService.instance.getCollectionKey(widget.c.id), + // ); + // } catch (e) { + // await showGenericErrorDialog( + // context: context, + // error: e, + // ); + // } + // return ""; + // } + @override Widget build(BuildContext context) { - final GlobalKey shareLinkAlbumButtonKey = GlobalKey(); - - Future getAlbumShareUrl() async { - final PublicURL url = widget.c.publicURLs!.firstOrNull!; - final String collectionKey = Base58Encode( - CollectionsService.instance.getCollectionKey(widget.c.id), - ); - return "${url.url}#$collectionKey"; - } - + final PublicURL url = widget.c!.publicURLs!.firstOrNull!; + final String collectionKey = Base58Encode( + CollectionsService.instance.getCollectionKey(widget.c!.id), + ); + final String urlValue = "${url.url}#$collectionKey"; return ValueListenableBuilder( valueListenable: _hasSelectedFilesNotifier, builder: (context, value, child) { @@ -71,8 +81,6 @@ class _EmptyAlbumStateNewState extends State { child: Padding( padding: const EdgeInsets.fromLTRB(24, 0, 24, 12), child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ Container( @@ -89,7 +97,7 @@ class _EmptyAlbumStateNewState extends State { shouldSurfaceExecutionStates: false, onTap: () async { try { - await showAddPhotosSheet(context, widget.c); + await showAddPhotosSheet(context, widget.c!); } catch (e) { await showGenericErrorDialog( context: context, @@ -107,11 +115,10 @@ class _EmptyAlbumStateNewState extends State { icon: Icons.adaptive.share, shouldSurfaceExecutionStates: false, onTap: () async { - final String shareUrl = await getAlbumShareUrl(); await shareAlbumLinkWithPlaceholder( context, - widget.c, - shareUrl, + widget.c!, + urlValue, shareLinkAlbumButtonKey, ); }, diff --git a/mobile/lib/ui/settings/new_album_card_widget.dart b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart similarity index 93% rename from mobile/lib/ui/settings/new_album_card_widget.dart rename to mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart index d398290c35..5dff4a039c 100644 --- a/mobile/lib/ui/settings/new_album_card_widget.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart @@ -13,14 +13,15 @@ import "package:photos/ui/viewer/gallery/collection_page.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/navigation_util.dart"; -class NewAlbumCardWidget extends StatefulWidget { - const NewAlbumCardWidget({super.key}); +class CollectPhotosCardWidget extends StatefulWidget { + const CollectPhotosCardWidget({super.key}); @override - State createState() => _NewAlbumCardWidgetState(); + State createState() => + _CollectPhotosCardWidgetState(); } -class _NewAlbumCardWidgetState extends State { +class _CollectPhotosCardWidgetState extends State { Future _onTapCreateAlbum() async { final String currentDate = DateFormat('MMMM d, yyyy').format(DateTime.now()); @@ -45,12 +46,13 @@ class _NewAlbumCardWidgetState extends State { routeToPage( context, CollectionPage( - isNewCollection: true, + isFromCollectPhotos: true, CollectionWithThumbnail(c, null), ), ); } catch (e, s) { - Logger("CreateNewAlbumIcon").severe("Failed to rename album", e, s); + Logger("CollectPhotosCardWidget") + .severe("Failed to rename album", e, s); rethrow; } }, diff --git a/mobile/lib/ui/viewer/gallery/collection_page.dart b/mobile/lib/ui/viewer/gallery/collection_page.dart index b2efa7eeca..f3f044f898 100644 --- a/mobile/lib/ui/viewer/gallery/collection_page.dart +++ b/mobile/lib/ui/viewer/gallery/collection_page.dart @@ -12,8 +12,8 @@ import 'package:photos/models/gallery_type.dart'; import 'package:photos/models/selected_files.dart'; import 'package:photos/services/ignored_files_service.dart'; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; +import "package:photos/ui/viewer/gallery/collect_photos_bottom_buttons.dart"; import "package:photos/ui/viewer/gallery/empty_album_state.dart"; -import "package:photos/ui/viewer/gallery/empty_album_state_new.dart"; import 'package:photos/ui/viewer/gallery/empty_state.dart'; import 'package:photos/ui/viewer/gallery/gallery.dart'; import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart'; @@ -23,13 +23,13 @@ class CollectionPage extends StatelessWidget { final CollectionWithThumbnail c; final String tagPrefix; final bool? hasVerifiedLock; - final bool isNewCollection; + final bool isFromCollectPhotos; CollectionPage( this.c, { this.tagPrefix = "collection", this.hasVerifiedLock = false, - this.isNewCollection = false, + this.isFromCollectPhotos = false, Key? key, }) : super(key: key); @@ -91,10 +91,10 @@ class CollectionPage extends StatelessWidget { emptyState: galleryType == GalleryType.ownedCollection ? EmptyAlbumState( c.collection, - isNewCollection: isNewCollection, + isFromCollectPhotos: isFromCollectPhotos, ) : const EmptyState(), - footer: isNewCollection + footer: isFromCollectPhotos ? const SizedBox(height: 20) : const SizedBox(height: 212), ); @@ -108,8 +108,8 @@ class CollectionPage extends StatelessWidget { collection: c.collection, ), ), - floatingActionButton: isNewCollection - ? EmptyAlbumStateNew( + floatingActionButton: isFromCollectPhotos + ? CollectPhotosBottomButtons( c.collection, selectedFiles: _selectedFiles, ) diff --git a/mobile/lib/ui/viewer/gallery/empty_album_state.dart b/mobile/lib/ui/viewer/gallery/empty_album_state.dart index fdaffb2447..72c13c226e 100644 --- a/mobile/lib/ui/viewer/gallery/empty_album_state.dart +++ b/mobile/lib/ui/viewer/gallery/empty_album_state.dart @@ -8,16 +8,16 @@ import "package:photos/utils/dialog_util.dart"; class EmptyAlbumState extends StatelessWidget { final Collection c; - final bool isNewCollection; + final bool isFromCollectPhotos; const EmptyAlbumState( this.c, { super.key, - this.isNewCollection = false, + this.isFromCollectPhotos = false, }); @override Widget build(BuildContext context) { - return isNewCollection + return isFromCollectPhotos ? Stack( children: [ Center( From 093b736a3bedbfe2383afe1e266fb3e90a54d044 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Wed, 21 Aug 2024 16:19:19 +0530 Subject: [PATCH 03/14] [mob][photos] Fixed sharing of album --- .../collect_photos_bottom_buttons.dart | 66 +++++++++++-------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart index b5dfc1e0a9..c7f35c0208 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart @@ -1,11 +1,11 @@ import "package:fast_base58/fast_base58.dart"; import "package:flutter/material.dart"; import "package:photos/generated/l10n.dart"; -import "package:photos/models/api/collection/public_url.dart"; import "package:photos/models/collection/collection.dart"; import "package:photos/models/selected_files.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/actions/collection/collection_sharing_actions.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; import "package:photos/ui/viewer/gallery/hooks/add_photos_sheet.dart"; @@ -13,7 +13,7 @@ import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/share_util.dart"; class CollectPhotosBottomButtons extends StatefulWidget { - final Collection? c; + final Collection c; final SelectedFiles? selectedFiles; const CollectPhotosBottomButtons( this.c, { @@ -28,10 +28,12 @@ class CollectPhotosBottomButtons extends StatefulWidget { class _EmptyAlbumStateNewState extends State { final ValueNotifier _hasSelectedFilesNotifier = ValueNotifier(false); final GlobalKey shareLinkAlbumButtonKey = GlobalKey(); + late CollectionActions collectionActions; @override void initState() { super.initState(); + collectionActions = CollectionActions(CollectionsService.instance); widget.selectedFiles?.addListener(_selectedFilesListener); } @@ -42,27 +44,42 @@ class _EmptyAlbumStateNewState extends State { super.dispose(); } - // Future _getAlbumShareUrl() async { - // try { - // final String collectionKey = Base58Encode( - // CollectionsService.instance.getCollectionKey(widget.c.id), - // ); - // } catch (e) { - // await showGenericErrorDialog( - // context: context, - // error: e, - // ); - // } - // return ""; - // } + Future _shareAlbumUrl() async { + final String collectionKey = Base58Encode( + CollectionsService.instance.getCollectionKey(widget.c.id), + ); + final String url = "${widget.c.publicURLs!.first!.url}#$collectionKey"; + await shareAlbumLinkWithPlaceholder( + context, + widget.c, + url, + shareLinkAlbumButtonKey, + ); + } + + Future _generateAlbumUrl() async { + final dialog = createProgressDialog( + context, + S.of(context).creatingLink, + isDismissible: true, + ); + await dialog.show(); + final bool hasUrl = widget.c.hasLink; + if (hasUrl) { + await _shareAlbumUrl(); + } else { + final bool result = await collectionActions.enableUrl(context, widget.c); + if (result) { + await _shareAlbumUrl(); + } else { + await showGenericErrorDialog(context: context, error: result); + } + } + await dialog.hide(); + } @override Widget build(BuildContext context) { - final PublicURL url = widget.c!.publicURLs!.firstOrNull!; - final String collectionKey = Base58Encode( - CollectionsService.instance.getCollectionKey(widget.c!.id), - ); - final String urlValue = "${url.url}#$collectionKey"; return ValueListenableBuilder( valueListenable: _hasSelectedFilesNotifier, builder: (context, value, child) { @@ -97,7 +114,7 @@ class _EmptyAlbumStateNewState extends State { shouldSurfaceExecutionStates: false, onTap: () async { try { - await showAddPhotosSheet(context, widget.c!); + await showAddPhotosSheet(context, widget.c); } catch (e) { await showGenericErrorDialog( context: context, @@ -115,12 +132,7 @@ class _EmptyAlbumStateNewState extends State { icon: Icons.adaptive.share, shouldSurfaceExecutionStates: false, onTap: () async { - await shareAlbumLinkWithPlaceholder( - context, - widget.c!, - urlValue, - shareLinkAlbumButtonKey, - ); + await _generateAlbumUrl(); }, ), ], From bbaabeef38101d420bc3333dfbdb2924ea7465dc Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Wed, 21 Aug 2024 16:23:13 +0530 Subject: [PATCH 04/14] [mob][photos] Hide share icon when collection is from Collect Photos --- mobile/lib/ui/viewer/gallery/collection_page.dart | 1 + mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/gallery/collection_page.dart b/mobile/lib/ui/viewer/gallery/collection_page.dart index f3f044f898..34fe367bac 100644 --- a/mobile/lib/ui/viewer/gallery/collection_page.dart +++ b/mobile/lib/ui/viewer/gallery/collection_page.dart @@ -106,6 +106,7 @@ class CollectionPage extends StatelessWidget { c.collection.displayName, _selectedFiles, collection: c.collection, + isFromCollectPhotos: isFromCollectPhotos, ), ), floatingActionButton: isFromCollectPhotos diff --git a/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart b/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart index 4535ce7c86..b0a35613ea 100644 --- a/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart +++ b/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart @@ -52,6 +52,7 @@ class GalleryAppBarWidget extends StatefulWidget { final SelectedFiles selectedFiles; final DeviceCollection? deviceCollection; final Collection? collection; + final bool isFromCollectPhotos; const GalleryAppBarWidget( this.type, @@ -60,6 +61,7 @@ class GalleryAppBarWidget extends StatefulWidget { Key? key, this.deviceCollection, this.collection, + this.isFromCollectPhotos = false, }) : super(key: key); @override @@ -306,7 +308,7 @@ class _GalleryAppBarWidgetState extends State { ), ); } - if (galleryType.isSharable()) { + if (galleryType.isSharable() && !widget.isFromCollectPhotos) { actions.add( Tooltip( message: "Share", From 6185556b9b475cbc0c9d6fd2d2416aa92100a6ce Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Tue, 3 Sep 2024 13:21:45 +0530 Subject: [PATCH 05/14] [mob][photos] Fix floating button background color --- .../lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart index c7f35c0208..481cd365e1 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart @@ -102,7 +102,8 @@ class _EmptyAlbumStateNewState extends State { children: [ Container( decoration: BoxDecoration( - color: getEnteColorScheme(context).backdropBase, + color: + getEnteColorScheme(context).backgroundElevated2, borderRadius: const BorderRadius.all(Radius.circular(4)), ), From 9b0d11963cfe5947380548eec84a7ceb271e3c95 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Tue, 3 Sep 2024 16:49:50 +0530 Subject: [PATCH 06/14] [mob][photos] Fixed border stroke --- .../viewer/gallery/collect_photos_card_widget.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart index 5dff4a039c..334d16bed1 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart @@ -70,13 +70,11 @@ class _CollectPhotosCardWidgetState extends State { children: [ Positioned( bottom: 22, - left: 14, + left: 14.5, child: Container( height: 125, width: 125, - decoration: BoxDecoration( - borderRadius: - const BorderRadius.only(bottomLeft: Radius.circular(12)), + decoration: ShapeDecoration( gradient: LinearGradient( colors: [ colorTheme.primary700.withOpacity(0.9), @@ -86,6 +84,12 @@ class _CollectPhotosCardWidgetState extends State { begin: Alignment.bottomLeft, end: Alignment.topRight, ), + shape: SmoothRectangleBorder( + borderRadius: SmoothBorderRadius( + cornerRadius: 12.0, + cornerSmoothing: 1.0, + ), + ), ), ), ), From db1eb19ef0af31373a1e7f76d7c8aec7876a53bd Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Tue, 3 Sep 2024 17:16:11 +0530 Subject: [PATCH 07/14] [mob][photos] Floating button background color fixed --- .../lib/ui/tabs/shared_collections_tab.dart | 2 + .../collect_photos_bottom_buttons.dart | 92 +++++++++---------- .../ui/viewer/gallery/collection_page.dart | 3 +- 3 files changed, 47 insertions(+), 50 deletions(-) diff --git a/mobile/lib/ui/tabs/shared_collections_tab.dart b/mobile/lib/ui/tabs/shared_collections_tab.dart index 38441ae73a..d47977b9c4 100644 --- a/mobile/lib/ui/tabs/shared_collections_tab.dart +++ b/mobile/lib/ui/tabs/shared_collections_tab.dart @@ -10,6 +10,7 @@ import 'package:photos/events/user_logged_out_event.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/models/collection/collection_items.dart'; import 'package:photos/services/collections_service.dart'; +import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/collections/album/row_item.dart"; import "package:photos/ui/collections/collection_list_page.dart"; import 'package:photos/ui/common/loading_widget.dart'; @@ -319,6 +320,7 @@ class _SharedCollectionsTabState extends State ], ) : const SizedBox.shrink(), + Divider(color: getEnteColorScheme(context).strokeFaint), const CollectPhotosCardWidget(), const SizedBox(height: 32), ], diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart index 481cd365e1..d2bdb6643a 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart @@ -91,56 +91,52 @@ class _EmptyAlbumStateNewState extends State { crossFadeState: !_hasSelectedFilesNotifier.value ? CrossFadeState.showFirst : CrossFadeState.showSecond, - firstChild: Stack( - children: [ - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.fromLTRB(24, 0, 24, 12), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - decoration: BoxDecoration( - color: - getEnteColorScheme(context).backgroundElevated2, - borderRadius: - const BorderRadius.all(Radius.circular(4)), - ), - child: ButtonWidget( - buttonType: ButtonType.secondary, - buttonSize: ButtonSize.large, - labelText: S.of(context).addPhotos, - icon: Icons.add_photo_alternate_outlined, - shouldSurfaceExecutionStates: false, - onTap: () async { - try { - await showAddPhotosSheet(context, widget.c); - } catch (e) { - await showGenericErrorDialog( - context: context, - error: e, - ); - } - }, - ), - ), - const SizedBox(height: 10), - ButtonWidget( - buttonType: ButtonType.primary, - buttonSize: ButtonSize.large, - labelText: S.of(context).share, - icon: Icons.adaptive.share, - shouldSurfaceExecutionStates: false, - onTap: () async { - await _generateAlbumUrl(); - }, - ), - ], + firstChild: Container( + decoration: BoxDecoration( + color: getEnteColorScheme(context).backgroundElevated, + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 12, 24, 12), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + decoration: BoxDecoration( + color: getEnteColorScheme(context).backgroundElevated2, + borderRadius: const BorderRadius.all(Radius.circular(4)), + ), + child: ButtonWidget( + buttonType: ButtonType.secondary, + buttonSize: ButtonSize.large, + labelText: S.of(context).addPhotos, + icon: Icons.add_photo_alternate_outlined, + shouldSurfaceExecutionStates: false, + onTap: () async { + try { + await showAddPhotosSheet(context, widget.c); + } catch (e) { + await showGenericErrorDialog( + context: context, + error: e, + ); + } + }, + ), ), - ), + const SizedBox(height: 8), + ButtonWidget( + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + labelText: S.of(context).share, + icon: Icons.adaptive.share, + shouldSurfaceExecutionStates: false, + onTap: () async { + await _generateAlbumUrl(); + }, + ), + ], ), - ], + ), ), secondChild: const SizedBox.shrink(), ); diff --git a/mobile/lib/ui/viewer/gallery/collection_page.dart b/mobile/lib/ui/viewer/gallery/collection_page.dart index 34fe367bac..5683c14b8a 100644 --- a/mobile/lib/ui/viewer/gallery/collection_page.dart +++ b/mobile/lib/ui/viewer/gallery/collection_page.dart @@ -109,13 +109,12 @@ class CollectionPage extends StatelessWidget { isFromCollectPhotos: isFromCollectPhotos, ), ), - floatingActionButton: isFromCollectPhotos + bottomNavigationBar: isFromCollectPhotos ? CollectPhotosBottomButtons( c.collection, selectedFiles: _selectedFiles, ) : const SizedBox.shrink(), - floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, body: SelectionState( selectedFiles: _selectedFiles, child: Stack( From 1fde4b9f16a7d60dca4e0fbef911aadd39e01166 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Tue, 3 Sep 2024 17:35:17 +0530 Subject: [PATCH 08/14] [mob][photos] same action like new card widget when tap on Collect event photos --- mobile/lib/ui/tabs/shared/empty_state.dart | 53 ++++++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/tabs/shared/empty_state.dart b/mobile/lib/ui/tabs/shared/empty_state.dart index d466e0aa07..97f88b88f5 100644 --- a/mobile/lib/ui/tabs/shared/empty_state.dart +++ b/mobile/lib/ui/tabs/shared/empty_state.dart @@ -1,18 +1,66 @@ import "package:flutter/material.dart"; +import "package:intl/intl.dart"; +import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/tab_changed_event.dart"; import "package:photos/generated/l10n.dart"; +import "package:photos/models/collection/collection.dart"; +import "package:photos/models/collection/collection_items.dart"; +import "package:photos/services/collections_service.dart"; import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/collections/collection_action_sheet.dart'; import 'package:photos/ui/components/buttons/button_widget.dart'; import "package:photos/ui/components/empty_state_item_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/viewer/gallery/collection_page.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/navigation_util.dart"; import "package:photos/utils/share_util.dart"; import "package:photos/utils/toast_util.dart"; class SharedEmptyStateWidget extends StatelessWidget { const SharedEmptyStateWidget({super.key}); + Future _onTapCollectEventPhotos(BuildContext context) async { + final String currentDate = + DateFormat('MMMM d, yyyy').format(DateTime.now()); + final result = await showTextInputDialog( + context, + title: "Name the album", + submitButtonLabel: S.of(context).create, + hintText: S.of(context).enterAlbumName, + alwaysShowSuccessState: false, + initialValue: currentDate, + textCapitalization: TextCapitalization.words, + onSubmit: (String text) async { + // indicates user cancelled the rename request + if (text.trim() == "") { + return; + } + + try { + final Collection c = + await CollectionsService.instance.createAlbum(text); + // ignore: unawaited_futures + routeToPage( + context, + CollectionPage( + isFromCollectPhotos: true, + CollectionWithThumbnail(c, null), + ), + ); + } catch (e, s) { + Logger("Collect event photos from CollectPhotosCardWidget") + .severe("Failed to rename album", e, s); + rethrow; + } + }, + ); + if (result is Exception) { + await showGenericErrorDialog(context: context, error: result); + } + } + @override Widget build(BuildContext context) { final textTheme = getEnteTextTheme(context); @@ -80,10 +128,7 @@ class SharedEmptyStateWidget extends StatelessWidget { labelText: S.of(context).collectEventPhotos, icon: Icons.add_photo_alternate_outlined, onTap: () async { - showCollectionActionSheet( - context, - actionType: CollectionActionType.collectPhotos, - ); + await _onTapCollectEventPhotos(context); }, ), const SizedBox(height: 6), From 3c850ef195438cdce9d919f936f5257aac7b2039 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Wed, 4 Sep 2024 21:55:49 +0530 Subject: [PATCH 09/14] [mob][photos] Fix border of card widget --- mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart index 334d16bed1..888b18da5b 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart @@ -69,7 +69,7 @@ class _CollectPhotosCardWidgetState extends State { return Stack( children: [ Positioned( - bottom: 22, + bottom: 22.5, left: 14.5, child: Container( height: 125, From f448c66c17c80c88137b90422eca38b8ed241aa6 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Wed, 4 Sep 2024 22:07:14 +0530 Subject: [PATCH 10/14] [mob][photos] Fixed bottom button spacing --- .../collect_photos_bottom_buttons.dart | 114 ++++++++++-------- 1 file changed, 61 insertions(+), 53 deletions(-) diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart index d2bdb6643a..7c892f9633 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart @@ -80,67 +80,75 @@ class _EmptyAlbumStateNewState extends State { @override Widget build(BuildContext context) { - return ValueListenableBuilder( - valueListenable: _hasSelectedFilesNotifier, - builder: (context, value, child) { - return AnimatedCrossFade( - firstCurve: Curves.easeInOutExpo, - secondCurve: Curves.easeInOutExpo, - sizeCurve: Curves.easeInOutExpo, - duration: const Duration(milliseconds: 300), - crossFadeState: !_hasSelectedFilesNotifier.value - ? CrossFadeState.showFirst - : CrossFadeState.showSecond, - firstChild: Container( - decoration: BoxDecoration( - color: getEnteColorScheme(context).backgroundElevated, - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(24, 12, 24, 12), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - decoration: BoxDecoration( - color: getEnteColorScheme(context).backgroundElevated2, - borderRadius: const BorderRadius.all(Radius.circular(4)), + return SafeArea( + child: ValueListenableBuilder( + valueListenable: _hasSelectedFilesNotifier, + builder: (context, value, child) { + return AnimatedCrossFade( + firstCurve: Curves.easeInOutExpo, + secondCurve: Curves.easeInOutExpo, + sizeCurve: Curves.easeInOutExpo, + duration: const Duration(milliseconds: 300), + crossFadeState: !_hasSelectedFilesNotifier.value + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + firstChild: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: getEnteColorScheme(context).strokeFaint, + ), + ), + color: getEnteColorScheme(context).backgroundElevated, + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 12, 16, 18), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + decoration: BoxDecoration( + color: getEnteColorScheme(context).backgroundElevated2, + borderRadius: + const BorderRadius.all(Radius.circular(4)), + ), + child: ButtonWidget( + buttonType: ButtonType.secondary, + buttonSize: ButtonSize.large, + labelText: S.of(context).addPhotos, + icon: Icons.add_photo_alternate_outlined, + shouldSurfaceExecutionStates: false, + onTap: () async { + try { + await showAddPhotosSheet(context, widget.c); + } catch (e) { + await showGenericErrorDialog( + context: context, + error: e, + ); + } + }, + ), ), - child: ButtonWidget( - buttonType: ButtonType.secondary, + const SizedBox(height: 8), + ButtonWidget( + buttonType: ButtonType.primary, buttonSize: ButtonSize.large, - labelText: S.of(context).addPhotos, - icon: Icons.add_photo_alternate_outlined, + labelText: S.of(context).share, + icon: Icons.adaptive.share, shouldSurfaceExecutionStates: false, onTap: () async { - try { - await showAddPhotosSheet(context, widget.c); - } catch (e) { - await showGenericErrorDialog( - context: context, - error: e, - ); - } + await _generateAlbumUrl(); }, ), - ), - const SizedBox(height: 8), - ButtonWidget( - buttonType: ButtonType.primary, - buttonSize: ButtonSize.large, - labelText: S.of(context).share, - icon: Icons.adaptive.share, - shouldSurfaceExecutionStates: false, - onTap: () async { - await _generateAlbumUrl(); - }, - ), - ], + ], + ), ), ), - ), - secondChild: const SizedBox.shrink(), - ); - }, + secondChild: const SizedBox.shrink(), + ); + }, + ), ); } From 8b2322ef6c596e4f8fbc9c252b76092ea77f1090 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 6 Sep 2024 16:17:17 +0530 Subject: [PATCH 11/14] [mob][photos] Minor change --- mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart index 7c892f9633..5cb6f6c876 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_bottom_buttons.dart @@ -102,7 +102,7 @@ class _EmptyAlbumStateNewState extends State { color: getEnteColorScheme(context).backgroundElevated, ), child: Padding( - padding: const EdgeInsets.fromLTRB(16, 12, 16, 18), + padding: const EdgeInsets.fromLTRB(16, 15, 16, 18), child: Column( mainAxisSize: MainAxisSize.min, children: [ From e1feb8bcd5836247a99e567c54a6f9ca22aa05ec Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 6 Sep 2024 16:47:34 +0530 Subject: [PATCH 12/14] [mob][photos] UI changes --- .../lib/ui/tabs/shared_collections_tab.dart | 32 +------------------ 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/mobile/lib/ui/tabs/shared_collections_tab.dart b/mobile/lib/ui/tabs/shared_collections_tab.dart index d47977b9c4..63e8bcac80 100644 --- a/mobile/lib/ui/tabs/shared_collections_tab.dart +++ b/mobile/lib/ui/tabs/shared_collections_tab.dart @@ -10,14 +10,10 @@ import 'package:photos/events/user_logged_out_event.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/models/collection/collection_items.dart'; import 'package:photos/services/collections_service.dart'; -import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/collections/album/row_item.dart"; import "package:photos/ui/collections/collection_list_page.dart"; import 'package:photos/ui/common/loading_widget.dart'; -import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; -import "package:photos/ui/components/divider_widget.dart"; -import "package:photos/ui/components/models/button_type.dart"; import 'package:photos/ui/tabs/section_title.dart'; import "package:photos/ui/tabs/shared/all_quick_links_page.dart"; import "package:photos/ui/tabs/shared/empty_state.dart"; @@ -26,7 +22,6 @@ import "package:photos/ui/viewer/gallery/collect_photos_card_widget.dart"; import "package:photos/ui/viewer/gallery/collection_page.dart"; import "package:photos/utils/debouncer.dart"; import "package:photos/utils/navigation_util.dart"; -import "package:photos/utils/share_util.dart"; class SharedCollectionsTab extends StatefulWidget { const SharedCollectionsTab({super.key}); @@ -295,32 +290,7 @@ class _SharedCollectionsTabState extends State ), ) : const SizedBox.shrink(), - collections.incoming.isNotEmpty - ? Column( - children: [ - const DividerWidget(dividerType: DividerType.bottomBar), - const SizedBox(height: 32), - Padding( - padding: const EdgeInsets.fromLTRB(24, 0, 24, 12), - child: ButtonWidget( - buttonType: numberOfQuickLinks == 0 && - collections.outgoing.isEmpty - ? ButtonType.trailingIconSecondary - : ButtonType.trailingIconPrimary, - labelText: S.of(context).inviteYourFriendsToEnte, - icon: Icons.ios_share_outlined, - onTap: () async { - // ignore: unawaited_futures - shareText( - S.of(context).shareTextRecommendUsingEnte, - ); - }, - ), - ), - ], - ) - : const SizedBox.shrink(), - Divider(color: getEnteColorScheme(context).strokeFaint), + const SizedBox(height: 4), const CollectPhotosCardWidget(), const SizedBox(height: 32), ], From 2a0c7d1e56f89beb5f5bed7a83e442de544dcd12 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Tue, 10 Sep 2024 13:44:00 +0530 Subject: [PATCH 13/14] [mob][photos] Refractor code --- mobile/lib/ui/tabs/shared/empty_state.dart | 51 +----------------- .../gallery/collect_photos_card_widget.dart | 54 ++----------------- mobile/lib/utils/collection_util.dart | 49 +++++++++++++++++ 3 files changed, 54 insertions(+), 100 deletions(-) create mode 100644 mobile/lib/utils/collection_util.dart diff --git a/mobile/lib/ui/tabs/shared/empty_state.dart b/mobile/lib/ui/tabs/shared/empty_state.dart index 97f88b88f5..b69d64b96d 100644 --- a/mobile/lib/ui/tabs/shared/empty_state.dart +++ b/mobile/lib/ui/tabs/shared/empty_state.dart @@ -1,66 +1,19 @@ import "package:flutter/material.dart"; -import "package:intl/intl.dart"; -import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/tab_changed_event.dart"; import "package:photos/generated/l10n.dart"; -import "package:photos/models/collection/collection.dart"; -import "package:photos/models/collection/collection_items.dart"; -import "package:photos/services/collections_service.dart"; import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/collections/collection_action_sheet.dart'; import 'package:photos/ui/components/buttons/button_widget.dart'; import "package:photos/ui/components/empty_state_item_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; -import "package:photos/ui/viewer/gallery/collection_page.dart"; -import "package:photos/utils/dialog_util.dart"; -import "package:photos/utils/navigation_util.dart"; +import "package:photos/utils/collection_util.dart"; import "package:photos/utils/share_util.dart"; import "package:photos/utils/toast_util.dart"; class SharedEmptyStateWidget extends StatelessWidget { const SharedEmptyStateWidget({super.key}); - Future _onTapCollectEventPhotos(BuildContext context) async { - final String currentDate = - DateFormat('MMMM d, yyyy').format(DateTime.now()); - final result = await showTextInputDialog( - context, - title: "Name the album", - submitButtonLabel: S.of(context).create, - hintText: S.of(context).enterAlbumName, - alwaysShowSuccessState: false, - initialValue: currentDate, - textCapitalization: TextCapitalization.words, - onSubmit: (String text) async { - // indicates user cancelled the rename request - if (text.trim() == "") { - return; - } - - try { - final Collection c = - await CollectionsService.instance.createAlbum(text); - // ignore: unawaited_futures - routeToPage( - context, - CollectionPage( - isFromCollectPhotos: true, - CollectionWithThumbnail(c, null), - ), - ); - } catch (e, s) { - Logger("Collect event photos from CollectPhotosCardWidget") - .severe("Failed to rename album", e, s); - rethrow; - } - }, - ); - if (result is Exception) { - await showGenericErrorDialog(context: context, error: result); - } - } - @override Widget build(BuildContext context) { final textTheme = getEnteTextTheme(context); @@ -128,7 +81,7 @@ class SharedEmptyStateWidget extends StatelessWidget { labelText: S.of(context).collectEventPhotos, icon: Icons.add_photo_alternate_outlined, onTap: () async { - await _onTapCollectEventPhotos(context); + await onTapCollectEventPhotos(context); }, ), const SizedBox(height: 6), diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart index 888b18da5b..46e816b407 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart @@ -1,17 +1,9 @@ import "package:figma_squircle/figma_squircle.dart"; import 'package:flutter/material.dart'; -import "package:intl/intl.dart"; -import "package:logging/logging.dart"; -import "package:photos/generated/l10n.dart"; -import "package:photos/models/collection/collection.dart"; -import "package:photos/models/collection/collection_items.dart"; -import "package:photos/services/collections_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; -import "package:photos/ui/viewer/gallery/collection_page.dart"; -import "package:photos/utils/dialog_util.dart"; -import "package:photos/utils/navigation_util.dart"; +import "package:photos/utils/collection_util.dart"; class CollectPhotosCardWidget extends StatefulWidget { const CollectPhotosCardWidget({super.key}); @@ -22,46 +14,6 @@ class CollectPhotosCardWidget extends StatefulWidget { } class _CollectPhotosCardWidgetState extends State { - Future _onTapCreateAlbum() async { - final String currentDate = - DateFormat('MMMM d, yyyy').format(DateTime.now()); - final result = await showTextInputDialog( - context, - title: "Name the album", - submitButtonLabel: S.of(context).create, - hintText: S.of(context).enterAlbumName, - alwaysShowSuccessState: false, - initialValue: currentDate, - textCapitalization: TextCapitalization.words, - onSubmit: (String text) async { - // indicates user cancelled the rename request - if (text.trim() == "") { - return; - } - - try { - final Collection c = - await CollectionsService.instance.createAlbum(text); - // ignore: unawaited_futures - routeToPage( - context, - CollectionPage( - isFromCollectPhotos: true, - CollectionWithThumbnail(c, null), - ), - ); - } catch (e, s) { - Logger("CollectPhotosCardWidget") - .severe("Failed to rename album", e, s); - rethrow; - } - }, - ); - if (result is Exception) { - await showGenericErrorDialog(context: context, error: result); - } - } - @override Widget build(BuildContext context) { final textTheme = getEnteTextTheme(context); @@ -94,7 +46,7 @@ class _CollectPhotosCardWidgetState extends State { ), ), GestureDetector( - onTap: () => _onTapCreateAlbum(), + onTap: () => onTapCollectEventPhotos(context), child: Padding( padding: const EdgeInsets.fromLTRB(16, 16, 16, 24), child: Container( @@ -144,7 +96,7 @@ class _CollectPhotosCardWidgetState extends State { icon: Icons.add_photo_alternate_outlined, shouldShowSuccessConfirmation: false, shouldSurfaceExecutionStates: false, - onTap: () => _onTapCreateAlbum(), + onTap: () => onTapCollectEventPhotos(context), ), ], ), diff --git a/mobile/lib/utils/collection_util.dart b/mobile/lib/utils/collection_util.dart new file mode 100644 index 0000000000..0190c10624 --- /dev/null +++ b/mobile/lib/utils/collection_util.dart @@ -0,0 +1,49 @@ +import "package:flutter/material.dart"; +import "package:intl/intl.dart"; +import "package:logging/logging.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/collection/collection.dart"; +import "package:photos/models/collection/collection_items.dart"; +import "package:photos/services/collections_service.dart"; +import "package:photos/ui/viewer/gallery/collection_page.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/navigation_util.dart"; + +Future onTapCollectEventPhotos(BuildContext context) async { + final String currentDate = DateFormat('MMMM d, yyyy').format(DateTime.now()); + final result = await showTextInputDialog( + context, + title: "Name the album", + submitButtonLabel: S.of(context).create, + hintText: S.of(context).enterAlbumName, + alwaysShowSuccessState: false, + initialValue: currentDate, + textCapitalization: TextCapitalization.words, + onSubmit: (String text) async { + // indicates user cancelled the rename request + if (text.trim() == "") { + return; + } + + try { + final Collection c = + await CollectionsService.instance.createAlbum(text); + // ignore: unawaited_futures + routeToPage( + context, + CollectionPage( + isFromCollectPhotos: true, + CollectionWithThumbnail(c, null), + ), + ); + } catch (e, s) { + Logger("Collect event photos from CollectPhotosCardWidget") + .severe("Failed to rename album", e, s); + rethrow; + } + }, + ); + if (result is Exception) { + await showGenericErrorDialog(context: context, error: result); + } +} From 068cad2207258137205fc06a5f18798678779352 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Tue, 10 Sep 2024 13:58:42 +0530 Subject: [PATCH 14/14] [mob][photos] Extract strings --- mobile/lib/generated/intl/messages_cs.dart | 5 ++++ mobile/lib/generated/intl/messages_de.dart | 8 +++-- mobile/lib/generated/intl/messages_en.dart | 4 +++ mobile/lib/generated/intl/messages_es.dart | 4 +++ mobile/lib/generated/intl/messages_fr.dart | 4 +++ mobile/lib/generated/intl/messages_it.dart | 4 +++ mobile/lib/generated/intl/messages_ko.dart | 5 ++++ mobile/lib/generated/intl/messages_nl.dart | 4 +++ mobile/lib/generated/intl/messages_no.dart | 5 ++++ mobile/lib/generated/intl/messages_pl.dart | 10 +++++-- mobile/lib/generated/intl/messages_pt.dart | 12 +++++--- mobile/lib/generated/intl/messages_ru.dart | 4 +++ mobile/lib/generated/intl/messages_tr.dart | 4 +++ mobile/lib/generated/intl/messages_zh.dart | 4 +++ mobile/lib/generated/l10n.dart | 30 +++++++++++++++++++ mobile/lib/l10n/intl_cs.arb | 6 +++- mobile/lib/l10n/intl_de.arb | 5 +++- mobile/lib/l10n/intl_en.arb | 5 +++- mobile/lib/l10n/intl_es.arb | 5 +++- mobile/lib/l10n/intl_fr.arb | 5 +++- mobile/lib/l10n/intl_it.arb | 5 +++- mobile/lib/l10n/intl_ko.arb | 6 +++- mobile/lib/l10n/intl_nl.arb | 5 +++- mobile/lib/l10n/intl_no.arb | 6 +++- mobile/lib/l10n/intl_pl.arb | 5 +++- mobile/lib/l10n/intl_pt.arb | 5 +++- mobile/lib/l10n/intl_ru.arb | 5 +++- mobile/lib/l10n/intl_tr.arb | 5 +++- mobile/lib/l10n/intl_zh.arb | 5 +++- .../gallery/collect_photos_card_widget.dart | 7 +++-- mobile/lib/utils/collection_util.dart | 2 +- 31 files changed, 162 insertions(+), 27 deletions(-) diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index b49e60133c..22d2d58927 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -42,6 +42,10 @@ class MessageLookup extends MessageLookupByLibrary { "Change location of selected items?"), "clusteringProgress": MessageLookupByLibrary.simpleMessage("Clustering progress"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), + "collectPhotos": MessageLookupByLibrary.simpleMessage("Collect photos"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "createCollaborativeLink": MessageLookupByLibrary.simpleMessage("Create collaborative link"), @@ -81,6 +85,7 @@ class MessageLookup extends MessageLookupByLibrary { "Modify your query, or try searching for"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Move to hidden album"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "next": MessageLookupByLibrary.simpleMessage("Next"), "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage("No quick links selected"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index feed2c27a5..7b272bb8a1 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -484,9 +484,12 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage in Galerie gespeichert"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage( "Gemeinsam Event-Fotos sammeln"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Fotos sammeln"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Farbe"), "confirm": MessageLookupByLibrary.simpleMessage("Bestätigen"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -825,9 +828,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zugriff gewähren"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Fotos in der Nähe gruppieren"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Gastansicht"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -1023,6 +1026,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Verschiebe Dateien in Album..."), "name": MessageLookupByLibrary.simpleMessage("Name"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "Ente ist im Moment nicht erreichbar. Bitte versuchen Sie es später erneut. Sollte das Problem bestehen bleiben, wenden Sie sich bitte an den Support."), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index d22cdd7ecc..6d9becb2d8 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -467,9 +467,12 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage("Collage saved to gallery"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("Collect event photos"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Collect photos"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Color"), "confirm": MessageLookupByLibrary.simpleMessage("Confirm"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -980,6 +983,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Moving files to album..."), "name": MessageLookupByLibrary.simpleMessage("Name"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "Unable to connect to Ente, please retry after sometime. If the error persists, please contact support."), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 857b10f70a..c4bfd32718 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -482,10 +482,13 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Disposición"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage guardado en la galería"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("Recopilar fotos del evento"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Recolectar fotos"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Color"), "confirm": MessageLookupByLibrary.simpleMessage("Confirmar"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -1028,6 +1031,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Moviendo archivos al álbum..."), "name": MessageLookupByLibrary.simpleMessage("Nombre"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "No se puede conectar a Ente. Por favor, vuelve a intentarlo pasado un tiempo. Si el error persiste, ponte en contacto con el soporte técnico."), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index cc0feb9555..cb322731ce 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -452,10 +452,13 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Disposition"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage sauvegardé dans la galerie"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage( "Collecter des photos de l\'événement"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Récupérer les photos"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Couleur "), "confirm": MessageLookupByLibrary.simpleMessage("Confirmer"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -955,6 +958,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Déplacement des fichiers vers l\'album..."), "name": MessageLookupByLibrary.simpleMessage("Nom"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "never": MessageLookupByLibrary.simpleMessage("Jamais"), "newAlbum": MessageLookupByLibrary.simpleMessage("Nouvel album"), "newToEnte": MessageLookupByLibrary.simpleMessage("Nouveau sur ente"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 1681da9726..d22899d126 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -438,10 +438,13 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Disposizione"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage salvato nella galleria"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage( "Raccogli le foto di un evento"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Raccogli le foto"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Colore"), "confirm": MessageLookupByLibrary.simpleMessage("Conferma"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -922,6 +925,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Spostamento dei file nell\'album..."), "name": MessageLookupByLibrary.simpleMessage("Nome"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "never": MessageLookupByLibrary.simpleMessage("Mai"), "newAlbum": MessageLookupByLibrary.simpleMessage("Nuovo album"), "newToEnte": MessageLookupByLibrary.simpleMessage("Nuovo utente"), diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 5a372c298b..f00053d864 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -42,6 +42,10 @@ class MessageLookup extends MessageLookupByLibrary { "Change location of selected items?"), "clusteringProgress": MessageLookupByLibrary.simpleMessage("Clustering progress"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), + "collectPhotos": MessageLookupByLibrary.simpleMessage("Collect photos"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "createCollaborativeLink": MessageLookupByLibrary.simpleMessage("Create collaborative link"), @@ -81,6 +85,7 @@ class MessageLookup extends MessageLookupByLibrary { "Modify your query, or try searching for"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Move to hidden album"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "next": MessageLookupByLibrary.simpleMessage("Next"), "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage("No quick links selected"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index b68312d437..a2fd623546 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -482,10 +482,13 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage opgeslagen in gallerij"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage( "Foto\'s van gebeurtenissen verzamelen"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Foto\'s verzamelen"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Kleur"), "confirm": MessageLookupByLibrary.simpleMessage("Bevestig"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -1023,6 +1026,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Bestanden verplaatsen naar album..."), "name": MessageLookupByLibrary.simpleMessage("Naam"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "Kan geen verbinding maken met Ente, probeer het later opnieuw. Als de fout zich blijft voordoen, neem dan contact op met support."), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 886121b119..1d177fb99e 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -47,6 +47,10 @@ class MessageLookup extends MessageLookupByLibrary { "Change location of selected items?"), "clusteringProgress": MessageLookupByLibrary.simpleMessage("Clustering progress"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), + "collectPhotos": MessageLookupByLibrary.simpleMessage("Collect photos"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Bekreft sletting av konto"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( @@ -103,6 +107,7 @@ class MessageLookup extends MessageLookupByLibrary { "Modify your query, or try searching for"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Move to hidden album"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "next": MessageLookupByLibrary.simpleMessage("Next"), "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage("No quick links selected"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 46bebdd3d6..8ebb6fc3e3 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -483,9 +483,12 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Układ"), "collageSaved": MessageLookupByLibrary.simpleMessage("Kolaż zapisano w galerii"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("Zbierz zdjęcia z wydarzenia"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Zbierz zdjęcia"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Kolor"), "confirm": MessageLookupByLibrary.simpleMessage("Potwierdź"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -752,7 +755,7 @@ class MessageLookup extends MessageLookupByLibrary { "failedToRenew": MessageLookupByLibrary.simpleMessage("Nie udało się odnowić"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( - "Nie udało się zweryfikować statusu płatności"), + "Nie udało się zweryfikować stanu płatności"), "familyPlanOverview": MessageLookupByLibrary.simpleMessage( "Dodaj 5 członków rodziny do istniejącego planu bez dodatkowego płacenia.\n\nKażdy członek otrzymuje własną przestrzeń prywatną i nie widzi wzajemnie swoich plików, chyba że są one udostępnione.\n\nPlany rodzinne są dostępne dla klientów, którzy mają płatną subskrypcję Ente.\n\nSubskrybuj teraz, aby rozpocząć!"), "familyPlanPortalTitle": @@ -818,9 +821,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Przyznaj uprawnienie"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("Grupuj pobliskie zdjęcia"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Widok gościa"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Nie śledzimy instalacji aplikacji. Pomogłyby nam, gdybyś powiedział/a nam, gdzie nas znalazłeś/aś!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -1017,6 +1020,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Przenoszenie plików do albumów..."), "name": MessageLookupByLibrary.simpleMessage("Nazwa"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "Nie można połączyć się z Ente, spróbuj ponownie po pewnym czasie. Jeśli błąd będzie się powtarzał, skontaktuj się z pomocą techniczną."), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index a628a8637b..d04357fef7 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -479,9 +479,12 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage("Colagem salva na galeria"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("Coletar fotos do evento"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Colete fotos"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Cor"), "confirm": MessageLookupByLibrary.simpleMessage("Confirme"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -673,7 +676,7 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Esvaziar"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Esvaziar a lixeira?"), - "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar mapa"), + "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar Mapa"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), "encryptingBackup": @@ -817,9 +820,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Conceder permissão"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("Agrupar fotos próximas"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Visão de convidado"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -1013,6 +1016,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Enviando arquivos para o álbum..."), "name": MessageLookupByLibrary.simpleMessage("Nome"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "Não foi possível conectar ao Ente, tente novamente após algum tempo. Se o erro persistir, entre em contato com o suporte."), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( @@ -1221,7 +1225,7 @@ class MessageLookup extends MessageLookupByLibrary { "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Indique amigos e 2x seu plano"), "referralStep1": MessageLookupByLibrary.simpleMessage( - "Envie esse código aos seus amigos"), + "1. Dê este código aos seus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Eles se inscrevem em um plano pago"), "referralStep3": m44, diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 506d3726f5..ad8859350c 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -478,10 +478,13 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Разметка"), "collageSaved": MessageLookupByLibrary.simpleMessage("Коллаж сохранен в галерее"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("Собрать фото события"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Собрать фотографии"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Цвет"), "confirm": MessageLookupByLibrary.simpleMessage("Подтвердить"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -1012,6 +1015,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Перемещение файлов в альбом..."), "name": MessageLookupByLibrary.simpleMessage("Имя"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "Не удается подключиться к Ente, пожалуйста, повторите попытку через некоторое время. Если ошибка не устраняется, обратитесь в службу поддержки."), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 481534b2c0..f199def316 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -476,10 +476,13 @@ class MessageLookup extends MessageLookupByLibrary { "collageLayout": MessageLookupByLibrary.simpleMessage("Düzen"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Kolajınız galeriye kaydedildi"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage( "Etkinlik fotoğraflarını topla"), "collectPhotos": MessageLookupByLibrary.simpleMessage("Fotoğrafları topla"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("Renk"), "confirm": MessageLookupByLibrary.simpleMessage("Onayla"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( @@ -1010,6 +1013,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Dosyalar albüme taşınıyor..."), "name": MessageLookupByLibrary.simpleMessage("İsim"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "Ente\'ye bağlanılamıyor. Lütfen bir süre sonra tekrar deneyin. Hata devam ederse lütfen desteğe başvurun."), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index f46ffc9fc4..8f4af88ab8 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -409,8 +409,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("协作者可以将照片和视频添加到共享相册中。"), "collageLayout": MessageLookupByLibrary.simpleMessage("布局"), "collageSaved": MessageLookupByLibrary.simpleMessage("拼贴已保存到相册"), + "collect": MessageLookupByLibrary.simpleMessage("Collect"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("收集活动照片"), "collectPhotos": MessageLookupByLibrary.simpleMessage("收集照片"), + "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Create a link where your friends can upload photos in original quality."), "color": MessageLookupByLibrary.simpleMessage("颜色"), "confirm": MessageLookupByLibrary.simpleMessage("确认"), "confirm2FADisable": @@ -834,6 +837,7 @@ class MessageLookup extends MessageLookupByLibrary { "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("正在将文件移动到相册..."), "name": MessageLookupByLibrary.simpleMessage("名称"), + "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( "无法连接到 Ente,请稍后重试。如果错误仍然存在,请联系支持人员。"), "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 7cb3716b4d..3aca2f894b 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9254,6 +9254,36 @@ class S { args: [], ); } + + /// `Name the album` + String get nameTheAlbum { + return Intl.message( + 'Name the album', + name: 'nameTheAlbum', + desc: '', + args: [], + ); + } + + /// `Create a link where your friends can upload photos in original quality.` + String get collectPhotosDescription { + return Intl.message( + 'Create a link where your friends can upload photos in original quality.', + name: 'collectPhotosDescription', + desc: '', + args: [], + ); + } + + /// `Collect` + String get collect { + return Intl.message( + 'Collect', + name: 'collect', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index f5991dd0b0..6c4188d4bb 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -54,5 +54,9 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotos": "Collect photos", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 0a16ed655e..803735c984 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1291,5 +1291,8 @@ "removePublicLinks": "Öffentliche Links entfernen", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Hiermit werden die öffentlichen Links aller ausgewählten schnellen Links entfernt.", "guestView": "Gastansicht", - "guestViewEnablePreSteps": "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen." + "guestViewEnablePreSteps": "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index f7f842f493..8bfe2d46c4 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1291,5 +1291,8 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 59affb44b2..086f630ed0 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1278,5 +1278,8 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 17aa27bab6..c8dae2b409 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1195,5 +1195,8 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 45188038fd..f12f7ecf21 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1157,5 +1157,8 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index f5991dd0b0..6c4188d4bb 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -54,5 +54,9 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotos": "Collect photos", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index a7105491da..1b5e26645f 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1292,5 +1292,8 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 2b6829f1f9..5105aadedf 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -68,5 +68,9 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotos": "Collect photos", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index f00e9ee34d..2495ceebad 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1291,5 +1291,8 @@ "removePublicLinks": "Usuń linki publiczne", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Spowoduje to usunięcie publicznych linków wszystkich zaznaczonych szybkich linków.", "guestView": "Widok gościa", - "guestViewEnablePreSteps": "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu." + "guestViewEnablePreSteps": "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index b1fe399716..28cad58f33 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1291,5 +1291,8 @@ "removePublicLinks": "Remover link público", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Isto removerá links públicos de todos os links rápidos selecionados.", "guestView": "Visão de convidado", - "guestViewEnablePreSteps": "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo." + "guestViewEnablePreSteps": "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index 60dc6271af..a0e3ece099 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1277,5 +1277,8 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index 0874270399..8f15f2fcd7 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1289,5 +1289,8 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 2055ef0322..aed261a76c 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1292,5 +1292,8 @@ "removePublicLinks": "删除公开链接", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "这将删除所有选定的快速链接的公共链接。", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "nameTheAlbum": "Name the album", + "collectPhotosDescription": "Create a link where your friends can upload photos in original quality.", + "collect": "Collect" } \ No newline at end of file diff --git a/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart index 46e816b407..7ace20a3b1 100644 --- a/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart +++ b/mobile/lib/ui/viewer/gallery/collect_photos_card_widget.dart @@ -1,5 +1,6 @@ import "package:figma_squircle/figma_squircle.dart"; import 'package:flutter/material.dart'; +import "package:photos/generated/l10n.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; @@ -73,14 +74,14 @@ class _CollectPhotosCardWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Collect photos", + S.of(context).collectPhotos, style: textTheme.bodyBold, ), const SizedBox( height: 16, ), Text( - "Create a link where your friends can upload photos in original quality.", + S.of(context).collectPhotosDescription, style: textTheme.smallMuted, ), const SizedBox( @@ -92,7 +93,7 @@ class _CollectPhotosCardWidgetState extends State { ButtonWidget( buttonType: ButtonType.primary, buttonSize: ButtonSize.small, - labelText: "Collect", + labelText: S.of(context).collect, icon: Icons.add_photo_alternate_outlined, shouldShowSuccessConfirmation: false, shouldSurfaceExecutionStates: false, diff --git a/mobile/lib/utils/collection_util.dart b/mobile/lib/utils/collection_util.dart index 0190c10624..1c3eec49d2 100644 --- a/mobile/lib/utils/collection_util.dart +++ b/mobile/lib/utils/collection_util.dart @@ -13,7 +13,7 @@ Future onTapCollectEventPhotos(BuildContext context) async { final String currentDate = DateFormat('MMMM d, yyyy').format(DateTime.now()); final result = await showTextInputDialog( context, - title: "Name the album", + title: S.of(context).nameTheAlbum, submitButtonLabel: S.of(context).create, hintText: S.of(context).enterAlbumName, alwaysShowSuccessState: false,