* test(integration): add integration test support with basic messaging flow test
* chore(): add docker-compose file with needed relays for integration tests
* Add copy deep link action to chat debug screen
* Address deep link review feedback
* Address deep link PR review follow-ups
* Scale profile QR code size
* feat: add gal depency to save images in gallery
* feat: add save to gallery translations
* feat: add save to gallery hook
* refactor: extract aspect ratio from dim to utils
* refactor: use wn icon button for deleting media in previews
* feat: add overlay to video to then have download button
* feat: save to gallery in media modal
* docs: update changelog
* test: improve coverage of chat message media
* feat: add feature flags provider for leave group
* feat: update leave group locales
* feat: add self remove to chat list chat summary
* feat: adjust use leave group hook to show it only when allowed
* chore: update podfile.lock
* chore: add connectivity plus
* feat: add provider to detect offline state
* test: improve coverage of add logs screen
* feat: add waiting for internet translations
* feat: show no internet notice in chat list
* docs: update changelog
* Add version to settings footer, bump whitenoise crate rev
* Update icons and get staging iOS updated for TestFlight
* fix: surface group operation errors to the user
- GroupInfoScreen: show error notice when member list fails to load
- SetUpGroupScreen: show warning notice when group image upload fails
(group is created successfully but user is informed the image didn't upload)
- EditGroupScreen: show save failure as a notice and keep Save/Cancel
buttons visible so the user can retry, rather than replacing the form
Refactors useCreateGroup.createGroup to return ({Group? group, bool
imageUploadFailed}) instead of Group?, making partial success explicit
in the return value rather than as a state side-effect.
* fix(l10n): translate groupImageUploadFailed into all supported locales
* Update iOS icons and app name for staging
* fix(ios): harden build script and correct Release display name
- Add cargo check to environment validation in build_ios.sh
- Add existence check before cd rust to give informative errors
- Replace fragile cd/pod install/cd with pushd/popd and error handling
- Add POSIX-compliant trailing newline to build_ios.sh
- Fix project-level Release APP_DISPLAY_NAME ("White Noise staging" → "White Noise") to match target-level value
* feat(android): add staging flavor launcher icons
Add ic_launcher_foreground, ic_launcher_background, ic_launcher_monochrome,
and legacy ic_launcher PNGs for all densities (mdpi through xxxhdpi) plus
the mipmap-anydpi-v26 adaptive icon XML in the staging source set.
* fix(ios): add CocoaPods availability check to build script
* chore: replace LICENSE copies with symlinks to root
Fixes missing license warnings during iOS builds by ensuring
rust/ and rust_builder/ both symlink to the root LICENSE file.
* refactor: remove unused animated pixel overlay widget
* feat: add base media placeholder widgets
* feat: add media thumbnail widget
* feat: add media download hook
* feat: add media display widgets
* feat: add media preview and modal widgets
* feat: add media upload support
* refactor: replace reply preview with chat message quote
* feat: integrate media into chat screen
* docs: update changelog
* test: replace magic number 844 with testDesignSize.height in WnTooltip test
* fix: remove thumbnail gradient overlay, center image in remaining space
* fix: constrain modal height so image fills remaining space below header
* test: improve coverage
* Translations
* Hooks
* Routes
* Screens
* Tests
* Update CHANGELOG.md
* tapping close button navigates back
* find.byKey
* New design
* 'Create group'
* Pass selectedUsers as param to hook
* Add missing spacing for user list in set up group
* use back button for headers in create group flow
* Refactor camera permission flow
* Update CHANGELOG.md
* chore: add permission handler
* feat: add scanner translations
* fix: request camera permission and use permission handler to go to settings in case of denied
* fix: show camera option in ios settings
---------
Co-authored-by: josefinalliende <mariajosefinaalliende@gmail.com>
* feat(auth): multi-step login with relay resolution UI
Replace the single-shot login API with a multi-step flow that gracefully
handles missing relay lists instead of crashing. When relay lists aren't
found on the network, users are now presented with a relay resolution
screen offering two paths: provide a custom relay URL to search, or
publish default relay lists.
- Update whitenoise-rs to multi-step login PR (3435fd9)
- Add LoginResult/LoginStatus/LoginError types to Rust API bridge
- Add login_start, login_publish_default_relays, login_with_custom_relay,
login_cancel bridge functions (nsec + external signer variants)
- Refactor AuthNotifier, hooks, and AndroidSignerService for multi-step flow
- Add RelayResolutionScreen with relay URL input and default relays option
- Add structured login error messages (invalid key, timeout, no connections)
- Remove obsolete AccountSettings bridge (removed upstream)
Closesmarmot-protocol/whitenoise#46, marmot-protocol/whitenoise#143
* fix(auth): standardize error keys, add translations, maximize test coverage
- Standardize all login hook errors to l10n keys instead of raw English
strings (paste errors, all 5 LoginError variants)
- Remove redundant useEffect cleanup from hooks (useTextEditingController
handles its own disposal)
- Wrap fire-and-forget userMetadata call with unawaited() for clarity
- Simplify relay resolution error resolver to two-branch switch
- Translate all 15 new l10n keys into DE, ES, FR, IT, PT, RU, TR
- Add 4 new l10n keys: loginErrorNoLoginInProgress, loginErrorInternal,
loginPasteNothingToPaste, loginPasteFailed
- Add tests for all uncovered provider, screen, hook, and service paths
Coverage: 99.43% overall, 100% on all changed files
* fix(auth): remove unused hook param, disable buttons during loading, assert loginCancel
- Remove unused isExternalSigner parameter from useRelayResolution hook
(the screen uses it to select callbacks, not the hook itself)
- Disable both relay resolution buttons while loading to prevent
concurrent requests
- Add assertion to loginCancel test verifying the Rust API receives
the correct pubkey
* fix(auth): restore nsec cleanup on dispose, use consistent error key
- Restore useEffect cleanup that clears nsec from TextEditingController
on widget dispose (security fix from defb482 accidentally removed)
- Replace orphaned 'relayResolutionPublishFailed' error key with
'loginErrorGeneric' for consistency with tryCustomRelay error handling
- Regenerate flutter_rust_bridge code after rebase onto master
* fix(auth): independent button loading, relay URL prefill and validation
- Split isLoading into isPublishingDefaults and isSearchingRelay so each
button shows its own loading indicator while the other is just disabled
- Prefill relay URL input with wss:// matching the network settings pattern
- Add debounced relay URL validation (shared utility extracted from
use_add_relay) with inline error display via WnInput.errorText
- Wrap fire-and-forget userMetadata call with error handling in
_completeLogin to prevent unhandled async exceptions
- Replace map-iteration-order-dependent testNpubToHex.values.first with
explicit testPubkeyA constant in mock
- Add mounted guard (useRef<bool>) to skip state updates after unmount
- Map caught ApiError variants to structured l10n keys instead of
hardcoding loginErrorGeneric; expand _resolveError to match
* test: add coverage for metadata fetch failure, validation reset, and external signer method routing
- Test that login completes even when fire-and-forget userMetadata fails
- Test that clearing relay URL back to wss:// prefix resets validation state
- Add invocation flags to mock auth notifier and assert external signer
tests call the correct methods (not the regular login methods)
* fix: lock app orientation to portrait mode (#233)
Disable device rotation since there is no landscape design.
Lock orientation at both Flutter (SystemChrome) and native
(iOS Info.plist, Android manifest) levels.
* fix: consistent indentation for orientation plist entries
* chore: use whitenoise app team and bundle id
* chore: add apk commands
* chore: rename package from sloth to whitenoise
* docs: remove sloth word from readme and agents.md
* chore: replace sloth texts with whitenoise
* chore: remove unused error screen
* docs: copy LICENSE file from whitenoise repo
* chore: upgrade version to 0.3.0+15 so that android apk can replace old whitenoise ones
* refactor: rename MyApp to WnApp
* chore: use new staging bundle id
* chore: rename org.parres to IPF
* chore: remove .so file
* fix: make android signer work after bundle id change
* core: replace org.parres with dev.ipf for widgebtook
* test: improve coverage
* feat(theme): add centralized AppTypography system
- Add AppTypography ThemeExtension with all font size/weight variants
- Replace inline TextStyle definitions across screens and widgets
- Use context.typographyScaled for responsive font sizing
- Update wn_list_item and wn_tooltip to use new typography system
- Reduces code duplication and ensures consistent typography
* chore: remove comments from AppTypography
* refactor: inline single-use typography variables
Remove unnecessary typography variable declarations in files where
context.typographyScaled is only called once. Direct inline access
is cleaner for single-use cases.
* refactor(theme): remove fontFamily overrides and add size 10 typography
- Remove explicit fontFamily: 'Manrope' from all 42 TextStyle variants
in AppTypography to allow theme-level font changes to propagate
- Add medium10, semiBold10, bold10 typography variants (fontSize: 10,
height: 14/10, letterSpacing: 0.8)
- Remove redundant Builder widgets in WnSystemNotice and hoist
typography lookup to build method scope
- Replace one-off fontSize: 10.sp overrides in WnMessageReactions
with typography.medium10
- Add widget-level tests for AppTypographyExtension in theme_test.dart
- Add tests for size 10 typography styles
* fix(theme): scale letterSpacing in _scaleStyle for responsive typography
Apply .sp scaling to letterSpacing in addition to fontSize to ensure
letter spacing scales responsively across different device sizes.
* feat(widgetbook): add typography showcase to foundations
Display all 48 text style variants organized by size (96-10) with
Medium, SemiBold, and Bold weight variants. Each section shows specs
(font size, line height, letter spacing) and sample text.
* feat: replace missing TextStyle with typography
---------
Co-authored-by: josefinalliende <mariajosefinaalliende@gmail.com>
* feat: use cached network image in avatar and unify them in single widget
* chore: ignore ai folders
* feat: add encoding util and move hex to npub conversion there
* feat: fetch user and rename service to user service
* feat: add hook to search user by npub
* feat: add search field component
* feat: add user search screen
* feat: add user search route
* docs: update changelog
* test: avoid mocks duplication and add misisng icon keys
* refactor: extract fade overlay to its own widget
* feat: fade overlay for user search results scroll
* test: find by key instead of specific icon
* feat: add hook for chat input
* feat: add message service to send text messages
* feat: store chat messages mapped by id and save latest message id
* feat: add hook to handle chat scroll
* feat: send messages from chat screen
* chore: update pubspec.lock
* docs: update CHANGELOG