Added default tags

This commit is contained in:
Juan Gilsanz Polo
2024-06-11 19:27:11 +02:00
parent bfaa8bf356
commit 9765dfeea5
18 changed files with 259 additions and 29 deletions

View File

@@ -175,7 +175,7 @@ final getTagsProvider =
);
typedef GetTagsRef = AutoDisposeFutureProviderRef<ApiResponse<TagsResponse>>;
String _$bookmarkFormHash() => r'a89ab1d3b17c37f072e016d033a0adc26ed39748';
String _$bookmarkFormHash() => r'9d99362f0234456b26e4ef16179455862b300fe4';
/// See also [BookmarkForm].
@ProviderFor(BookmarkForm)

View File

@@ -221,7 +221,7 @@ final bookmarksRequestLoadMoreProvider =
);
typedef BookmarksRequestLoadMoreRef = AutoDisposeFutureProviderRef<void>;
String _$bookmarksHash() => r'ed3a350dc6f4818adf146c1dab84005fec8c9be4';
String _$bookmarksHash() => r'21cfb29298db2edcea8ce2b162e2f312972e9f3b';
/// See also [Bookmarks].
@ProviderFor(Bookmarks)

View File

@@ -174,7 +174,7 @@ final fetchSearchBookmarksLoadMoreProvider =
);
typedef FetchSearchBookmarksLoadMoreRef = AutoDisposeFutureProviderRef<void>;
String _$searchBookmarksHash() => r'a70324693484f2c7731fcebf4df007443f1c30e9';
String _$searchBookmarksHash() => r'545924de28fd2ce74b8c243db8dda33c5fd079a2';
/// See also [SearchBookmarks].
@ProviderFor(SearchBookmarks)

View File

@@ -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<BookmarkFormModal> {
@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()),

View File

@@ -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<void>;
String _$filteredBookmarksHash() => r'2239ac5e2eb27ffee118a5c513f191702faea8de';
String _$filteredBookmarksHash() => r'8f5229e1bb6b0d50c7df4fcb6c3ef6c2aab898af';
/// See also [FilteredBookmarks].
@ProviderFor(FilteredBookmarks)

View File

@@ -21,7 +21,7 @@ final connectToServerProvider = AutoDisposeFutureProvider<bool>.internal(
);
typedef ConnectToServerRef = AutoDisposeFutureProviderRef<bool>;
String _$connectHash() => r'5382c9c95131bf263662799f30d2c131a548a8c5';
String _$connectHash() => r'15405d136ca9517c557e6a3e021a882213ee3be2';
/// See also [Connect].
@ProviderFor(Connect)

View File

@@ -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<DefaultTagsScreen> {
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),
],
),
),
],
),
],
),
),
),
),
);
}
}

View File

@@ -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),