From 1e4f4919b6e4253a6011641e67973d203ef3272f Mon Sep 17 00:00:00 2001 From: poppingmoon <63451158+poppingmoon@users.noreply.github.com> Date: Thu, 25 Apr 2024 04:31:43 +0900 Subject: [PATCH] fix: hide deleted notes Changed the type of state of `NotesNotifier` to `Map`. When receiving `deleted` events, set values responsible for the ids of deleted notes to `null`. If notes are deleted, show blank widgets instead of errors. --- lib/provider/id_notifier_provider.dart | 22 ---- lib/provider/note_is_deleted_provider.dart | 14 +++ ...g.dart => note_is_deleted_provider.g.dart} | 112 +++++++++--------- lib/provider/notes_notifier_provider.dart | 9 +- lib/provider/notes_notifier_provider.g.dart | 18 +-- lib/view/widget/timeline_note.dart | 5 + 6 files changed, 91 insertions(+), 89 deletions(-) delete mode 100644 lib/provider/id_notifier_provider.dart create mode 100644 lib/provider/note_is_deleted_provider.dart rename lib/provider/{id_notifier_provider.g.dart => note_is_deleted_provider.g.dart} (54%) diff --git a/lib/provider/id_notifier_provider.dart b/lib/provider/id_notifier_provider.dart deleted file mode 100644 index a1b7a2433..000000000 --- a/lib/provider/id_notifier_provider.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:riverpod_annotation/riverpod_annotation.dart'; - -import '../model/account.dart'; -import '../model/id.dart'; -import 'notes_notifier_provider.dart'; - -part 'id_notifier_provider.g.dart'; - -@Riverpod(keepAlive: true) -class IdNotifier extends _$IdNotifier { - @override - IdGenMethod build(Account account) { - final id = ref.watch( - notesNotifierProvider(account).select((notes) => notes.values.first.id), - ); - return Id.parse(id).method; - } - - String genId(DateTime date) { - return Id(method: state, date: date).toString(); - } -} diff --git a/lib/provider/note_is_deleted_provider.dart b/lib/provider/note_is_deleted_provider.dart new file mode 100644 index 000000000..40c828a0c --- /dev/null +++ b/lib/provider/note_is_deleted_provider.dart @@ -0,0 +1,14 @@ +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +import '../model/account.dart'; +import 'notes_notifier_provider.dart'; + +part 'note_is_deleted_provider.g.dart'; + +@riverpod +bool noteIsDeleted(NoteIsDeletedRef ref, Account account, String noteId) { + return ref.watch( + notesNotifierProvider(account) + .select((notes) => notes.containsKey(noteId) && notes[noteId] == null), + ); +} diff --git a/lib/provider/id_notifier_provider.g.dart b/lib/provider/note_is_deleted_provider.g.dart similarity index 54% rename from lib/provider/id_notifier_provider.g.dart rename to lib/provider/note_is_deleted_provider.g.dart index e08b21714..22ce27f94 100644 --- a/lib/provider/id_notifier_provider.g.dart +++ b/lib/provider/note_is_deleted_provider.g.dart @@ -1,12 +1,12 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'id_notifier_provider.dart'; +part of 'note_is_deleted_provider.dart'; // ************************************************************************** // RiverpodGenerator // ************************************************************************** -String _$idNotifierHash() => r'59836ed737b6ca6901c6bd851d439cec02eadc19'; +String _$noteIsDeletedHash() => r'3a3589cbe9e6b2310a2d17abd67c60f654229744'; /// Copied from Dart SDK class _SystemHash { @@ -29,38 +29,33 @@ class _SystemHash { } } -abstract class _$IdNotifier extends BuildlessNotifier { - late final Account account; +/// See also [noteIsDeleted]. +@ProviderFor(noteIsDeleted) +const noteIsDeletedProvider = NoteIsDeletedFamily(); - IdGenMethod build( - Account account, - ); -} - -/// See also [IdNotifier]. -@ProviderFor(IdNotifier) -const idNotifierProvider = IdNotifierFamily(); +/// See also [noteIsDeleted]. +class NoteIsDeletedFamily extends Family { + /// See also [noteIsDeleted]. + const NoteIsDeletedFamily(); -/// See also [IdNotifier]. -class IdNotifierFamily extends Family { - /// See also [IdNotifier]. - const IdNotifierFamily(); - - /// See also [IdNotifier]. - IdNotifierProvider call( + /// See also [noteIsDeleted]. + NoteIsDeletedProvider call( Account account, + String noteId, ) { - return IdNotifierProvider( + return NoteIsDeletedProvider( account, + noteId, ); } @override - IdNotifierProvider getProviderOverride( - covariant IdNotifierProvider provider, + NoteIsDeletedProvider getProviderOverride( + covariant NoteIsDeletedProvider provider, ) { return call( provider.account, + provider.noteId, ); } @@ -76,29 +71,35 @@ class IdNotifierFamily extends Family { _allTransitiveDependencies; @override - String? get name => r'idNotifierProvider'; + String? get name => r'noteIsDeletedProvider'; } -/// See also [IdNotifier]. -class IdNotifierProvider extends NotifierProviderImpl { - /// See also [IdNotifier]. - IdNotifierProvider( +/// See also [noteIsDeleted]. +class NoteIsDeletedProvider extends AutoDisposeProvider { + /// See also [noteIsDeleted]. + NoteIsDeletedProvider( Account account, + String noteId, ) : this._internal( - () => IdNotifier()..account = account, - from: idNotifierProvider, - name: r'idNotifierProvider', + (ref) => noteIsDeleted( + ref as NoteIsDeletedRef, + account, + noteId, + ), + from: noteIsDeletedProvider, + name: r'noteIsDeletedProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null - : _$idNotifierHash, - dependencies: IdNotifierFamily._dependencies, + : _$noteIsDeletedHash, + dependencies: NoteIsDeletedFamily._dependencies, allTransitiveDependencies: - IdNotifierFamily._allTransitiveDependencies, + NoteIsDeletedFamily._allTransitiveDependencies, account: account, + noteId: noteId, ); - IdNotifierProvider._internal( + NoteIsDeletedProvider._internal( super._createNotifier, { required super.name, required super.dependencies, @@ -106,66 +107,69 @@ class IdNotifierProvider extends NotifierProviderImpl { required super.debugGetCreateSourceHash, required super.from, required this.account, + required this.noteId, }) : super.internal(); final Account account; + final String noteId; @override - IdGenMethod runNotifierBuild( - covariant IdNotifier notifier, + Override overrideWith( + bool Function(NoteIsDeletedRef provider) create, ) { - return notifier.build( - account, - ); - } - - @override - Override overrideWith(IdNotifier Function() create) { return ProviderOverride( origin: this, - override: IdNotifierProvider._internal( - () => create()..account = account, + override: NoteIsDeletedProvider._internal( + (ref) => create(ref as NoteIsDeletedRef), from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, account: account, + noteId: noteId, ), ); } @override - NotifierProviderElement createElement() { - return _IdNotifierProviderElement(this); + AutoDisposeProviderElement createElement() { + return _NoteIsDeletedProviderElement(this); } @override bool operator ==(Object other) { - return other is IdNotifierProvider && other.account == account; + return other is NoteIsDeletedProvider && + other.account == account && + other.noteId == noteId; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, account.hashCode); + hash = _SystemHash.combine(hash, noteId.hashCode); return _SystemHash.finish(hash); } } -mixin IdNotifierRef on NotifierProviderRef { +mixin NoteIsDeletedRef on AutoDisposeProviderRef { /// The parameter `account` of this provider. Account get account; + + /// The parameter `noteId` of this provider. + String get noteId; } -class _IdNotifierProviderElement - extends NotifierProviderElement - with IdNotifierRef { - _IdNotifierProviderElement(super.provider); +class _NoteIsDeletedProviderElement extends AutoDisposeProviderElement + with NoteIsDeletedRef { + _NoteIsDeletedProviderElement(super.provider); @override - Account get account => (origin as IdNotifierProvider).account; + Account get account => (origin as NoteIsDeletedProvider).account; + @override + String get noteId => (origin as NoteIsDeletedProvider).noteId; } // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/provider/notes_notifier_provider.dart b/lib/provider/notes_notifier_provider.dart index b6c9b4a00..10fa52599 100644 --- a/lib/provider/notes_notifier_provider.dart +++ b/lib/provider/notes_notifier_provider.dart @@ -13,7 +13,7 @@ part 'notes_notifier_provider.g.dart'; @Riverpod(keepAlive: true) class NotesNotifier extends _$NotesNotifier { @override - Map build(Account account) { + Map build(Account account) { return {}; } @@ -49,9 +49,10 @@ class NotesNotifier extends _$NotesNotifier { } void remove(String noteId) { - final temp = Map.of(state); - temp.remove(noteId); - state = temp; + state = { + ...state, + noteId: null, + }; } void addReaction(String noteId, Reacted reacted) { diff --git a/lib/provider/notes_notifier_provider.g.dart b/lib/provider/notes_notifier_provider.g.dart index 0579957c1..b4e6e7472 100644 --- a/lib/provider/notes_notifier_provider.g.dart +++ b/lib/provider/notes_notifier_provider.g.dart @@ -6,7 +6,7 @@ part of 'notes_notifier_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$notesNotifierHash() => r'a5a400ae72e3d7b7d72148018900485a9efbd483'; +String _$notesNotifierHash() => r'cdb0332d358ae9a03edd16336293f5763f89c305'; /// Copied from Dart SDK class _SystemHash { @@ -29,10 +29,10 @@ class _SystemHash { } } -abstract class _$NotesNotifier extends BuildlessNotifier> { +abstract class _$NotesNotifier extends BuildlessNotifier> { late final Account account; - Map build( + Map build( Account account, ); } @@ -42,7 +42,7 @@ abstract class _$NotesNotifier extends BuildlessNotifier> { const notesNotifierProvider = NotesNotifierFamily(); /// See also [NotesNotifier]. -class NotesNotifierFamily extends Family> { +class NotesNotifierFamily extends Family> { /// See also [NotesNotifier]. const NotesNotifierFamily(); @@ -81,7 +81,7 @@ class NotesNotifierFamily extends Family> { /// See also [NotesNotifier]. class NotesNotifierProvider - extends NotifierProviderImpl> { + extends NotifierProviderImpl> { /// See also [NotesNotifier]. NotesNotifierProvider( Account account, @@ -112,7 +112,7 @@ class NotesNotifierProvider final Account account; @override - Map runNotifierBuild( + Map runNotifierBuild( covariant NotesNotifier notifier, ) { return notifier.build( @@ -137,7 +137,7 @@ class NotesNotifierProvider } @override - NotifierProviderElement> createElement() { + NotifierProviderElement> createElement() { return _NotesNotifierProviderElement(this); } @@ -155,13 +155,13 @@ class NotesNotifierProvider } } -mixin NotesNotifierRef on NotifierProviderRef> { +mixin NotesNotifierRef on NotifierProviderRef> { /// The parameter `account` of this provider. Account get account; } class _NotesNotifierProviderElement - extends NotifierProviderElement> + extends NotifierProviderElement> with NotesNotifierRef { _NotesNotifierProviderElement(super.provider); diff --git a/lib/view/widget/timeline_note.dart b/lib/view/widget/timeline_note.dart index 507e3e2d9..2a78deac6 100644 --- a/lib/view/widget/timeline_note.dart +++ b/lib/view/widget/timeline_note.dart @@ -8,6 +8,7 @@ import '../../model/streaming/note_update_event.dart'; import '../../model/tab_settings.dart'; import '../../provider/appear_note_provider.dart'; import '../../provider/misskey_colors_provider.dart'; +import '../../provider/note_is_deleted_provider.dart'; import '../../provider/note_provider.dart'; import '../../provider/notes_notifier_provider.dart'; import '../../provider/streaming/note_subscription_notifier_provider.dart'; @@ -31,6 +32,10 @@ class TimelineNote extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final account = tabSettings.account; + final isDeleted = ref.watch(noteIsDeletedProvider(account, noteId)); + if (isDeleted) { + return const SizedBox.shrink(); + } final note = ref.watch(noteProvider(account, noteId)); final appearNote = ref.watch(appearNoteProvider(account, noteId)); final notifier =