Notechondria

Version: 0.1.86 Build Date: 2026-04-28

What's Changed

Cover images and multi-device session manager ported from editor_app to planner_app and portal_app.

Cover images — planner + portal

NoteCoverImage upload, delete, and display in the note editor metadata dialog, note viewer, and note cards for both planner_app and portal_app.

  • Client layer — Added uploadNoteCoverImage (multipart POST to /notes/$noteId/cover/) and deleteNoteCoverImage (DELETE to /notes/$noteId/cover/) to both apps' NotechondriaClient interface and HttpNotechondriaClient implementation.
  • App shell — Wired onUploadCover / onDeleteCover callbacks in _buildPage() for both apps.
  • Note metadata dialog — Added cover section with file picker, upload/replace/remove actions, and NoteCoverImage preview to both apps' _NoteMetadataDialog. Extracted from learner_note_editor.dart into new note_metadata_dialog.dart part-files to stay under the 1000-line ceiling.
  • Note viewer — Added cover image banner above the markdown body when cover_image_url is present.
  • Note cards — Added NoteCoverImage banner to _LearnerNoteCard in both apps (21/9 aspect ratio, clipped anti-alias).

Multi-device session manager — planner + portal

ActiveSessionsCard in the Settings page for both planner_app and portal_app, enabling users to view and revoke active sessions.

  • App shell state — Added _currentSessionId, _multiDevice, _otherSessionsCount fields and applySessionMetadata / clearSessionMetadata overrides via AppShellSessionMixin.
  • Callback wiringonListSessions, onRevokeSession, onCurrentSessionRevoked wired in _buildPage() for both apps.
  • Settings UI — Added constructor params, field declarations, and ActiveSessionsCard embed for both apps.

Files Changed

  • VERSION — 0.1.85 → 0.1.86.
  • frontend/planner_app/lib/core/client.dart — abstract + HTTP impl for uploadNoteCoverImage / deleteNoteCoverImage.
  • frontend/portal_app/lib/core/client.dart — same additions.
  • frontend/planner_app/lib/app_shell.dart — cover + session callbacks, session state fields and mixin overrides.
  • frontend/planner_app/lib/modules/learner.dart — cover params, card banner.
  • frontend/planner_app/lib/modules/learner_note_editor.dart — cover params, extracted metadata dialog.
  • frontend/planner_app/lib/modules/note_metadata_dialog.dart — new part-file with cover section UI.
  • frontend/planner_app/lib/modules/note_viewer.dart — cover image banner.
  • frontend/planner_app/lib/modules/settings.dart — session params + ActiveSessionsCard.
  • frontend/planner_app/lib/main.dart — added part directive for note_metadata_dialog.
  • frontend/portal_app/lib/app_shell.dart — cover + session callbacks, session state fields and mixin overrides.
  • frontend/portal_app/lib/modules/learner.dart — cover params, card banner.
  • frontend/portal_app/lib/modules/learner_note_editor.dart — cover params, extracted metadata dialog.
  • frontend/portal_app/lib/modules/note_metadata_dialog.dart — new part-file with cover section UI.
  • frontend/portal_app/lib/modules/note_viewer.dart — cover image banner.
  • frontend/portal_app/lib/modules/settings.dart — session params + ActiveSessionsCard.
  • frontend/portal_app/lib/main.dart — added part directive for note_metadata_dialog.
  • docs/TODO.md — cover images and session manager items removed.