'
- f"{av}"
- f'
"
)
diff --git a/src/imwald/core/database.py b/src/imwald/core/database.py
index 409ffe2..ff261de 100644
--- a/src/imwald/core/database.py
+++ b/src/imwald/core/database.py
@@ -659,7 +659,7 @@ class Database:
) -> list[dict[str, Any]]:
"""
Feed-shaped rows newest-first. With ``exclude_viewed`` and ``viewer_pubkey``,
- omits ids already in ``feed_views`` (the UI records an OP when it is shown).
+ omits ids already in ``feed_views`` (the feed pager records an OP when the user leaves it).
"""
kind_list = list(kinds)
placeholders = ",".join("?" * len(kind_list))
@@ -695,7 +695,7 @@ class Database:
return out
def mark_feed_viewed(self, viewer_pubkey: str, event_id: str) -> None:
- """Persist that this viewer was shown this OP (pager); used to prefer fresh notes in the feed."""
+ """Persist that this viewer finished this OP (pager left / account switch); used for unseen feed ranking."""
with self.write_lock() as c:
c.execute(
"""
diff --git a/src/imwald/ui/feed_page.py b/src/imwald/ui/feed_page.py
index 5689173..44e5324 100644
--- a/src/imwald/ui/feed_page.py
+++ b/src/imwald/ui/feed_page.py
@@ -408,9 +408,16 @@ class FeedPage(QWidget):
following: set[str],
list30000_pubkeys: set[str] | None = None,
) -> None:
+ old_vk = (self._my_pubkey or "_anon").lower()
self._my_pubkey = my_pubkey
self._following = following
self._list30000_pubkeys = list30000_pubkeys or set()
+ new_vk = (self._my_pubkey or "_anon").lower()
+ if old_vk != new_vk and self._rendered_op_id:
+ self._db.mark_feed_viewed(old_vk, self._rendered_op_id)
+ self._rendered_op_id = None
+ self._rendered_reply_sig = None
+ self._op_ev_snapshot = None
def _feed_viewer_key(self) -> str:
"""Per-device feed history; logged-out users share `_anon`."""
@@ -600,6 +607,10 @@ class FeedPage(QWidget):
self._engagement_label.setText("")
return
ev = self._queue[self._index % len(self._queue)]
+ root_id = str(ev["id"])
+ prev_rid = self._rendered_op_id
+ if prev_rid and prev_rid != root_id:
+ self._db.mark_feed_viewed(self._feed_viewer_key(), prev_rid)
if ev.get("deleted"):
self._rendered_op_id = None
self._rendered_reply_sig = None
@@ -631,7 +642,6 @@ class FeedPage(QWidget):
_format_engagement_html(stats, reaction_nip30_urls=author_nip30)
)
- root_id = str(ev["id"])
replies = self._db.list_replies_to(ev)
reply_sig = tuple(str(r["id"]) for r in replies)
if root_id == self._rendered_op_id and reply_sig == self._rendered_reply_sig:
@@ -644,7 +654,6 @@ class FeedPage(QWidget):
self._op_ev_snapshot = ev
body = self._build_op_html(ev, None)
self._op.setHtml(body)
- self._db.mark_feed_viewed(self._feed_viewer_key(), root_id)
pk = op_pk
prof_row2 = self._db.get_latest_kind0_profile(pk)