aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-09-28 23:29:55 -0700
committerAdam Soltys <[email protected]>2026-09-28 23:29:55 -0700
commitd5598a131a9d160b929ff7ccbd650a4ef57b21c0 (patch)
tree4514d9524c2724a191790de6a473c4a375bdbe61 /tools
parent73ab54a004113b32a9a12661e7e7eb9151999ee3 (diff)
downloadcoinosv3-d5598a131a9d160b929ff7ccbd650a4ef57b21c0.tar.gz
coinosv3-d5598a131a9d160b929ff7ccbd650a4ef57b21c0.zip
"Save feed" on someone's timeline adds it to your feeds at once, instead of an editor listing every person they follow.
The editor copied their whole follow list into the form, one row each — long enough to freeze the browser. A saved timeline now keeps only the person (of: pk); their follow list is read from the relays when it is opened, so it stays small in sync and follows who they follow. Its ⋯ offers Delete rather than Edit, and list pickers leave it out. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Du1qT1wbkYwYK6zkGH79Rp
Diffstat (limited to 'tools')
-rw-r--r--tools/avatar-profile-test.js14
1 files changed, 14 insertions, 0 deletions
diff --git a/tools/avatar-profile-test.js b/tools/avatar-profile-test.js
index 0f59e10..6e84429 100644
--- a/tools/avatar-profile-test.js
+++ b/tools/avatar-profile-test.js
@@ -76,6 +76,20 @@ try {
await sleep(1500);
const chip = await page.evaluate(() => document.querySelector('.feed-chip.on')?.textContent || null);
check('someone’s timeline has a labelled chip', !!chip && /Bob Poster/.test(chip), JSON.stringify(chip));
+
+ // ⋯ → Save feed: straight into the chips, no editor listing their follows
+ await page.evaluate((l) => document.querySelector('button[aria-label="' + l + '"]').click(), 'Feed options');
+ await sleep(500);
+ const saved = await click('save feed');
+ await sleep(1000);
+ const savedState = await page.evaluate(() => ({ editor: /New feed/.test(document.body.innerText), chips: [...document.querySelectorAll('.feed-chip')].map((c) => c.textContent), on: document.querySelector('.feed-chip.on')?.textContent }));
+ check('“Save feed” on a timeline saves it without the editor', saved && !savedState.editor && /Bob Poster/.test(savedState.on || ''), JSON.stringify(savedState));
+ await page.reload({ waitUntil: 'domcontentloaded' });
+ await waitText('receive', 20000);
+ await page.evaluate(() => document.querySelector('.app-bottom-nav .app-nav-button').click());
+ await sleep(2000);
+ const kept = await page.evaluate(() => [...document.querySelectorAll('.feed-chip')].map((c) => c.textContent));
+ check('...and it is still among the feeds after a reload', kept.some((c) => /(Bob Poster|npub1hwam).*’s timeline/.test(c)), JSON.stringify(kept));
} finally { await browser.close(); server.stop(true); }
console.log(ok ? '\n✅ a face opens its profile at the top' : '\n❌ failed');
process.exit(ok ? 0 : 1);