On the Unread tab, a swipe back goes to the item just read (#50)
selectEntry took each read item out of the list the moment you moved on from it, so the item was not there for the back swipe (or k) to reach: it went to the one before, or to the list if the item had been first. Items read while turning from one to the next (a swipe, j and k) now stay in the list until the reader closes or another item is picked from the list, and a background refresh keeps them as it keeps the open one. Picking a row still drops the item left behind at once, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -20,10 +20,12 @@ async function loadEntries(append?: boolean){
|
||||
// A background scan finishing refreshes the list from the server, which -- on the Unread
|
||||
// tab -- would drop the item you have open the moment reading it took it off the filter.
|
||||
// Keep it until you pick a different one; the next refresh after that no longer protects it.
|
||||
if(S.filter==='unread') entries=entries.filter(e=>!e.read||e.guid===S.sel);
|
||||
if(!append && S.sel && !entries.some(e=>e.guid===S.sel)){
|
||||
const open=S.entries.find(e=>e.guid===S.sel);
|
||||
if(open) entries=[open,...entries];
|
||||
// The items turned past on the way to it are kept too, so a swipe back still finds them.
|
||||
const kept=e=>e.guid===S.sel||turned.has(e.guid);
|
||||
if(S.filter==='unread') entries=entries.filter(e=>!e.read||kept(e));
|
||||
if(!append && S.sel){
|
||||
const gone=S.entries.filter(e=>kept(e)&&!entries.some(n=>n.guid===e.guid));
|
||||
entries=[...gone,...entries];
|
||||
}
|
||||
S.entries = entries;
|
||||
renderEntries();
|
||||
@@ -161,13 +163,24 @@ function markRead(e){
|
||||
setRead(e,true).catch(err=>{ e.read=false; readWrites.delete(readKey(e)); toast(err.message,true); });
|
||||
}
|
||||
|
||||
function selectEntry(e){
|
||||
/// On the Unread tab, the items read while turning from one to the next (a swipe, j and k), kept
|
||||
/// in the list until the reader closes or another item is picked from the list. Dropped as each
|
||||
/// was left, a swipe back had nothing to go back to: the item just read was already gone.
|
||||
const turned=new Set<string>();
|
||||
function dropTurned(keep){
|
||||
const gone=S.entries.filter(x=>turned.has(x.guid)&&x.read&&x.guid!==keep);
|
||||
turned.clear();
|
||||
if(!gone.length) return;
|
||||
S.entries=S.entries.filter(x=>!gone.includes(x)); S.total-=gone.length;
|
||||
for(const x of gone) $(`#eps .ep[data-guid="${CSS.escape(x.guid)}"]`)?.remove();
|
||||
}
|
||||
|
||||
function selectEntry(e,turning=false){
|
||||
// On the Unread tab the item you were reading goes as you move on, not whenever a refresh
|
||||
// next happens to come along, which left a few read ones in the list for a while.
|
||||
const prev=S.filter==='unread' && S.sel!==e.guid && S.entries.find(x=>x.guid===S.sel);
|
||||
if(prev&&prev.read){
|
||||
S.entries=S.entries.filter(x=>x!==prev); S.total--;
|
||||
$(`#eps .ep[data-guid="${CSS.escape(prev.guid)}"]`)?.remove();
|
||||
if(S.filter==='unread' && S.sel && S.sel!==e.guid){
|
||||
turned.add(S.sel);
|
||||
if(!turning) dropTurned(e.guid);
|
||||
}
|
||||
S.sel=e.guid;
|
||||
markRead(e);
|
||||
@@ -224,6 +237,7 @@ function showDetail(e){
|
||||
document.body.classList.toggle('reading',!!e);
|
||||
syncTools(e);
|
||||
if(!e){
|
||||
dropTurned(S.sel);
|
||||
box.innerHTML='<p class="empty">Pick an item to read it.</p>';
|
||||
if(files) files.innerHTML='<p class="empty">No files</p>';
|
||||
return;
|
||||
|
||||
@@ -141,7 +141,7 @@ function stepEntry(by){
|
||||
if(VIEWS[S.feed]?.url||!S.entries.length) return;
|
||||
const i=S.entries.findIndex(x=>x.guid===S.sel);
|
||||
const e=S.entries[i<0?0:Math.min(S.entries.length-1,Math.max(0,i+by))];
|
||||
selectEntry(e);
|
||||
selectEntry(e,true);
|
||||
$(`#eps .ep[data-guid="${CSS.escape(e.guid)}"]`)?.scrollIntoView({block:'nearest'});
|
||||
}
|
||||
function stepFeed(by){
|
||||
|
||||
Reference in New Issue
Block a user