diff --git a/lib/constants/shared_preferences_keys.dart b/lib/constants/shared_preferences_keys.dart index f83665c..442c3d2 100644 --- a/lib/constants/shared_preferences_keys.dart +++ b/lib/constants/shared_preferences_keys.dart @@ -6,4 +6,5 @@ class SharedPreferencesKeys { static const useInAppBrowser = "useInAppBrowser"; static const showFavicon = "showFavicon"; static const openLinksBrowser = "openLinksBrowser"; + static const defaultTags = "defaultTags"; } diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 9215a72..0293c6a 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 3 -/// Strings: 591 (197 per locale) +/// Strings: 603 (201 per locale) /// -/// Built on 2024-06-11 at 16:25 UTC +/// Built on 2024-06-11 at 17:17 UTC // coverage:ignore-file // ignore_for_file: type=lint @@ -503,8 +503,7 @@ class _StringsSettingsGeneralSettingsEn { String get browserCustomTab => 'Browser custom tab'; String get systemBrowser => 'System browser'; String get tags => 'Tags'; - String get defaultTags => 'Default tags'; - String get defaultTagsDescription => 'Define a list of tags that will be added by default when creating a bookmark'; + late final _StringsSettingsGeneralSettingsDefaultTagsEn defaultTags = _StringsSettingsGeneralSettingsDefaultTagsEn._(_root); } // Path: settings.generalSettings.disconnectModal @@ -518,6 +517,21 @@ class _StringsSettingsGeneralSettingsDisconnectModalEn { String get description => 'Are you sure you want to disconnect from the server?\nYou will be redirected to the initial setup.'; } +// Path: settings.generalSettings.defaultTags +class _StringsSettingsGeneralSettingsDefaultTagsEn { + _StringsSettingsGeneralSettingsDefaultTagsEn._(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + String get defaultTags => 'Default tags'; + String get defaultTagsDescription => 'Define a list of tags that will be added by default when creating a bookmark'; + String get newTag => 'New tag'; + String get addTag => 'Add tag'; + String get removeThisTag => 'Remove this tag'; + String get noDefaultTags => 'There are no default tags'; +} + // Path: class _StringsEs implements Translations { /// You can call this constructor and build your own translation instance of this locale. @@ -896,8 +910,7 @@ class _StringsSettingsGeneralSettingsEs implements _StringsSettingsGeneralSettin @override String get browserCustomTab => 'Pestaña personalizada del navegador'; @override String get systemBrowser => 'Navegador del sistema'; @override String get tags => 'Etiquetas'; - @override String get defaultTags => 'Etiquetas por defecto'; - @override String get defaultTagsDescription => 'Define una lista de etiquetas que se añadirán por defecto al crear un marcador'; + @override late final _StringsSettingsGeneralSettingsDefaultTagsEs defaultTags = _StringsSettingsGeneralSettingsDefaultTagsEs._(_root); } // Path: settings.generalSettings.disconnectModal @@ -911,6 +924,21 @@ class _StringsSettingsGeneralSettingsDisconnectModalEs implements _StringsSettin @override String get description => '¿Estás seguro que deseas desconectarte del servidor?\nSerás redirigido a la configuración inicial.'; } +// Path: settings.generalSettings.defaultTags +class _StringsSettingsGeneralSettingsDefaultTagsEs implements _StringsSettingsGeneralSettingsDefaultTagsEn { + _StringsSettingsGeneralSettingsDefaultTagsEs._(this._root); + + @override final _StringsEs _root; // ignore: unused_field + + // Translations + @override String get defaultTags => 'Etiquetas por defecto'; + @override String get defaultTagsDescription => 'Define una lista de etiquetas que se añadirán por defecto al crear un marcador'; + @override String get newTag => 'Nueva etiqueta'; + @override String get addTag => 'Añadir etiqueta'; + @override String get removeThisTag => 'Eliminar esta etiqueta'; + @override String get noDefaultTags => 'No hay etiquetas por defecto'; +} + // Path: class _StringsTr implements Translations { /// You can call this constructor and build your own translation instance of this locale. @@ -1289,8 +1317,7 @@ class _StringsSettingsGeneralSettingsTr implements _StringsSettingsGeneralSettin @override String get browserCustomTab => 'Browser custom tab'; @override String get systemBrowser => 'System browser'; @override String get tags => 'Tags'; - @override String get defaultTags => 'Default tags'; - @override String get defaultTagsDescription => 'Define a list of tags that will be added by default when creating a bookmark'; + @override late final _StringsSettingsGeneralSettingsDefaultTagsTr defaultTags = _StringsSettingsGeneralSettingsDefaultTagsTr._(_root); } // Path: settings.generalSettings.disconnectModal @@ -1304,6 +1331,21 @@ class _StringsSettingsGeneralSettingsDisconnectModalTr implements _StringsSettin @override String get description => 'Sunucu bağlantısını kesmek istediğinizden emin misiniz?\nİlk kuruluma yönlendirileceksiniz.'; } +// Path: settings.generalSettings.defaultTags +class _StringsSettingsGeneralSettingsDefaultTagsTr implements _StringsSettingsGeneralSettingsDefaultTagsEn { + _StringsSettingsGeneralSettingsDefaultTagsTr._(this._root); + + @override final _StringsTr _root; // ignore: unused_field + + // Translations + @override String get defaultTags => 'Default tags'; + @override String get defaultTagsDescription => 'Define a list of tags that will be added by default when creating a bookmark'; + @override String get newTag => 'New tag'; + @override String get addTag => 'AddTag'; + @override String get removeThisTag => 'Remove this tag'; + @override String get noDefaultTags => 'There are no default tags'; +} + /// Flat map(s) containing all translations. /// Only for edge cases! For simple maps, use the map function of this library. @@ -1487,8 +1529,12 @@ extension on Translations { case 'settings.generalSettings.browserCustomTab': return 'Browser custom tab'; case 'settings.generalSettings.systemBrowser': return 'System browser'; case 'settings.generalSettings.tags': return 'Tags'; - case 'settings.generalSettings.defaultTags': return 'Default tags'; - case 'settings.generalSettings.defaultTagsDescription': return 'Define a list of tags that will be added by default when creating a bookmark'; + case 'settings.generalSettings.defaultTags.defaultTags': return 'Default tags'; + case 'settings.generalSettings.defaultTags.defaultTagsDescription': return 'Define a list of tags that will be added by default when creating a bookmark'; + case 'settings.generalSettings.defaultTags.newTag': return 'New tag'; + case 'settings.generalSettings.defaultTags.addTag': return 'Add tag'; + case 'settings.generalSettings.defaultTags.removeThisTag': return 'Remove this tag'; + case 'settings.generalSettings.defaultTags.noDefaultTags': return 'There are no default tags'; case 'webview.goBack': return 'Go back'; case 'webview.goForward': return 'Go forward'; case 'webview.reload': return 'Reload'; @@ -1692,8 +1738,12 @@ extension on _StringsEs { case 'settings.generalSettings.browserCustomTab': return 'Pestaña personalizada del navegador'; case 'settings.generalSettings.systemBrowser': return 'Navegador del sistema'; case 'settings.generalSettings.tags': return 'Etiquetas'; - case 'settings.generalSettings.defaultTags': return 'Etiquetas por defecto'; - case 'settings.generalSettings.defaultTagsDescription': return 'Define una lista de etiquetas que se añadirán por defecto al crear un marcador'; + case 'settings.generalSettings.defaultTags.defaultTags': return 'Etiquetas por defecto'; + case 'settings.generalSettings.defaultTags.defaultTagsDescription': return 'Define una lista de etiquetas que se añadirán por defecto al crear un marcador'; + case 'settings.generalSettings.defaultTags.newTag': return 'Nueva etiqueta'; + case 'settings.generalSettings.defaultTags.addTag': return 'Añadir etiqueta'; + case 'settings.generalSettings.defaultTags.removeThisTag': return 'Eliminar esta etiqueta'; + case 'settings.generalSettings.defaultTags.noDefaultTags': return 'No hay etiquetas por defecto'; case 'webview.goBack': return 'Ir atrás'; case 'webview.goForward': return 'Ir adelante'; case 'webview.reload': return 'Recargar'; @@ -1897,8 +1947,12 @@ extension on _StringsTr { case 'settings.generalSettings.browserCustomTab': return 'Browser custom tab'; case 'settings.generalSettings.systemBrowser': return 'System browser'; case 'settings.generalSettings.tags': return 'Tags'; - case 'settings.generalSettings.defaultTags': return 'Default tags'; - case 'settings.generalSettings.defaultTagsDescription': return 'Define a list of tags that will be added by default when creating a bookmark'; + case 'settings.generalSettings.defaultTags.defaultTags': return 'Default tags'; + case 'settings.generalSettings.defaultTags.defaultTagsDescription': return 'Define a list of tags that will be added by default when creating a bookmark'; + case 'settings.generalSettings.defaultTags.newTag': return 'New tag'; + case 'settings.generalSettings.defaultTags.addTag': return 'AddTag'; + case 'settings.generalSettings.defaultTags.removeThisTag': return 'Remove this tag'; + case 'settings.generalSettings.defaultTags.noDefaultTags': return 'There are no default tags'; case 'webview.goBack': return 'Geri dön'; case 'webview.goForward': return 'İleri git'; case 'webview.reload': return 'Yenile'; diff --git a/lib/i18n/strings_en.i18n.json b/lib/i18n/strings_en.i18n.json index 254685c..48fe04c 100644 --- a/lib/i18n/strings_en.i18n.json +++ b/lib/i18n/strings_en.i18n.json @@ -204,8 +204,14 @@ "browserCustomTab": "Browser custom tab", "systemBrowser": "System browser", "tags": "Tags", - "defaultTags": "Default tags", - "defaultTagsDescription": "Define a list of tags that will be added by default when creating a bookmark" + "defaultTags": { + "defaultTags": "Default tags", + "defaultTagsDescription": "Define a list of tags that will be added by default when creating a bookmark", + "newTag": "New tag", + "addTag": "Add tag", + "removeThisTag": "Remove this tag", + "noDefaultTags": "There are no default tags" + } } }, "webview": { diff --git a/lib/i18n/strings_es.i18n.json b/lib/i18n/strings_es.i18n.json index 94bcbe7..e7df134 100644 --- a/lib/i18n/strings_es.i18n.json +++ b/lib/i18n/strings_es.i18n.json @@ -204,8 +204,14 @@ "browserCustomTab": "Pestaña personalizada del navegador", "systemBrowser": "Navegador del sistema", "tags": "Etiquetas", - "defaultTags": "Etiquetas por defecto", - "defaultTagsDescription": "Define una lista de etiquetas que se añadirán por defecto al crear un marcador" + "defaultTags": { + "defaultTags": "Etiquetas por defecto", + "defaultTagsDescription": "Define una lista de etiquetas que se añadirán por defecto al crear un marcador", + "newTag": "Nueva etiqueta", + "addTag": "Añadir etiqueta", + "removeThisTag": "Eliminar esta etiqueta", + "noDefaultTags": "No hay etiquetas por defecto" + } } }, "webview": { diff --git a/lib/i18n/strings_tr.i18n.json b/lib/i18n/strings_tr.i18n.json index 5ff8388..1796117 100644 --- a/lib/i18n/strings_tr.i18n.json +++ b/lib/i18n/strings_tr.i18n.json @@ -204,8 +204,14 @@ "browserCustomTab": "Browser custom tab", "systemBrowser": "System browser", "tags": "Tags", - "defaultTags": "Default tags", - "defaultTagsDescription": "Define a list of tags that will be added by default when creating a bookmark" + "defaultTags": { + "defaultTags": "Default tags", + "defaultTagsDescription": "Define a list of tags that will be added by default when creating a bookmark", + "newTag": "New tag", + "addTag": "AddTag", + "removeThisTag": "Remove this tag", + "noDefaultTags": "There are no default tags" + } } }, "webview": { diff --git a/lib/models/providers_models/app_status.model.dart b/lib/models/providers_models/app_status.model.dart index 4a5ba59..1f5a9d3 100644 --- a/lib/models/providers_models/app_status.model.dart +++ b/lib/models/providers_models/app_status.model.dart @@ -7,6 +7,7 @@ class AppStatusModel { int selectedColor; OpenLinksBrowser openLinksBrowser; bool showFavicon; + List defaultTags; AppStatusModel({ this.selectedTheme = SelectedTheme.system, @@ -15,5 +16,6 @@ class AppStatusModel { this.selectedColor = 0, this.openLinksBrowser = OpenLinksBrowser.integrated, this.showFavicon = true, + required this.defaultTags, }); } diff --git a/lib/providers/app_status.provider.dart b/lib/providers/app_status.provider.dart index 756de14..61ef40b 100644 --- a/lib/providers/app_status.provider.dart +++ b/lib/providers/app_status.provider.dart @@ -23,6 +23,7 @@ class AppStatus extends _$AppStatus { OpenLinksBrowserExtension.fromString(sharedPreferences.getString(SharedPreferencesKeys.openLinksBrowser)) ?? OpenLinksBrowser.integrated, showFavicon: sharedPreferences.getBool(SharedPreferencesKeys.showFavicon) ?? true, + defaultTags: sharedPreferences.getStringList(SharedPreferencesKeys.defaultTags) ?? [], ); } @@ -61,6 +62,20 @@ class AppStatus extends _$AppStatus { ref.read(faviconStoreProvider.notifier).clearFavicons(); ref.notifyListeners(); } + + void addDefaultTag(String value) { + final newTags = [...state.defaultTags, value]; + state.defaultTags = newTags; + ref.read(sharedPreferencesProvider).setStringList(SharedPreferencesKeys.defaultTags, newTags); + ref.notifyListeners(); + } + + void removeDefaultTag(String value) { + final newTags = state.defaultTags.where((e) => e != value).toList(); + state.defaultTags = newTags; + ref.read(sharedPreferencesProvider).setStringList(SharedPreferencesKeys.defaultTags, newTags); + ref.notifyListeners(); + } } @riverpod diff --git a/lib/providers/app_status.provider.g.dart b/lib/providers/app_status.provider.g.dart index 732f9db..bbe08ef 100644 --- a/lib/providers/app_status.provider.g.dart +++ b/lib/providers/app_status.provider.g.dart @@ -21,7 +21,7 @@ final selectedThemeProvider = AutoDisposeProvider.internal( ); typedef SelectedThemeRef = AutoDisposeProviderRef; -String _$appStatusHash() => r'f9f4e14943668e49749dfb7e65b42add404e9e8e'; +String _$appStatusHash() => r'745dcff38d083afce16217c439f7667bda875a6d'; /// See also [AppStatus]. @ProviderFor(AppStatus) diff --git a/lib/router/paths.dart b/lib/router/paths.dart index 25922b6..007c4f3 100644 --- a/lib/router/paths.dart +++ b/lib/router/paths.dart @@ -9,5 +9,6 @@ class RoutesPaths { static const archivedBookmarks = "/bookmarks/archived"; static const settings = "/settings"; static const customization = "/settings/customization"; + static const defaultTags = "/settings/default-tags"; static const generalSettings = "/settings/general"; } diff --git a/lib/router/routes.dart b/lib/router/routes.dart index 388fb10..3929f54 100644 --- a/lib/router/routes.dart +++ b/lib/router/routes.dart @@ -5,6 +5,7 @@ import 'package:linkdy/router/names.dart'; import 'package:linkdy/screens/bookmarks/ui/bookmarks.dart'; import 'package:linkdy/screens/onboarding/ui/onboarding.dart'; import 'package:linkdy/screens/settings/ui/customization/customization.dart'; +import 'package:linkdy/screens/settings/ui/default_tags/default_tags.dart'; import 'package:linkdy/screens/settings/ui/general_settings/general_settings.dart'; import 'package:linkdy/screens/settings/ui/settings.dart'; import 'package:linkdy/screens/filtered_bookmarks/ui/filtered_bookmarks.dart'; @@ -60,6 +61,10 @@ final List appRoutes = [ path: RoutesPaths.customization, builder: (context, state) => const Customization(), ), + GoRoute( + path: RoutesPaths.defaultTags, + builder: (context, state) => const DefaultTagsScreen(), + ), GoRoute( path: RoutesPaths.generalSettings, builder: (context, state) => const GeneralSettings(), diff --git a/lib/screens/bookmarks/provider/bookmark_form.provider.g.dart b/lib/screens/bookmarks/provider/bookmark_form.provider.g.dart index 2753be9..66f7ffb 100644 --- a/lib/screens/bookmarks/provider/bookmark_form.provider.g.dart +++ b/lib/screens/bookmarks/provider/bookmark_form.provider.g.dart @@ -175,7 +175,7 @@ final getTagsProvider = ); typedef GetTagsRef = AutoDisposeFutureProviderRef>; -String _$bookmarkFormHash() => r'a89ab1d3b17c37f072e016d033a0adc26ed39748'; +String _$bookmarkFormHash() => r'9d99362f0234456b26e4ef16179455862b300fe4'; /// See also [BookmarkForm]. @ProviderFor(BookmarkForm) diff --git a/lib/screens/bookmarks/provider/bookmarks.provider.g.dart b/lib/screens/bookmarks/provider/bookmarks.provider.g.dart index 99ba59f..371357b 100644 --- a/lib/screens/bookmarks/provider/bookmarks.provider.g.dart +++ b/lib/screens/bookmarks/provider/bookmarks.provider.g.dart @@ -221,7 +221,7 @@ final bookmarksRequestLoadMoreProvider = ); typedef BookmarksRequestLoadMoreRef = AutoDisposeFutureProviderRef; -String _$bookmarksHash() => r'ed3a350dc6f4818adf146c1dab84005fec8c9be4'; +String _$bookmarksHash() => r'21cfb29298db2edcea8ce2b162e2f312972e9f3b'; /// See also [Bookmarks]. @ProviderFor(Bookmarks) diff --git a/lib/screens/bookmarks/provider/search_bookmarks.provider.g.dart b/lib/screens/bookmarks/provider/search_bookmarks.provider.g.dart index 5aee3b3..57c9aad 100644 --- a/lib/screens/bookmarks/provider/search_bookmarks.provider.g.dart +++ b/lib/screens/bookmarks/provider/search_bookmarks.provider.g.dart @@ -174,7 +174,7 @@ final fetchSearchBookmarksLoadMoreProvider = ); typedef FetchSearchBookmarksLoadMoreRef = AutoDisposeFutureProviderRef; -String _$searchBookmarksHash() => r'a70324693484f2c7731fcebf4df007443f1c30e9'; +String _$searchBookmarksHash() => r'545924de28fd2ce74b8c243db8dda33c5fd079a2'; /// See also [SearchBookmarks]. @ProviderFor(SearchBookmarks) diff --git a/lib/screens/bookmarks/ui/bookmark_form_modal.dart b/lib/screens/bookmarks/ui/bookmark_form_modal.dart index 1311dff..cfe5a2c 100644 --- a/lib/screens/bookmarks/ui/bookmark_form_modal.dart +++ b/lib/screens/bookmarks/ui/bookmark_form_modal.dart @@ -6,6 +6,7 @@ import 'package:linkdy/screens/bookmarks/provider/bookmark_form.provider.dart'; import 'package:linkdy/widgets/section_label.dart'; import 'package:linkdy/models/data/bookmarks.dart'; +import 'package:linkdy/providers/app_status.provider.dart'; import 'package:linkdy/config/sizes.dart'; import 'package:linkdy/i18n/strings.g.dart'; import 'package:linkdy/constants/global_keys.dart'; @@ -28,6 +29,9 @@ class BookmarkFormModal extends ConsumerStatefulWidget { class BookmarkFormModalState extends ConsumerState { @override void initState() { + if (widget.bookmark == null) { + ref.read(bookmarkFormProvider).tags = ref.read(appStatusProvider).defaultTags; + } if (widget.bookmark != null) { ref.read(bookmarkFormProvider.notifier).initializeProvider(widget.bookmark!); } @@ -362,6 +366,7 @@ class _ModalContent extends ConsumerWidget { separatorBuilder: (context, index) => const SizedBox(width: 8), itemBuilder: (context, index) => InputChip( label: Text(provider.tags[index]), + isEnabled: enabledFields, onDeleted: () => ref .read(bookmarkFormProvider.notifier) .setTags(provider.tags.where((tag) => tag != provider.tags[index]).toList()), diff --git a/lib/screens/filtered_bookmarks/provider/filtered_bookmarks.provider.g.dart b/lib/screens/filtered_bookmarks/provider/filtered_bookmarks.provider.g.dart index 7ec88c5..e8b0c83 100644 --- a/lib/screens/filtered_bookmarks/provider/filtered_bookmarks.provider.g.dart +++ b/lib/screens/filtered_bookmarks/provider/filtered_bookmarks.provider.g.dart @@ -7,7 +7,7 @@ part of 'filtered_bookmarks.provider.dart'; // ************************************************************************** String _$tagBookmarksRequestHash() => - r'abcde0e4ef3aecf21708a24573ddd4279211e288'; + r'795205672ccd02914dbb2e15dbcf93bac94c645c'; /// Copied from Dart SDK class _SystemHash { @@ -372,7 +372,7 @@ final filteredBookmarksRequestLoadMoreProvider = typedef FilteredBookmarksRequestLoadMoreRef = AutoDisposeFutureProviderRef; -String _$filteredBookmarksHash() => r'2239ac5e2eb27ffee118a5c513f191702faea8de'; +String _$filteredBookmarksHash() => r'8f5229e1bb6b0d50c7df4fcb6c3ef6c2aab898af'; /// See also [FilteredBookmarks]. @ProviderFor(FilteredBookmarks) diff --git a/lib/screens/onboarding/provider/connect.provider.g.dart b/lib/screens/onboarding/provider/connect.provider.g.dart index bb28578..eb338d2 100644 --- a/lib/screens/onboarding/provider/connect.provider.g.dart +++ b/lib/screens/onboarding/provider/connect.provider.g.dart @@ -21,7 +21,7 @@ final connectToServerProvider = AutoDisposeFutureProvider.internal( ); typedef ConnectToServerRef = AutoDisposeFutureProviderRef; -String _$connectHash() => r'5382c9c95131bf263662799f30d2c131a548a8c5'; +String _$connectHash() => r'15405d136ca9517c557e6a3e021a882213ee3be2'; /// See also [Connect]. @ProviderFor(Connect) diff --git a/lib/screens/settings/ui/default_tags/default_tags.dart b/lib/screens/settings/ui/default_tags/default_tags.dart new file mode 100644 index 0000000..6c3e15a --- /dev/null +++ b/lib/screens/settings/ui/default_tags/default_tags.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +import 'package:linkdy/i18n/strings.g.dart'; +import 'package:linkdy/providers/app_status.provider.dart'; + +class DefaultTagsScreen extends ConsumerStatefulWidget { + const DefaultTagsScreen({super.key}); + + @override + DefaultTagsScreenState createState() => DefaultTagsScreenState(); +} + +class DefaultTagsScreenState extends ConsumerState { + final _newTagController = TextEditingController(); + bool _addEnabled = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: NestedScrollView( + headerSliverBuilder: (context, innerBoxIsScrolled) => [ + SliverOverlapAbsorber( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + sliver: SliverAppBar.large( + pinned: true, + floating: true, + centerTitle: false, + forceElevated: innerBoxIsScrolled, + title: Text(t.settings.generalSettings.defaultTags.defaultTags), + ), + ), + ], + body: SafeArea( + top: false, + bottom: false, + child: Builder( + builder: (context) => CustomScrollView( + slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + ), + SliverList.list( + children: [ + if (ref.watch(appStatusProvider).defaultTags.isNotEmpty) + ...ref.watch(appStatusProvider).defaultTags.map( + (tag) => ListTile( + title: Text(tag), + trailing: IconButton( + onPressed: () => ref.read(appStatusProvider.notifier).removeDefaultTag(tag), + icon: const Icon(Icons.delete_rounded), + tooltip: t.settings.generalSettings.defaultTags.removeThisTag, + ), + ), + ), + if (ref.watch(appStatusProvider).defaultTags.isEmpty) + Padding( + padding: const EdgeInsets.all(16), + child: Center( + child: Text( + t.settings.generalSettings.defaultTags.noDefaultTags, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: Row( + children: [ + Expanded( + child: TextFormField( + controller: _newTagController, + onChanged: (v) => setState(() => v != "" ? _addEnabled = true : _addEnabled = false), + autocorrect: false, + textCapitalization: TextCapitalization.none, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.sell_rounded), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(10), + ), + ), + labelText: t.settings.generalSettings.defaultTags.newTag, + ), + onFieldSubmitted: (value) { + ref.read(appStatusProvider.notifier).addDefaultTag(value); + setState(() { + _newTagController.text = ""; + _addEnabled = false; + }); + }, + ), + ), + const SizedBox(width: 16), + IconButton( + onPressed: _addEnabled + ? () { + ref.read(appStatusProvider.notifier).addDefaultTag(_newTagController.text); + setState(() { + _newTagController.text = ""; + _addEnabled = false; + }); + } + : null, + icon: const Icon(Icons.add_rounded), + tooltip: t.settings.generalSettings.defaultTags.addTag, + ), + const SizedBox(width: 8), + ], + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/screens/settings/ui/general_settings/general_settings.dart b/lib/screens/settings/ui/general_settings/general_settings.dart index f869007..a2dad48 100644 --- a/lib/screens/settings/ui/general_settings/general_settings.dart +++ b/lib/screens/settings/ui/general_settings/general_settings.dart @@ -5,6 +5,8 @@ import 'package:linkdy/screens/settings/ui/general_settings/browser_mode_selecti import 'package:linkdy/screens/settings/ui/general_settings/disconnect_modal.dart'; import 'package:linkdy/widgets/section_label.dart'; +import 'package:linkdy/router/paths.dart'; +import 'package:linkdy/providers/router.provider.dart'; import 'package:linkdy/i18n/strings.g.dart'; import 'package:linkdy/providers/app_status.provider.dart'; import 'package:linkdy/constants/enums.dart'; @@ -71,8 +73,9 @@ class GeneralSettings extends ConsumerWidget { ), SectionLabel(label: t.settings.generalSettings.tags), ListTile( - title: Text(t.settings.generalSettings.defaultTags), - subtitle: Text(t.settings.generalSettings.defaultTagsDescription), + title: Text(t.settings.generalSettings.defaultTags.defaultTags), + subtitle: Text(t.settings.generalSettings.defaultTags.defaultTagsDescription), + onTap: () => ref.watch(routerProvider).push(RoutesPaths.defaultTags), ), const Padding( padding: EdgeInsets.symmetric(vertical: 16),