diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 049edf4..e36730d 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 2 -/// Strings: 150 (75 per locale) +/// Strings: 162 (81 per locale) /// -/// Built on 2024-02-23 at 14:24 UTC +/// Built on 2024-02-23 at 17:01 UTC // coverage:ignore-file // ignore_for_file: type=lint @@ -168,6 +168,8 @@ class _StringsGenericEn { String get cancel => 'Cancel'; String get next => 'Next'; String get save => 'Save'; + String get close => 'Close'; + String get error => 'Error'; } // Path: onboarding @@ -302,6 +304,10 @@ class _StringsLinksAddLinkEn { String get markAsUnread => 'Mark as unread'; String get notes => 'Notes'; String get addNotes => 'Add notes'; + String get savingLink => 'Saving link...'; + String get errorSavingLink => 'An error occured when saving the new link.'; + String get leaveEmptyUseWebsiteTitle => 'Leave empty to use the website\'s title.'; + String get leaveEmptyUseWebsiteDescription => 'Leave empty to use the website\'s description.'; } // Path: settings.customization @@ -389,6 +395,8 @@ class _StringsGenericEs implements _StringsGenericEn { @override String get cancel => 'Cancelar'; @override String get next => 'Siguiente'; @override String get save => 'Guardar'; + @override String get close => 'Cerrar'; + @override String get error => 'Error'; } // Path: onboarding @@ -523,6 +531,10 @@ class _StringsLinksAddLinkEs implements _StringsLinksAddLinkEn { @override String get markAsUnread => 'Marcar como no leído'; @override String get notes => 'Notas'; @override String get addNotes => 'Añadir notas'; + @override String get savingLink => 'Guardando enlace...'; + @override String get errorSavingLink => 'Ocurrió un error al guardar el nuevo enlace.'; + @override String get leaveEmptyUseWebsiteTitle => 'Dejar vacío para usar el título del sitio web.'; + @override String get leaveEmptyUseWebsiteDescription => 'Dejar vacío para usar la descripción del sitio web.'; } // Path: settings.customization @@ -576,6 +588,8 @@ extension on Translations { case 'generic.cancel': return 'Cancel'; case 'generic.next': return 'Next'; case 'generic.save': return 'Save'; + case 'generic.close': return 'Close'; + case 'generic.error': return 'Error'; case 'onboarding.title': return 'Welcome to Linkdy'; case 'onboarding.subtitle': return 'An application to manage your bookmarks.'; case 'onboarding.start': return 'Start'; @@ -608,6 +622,10 @@ extension on Translations { case 'links.addLink.markAsUnread': return 'Mark as unread'; case 'links.addLink.notes': return 'Notes'; case 'links.addLink.addNotes': return 'Add notes'; + case 'links.addLink.savingLink': return 'Saving link...'; + case 'links.addLink.errorSavingLink': return 'An error occured when saving the new link.'; + case 'links.addLink.leaveEmptyUseWebsiteTitle': return 'Leave empty to use the website\'s title.'; + case 'links.addLink.leaveEmptyUseWebsiteDescription': return 'Leave empty to use the website\'s description.'; case 'search.search': return 'Search'; case 'settings.settings': return 'Settings'; case 'settings.appSettings': return 'App settings'; @@ -659,6 +677,8 @@ extension on _StringsEs { case 'generic.cancel': return 'Cancelar'; case 'generic.next': return 'Siguiente'; case 'generic.save': return 'Guardar'; + case 'generic.close': return 'Cerrar'; + case 'generic.error': return 'Error'; case 'onboarding.title': return 'Bienvenido a Linkdy'; case 'onboarding.subtitle': return 'Una aplicación para gestionar tus enlaces favoritos.'; case 'onboarding.start': return 'Comenzar'; @@ -691,6 +711,10 @@ extension on _StringsEs { case 'links.addLink.markAsUnread': return 'Marcar como no leído'; case 'links.addLink.notes': return 'Notas'; case 'links.addLink.addNotes': return 'Añadir notas'; + case 'links.addLink.savingLink': return 'Guardando enlace...'; + case 'links.addLink.errorSavingLink': return 'Ocurrió un error al guardar el nuevo enlace.'; + case 'links.addLink.leaveEmptyUseWebsiteTitle': return 'Dejar vacío para usar el título del sitio web.'; + case 'links.addLink.leaveEmptyUseWebsiteDescription': return 'Dejar vacío para usar la descripción del sitio web.'; case 'search.search': return 'Buscar'; case 'settings.settings': return 'Ajustes'; case 'settings.appSettings': return 'Ajustes de la aplicación'; diff --git a/lib/i18n/strings_en.i18n.json b/lib/i18n/strings_en.i18n.json index ea5a14e..e332de1 100644 --- a/lib/i18n/strings_en.i18n.json +++ b/lib/i18n/strings_en.i18n.json @@ -3,7 +3,9 @@ "confirm": "Confirm", "cancel": "Cancel", "next": "Next", - "save": "Save" + "save": "Save", + "close": "Close", + "error": "Error" }, "onboarding": { "title": "Welcome to Linkdy", @@ -42,7 +44,11 @@ "description": "Description", "markAsUnread": "Mark as unread", "notes": "Notes", - "addNotes": "Add notes" + "addNotes": "Add notes", + "savingLink": "Saving link...", + "errorSavingLink": "An error occured when saving the new link.", + "leaveEmptyUseWebsiteTitle": "Leave empty to use the website's title.", + "leaveEmptyUseWebsiteDescription": "Leave empty to use the website's description." } }, "search": { diff --git a/lib/i18n/strings_es.i18n.json b/lib/i18n/strings_es.i18n.json index e911c4f..73206f6 100644 --- a/lib/i18n/strings_es.i18n.json +++ b/lib/i18n/strings_es.i18n.json @@ -3,7 +3,9 @@ "confirm": "Confirmar", "cancel": "Cancelar", "next": "Siguiente", - "save": "Guardar" + "save": "Guardar", + "close": "Cerrar", + "error": "Error" }, "onboarding": { "title": "Bienvenido a Linkdy", @@ -42,7 +44,11 @@ "description": "Description", "markAsUnread": "Marcar como no leído", "notes": "Notas", - "addNotes": "Añadir notas" + "addNotes": "Añadir notas", + "savingLink": "Guardando enlace...", + "errorSavingLink": "Ocurrió un error al guardar el nuevo enlace.", + "leaveEmptyUseWebsiteTitle": "Dejar vacío para usar el título del sitio web.", + "leaveEmptyUseWebsiteDescription": "Dejar vacío para usar la descripción del sitio web." } }, "search": { diff --git a/lib/screens/links/provider/add_link.provider.dart b/lib/screens/links/provider/add_link.provider.dart index 2277d95..62f2226 100644 --- a/lib/screens/links/provider/add_link.provider.dart +++ b/lib/screens/links/provider/add_link.provider.dart @@ -1,11 +1,14 @@ import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; -import 'package:linkdy/utils/snackbar.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:linkdy/screens/links/ui/error_save_link.dart'; import 'package:linkdy/screens/links/provider/links.provider.dart'; import 'package:linkdy/screens/links/model/add_link.model.dart'; +import 'package:linkdy/i18n/strings.g.dart'; +import 'package:linkdy/router/routes.dart'; +import 'package:linkdy/utils/process_modal.dart'; import 'package:linkdy/models/data/post_bookmark.dart'; import 'package:linkdy/providers/router_provider.dart'; import 'package:linkdy/models/data/bookmarks.dart'; @@ -87,16 +90,21 @@ class AddLink extends _$AddLink { shared: false, tagNames: [], ); - print(newBookmark.toJson()); + + final processModal = ProcessModal(); + processModal.open(t.links.addLink.savingLink); + final result = await ref.watch(addBookmarkProvider(newBookmark).future); - print(result.content); + + processModal.close(); + if (result.successful == true) { ref.invalidate(linksRequestProvider); ref.watch(routerProvider).pop(); } else { - showSnacbkar( - label: "Add bookmark failed", - color: Colors.red, + showDialog( + context: rootNavigatorKey.currentContext!, + builder: (context) => const ErrorSaveLink(), ); } } diff --git a/lib/screens/links/ui/add_link_modal.dart b/lib/screens/links/ui/add_link_modal.dart index 5e01006..a8d7d02 100644 --- a/lib/screens/links/ui/add_link_modal.dart +++ b/lib/screens/links/ui/add_link_modal.dart @@ -107,7 +107,10 @@ class AddLinkModalState extends ConsumerState with SingleTickerPro ), ), if (provider.checkBookmark != null) ...[ - const SizedBox(height: 24), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 16), + child: Divider(), + ), Padding( padding: const EdgeInsets.symmetric(horizontal: 24), child: TextFormField( @@ -125,6 +128,7 @@ class AddLinkModalState extends ConsumerState with SingleTickerPro labelText: t.links.addLink.title, hintText: provider.checkBookmark?.metadata?.title, floatingLabelBehavior: FloatingLabelBehavior.always, + helperText: t.links.addLink.leaveEmptyUseWebsiteTitle, ), ), ), @@ -146,6 +150,7 @@ class AddLinkModalState extends ConsumerState with SingleTickerPro labelText: t.links.addLink.description, hintText: provider.checkBookmark?.metadata?.description, floatingLabelBehavior: FloatingLabelBehavior.always, + helperText: t.links.addLink.leaveEmptyUseWebsiteDescription, ), ), ), diff --git a/lib/screens/links/ui/error_save_link.dart b/lib/screens/links/ui/error_save_link.dart new file mode 100644 index 0000000..bea20fc --- /dev/null +++ b/lib/screens/links/ui/error_save_link.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +import 'package:linkdy/i18n/strings.g.dart'; + +class ErrorSaveLink extends StatelessWidget { + const ErrorSaveLink({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.generic.error), + content: Text(t.links.addLink.errorSavingLink), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(t.generic.close), + ), + ], + ), + ], + ); + } +}