From 56c12e3828a071bc97263558c125064fb8bb5b8f Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Fri, 23 Feb 2024 16:12:15 +0100 Subject: [PATCH] Add bookmark request --- lib/models/data/post_bookmark.dart | 29 ++++ .../links/provider/add_link.provider.dart | 37 +++++ .../links/provider/add_link.provider.g.dart | 132 +++++++++++++++++- lib/screens/links/ui/add_link_modal.dart | 2 +- lib/services/api_client.dart | 16 +++ 5 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 lib/models/data/post_bookmark.dart diff --git a/lib/models/data/post_bookmark.dart b/lib/models/data/post_bookmark.dart new file mode 100644 index 0000000..042d9ed --- /dev/null +++ b/lib/models/data/post_bookmark.dart @@ -0,0 +1,29 @@ +class PostBookmark { + final String url; + final String title; + final String description; + final bool isArchived; + final bool unread; + final bool shared; + final List tagNames; + + const PostBookmark({ + required this.url, + required this.title, + required this.description, + required this.isArchived, + required this.unread, + required this.shared, + required this.tagNames, + }); + + Map toJson() => { + "url": url, + "title": title, + "description": description, + "isArchived": isArchived, + "unread": unread, + "shared": shared, + "tagNames": tagNames, + }; +} diff --git a/lib/screens/links/provider/add_link.provider.dart b/lib/screens/links/provider/add_link.provider.dart index a88bbeb..2277d95 100644 --- a/lib/screens/links/provider/add_link.provider.dart +++ b/lib/screens/links/provider/add_link.provider.dart @@ -1,9 +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/provider/links.provider.dart'; import 'package:linkdy/screens/links/model/add_link.model.dart'; +import 'package:linkdy/models/data/post_bookmark.dart'; +import 'package:linkdy/providers/router_provider.dart'; +import 'package:linkdy/models/data/bookmarks.dart'; import 'package:linkdy/constants/enums.dart'; import 'package:linkdy/constants/regexp.dart'; import 'package:linkdy/models/api_response.dart'; @@ -18,6 +23,12 @@ Future> checkBookmark(CheckBookmarkRef ref, String ur return result; } +@riverpod +FutureOr> addBookmark(AddBookmarkRef ref, PostBookmark newBookmark) async { + final result = await ref.watch(apiClientProviderProvider)!.fetchPostBookmark(newBookmark); + return result; +} + @riverpod class AddLink extends _$AddLink { @override @@ -63,4 +74,30 @@ class AddLink extends _$AddLink { state.markAsUnread = value; ref.notifyListeners(); } + + void addBookmark() async { + final newBookmark = PostBookmark( + url: state.urlController.text, + title: state.titleController.text != "" ? state.titleController.text : state.checkBookmark?.metadata?.title ?? '', + description: state.descriptionController.text != "" + ? state.descriptionController.text + : state.checkBookmark?.metadata?.description ?? '', + isArchived: false, + unread: state.markAsUnread, + shared: false, + tagNames: [], + ); + print(newBookmark.toJson()); + final result = await ref.watch(addBookmarkProvider(newBookmark).future); + print(result.content); + if (result.successful == true) { + ref.invalidate(linksRequestProvider); + ref.watch(routerProvider).pop(); + } else { + showSnacbkar( + label: "Add bookmark failed", + color: Colors.red, + ); + } + } } diff --git a/lib/screens/links/provider/add_link.provider.g.dart b/lib/screens/links/provider/add_link.provider.g.dart index f6f596b..f396359 100644 --- a/lib/screens/links/provider/add_link.provider.g.dart +++ b/lib/screens/links/provider/add_link.provider.g.dart @@ -160,7 +160,137 @@ class _CheckBookmarkProviderElement String get url => (origin as CheckBookmarkProvider).url; } -String _$addLinkHash() => r'd971275978e113b16d1bc34a2370d9d3feba60b5'; +String _$addBookmarkHash() => r'94d54330832874c142e417df21522f5faac27f9e'; + +/// See also [addBookmark]. +@ProviderFor(addBookmark) +const addBookmarkProvider = AddBookmarkFamily(); + +/// See also [addBookmark]. +class AddBookmarkFamily extends Family>> { + /// See also [addBookmark]. + const AddBookmarkFamily(); + + /// See also [addBookmark]. + AddBookmarkProvider call( + PostBookmark newBookmark, + ) { + return AddBookmarkProvider( + newBookmark, + ); + } + + @override + AddBookmarkProvider getProviderOverride( + covariant AddBookmarkProvider provider, + ) { + return call( + provider.newBookmark, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'addBookmarkProvider'; +} + +/// See also [addBookmark]. +class AddBookmarkProvider + extends AutoDisposeFutureProvider> { + /// See also [addBookmark]. + AddBookmarkProvider( + PostBookmark newBookmark, + ) : this._internal( + (ref) => addBookmark( + ref as AddBookmarkRef, + newBookmark, + ), + from: addBookmarkProvider, + name: r'addBookmarkProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$addBookmarkHash, + dependencies: AddBookmarkFamily._dependencies, + allTransitiveDependencies: + AddBookmarkFamily._allTransitiveDependencies, + newBookmark: newBookmark, + ); + + AddBookmarkProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.newBookmark, + }) : super.internal(); + + final PostBookmark newBookmark; + + @override + Override overrideWith( + FutureOr> Function(AddBookmarkRef provider) create, + ) { + return ProviderOverride( + origin: this, + override: AddBookmarkProvider._internal( + (ref) => create(ref as AddBookmarkRef), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + newBookmark: newBookmark, + ), + ); + } + + @override + AutoDisposeFutureProviderElement> createElement() { + return _AddBookmarkProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is AddBookmarkProvider && other.newBookmark == newBookmark; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, newBookmark.hashCode); + + return _SystemHash.finish(hash); + } +} + +mixin AddBookmarkRef on AutoDisposeFutureProviderRef> { + /// The parameter `newBookmark` of this provider. + PostBookmark get newBookmark; +} + +class _AddBookmarkProviderElement + extends AutoDisposeFutureProviderElement> + with AddBookmarkRef { + _AddBookmarkProviderElement(super.provider); + + @override + PostBookmark get newBookmark => (origin as AddBookmarkProvider).newBookmark; +} + +String _$addLinkHash() => r'0e9fcd2cca9fa5e195072163a11ae09b7bbe903a'; /// See also [AddLink]. @ProviderFor(AddLink) diff --git a/lib/screens/links/ui/add_link_modal.dart b/lib/screens/links/ui/add_link_modal.dart index dfc5cd7..5e01006 100644 --- a/lib/screens/links/ui/add_link_modal.dart +++ b/lib/screens/links/ui/add_link_modal.dart @@ -246,7 +246,7 @@ class AddLinkModalState extends ConsumerState with SingleTickerPro ), if (provider.checkBookmark != null) TextButton( - onPressed: () => Navigator.pop(context), + onPressed: ref.read(addLinkProvider.notifier).addBookmark, child: Text(t.generic.confirm), ), ], diff --git a/lib/services/api_client.dart b/lib/services/api_client.dart index efe628f..8d6c9cc 100644 --- a/lib/services/api_client.dart +++ b/lib/services/api_client.dart @@ -3,6 +3,7 @@ import 'package:dio/dio.dart'; import 'package:linkdy/models/api_response.dart'; import 'package:linkdy/models/data/bookmarks.dart'; import 'package:linkdy/models/data/check_bookmark.dart'; +import 'package:linkdy/models/data/post_bookmark.dart'; import 'package:linkdy/models/server_instance.dart'; class ApiClient { @@ -58,4 +59,19 @@ class ApiClient { return const ApiResponse(successful: false); } } + + Future> fetchPostBookmark(PostBookmark bookmark) async { + try { + final response = await dioInstance.post( + "/bookmarks/", + data: FormData.fromMap(bookmark.toJson()), + ); + return ApiResponse( + successful: true, + content: Bookmark.fromJson(response.data), + ); + } catch (e, stackTrace) { + return const ApiResponse(successful: false); + } + } }