The server derives user identity from the Matrix Bearer token already
sent in the Authorization header. The pangea_user_id query param is
ignored server-side and unnecessary.
Co-authored-by: ggurdin <ggurdin@gmail.com>
Co-authored-by: ggurdin <46800240+ggurdin@users.noreply.github.com>
* docs: add User Feedback section to toolbar reading assistance instructions
Describes the shared feedback pattern for word cards (existing) and
translations (planned). References #5838.
* feat: allow users to flag translations
* make flag button smaller
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* fix: emit granular IGC/IT use types instead of collapsed ga/ta
* formatting
* fix linter issues with deprecated use types
* fix: don't add match viewing update to choreo record, don't flatten token IGC uses into a single type
* break vocabAndMorphUses down into smaller functions
* filter viewed choreo steps when getting uses from choreo
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* fix: show knock-accepted notification body when invite follows a knock (#5823)
When Synapse accepts a knock it sends an m.room.member invite event. The client
was displaying the generic 'You have been invited by X' push notification body
because the invite event alone doesn't carry prev_content on the push path.
Use KnockTracker (already used for auto-join) to detect knock-accepted invites
and show a dedicated 'Your join request was accepted!' notification body instead.
- Add knockAccepted string to intl_en.arb
- Extract condition into isKnockAcceptedInvite() pure util for testability
- Expose KnockTracker.getKnockedRoomIds() publicly (was _getKnockedRoomIds)
- Override notification body in push_helper.dart (background) and
local_notifications_extension.dart (foreground/web)
- Unit tests for all isKnockAcceptedInvite() branches (9 tests)
* formatting
* fix up pangea comments
* fix: avoid race condition with knocked room account data updates and local push notification content
* translations
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* move activity session page bottom section into its own widget
* activity session full mode
* fix loading of activity session preview on open app via course ping
* "docs: writing assistance redesign design spec (#5655)
Add comprehensive design doc for the WA redesign:
- AssistanceRing replaces StartIGCButton (segmented ring around Pangea icon)
- Background highlights with category colors (not red/orange error tones)
- Simplified match lifecycle: open → viewed → accepted (no ignore)
- Persistent span card with smooth transitions between matches
- Send always available, no gate on unresolved matches
Remove superseded design docs (SPAN_CARD_REDESIGN_FINALIZED.md,
SPAN_CARD_REDESIGN_Q_AND_A.md, choreographer.instructions.md)."
* feat: replace ignored status with viewed status, initial updates to span card
* resolve merge conflicts
* rebuild input bar on active match update to fix span hightlighting
* cleanup
* allow opening span cards for closed matches
* no gate on sending, update underline colors
* animate span card transitions
* initial updates to add segmented IGC progress ring
* update segment colors / opacities based on match statuses
* use same widget for igc loading and fetched
* more segment animation changes
* fix scrolling and wrap in span card
* better disabled color
* close span card on assistance state change
* remove print statements
* update design doc
* cleanup
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* feat: client-side knock auto-accept via KnockTracker
Replace server-side AutoAcceptInviteIfKnocked (removed in
synapse-pangea-chat PR #21) with client-side KnockTracker.
- Record knocked room IDs in Matrix account data (org.pangea.knocked_rooms)
- Auto-join when invite arrives for a previously knocked room
- Migrate storage from GetStorage to Matrix account data for
cross-device sync and reinstall persistence
- Add joining-courses.instructions.md design doc
* formatting
* centralizes calls to knock-storage related functions
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* chore: split up analytics activity page widgets into separate files
* started analytics practice refactor
* refactor how UI updates are triggered in analytics practice page
* some fixes