From adc6fa0333e6612f200aef2820230c1a520035d0 Mon Sep 17 00:00:00 2001 From: poppingmoon <63451158+poppingmoon@users.noreply.github.com> Date: Fri, 26 Jul 2024 00:42:05 +0900 Subject: [PATCH] fix: reset channel after post --- lib/provider/api/post_notifier_provider.dart | 8 +---- .../api/post_notifier_provider.g.dart | 2 +- .../timeline_tab_index_notifier_provider.dart | 30 ++++++++++++++++++ ...imeline_tab_index_notifier_provider.g.dart | 27 ++++++++++++++++ .../timeline_tab_settings_provider.dart | 15 +++++++++ .../timeline_tab_settings_provider.g.dart | 26 ++++++++++++++++ lib/view/page/post_page.dart | 7 +++++ lib/view/page/timelines_page.dart | 31 ++++++------------- lib/view/widget/post_form.dart | 12 +++++-- 9 files changed, 125 insertions(+), 33 deletions(-) create mode 100644 lib/provider/timeline_tab_index_notifier_provider.dart create mode 100644 lib/provider/timeline_tab_index_notifier_provider.g.dart create mode 100644 lib/provider/timeline_tab_settings_provider.dart create mode 100644 lib/provider/timeline_tab_settings_provider.g.dart diff --git a/lib/provider/api/post_notifier_provider.dart b/lib/provider/api/post_notifier_provider.dart index 0cf18cfc5..20636adac 100644 --- a/lib/provider/api/post_notifier_provider.dart +++ b/lib/provider/api/post_notifier_provider.dart @@ -181,13 +181,7 @@ class PostNotifier extends _$PostNotifier { } void reset() { - state = _defaultRequest.copyWith( - channelId: state.channelId, - localOnly: state.channelId != null ? true : _defaultRequest.localOnly, - visibility: state.channelId != null - ? NoteVisibility.public - : _defaultRequest.visibility, - ); + state = _defaultRequest; ref.read(sharedPreferencesProvider).remove(_key); } diff --git a/lib/provider/api/post_notifier_provider.g.dart b/lib/provider/api/post_notifier_provider.g.dart index a03c6e797..df89d6356 100644 --- a/lib/provider/api/post_notifier_provider.g.dart +++ b/lib/provider/api/post_notifier_provider.g.dart @@ -6,7 +6,7 @@ part of 'post_notifier_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$postNotifierHash() => r'3d91f03110ea5dc0015442266a0c2c87a182a5fd'; +String _$postNotifierHash() => r'605985d90782fa4b9b9782f9ecf9926b31543ce3'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/provider/timeline_tab_index_notifier_provider.dart b/lib/provider/timeline_tab_index_notifier_provider.dart new file mode 100644 index 000000000..229d43372 --- /dev/null +++ b/lib/provider/timeline_tab_index_notifier_provider.dart @@ -0,0 +1,30 @@ +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +import 'timeline_last_viewed_at_notifier_provider.dart'; +import 'timeline_tabs_notifier_provider.dart'; + +part 'timeline_tab_index_notifier_provider.g.dart'; + +@riverpod +class TimelineTabIndexNotifier extends _$TimelineTabIndexNotifier { + @override + int build() { + final tabs = ref.watch(timelineTabsNotifierProvider); + int latestIndex = 0; + DateTime latestDate = DateTime(0); + for (final (index, tabSettings) in tabs.indexed) { + final lastViewedAt = + ref.read(timelineLastViewedAtNotifierProvider(tabSettings)); + if (lastViewedAt != null && lastViewedAt.isAfter(latestDate)) { + latestIndex = index; + latestDate = lastViewedAt; + } + } + return latestIndex; + } + + // ignore: use_setters_to_change_properties + void updateIndex(int index) { + state = index; + } +} diff --git a/lib/provider/timeline_tab_index_notifier_provider.g.dart b/lib/provider/timeline_tab_index_notifier_provider.g.dart new file mode 100644 index 000000000..74400c1ea --- /dev/null +++ b/lib/provider/timeline_tab_index_notifier_provider.g.dart @@ -0,0 +1,27 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'timeline_tab_index_notifier_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$timelineTabIndexNotifierHash() => + r'c9af333f0f8c082a8293a8bd889e9b478757a2bf'; + +/// See also [TimelineTabIndexNotifier]. +@ProviderFor(TimelineTabIndexNotifier) +final timelineTabIndexNotifierProvider = + AutoDisposeNotifierProvider.internal( + TimelineTabIndexNotifier.new, + name: r'timelineTabIndexNotifierProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$timelineTabIndexNotifierHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$TimelineTabIndexNotifier = AutoDisposeNotifier; +// 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/timeline_tab_settings_provider.dart b/lib/provider/timeline_tab_settings_provider.dart new file mode 100644 index 000000000..53ea26f0c --- /dev/null +++ b/lib/provider/timeline_tab_settings_provider.dart @@ -0,0 +1,15 @@ +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +import '../model/tab_settings.dart'; +import 'timeline_tab_index_notifier_provider.dart'; +import 'timeline_tabs_notifier_provider.dart'; + +part 'timeline_tab_settings_provider.g.dart'; + +@riverpod +TabSettings? timelineTabSettings(TimelineTabSettingsRef ref) { + final index = ref.watch(timelineTabIndexNotifierProvider); + return ref.watch( + timelineTabsNotifierProvider.select((tabs) => tabs.elementAtOrNull(index)), + ); +} diff --git a/lib/provider/timeline_tab_settings_provider.g.dart b/lib/provider/timeline_tab_settings_provider.g.dart new file mode 100644 index 000000000..115cf9610 --- /dev/null +++ b/lib/provider/timeline_tab_settings_provider.g.dart @@ -0,0 +1,26 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'timeline_tab_settings_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$timelineTabSettingsHash() => + r'a59c07a28158fd5cde50fe269f04c41b9a401161'; + +/// See also [timelineTabSettings]. +@ProviderFor(timelineTabSettings) +final timelineTabSettingsProvider = AutoDisposeProvider.internal( + timelineTabSettings, + name: r'timelineTabSettingsProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$timelineTabSettingsHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef TimelineTabSettingsRef = AutoDisposeProviderRef; +// 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/view/page/post_page.dart b/lib/view/page/post_page.dart index 5b0a53145..e4f83d232 100644 --- a/lib/view/page/post_page.dart +++ b/lib/view/page/post_page.dart @@ -18,6 +18,7 @@ import '../../provider/api/i_notifier_provider.dart'; import '../../provider/api/post_notifier_provider.dart'; import '../../provider/general_settings_notifier_provider.dart'; import '../../provider/misskey_colors_provider.dart'; +import '../../provider/timeline_tab_settings_provider.dart'; import '../../util/future_with_dialog.dart'; import '../dialog/post_confirmation_dialog.dart'; import '../widget/mfm_keyboard.dart'; @@ -88,6 +89,12 @@ class PostPage extends HookConsumerWidget { .setHashtags({...hashtags, ...history}.toList()), ); } + if (ref.read(timelineTabSettingsProvider)?.channelId + case final channelId?) { + ref + .read(postNotifierProvider(account, noteId: noteId).notifier) + .setChannel(channelId); + } ref.invalidate(attachesNotifierProvider(account, noteId: noteId)); ref.context.pop(); } diff --git a/lib/view/page/timelines_page.dart b/lib/view/page/timelines_page.dart index 16af93aad..988ce15e5 100644 --- a/lib/view/page/timelines_page.dart +++ b/lib/view/page/timelines_page.dart @@ -15,8 +15,9 @@ import '../../provider/emojis_notifier_provider.dart'; import '../../provider/general_settings_notifier_provider.dart'; import '../../provider/misskey_colors_provider.dart'; import '../../provider/streaming/main_stream_notifier_provider.dart'; -import '../../provider/timeline_last_viewed_at_notifier_provider.dart'; import '../../provider/timeline_scroll_controller_provider.dart'; +import '../../provider/timeline_tab_index_notifier_provider.dart'; +import '../../provider/timeline_tab_settings_provider.dart'; import '../../provider/timeline_tabs_notifier_provider.dart'; import '../widget/post_form.dart'; import '../widget/timeline_drawer.dart'; @@ -30,22 +31,8 @@ class TimelinesPage extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final tabs = ref.watch(timelineTabsNotifierProvider); final numTabs = tabs.length; - final initialIndex = useMemoized( - () { - int latestIndex = 0; - DateTime latestDate = DateTime(0); - for (final (index, tabSettings) in tabs.indexed) { - final lastViewedAt = - ref.read(timelineLastViewedAtNotifierProvider(tabSettings)); - if (lastViewedAt != null && lastViewedAt.isAfter(latestDate)) { - latestIndex = index; - latestDate = lastViewedAt; - } - } - return latestIndex; - }, - [], - ); + final tabIndex = ref.watch(timelineTabIndexNotifierProvider); + final tabSettings = ref.watch(timelineTabSettingsProvider); final showTimelineTabBarAtBottom = ref.watch( generalSettingsNotifierProvider .select((settings) => settings.showTimelineTabBarAtBottom), @@ -60,11 +47,9 @@ class TimelinesPage extends HookConsumerWidget { ); final controller = useTabController( initialLength: numTabs, - initialIndex: initialIndex, + initialIndex: useMemoized(() => tabIndex), keys: [numTabs], ); - final tabIndex = useState(controller.index); - final tabSettings = tabs.elementAtOrNull(tabIndex.value); final i = tabSettings != null ? ref.watch(iNotifierProvider(tabSettings.account)).valueOrNull : null; @@ -73,7 +58,7 @@ class TimelinesPage extends HookConsumerWidget { () { void callback() { if (tabs.isEmpty) return; - final previousIndex = tabIndex.value; + final previousIndex = tabIndex; final nextIndex = controller.index; if (previousIndex == nextIndex) return; final previousAccount = tabs[previousIndex].account; @@ -112,7 +97,9 @@ class TimelinesPage extends HookConsumerWidget { .clearChannel(); } } - tabIndex.value = nextIndex; + ref + .read(timelineTabIndexNotifierProvider.notifier) + .updateIndex(nextIndex); } if (tabSettings != null) { diff --git a/lib/view/widget/post_form.dart b/lib/view/widget/post_form.dart index a28a47c84..a87c66eca 100644 --- a/lib/view/widget/post_form.dart +++ b/lib/view/widget/post_form.dart @@ -29,6 +29,7 @@ import '../../provider/api/user_notifier_provider.dart'; import '../../provider/general_settings_notifier_provider.dart'; import '../../provider/misskey_colors_provider.dart'; import '../../provider/note_provider.dart'; +import '../../provider/timeline_tab_settings_provider.dart'; import '../../util/extract_mentions.dart'; import '../../util/future_with_dialog.dart'; import '../dialog/post_confirmation_dialog.dart'; @@ -85,7 +86,7 @@ class PostForm extends HookConsumerWidget { WidgetRef ref, Account account, ) async { - final text = ref.read(postNotifierProvider(account, noteId: noteId)).text; + final request = ref.read(postNotifierProvider(account, noteId: noteId)); final attaches = ref.read(attachesNotifierProvider(account, noteId: noteId)); final hasFiles = attaches.isNotEmpty; @@ -104,7 +105,6 @@ class PostForm extends HookConsumerWidget { if (!ref.context.mounted) return; if (needsUpload || (ref.read(generalSettingsNotifierProvider).confirmBeforePost)) { - final request = ref.read(postNotifierProvider(account, noteId: noteId)); final confirmed = await confirmPost( ref, account, @@ -122,7 +122,7 @@ class PostForm extends HookConsumerWidget { ); if (!ref.context.mounted) return; if (result != null) { - if (text != null) { + if (request.text case final text?) { final nodes = const MfmParser().parse(text); final hashtags = nodes .extract((node) => node is MfmHashTag) @@ -136,6 +136,12 @@ class PostForm extends HookConsumerWidget { .setHashtags({...hashtags, ...history}.toList()), ); } + if (ref.read(timelineTabSettingsProvider)?.channelId + case final channelId?) { + ref + .read(postNotifierProvider(account, noteId: noteId).notifier) + .setChannel(channelId); + } ref.invalidate(attachesNotifierProvider(account, noteId: noteId)); ref.context.pop(); }