Skip to content

Commit

Permalink
feat: search with date range
Browse files Browse the repository at this point in the history
Added feature to search notes posted in a specific date range.
  • Loading branch information
poppingmoon committed Jun 30, 2024
1 parent 7fd8078 commit 03b1279
Show file tree
Hide file tree
Showing 11 changed files with 102 additions and 3 deletions.
2 changes: 2 additions & 0 deletions lib/i18n/aria/aria.i18n.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ showSubNoteReactionsViewer: "Show reactions viewers in subnotes"
showTimelineLastViewedAt: "Show last viewed date of timelines"
showTimelineTabBarAtBottom: "Show timeline tab bar at the bottom"
showTranslateButtonInNoteFooter: "Add \"Translate\" to note action menu"
sinceDate: "Since"
stackTrace: "Stack trace"
streamingChannel: "Streaming channel"
tabName: "Tab name"
Expand All @@ -119,6 +120,7 @@ tapToShow: "Tap to show"
timeMachine: "Time machine"
unfavorited: "Removed from favorites"
unfollowConfirm(rich): "Are you sure you want to unfollow {name}?"
untilDate: "Until"
uploaded: "Uploaded"
useThisEmoji: "Use this emoji"
userSaysSomething(rich): "{name} said something"
Expand Down
2 changes: 2 additions & 0 deletions lib/i18n/aria/aria_ja-JP.i18n.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ showSubNoteReactionsViewer: "サブノートにリアクションを表示する
showTimelineLastViewedAt: "タイムラインを最後に見た日時を表示する"
showTimelineTabBarAtBottom: "タイムラインのタブバーを下に表示する"
showTranslateButtonInNoteFooter: "ノートのアクションに翻訳を追加"
sinceDate: "この日から"
stackTrace: "スタックトレース"
streamingChannel: "ストリーミングチャンネル"
tabName: "タブの名前"
Expand All @@ -115,6 +116,7 @@ tapToShow: "タップして表示"
timeMachine: "タイムマシン"
unfavorited: "お気に入りを解除しました"
unfollowConfirm(rich): "{name}のフォローを解除しますか?"
untilDate: "この日まで"
uploaded: "アップロードしました"
useThisEmoji: "この絵文字を使う"
userSaysSomething(rich): "{name}が何かを言いました"
Expand Down
2 changes: 2 additions & 0 deletions lib/i18n/aria/aria_ja-KS.i18n.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ showSubNoteReactionsViewer: "サブノートにツッコミを表示するで"
showTimelineLastViewedAt: "タイムラインを最後に見た日時を表示するで"
showTimelineTabBarAtBottom: "タイムラインのタブバーを下に表示するで"
showTranslateButtonInNoteFooter: "ノートのアクションに翻訳を追加"
sinceDate: "この日から"
stackTrace: "スタックトレース"
streamingChannel: "ストリーミングチャンネル"
tabName: "タブの名前"
Expand All @@ -115,6 +116,7 @@ tapToShow: "押したら見えるで"
timeMachine: "タイムマシン"
unfavorited: "お気に入りを解除したで"
unfollowConfirm(rich): "{name}のフォローを解除してもええんか?"
untilDate: "この日まで"
uploaded: "アップロードしたで"
useThisEmoji: "この絵文字を使う"
userSaysSomething(rich): "{name}が何か言うとるわ"
Expand Down
2 changes: 1 addition & 1 deletion lib/i18n/strings.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
/// To regenerate, run: `dart run slang`
///
/// Locales: 31
/// Strings: 51594 (1664 per locale)
/// Strings: 51600 (1664 per locale)
// coverage:ignore-file
// ignore_for_file: type=lint
Expand Down
2 changes: 2 additions & 0 deletions lib/i18n/strings_en_US.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ class _StringsAriaEnUs {
String get showTimelineLastViewedAt => 'Show last viewed date of timelines';
String get showTimelineTabBarAtBottom => 'Show timeline tab bar at the bottom';
String get showTranslateButtonInNoteFooter => 'Add "Translate" to note action menu';
String get sinceDate => 'Since';
String get stackTrace => 'Stack trace';
String get streamingChannel => 'Streaming channel';
String get tabName => 'Tab name';
Expand All @@ -206,6 +207,7 @@ class _StringsAriaEnUs {
name,
const TextSpan(text: '?'),
]);
String get untilDate => 'Until';
String get uploaded => 'Uploaded';
String get useThisEmoji => 'Use this emoji';
TextSpan userSaysSomething({required InlineSpan name}) => TextSpan(children: [
Expand Down
2 changes: 2 additions & 0 deletions lib/i18n/strings_ja_JP.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ class _StringsAriaJaJp extends _StringsAriaEnUs {
@override String get showTimelineLastViewedAt => 'タイムラインを最後に見た日時を表示する';
@override String get showTimelineTabBarAtBottom => 'タイムラインのタブバーを下に表示する';
@override String get showTranslateButtonInNoteFooter => 'ノートのアクションに翻訳を追加';
@override String get sinceDate => 'この日から';
@override String get stackTrace => 'スタックトレース';
@override String get streamingChannel => 'ストリーミングチャンネル';
@override String get tabName => 'タブの名前';
Expand All @@ -193,6 +194,7 @@ class _StringsAriaJaJp extends _StringsAriaEnUs {
name,
const TextSpan(text: 'のフォローを解除しますか?'),
]);
@override String get untilDate => 'この日まで';
@override String get uploaded => 'アップロードしました';
@override String get useThisEmoji => 'この絵文字を使う';
@override TextSpan userSaysSomething({required InlineSpan name}) => TextSpan(children: [
Expand Down
2 changes: 2 additions & 0 deletions lib/i18n/strings_ja_KS.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ class _StringsAriaJaKs extends _StringsAriaEnUs {
@override String get showTimelineLastViewedAt => 'タイムラインを最後に見た日時を表示するで';
@override String get showTimelineTabBarAtBottom => 'タイムラインのタブバーを下に表示するで';
@override String get showTranslateButtonInNoteFooter => 'ノートのアクションに翻訳を追加';
@override String get sinceDate => 'この日から';
@override String get stackTrace => 'スタックトレース';
@override String get streamingChannel => 'ストリーミングチャンネル';
@override String get tabName => 'タブの名前';
Expand All @@ -193,6 +194,7 @@ class _StringsAriaJaKs extends _StringsAriaEnUs {
name,
const TextSpan(text: 'のフォローを解除してもええんか?'),
]);
@override String get untilDate => 'この日まで';
@override String get uploaded => 'アップロードしたで';
@override String get useThisEmoji => 'この絵文字を使う';
@override TextSpan userSaysSomething({required InlineSpan name}) => TextSpan(children: [
Expand Down
2 changes: 2 additions & 0 deletions lib/provider/api/search_notes_notifier_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class SearchNotesNotifier extends _$SearchNotesNotifier {
String? userId,
String? channelId,
bool? localOnly,
String? sinceId,
String? untilId,
}) async {
final response = await _fetchNotes(untilId: untilId);
Expand All @@ -32,6 +33,7 @@ class SearchNotesNotifier extends _$SearchNotesNotifier {
userId: userId,
channelId: channelId,
host: (localOnly ?? false) ? '.' : null,
sinceId: sinceId,
untilId: untilId,
),
);
Expand Down
22 changes: 21 additions & 1 deletion lib/provider/api/search_notes_notifier_provider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/util/format_datetime.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,5 @@ String relativeTime(DateTime time) {
String absoluteTime(DateTime time) {
final lang = t.$meta.locale.languageTag;
final prefix = time.year.isNegative ? '-' : '';
return '$prefix${DateFormat.yMd(lang).add_jms().format(time.toUtc().toLocal())}';
return '$prefix${DateFormat.yMd(lang).add_jms().format(time.toLocal())}';
}
65 changes: 65 additions & 0 deletions lib/view/page/search/search_notes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@ import 'package:misskey_dart/misskey_dart.dart';
import '../../../constant/shortcuts.dart';
import '../../../i18n/strings.g.dart';
import '../../../model/account.dart';
import '../../../model/id.dart';
import '../../../provider/api/channel_notifier_provider.dart';
import '../../../provider/api/id_gen_method_provider.dart';
import '../../../provider/api/search_notes_notifier_provider.dart';
import '../../../provider/api/user_notifier_provider.dart';
import '../../../provider/misskey_colors_provider.dart';
import '../../../util/format_datetime.dart';
import '../../../util/pick_date_time.dart';
import '../../../util/punycode.dart';
import '../../dialog/user_select_dialog.dart';
import '../../widget/note_widget.dart';
Expand Down Expand Up @@ -50,6 +54,15 @@ class SearchNotes extends HookConsumerWidget {
.valueOrNull
: null;
final localOnly = useState(this.channelId != null);
final sinceDate = useState<DateTime?>(null);
final untilDate = useState<DateTime?>(null);
final method = ref.watch(idGenMethodProvider(account)).valueOrNull;
final sinceId = method != null && sinceDate.value != null
? Id(method: method, date: sinceDate.value!).toString()
: null;
final untilId = method != null && untilDate.value != null
? Id(method: method, date: untilDate.value!).toString()
: null;
final notes = query.value.isNotEmpty
? ref.watch(
searchNotesNotifierProvider(
Expand All @@ -58,6 +71,8 @@ class SearchNotes extends HookConsumerWidget {
userId: userId.value,
channelId: channelId.value,
localOnly: localOnly.value,
sinceId: sinceId,
untilId: untilId,
),
)
: null;
Expand Down Expand Up @@ -173,6 +188,52 @@ class SearchNotes extends HookConsumerWidget {
}
},
),
ListTile(
title: Text(t.aria.sinceDate),
subtitle: Text(
sinceDate.value != null
? absoluteTime(sinceDate.value!)
: t.misskey.notSet,
),
trailing: sinceDate.value != null
? IconButton(
onPressed: () => sinceDate.value = null,
icon: const Icon(Icons.close),
)
: const Icon(Icons.navigate_next),
onTap: () async {
final result = await pickDateTime(
context,
initialDate: sinceDate.value,
);
if (result != null) {
sinceDate.value = result;
}
},
),
ListTile(
title: Text(t.aria.untilDate),
subtitle: Text(
untilDate.value != null
? absoluteTime(untilDate.value!)
: t.misskey.notSet,
),
trailing: untilDate.value != null
? IconButton(
onPressed: () => untilDate.value = null,
icon: const Icon(Icons.close),
)
: const Icon(Icons.navigate_next),
onTap: () async {
final result = await pickDateTime(
context,
initialDate: untilDate.value,
);
if (result != null) {
untilDate.value = result;
}
},
),
],
),
Padding(
Expand All @@ -194,6 +255,8 @@ class SearchNotes extends HookConsumerWidget {
userId: userId.value,
channelId: channelId.value,
localOnly: localOnly.value,
sinceId: sinceId,
untilId: untilId,
).future,
),
loadMore: (skipError) => ref
Expand All @@ -204,6 +267,8 @@ class SearchNotes extends HookConsumerWidget {
userId: userId.value,
channelId: channelId.value,
localOnly: localOnly.value,
sinceId: sinceId,
untilId: untilId,
).notifier,
)
.loadMore(skipError: skipError),
Expand Down

0 comments on commit 03b1279

Please sign in to comment.