Changeset 189e335 in Klonkt for src/services/guardianship


Ignore:
Timestamp:
08/06/2026 07:02:57 AM (5 weeks ago)
Author:
Claude (agent) <aiclaude@…>
Branches:
main
Children:
84ce988
Parents:
99a7b40
git-author:
Robin <roboburr@…> (08/06/2026 07:02:56 AM)
git-committer:
Claude (agent) <aiclaude@…> (08/06/2026 07:02:57 AM)
Message:

Antwoorden vanuit een gesprek, rijk, met de zwaai als eigen knop

Berichten kon je gesprekken tonen maar er niet in antwoorden. Het invoerveld dat
er stond was msg-quickreply: platte tekst, 200 tekens, en het verstuurde geen
antwoord maar een zwaai (deliverDirectNote met wave:true, een FEP-633c-seintje).
Dat is iets anders dat toevallig op een reply leek.

Onder elke draad staat nu de gedeelde reply-editor, ingeklapt achter een
"Reageer" -- open onder elk gesprek maakt de lijst weer onleesbaar, precies wat
deze weergave moest oplossen. De zwaai blijft ernaast als eigen knop, want een
seintje en een antwoord horen niet op een hoop.

/messages/reply kiest het pad op wat de draad zelf meedraagt (replyTo):

  • draad aan een post -> deliverReply op het nieuwste ontvangen bericht erin, met een controle dat die parent ook echt bij die post hoort; anders kon een aangepast formulier een antwoord onder andermans draad hangen.
  • draad aan een persoon -> een direct bericht terug.

Voor dat tweede pad kon deliverDirectNote nog geen rijke inhoud: het escapete
platte tekst. Het accepteert nu html, door dezelfde sanitizer als deliverReply,
zodat een antwoord uit Berichten via één poort gaat. De mention-anker blijft een
eigen alinea vooraan, want de ontvanger moet genoemd staan ook als de inhoud met
een kop of lijst begint. Levert de sanitizer niets bruikbaars op, dan valt het
terug op de escaped tekst -- een leeggepoetste editor mag geen leeg bericht
versturen.

Meldingen in nl/en/de erbij, en getNotifications geeft nu het interactie-id en
de actor-uri mee, want zonder die twee weet een antwoord niet waar het heen moet.

Geverifieerd op dev: beide draden daar adresseren hun eigen tegenpartij, het
formulier draagt de juiste verborgen velden en de zwaai staat er los naast.
Suite 412/412.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/guardianship/delivery.js

    r99a7b40 r189e335  
    4141// guardian on any instance receives it as a private mention (the ward
    4242// call-for-help path).
    43 export async function deliverDirectNote(site, { recipients, text, language, inReplyTo, attachments, helpRequest, wave, awayUntil }) {
     43export async function deliverDirectNote(site, { recipients, text, html, language, inReplyTo, attachments, helpRequest, wave, awayUntil }) {
    4444  const { actorId, fetchActor, localActor, deliverTo, deriveHandle, escHtml, linkUrls, linkHashtags,
    4545          getOutboxRow, buildReplyNote, AP_CONTEXT, getOrCreateKeys, deliver, enqueueDelivery } = deps;
     
    8383    return `<a href="${escHtml(r.url)}" class="u-url mention" data-actor="${escHtml(r.uri)}">${escHtml(disp)}</a> `;
    8484  }).join('');
     85  // Rijk antwoord: `html` is de HTML uit de reply-editor, hier gesaneerd; `text`
     86  // blijft de platte versie (het `source`-veld en de no-JS-fallback). Levert de
     87  // sanitizer niets bruikbaars op, dan valt hij terug op de escaped tekst --
     88  // een leeggepoetste editor mag geen leeg bericht versturen.
     89  const richClean = html ? deps.sanitizeHtml(String(html)) : '';
     90  const rich = richClean && deps.htmlToPlainText(richClean).trim() ? richClean : '';
    8591  const body = escHtml(String(text).trim()).replace(/\r?\n/g, '<br>');
    86   const content = `<p>${mention}${linkUrls(linkHashtags(base, body))}</p>`;
     92  // De mention-anker blijft een eigen alinea vooraan: de ontvanger moet in het
     93  // bericht genoemd staan, ook als de rijke inhoud met een kop of lijst begint.
     94  const content = rich
     95    ? `<p>${mention}</p>${linkUrls(linkHashtags(base, rich))}`
     96    : `<p>${mention}${linkUrls(linkHashtags(base, body))}</p>`;
    8797  const lang = /^[a-z]{2,3}(-[A-Za-z0-9-]+)?$/.test(String(language || '')) ? language : null;
    8898  // Attachments: same rules as deliverReply (own /media/ uploads only,
Note: See TracChangeset for help on using the changeset viewer.