Changeset c26cc18 in Klonkt for src/routes/guardian.js


Ignore:
Timestamp:
07/24/2026 06:04:03 PM (7 weeks ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
780a7c6
Parents:
1a2d8ac
Message:

Guardian-PWA: duidelijker + verstuurde offer altijd zichtbaar

Twee klachten opgelost.

"Ik zie niet dat ik verstuurd heb": de offer werd wél opgeslagen, maar als de
directe bezorging aan de remote ward faalde gaf de flow 502 en ververste de
PWA niet, dus de kaart verscheen niet. Nu: bezorging is async met retry (de
delivery-queue), de handshake geeft altijd 202 (opgeslagen) met een
delivered-vlag, en de PWA ververst altijd en toont de offer onder een eigen
sectie "Verzonden aanvragen · wacht op antwoord". Faalt de eerste bezorging,
dan meldt de UI dat we blijven proberen.

"Mag allemaal duidelijker": de pagina is herzien met vaste secties met kop en
uitleg: Hulpverzoeken (met teller), Ward adopteren (met uitleg wat er gebeurt),
Verzonden aanvragen, Mijn wards (actief-tag), Meldingen. Statussen als tags,
nette lege staten, alles via i18n (nl/en/de).

Changed files:
src/services/ActivityPubService.js

  • deliverToActor: enqueue+retry+logging, geeft {delivered, inbox}

src/services/guardianship/handshake.js

src/routes/guardian.js

  • /adopt niet meer hard falen op bezorg-hik; delivered terug; meer strings

src/views/pages/guardian.ejs

  • herziene, duidelijke secties

src/assets/js/guardian.js

  • aparte "Verzonden aanvragen"-sectie, altijd verversen na adopt

src/assets/css/guardian.css

  • sectie-koppen, status-tags, nette lege staten

src/services/i18n.js

  • uitgebreide guardian.*-teksten nl/en/de

remarks: als de offer "niet binnenkomt" bij de ward, moet diens Klonkt de
nieuwe code draaien (demo/beta/demohub zijn bij); een oude Klonkt of Mastodon
snapt de Offer-Relationship niet.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/guardian.js

    r1a2d8ac rc26cc18  
    3131/** Everything the dashboard shows, one shape for page and API. */
    3232function uiStrings(L) {
    33   const keys = ['sent', 'failed', 'network', 'pending', 'retract', 'release'];
     33  const keys = ['sent', 'sent_retry', 'sending', 'not_found', 'failed', 'network',
     34    'pending', 'active', 'retract', 'release', 'open', 'push_unavailable'];
    3435  return Object.fromEntries(keys.map((k) => [k, i18nT(L, `guardian.${k}`)]));
    3536}
     
    8081  if (!handle) return res.status(400).json({ error: 'empty_handle' });
    8182  const wardUri = /^https?:\/\//i.test(handle) ? handle : await AP.webfingerResolve(handle).catch(() => null);
    82   if (!wardUri) return res.status(404).json({ error: 'not_found' });
     83  if (!wardUri) return res.status(404).json({ error: 'not_found' });   // the handle does not resolve to an account
    8384  const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
    8485  const me = AP.actorId(base, site.slug);
     
    8788    object: { type: 'Relationship', subject: wardUri, relationship: 'shaer:Guardian', object: me },
    8889  });
    89   if (!r || r.status >= 400) return res.status(r?.status || 500).json({ error: r?.error || 'offer_failed' });
    90   res.json({ ok: true, ward: wardUri });
     90  // 403/400 = a real refusal (e.g. you are a ward yourself); anything else the
     91  // offer is recorded and delivery is retried in the background.
     92  if (!r || (r.status >= 400 && r.status !== 502)) return res.status(r?.status || 500).json({ error: r?.error || 'offer_failed' });
     93  res.json({ ok: true, ward: wardUri, delivered: r.delivered !== false });
    9194});
    9295
Note: See TracChangeset for help on using the changeset viewer.