32 Commits
Author SHA1 Message Date
Jeff Gardner 2c16c5b0b3 chore: prepare v2026.5.22+25 release 2026-05-22 13:11:23 +02:00
JeffGandGitHub d57a883e53 Implement iOS NSE notifications and Android push token plumbing (#673)
* Add remote push notification plumbing

* Checkpoint notification reliability cleanup

* Prepare notification reliability PR

* Fix notification PR review findings

* Address notification review follow-ups

* Clean up failed iOS data migration copies

* Address app resume and migration cleanup review

* Restore coverage for notification review fixes

* Fix App Group migration guard

* Address notification PR review feedback

* Cover notification review edge cases

* Address notification test review feedback

* Address NSE migration and startup retry review

* Use foreground catch-up for notification refresh

* Update whitenoise-rs foreground catch-up dependency

* Cover notification catch-up error paths

* Fix notification review edge cases
2026-05-20 14:47:09 +02:00
Javier G. Montoya S.andGitHub 418fca8beb test(integration): add integration test support with basic messaging flow test (#666)
* test(integration): add integration test support with basic messaging flow test

* chore(): add docker-compose file with needed relays for integration tests
2026-05-18 12:03:00 -04:00
JeffGandGitHub 7c543c32a0 Add native deep links for users, chats, and settings (#661)
* 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
2026-05-15 12:34:58 +02:00
PepiandGitHub 61f3e6bc93 Save to gallery (#619)
* 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
2026-05-07 08:43:44 +02:00
PepiandGitHub 2300885c67 Use group capabilities in leave group hook (#600)
* 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
2026-04-29 10:08:16 -04:00
PepiandGitHub 11de8fbfc5 Detect offline state and show notice in chat list (#565)
* 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
2026-04-14 10:05:59 -04:00
JeffGandGitHub 5f7f0512c0 chore: add mobile push notification prerequisites (#539)
* chore: add mobile push notification prerequisites

* fix: address push prereq review feedback
2026-03-26 15:40:25 +01:00
Danny MandGitHub 2bfec517fb feat: add bug report screen with NIP-44 encrypted anonymous reports (#478) 2026-03-14 21:23:21 +01:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>josefinalliende
d8332b15d3 chore(deps): bump the flutter-dependencies group across 1 directory with 7 updates (#451)
* chore(deps): bump the flutter-dependencies group across 1 directory with 7 updates

Bumps the flutter-dependencies group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [build_runner](https://github.com/dart-lang/build) | `2.11.0` | `2.12.2` |
| [flutter_foreground_task](https://github.com/Dev-hwang/flutter_foreground_task) | `9.2.0` | `9.2.1` |
| [freezed](https://github.com/rrousselGit/freezed) | `3.2.3` | `3.2.5` |
| [mobile_scanner](https://github.com/juliansteenbakker/mobile_scanner) | `7.1.4` | `7.2.0` |
| [widgetbook](https://github.com/widgetbook/widgetbook/tree/main/packages) | `3.20.2` | `3.22.0` |
| [widgetbook_generator](https://github.com/widgetbook/widgetbook/tree/main/packages) | `3.20.1` | `3.22.0` |



Updates `build_runner` from 2.11.0 to 2.12.2
- [Release notes](https://github.com/dart-lang/build/releases)
- [Commits](https://github.com/dart-lang/build/compare/build_runner-v2.11.0...build_runner-v2.12.2)

Updates `flutter_foreground_task` from 9.2.0 to 9.2.1
- [Changelog](https://github.com/Dev-hwang/flutter_foreground_task/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Dev-hwang/flutter_foreground_task/commits)

Updates `freezed` from 3.2.3 to 3.2.5
- [Commits](https://github.com/rrousselGit/freezed/compare/freezed-v3.2.3...freezed-v3.2.5)

Updates `mobile_scanner` from 7.1.4 to 7.2.0
- [Release notes](https://github.com/juliansteenbakker/mobile_scanner/releases)
- [Changelog](https://github.com/juliansteenbakker/mobile_scanner/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/juliansteenbakker/mobile_scanner/compare/v7.1.4...v7.2.0)

Updates `widgetbook` from 3.20.2 to 3.22.0
- [Release notes](https://github.com/widgetbook/widgetbook/releases)
- [Commits](https://github.com/widgetbook/widgetbook/commits/widgetbook-v3.22.0/packages)

Updates `widgetbook_annotation` from 3.9.0 to 3.11.0
- [Release notes](https://github.com/widgetbook/widgetbook/releases)
- [Commits](https://github.com/widgetbook/widgetbook/commits/widgetbook_annotation-v3.11.0/packages)

Updates `widgetbook_generator` from 3.20.1 to 3.22.0
- [Release notes](https://github.com/widgetbook/widgetbook/releases)
- [Commits](https://github.com/widgetbook/widgetbook/commits/widgetbook_generator-v3.22.0/packages)

---
updated-dependencies:
- dependency-name: build_runner
  dependency-version: 2.12.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: flutter-dependencies
- dependency-name: flutter_foreground_task
  dependency-version: 9.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: flutter-dependencies
- dependency-name: freezed
  dependency-version: 3.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: flutter-dependencies
- dependency-name: mobile_scanner
  dependency-version: 7.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: flutter-dependencies
- dependency-name: widgetbook
  dependency-version: 3.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: flutter-dependencies
- dependency-name: widgetbook_annotation
  dependency-version: 3.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: flutter-dependencies
- dependency-name: widgetbook_generator
  dependency-version: 3.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: flutter-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: upgrade flutter and dart version

* chore: update version in widget book lockfile

* chore: upgrade flutter version in ci workflows

* test: update mock scanner controller to fix failing tests

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: josefinalliende <mariajosefinaalliende@gmail.com>
2026-03-08 10:26:43 -03:00
JeffGandGitHub ec18bcce2c Add version to settings footer, bump whitenoise crate rev (#367)
* 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
2026-02-23 10:49:23 +01:00
PepiandGitHub 208bed5367 Fix chat message input (#366)
* fix: adjust chat message input actions positioning

* fix: scroll edge effect for chat input

* chore: update podfile.lock
2026-02-22 11:24:27 -03:00
JeffGandGitHub ae203e9d65 Update iOS icons and app name for staging (#330)
* 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.
2026-02-20 19:50:04 +01:00
PepiandGitHub 8b7b9e48e4 Images in chat (#249)
* 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
2026-02-20 00:59:21 -03:00
emir yorulmazandGitHub c0c451887c Group info & management (#315)
* Hooks

* Translations

* Routes

* Screens

* Widgets

* Tests

* Update CHANGELOG.md

* Group-specific success msg

* Group specific error msg

* Add missing error msgs and tests

* Remove unused system notice from group info
2026-02-19 13:40:17 +03:00
emir yorulmazandGitHub c35f592284 Create group (#288)
* 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
2026-02-18 16:00:47 +03:00
a31e528776 Refactor camera permission flow (#194)
* 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>
2026-02-18 14:43:15 +03:00
JeffGandGitHub 147b6bccde feat(auth): multi-step login with relay resolution UI (#281)
* 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)

Closes marmot-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)
2026-02-17 11:41:56 +01:00
JeffGandGitHub 21c52783a1 fix: lock app orientation to portrait mode (#235)
* 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
2026-02-12 12:54:23 +01:00
PepiandGitHub 2cec4e850b Migrate to white noise app bundle id (#163)
* 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
2026-02-05 14:45:04 -03:00
8e18dbce40 feat(theme): add centralized AppTypography system (#170)
* 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>
2026-02-04 14:57:55 +01:00
emir yorulmazandGitHub d44ef064a8 Scan QR for nsec (#164)
* Add tests

* use_scan

* routes

* screens

* widgets

* Translations and permissions

* scanner service

* Update CHANGELOG

* Make scanner start/stop return bool

* Design update
2026-02-03 15:29:18 +03:00
PepiandGitHub e644c08aed Setup widgetbook with semantic colors story (#82)
* chore: setup widgetboook

* feat: update colors

* docs: add colors story

* docs: add intro with figma links

* docs: update changelog

* fix: linter issue in wn icon
2026-01-29 10:43:20 -03:00
PepiandGitHub e55e2f30d5 Emoji picker for reactions (#81)
* feat: add icons for emojis categories

* feat: add emoji picker

* feat: move message actions to screen and use emoji picker

* fix: chat input focus after reaction

* docs: update changelog
2026-01-26 16:41:34 -03:00
PepiandGitHub c909d1e53b Search user by npub (#39)
* 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
2026-01-20 12:30:54 -03:00
PepiandGitHub aac89deb29 Send messages (#33)
* 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
2026-01-14 18:41:31 -03:00
emir yorulmazandGitHub 043883711a Add profile (keys, edit, share) screens (#22)
* Add screens

* Add hooks

new hooks

* Add npub from hex pubkey util

* Update CHANGELOG.md

* Add tests

* Rename profile update func in service

* Just format
2026-01-08 18:08:08 +03:00
PepiandGitHub 754842417f Feat/auth-and-navigation (#6)
* feat: add auth providers, hooks and services

* feat: add more base components

* feat: add routing and main screens

* chore: add coverage-report just command

* docs: improve readme

* chore: add android buidl scrips from whitenoise repo
2025-12-18 12:36:03 -03:00
josefinalliende 1ef35799b7 chore: update debug staging build config to allow running in emulators 2025-12-09 07:47:07 -03:00
josefinalliende ce5dd6ae70 feat: setup splashscreen 2025-12-01 11:20:36 -03:00
josefinalliende 72a565cdaf chore: setup rust bridge 2025-12-01 10:23:00 -03:00
josefinalliende adea663d6e chore: setup new flutter project 2025-11-24 15:02:01 -03:00