feat(app,learn): invite to a shared studyset by email or link, and join

The apps' half of ADR 0044's step 5 (D37 to D40), on the instance's
half of the commit before.

halkyon_app's SharedSpaceGateway asks for inviting by mail, the
preview of a link, the code proving an address, accepting a mailed
invitation, a space's link (read, switched, joined) and marking a
share seen; SpaceInfo says whether a share is new and who made it,
a member whether they were invited by mail. joinTokenOf reads a link
or its token as pasted. The fake keeps the mails and codes it would
send, for the apps' tests.

In Learn:
- the Owner's Share sheet invites by handle or by email, lists an
  invitation mailed by its role alone, and switches the space's link,
  copying it while on;
- the Library's menu has Join with a link, and a link opened on
  Android (/join/<token> on learn.halkyon.eu, verified through the
  instance's assetlinks) opens the same on a screen of its own: who
  invites and as whom, then Join, or for a mailed invitation the
  address and the code mailed there;
- a studyset someone shared is new until opened: in the Inbox
  ("@alice shared Japanese with you", Open or Leave), on the Profile
  tab's badge and as New on its library card (NewSharesCubit, read
  again after every merge).

Whats-New: Invite people to a shared studyset by email or with a link, join one from the Library's Join with a link, and see in the Inbox what was shared with you.
Whats-New-De: Lade Leute per E-Mail oder Link zu einem geteilten Lernset ein, tritt einem über „Mit einem Link beitreten“ in der Bibliothek bei und sieh im Posteingang, was mit dir geteilt wurde.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-11 19:09:12 +01:00
commit fb6b78fa19
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -257,6 +257,15 @@ member reads everything in the space.
that never was, lapsed or was switched off. A membership someone else made is new
to its member (`shared_space_member.isNew`, `addedBy`; `mine` names who shared it,
`markSeen` clears it); joining by a link or a mailed invitation is not.
The apps' half built 11 Nov 2026: halkyon_app's `SharedSpaceGateway` asks all of it
(`joinTokenOf` reads a link or its token pasted), its fake keeping the mails and
codes it would send; in Learn the Owner's Share sheet invites by handle or by
email and switches the link, copying it; the Library's menu joins with a link
pasted, and a link opened on Android (`/join/<token>`, verified with the
instance's assetlinks) opens the same on a screen of its own, asking for the
address and its code where the invitation was mailed; what is new shows in the
Inbox ("@alice shared Japanese with you", Open or Leave), on the Profile tab's
badge and as New on the studyset's card, until the studyset is opened.
6. **Agents** (D6, D7, D10, D12).
## Open questions, before building