chiark / gitweb /
Support reading hashtag feeds.
authorSimon Tatham <anakin@pobox.com>
Mon, 1 Jan 2024 13:12:01 +0000 (13:12 +0000)
committerSimon Tatham <anakin@pobox.com>
Mon, 1 Jan 2024 13:12:01 +0000 (13:12 +0000)
No trouble at all given the existing infrastructure.

src/activity_stack.rs
src/editor.rs
src/file.rs
src/menu.rs
src/tui.rs

index 604f3fa55bcad59cc7c3ce2f9222f33642307ee1..fff8f47062678a34eca710c4758d83c4c017fd57 100644 (file)
@@ -5,6 +5,7 @@ pub enum NonUtilityActivity {
     PublicTimelineFile,
     LocalTimelineFile,
     SinglePost(String),
+    HashtagTimeline(String),
 }
 
 #[derive(PartialEq, Eq, Debug, Clone)]
@@ -27,6 +28,7 @@ pub enum UtilityActivity {
 pub enum OverlayActivity {
     GetUserToExamine,
     GetPostIdToRead,
+    GetHashtagToRead,
 }
 
 #[derive(PartialEq, Eq, Debug, Clone)]
index 1cf52616221120536219c103042c528181364dfa..8f5c9eddbf99c3f870b0508442971c70e32ece98 100644 (file)
@@ -618,3 +618,20 @@ pub fn get_post_id_to_read() -> Box<dyn ActivityState> {
         })
     ))
 }
+
+pub fn get_hashtag_to_read() -> Box<dyn ActivityState> {
+    Box::new(BottomLineEditorOverlay::new(
+        ColouredString::plain("View feed for hashtag: "),
+        Box::new(move |s, _client| {
+            let s = s.trim();
+            let s = s.strip_prefix("#").unwrap_or(s);
+            if s.is_empty() {
+                LogicalAction::PopOverlaySilent
+            } else {
+                LogicalAction::Goto(
+                        NonUtilityActivity::HashtagTimeline(s.to_owned())
+                        .into())
+            }
+        })
+    ))
+}
index a0116afedd74993e7eb7081970a59558386d8241..1f244bba181e4c449d45b2fbc55f96cc1e54e052 100644 (file)
@@ -623,6 +623,16 @@ pub fn ego_log(client: &mut Client) ->
     Ok(Box::new(file))
 }
 
+pub fn hashtag_timeline(client: &mut Client, tag: &str) ->
+    Result<Box<dyn ActivityState>, ClientError>
+{
+    let title = ColouredString::uniform(
+        &format!("Posts mentioning hashtag #{tag}"), 'H');
+    let file = File::<StatusFeedType, _>::new(
+        client, FeedSource::new(FeedId::Hashtag(tag.to_owned())), title)?;
+    Ok(Box::new(file))
+}
+
 struct ExamineUserFileType {}
 impl FileType for ExamineUserFileType {
     type Item = ExamineUserDisplay;
index 1143a830bfd2327c97aa1be00afc8dc4c4a0b690..ba256d202186c88a57616728daeaec26cd60ac9e 100644 (file)
@@ -195,8 +195,8 @@ pub fn main_menu() -> Box<dyn ActivityState> {
     menu.add_action(Pr('L'), "Local public timeline (this server)",
                     LogicalAction::Goto(
                         NonUtilityActivity::LocalTimelineFile.into()));
-    menu.add_action(Pr('#'), "Timeline for a #hashtag",
-                    LogicalAction::NYI);
+    menu.add_action(Pr('#'), "Timeline for a #hashtag", LogicalAction::Goto(
+        OverlayActivity::GetHashtagToRead.into()));
     menu.add_blank_line();
     menu.add_action(Pr('I'), "View a post by its ID", LogicalAction::Goto(
         OverlayActivity::GetPostIdToRead.into()));
index 1be8273579a6ded9522d23270cb5994e1c71b207..0cad0609a3eae20dc1da8b07388caaa3386929ab 100644 (file)
@@ -437,6 +437,8 @@ fn new_activity_state(activity: Activity, client: &mut Client) ->
             public_timeline(client),
         Activity::NonUtil(NonUtilityActivity::LocalTimelineFile) =>
             local_timeline(client),
+        Activity::NonUtil(NonUtilityActivity::HashtagTimeline(ref id)) =>
+            hashtag_timeline(client, id),
         Activity::Util(UtilityActivity::ReadMentions) =>
             mentions(client),
         Activity::Util(UtilityActivity::EgoLog) =>
@@ -445,6 +447,8 @@ fn new_activity_state(activity: Activity, client: &mut Client) ->
             Ok(get_user_to_examine()),
         Activity::Overlay(OverlayActivity::GetPostIdToRead) =>
             Ok(get_post_id_to_read()),
+        Activity::Overlay(OverlayActivity::GetHashtagToRead) =>
+            Ok(get_hashtag_to_read()),
         Activity::Util(UtilityActivity::ExamineUser(ref name)) =>
             examine_user(client, name),
         Activity::NonUtil(NonUtilityActivity::SinglePost(ref id)) =>