All checks were successful
Queue Release Build / prepare (push) Successful in 28s
Deploy Web Apps / deploy (push) Successful in 5m2s
Queue Release Build / build-windows (push) Successful in 16m44s
Queue Release Build / build-linux (push) Successful in 27m12s
Queue Release Build / finalize (push) Successful in 22s
2.8 KiB
2.8 KiB
Profile Avatar Domain
Owns local profile picture workflow plus peer-synced profile-card metadata: source validation, crop/zoom editor state, static 256x256 WebP rendering, animated avatar preservation, desktop file persistence, and P2P avatar/profile sync metadata.
Responsibilities
- Accept
.webp,.gif,.jpg,.jpegprofile image sources. - Let user drag and zoom source inside fixed preview frame before saving.
- Render static avatars to
256x256WebP with client-side compression. - Preserve animated
.gifand animated.webpuploads without flattening frames. - Persist desktop copy at
user/<username>/profile/profile.<ext>under app data. - Let the local user edit their profile-card display name and description.
- Expose helpers used by store effects to keep avatar metadata (
avatarHash,avatarMime,avatarUpdatedAt) consistent. - Reuse the avatar summary/request/full handshake to sync profile text (
displayName,description,profileUpdatedAt) alongside avatar state.
Module map
graph TD
PC[ProfileCardComponent] --> PAE[ProfileAvatarEditorComponent]
PAE --> PAF[ProfileAvatarFacade]
PAF --> PAI[ProfileAvatarImageService]
PAF --> PAS[ProfileAvatarStorageService]
PAF --> Store[UsersActions.updateCurrentUserAvatar]
Store --> UAV[UserAvatarEffects]
UAV --> RTC[WebRTC data channel]
UAV --> DB[DatabaseService]
click PAE "feature/profile-avatar-editor/" "Crop and zoom editor UI" _blank
click PAF "application/services/profile-avatar.facade.ts" "Facade used by UI and effects" _blank
click PAI "infrastructure/services/profile-avatar-image.service.ts" "Canvas render and compression" _blank
click PAS "infrastructure/services/profile-avatar-storage.service.ts" "Electron file persistence" _blank
Flow
ProfileCardComponentopens file picker from editable avatar button.ProfileCardComponentsaves display-name and description edits through the users store.ProfileAvatarEditorComponentpreviews exact crop using drag + zoom.ProfileAvatarImageServicerenders static uploads to256x256WebP, but keeps animated GIF and WebP sources intact.ProfileAvatarStorageServicewrites desktop copy when Electron is available.UserAvatarEffectsbroadcasts avatar/profile summaries, answers requests, streams chunks when needed, and persists received profile state locally.
Notes
- Static uploads are normalized to WebP. Animated GIF and animated WebP uploads keep their original animation, mime type, and full-frame presentation.
avatarUrlstays local display data. Version conflict resolution usesavatarUpdatedAtandavatarHash.- Profile text uses its own
profileUpdatedAtversion so display-name and description changes can sync without replacing a newer avatar.