Changeset 5218863 in Klonkt for test


Ignore:
Timestamp:
08/12/2026 08:25:10 PM (3 months ago)
Author:
Robin <roboburr@…>
Children:
4bb93aa
Parents:
084b046
Message:

De Ward PWA: het gesprek over de hemel, en de zwaai-hand

Plak 4. Een tik op een gezicht opent nu echt iets.

HET GESPREK is een overlay OVER de levende hemel, geen aparte pagina:
de hemel eronder blijft dezelfde draaiende instantie, en het paneel is
doorschijnend met blur, zoals de glazen bubbels in de app. Dezelfde
bron als de C2S-lezing die Shaer gebruikt (conversationHistory):
inkomend de ap_mentions, uitgaand de eigen directe notes. Openen is
lezen: markRead neemt het maximum, dus een oud toestel kan nooit iets
weer ongelezen maken. Verversen is pollen om de acht seconden zolang
het gesprek open staat; het ritme van een gesprek is geen milliseconde,
en een socket kan later zonder iets te slopen.

DE ZWAAI-HAND hangt in dezelfde hoek als de boei en ze wisselen elkaar
af met de stand: met de kaarten verdwijnt de boei, op de hemel hangt de
hand. Slepen op een gezicht opent het paneel met de drie antwoorden, en
de tekst die je kiest IS het bericht. De treffer is sky.pick(): exact
dezelfde rekensom als een tik, dus mikken gedraagt zich overal gelijk.

Changed files:
src/routes/ward.js

  • /api/thread: beide kanten, cursor, markRead bij openen
  • /api/message: direct bericht of zwaai (shaer:wave reist mee)

src/assets/js/ward-sky.js

  • pick() als publieke mikfunctie

src/assets/js/ward.js

  • thread-overlay met poll, verstuurvak, Escape sluit
  • de hand: slepen, mikken, paneel, versturen

src/views/pages/ward.ejs

  • thread, hand en zwaai-paneel in de schil

src/assets/css/ward.css

  • doorschijnend gesprek, bubbels, hand, paneel

src/services/i18n.js

  • tien sleutels in nl, en, de

test/ward-pwa.test.js

  • het gesprek draagt beide kanten en de zwaai-vlag overleeft; versturen eist een echte ontvanger en echte tekst

remarks: 897 tests groen. Nog niet geport: de (+) voor een nieuw
gesprek, Friends/Orbit-panelen, de composer met media, de mini-speler
en de themakleur; beads volgen. Slepen met een echte vinger is aan
Robin op dev.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/ward-pwa.test.js

    r084b046 r5218863  
    172172  } finally { server.close(); }
    173173});
     174
     175
     176test('het gesprek draagt beide kanten en een zwaai heet een zwaai', async () => {
     177  // Eén binnengekomen bericht (ap_mentions) en één eigen antwoord (ap_outbox,
     178  // direct). Het gesprek moet ze allebei dragen, elk met zijn richting.
     179  const VRIEND = 'https://elders.example/ap/users/vriend';
     180  db.prepare(`INSERT INTO ap_mentions (slug, object_uri, actor_uri, actor_name, actor_handle, content, wave, published, created_at)
     181              VALUES ('mee', 'https://elders.example/n/w1', ?, 'Vriend', '@vriend@elders.example', '<p>👋</p>', 1, datetime('now'), datetime('now'))`)
     182    .run(VRIEND);
     183  // post_id is NOT NULL (een reply hangt normaal onder een post); een direct
     184  // bericht draagt daar een leeg anker, precies zoals deliverDirectNote doet.
     185  db.prepare(`INSERT INTO ap_outbox (id, site_slug, post_id, in_reply_to, content, visibility, to_actors, created_at)
     186              VALUES ('out-1', 'mee', '', NULL, '<p>hoi terug</p>', 'direct', ?, datetime('now', '+1 minute'))`)
     187    .run(JSON.stringify([VRIEND]));
     188
     189  const { server, port } = await listen(appWith({ user: { id: 'u1' } }));
     190  try {
     191    const r = await fetch(`http://127.0.0.1:${port}/ward/api/thread?with=${encodeURIComponent(VRIEND)}`);
     192    assert.equal(r.status, 200);
     193    const { items } = await r.json();
     194    const dirs = items.map((i) => i.dir).sort();
     195    assert.deepEqual(dirs, ['in', 'out'], 'een kant van het gesprek ontbreekt');
     196    // De zwaai-vlag overleeft de reis: de client toont hem groter, en dat kan
     197    // alleen als de server hem niet als kale tekst plat slaat.
     198    assert.equal(items.find((i) => i.dir === 'in').wave, true);
     199  } finally { server.close(); }
     200});
     201
     202test('een bericht sturen eist een echte ontvanger en echte tekst', async () => {
     203  const { server, port } = await listen(appWith({ user: { id: 'u1' } }));
     204  try {
     205    const post = (body) => fetch(`http://127.0.0.1:${port}/ward/api/message`, {
     206      method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body),
     207    });
     208    // Geen uri: weigeren, want "aan niemand" bestaat niet.
     209    assert.equal((await post({ to: 'vriend', text: 'hoi' })).status, 400);
     210    // Lege tekst: weigeren, een leeg bericht versturen kan niet.
     211    assert.equal((await post({ to: 'https://elders.example/ap/users/vriend', text: '  ' })).status, 400);
     212  } finally { server.close(); }
     213});
Note: See TracChangeset for help on using the changeset viewer.