Commit Graph
318 Commits
Author SHA1 Message Date
Anastasiya 88571a4774 chore(@e2e): wait for animation of activity center panel before using buttons 2026-08-27 19:07:07 +03:00
Anastasiya a014f9ea3a tests(@e2e): keycard settings scenarios 2026-08-27 11:55:13 +03:00
Anastasiya 085bd54a2e test(e2e): fix messaging contact requests 2026-08-26 15:28:53 -04:00
Anastasiya 1e65148f0a fix(@e2e): stabilize clipped 14-inch GUI helpers 2026-08-26 22:04:09 +03:00
Jonathan Rainville b5de025f6b feat(nav): move Settings from the primary nav bar to the profile menu
Closes part of #21861
2026-08-26 09:27:40 -04:00
Anastasiya 12c731e846 tests(@e2e): add verification of transaction in activity 2026-08-26 15:04:04 +03:00
Anastasiya f02fca7740 test(@e2e): restart and PIN-login after empty Keycard onboarding 2026-08-25 12:20:58 +03:00
Alex JbancaandAnastasiya bd3fccc449 perf: load the chat and community sections asynchronously with skeletons (#21917)
* perf: load chat and community sections asynchronously with skeletons

The section loaders own the chrome (StatusSectionLayout) and show the
matching skeleton — with the real, functional header — while the actual
section incubates behind an asynchronous Loader; the section's panels
are proxied back into the loader-owned chrome once ready (full-page
community views hide it). The communities portal loader turns
asynchronous too. The pre-ready startup overlay recomposes from the
skeleton panels, replacing the ChatLayoutLoading placeholder view (whose
AppMain reference had been left dangling).

* fixup! perf: load chat and community sections asynchronously with skeletons

Each skeleton slot was gated on the whole section loader reaching Ready, so
the header, chat list, message column and member list all swapped in at once,
paced by the slowest panel. ChatView now publishes per-panel readiness and
ChatLayout forwards it, letting each slot retire on its own. `root.item` is
null until the section itself loads, so the old whole-loader behaviour remains
the floor.

The right panel is not deferred at this point in the stack, so its flag is
constant; it becomes meaningful once the members panel moves behind a loader.

Also drops `signal ready()` from both section loaders: `mainReady` is fed to
AppMain by AppMainLoader and nothing has ever connected to `ready`, so the
signal and the comment claiming AppMain owns the spinner toggle are both dead.

* fixup! perf: load chat and community sections asynchronously with skeletons

The startup overlay predates the loader-owned chrome. ChatLoader and
CommunityChatLoader declare their skeleton panels as plain children, which Qt
instantiates and paints even while the loader is inactive, so for the chat
section the overlay now covers an already-correct skeleton with a duplicate of
itself.

Scoped to the two cases where nothing else paints yet: the communities portal
(CommunitiesPortalLoader is gated on mainReady and owns no skeleton), and a
community section during the window where activeSectionType is already
`community` but the repeater has not produced any delegate — the same window
the currentIndex fallback below already accounts for.

* fixup! perf: load chat and community sections asynchronously with skeletons

Release the chrome skeletons instead of hiding them: permanent
visible:-gated skeletons re-evaluate their tile geometry bindings on
every resize for the lifetime of the section (same class as the
ChatContentView messages skeleton, caught in a resize profile). Each
skeleton now lives behind a Loader gated on its slot's readiness.

* fixup! perf: load chat and community sections asynchronously with skeletons

The slots fell through to the real panel as soon as `root.item` existed.
ChatView's panels are non-null Loader objects from the moment the section
loads, so `?? skeleton` never saw the readiness flags: the LayoutItemProxy
retargeted to an empty Loader, released the skeleton with
setParentItem(null)/setVisible(false), and the slot painted nothing until
the panel incubated. Gate each slot on its own flag instead.

The skeletons collapse to bare Loaders keyed on `!ready`, dropping the
wrapper Item whose `visible` the proxy also writes.

tst_SectionLoaderChrome drives both loaders with a stub section whose
flags are writable, so the contract is pinned as a binding rather than as
a race against incubation.

* fixup! perf: load chat and community sections asynchronously with skeletons

The startup overlay's only remaining case was a community section with no
repeater delegate yet, and it painted the chat-list skeleton there — wrong
shape, replaced a frame later by CommunityChannelsSkeleton. Keep the
overlay for the communities portal, which has nothing else painting, and
let a missing community delegate fall back to the currentIndex loader,
which already shows the right shape.

* fixup! perf: load chat and community sections asynchronously with skeletons

* chore(@e2e): fix tests according to the changes

* fixup! perf: load chat and community sections asynchronously with skeletons

* fixup! perf: load chat and community sections asynchronously with skeletons

---------

Co-authored-by: Anastasiya <anastasija.ig@gmail.com>
2026-08-22 08:13:51 +03:00
Anastasiya d2e639a549 tests(@e2e): fix password change tests and reduce timeout to 5 seconds 2026-08-21 23:22:58 +02:00
Sale Djenic 64ca2fb8ca feat: fast password change with optional rekey
Profiles on the DEK encryption scheme change their password by re-wrapping the profile key file
means no database re-encryption, no restart.

The change-password modal has options:
- do fast password change re-wrap the DEK
- do deep password change in case of legacy profiles (one-time migration), or the new profiles for
  which "also re-encrypt my data" (rekey) checkbox is checked

Closes #21877
2026-08-21 23:22:58 +02:00
Anastasiya 233fa7d065 chore(@e2e): remove keypair renaming test in favor of QML 2026-08-20 17:17:44 +03:00
Anastasiya df11b74877 test(@e2e): import recover phrase onto keycard from settings 2026-08-20 17:17:44 +03:00
Anastasiya cfa05c2a14 chore(@e2e): fix object types 2026-08-20 15:56:15 +02:00
Anastasiya 02a2c944b8 test(e2e): run transaction tests on Sepolia and L2 testnets 2026-08-18 19:02:31 +03:00
Anastasiya 5efb81423f chore(@e2e): make clicking community link cross platform 2026-08-13 14:07:51 +03:00
Alex Jbanca 20c41f73d9 fix(ios): paste without triggering the system paste permission prompt (#21799)
* fix(ios): paste without triggering the system paste permission prompt

On iOS any programmatic read of UIPasteboard shows the "Allow Paste?"
alert. Our Paste buttons read the clipboard directly, so they prompted
every time. Replace them with UIPasteControl, where the system performs
the read and hands over the contents, making the tap itself the consent.

- add NativePasteButtonItem, hosting a native UIPasteControl, and the
  StatusPasteButton wrapper (native on iOS, StatusButton elsewhere)
- use it for every Paste button: sync code, WalletConnect URI,
  watch-only address, private key, chat key and both send recipient
  inputs
- disable AppMain's passive clipboard watcher on iOS: it read the
  clipboard with no user action at all, which is what prompted on launch
- drop the now-dead iOS guards left over from #21365

A native view composites above the whole Qt scene, so the control is
clipped to its visible viewport and hidden whenever something is stacked
above it - a popup over the page, or another popup over the one holding
it. That state is recomputed per frame from afterAnimating and pushed to
UIKit only when it changes; it must not call polish(), which requests a
new frame and would keep the window rendering forever.

The paste completion captures the target view rather than a raw C++
pointer, so a control destroyed while the item provider loads - closing
the modal it lives in - cannot deliver into freed memory.

Desktop keeps its existing Paste button styling: the wrapper forwards
size, border, font weight and focus policy, and each site passes what it
used before. Desktop buttons are now disabled rather than always enabled
when the clipboard has no text.

Also track *.mm in STATUS_Q_FILES: the mobile build only watched .cpp
and .h, so no Objective-C++ change in StatusQ ever triggered a rebuild
and stale binaries were shipped to the simulator.

Text editors are unaffected: StatusTextArea is a Controls TextArea, so
long-press gives the OS edit menu, whose Paste the system authorises.

Closes #21438

* fix(StatusPasteButton): apply review feedback

- base the wrapper on Control and forward the font group, so a site can
  set the label's family, weight or pixelSize. They are forwarded one by
  one on purpose: StatusBaseButton binds each of them itself, and a
  whole-group `font:` assignment is silently ignored - verified by
  checking that a bigger pixelSize actually widens the button.
- keep the wrapper out of the tab chain. Control brings its own
  focusPolicy, so the button's is `buttonFocusPolicy`; otherwise the
  composite would add a tab stop in front of the button.
- derive the Qt -> UIKit scale from the window's devicePixelRatio over
  the view's contentScaleFactor rather than parsing QT_SCALE_FACTOR. The
  ratio is exactly the extra Qt scaling, whatever asked for it.
- mark foregroundColor/backgroundColor REQUIRED: UIKit picks each tint's
  default on its own, so setting only one can leave the glyph unreadable
  against the fill.

* fix(NativePasteButtonItem): make the zero-scale guard obvious

contentScaleFactor was already checked before the division, but far
enough above it to read like an unguarded divide. Bail out on the null
view and window first, then guard the divisor right where it is used.
2026-08-12 17:29:55 +03:00
Anastasiya 4acdfba962 tests(@e2e): import known seed onto card and create profile with keycard simulator 2026-08-12 12:46:00 +03:00
Anastasiya 8e4b6e0650 tests(@e2e): send stickers in chat 2026-08-10 18:53:33 +03:00
Anastasiya e285fde4a6 chore(@e2e): changes reflecting updated implementation 2026-08-09 00:10:11 +02:00
Anastasiya fd90ae1f5f chore(@e2e): fix for nightly failures 2026-08-06 10:08:13 +03:00
Michał Cieślak 09770ce633 Chat: StatusChatInputNew -> StatusChatInput rename 2026-08-05 14:44:03 +02:00
Anastasiya 555b7d8c14 chore(@e2e): fix locators for messaging tests 2026-08-05 08:40:31 +02:00
Anastasiya 7c415c5b94 chore(@e2e): fix locator due to changes made in QML 2026-08-04 19:07:13 +02:00
Anastasiya 1d56a27c69 chore(@e2e): fix locator for testnet popup 2026-08-03 16:38:26 +03:00
Anastasiya df9aec3f2b chore(@e2e): drop skipped wallet network settings tests 2026-08-03 11:40:56 +03:00
Anastasiya f768268861 tests(@e2e): create profile through onboarding with new keycard and log in 2026-07-31 16:37:35 +03:00
Noelia cfb3fb56ba fix(chat): Move message editing to chat input
- Reworks message editing to use the main chat input instead of rendering an inline editor inside the message.
- Keeps the edited message visible and highlighted in the chat list.
- Populates the main composer with the original message text when edit mode starts.
- Adds an Edit tag above the composer while editing.
- Preserves normal composer draft/reply/attachments when entering and canceling edit mode.
- Disables unsupported edit actions: image, sticker, and payment request.
- Keeps formatting, mentions, emoji, GIF links, message length limits, and manual accept/cancel.
Prevents GIF selection from auto-sending while editing.
- Scrolls the edited message into view after edit mode starts.
- Removes the old inline edit component and updates related QML/UI tests.
2026-07-29 10:02:33 +02:00
Anastasiya 7de64d95fb chore(@e2e): use new buttons to edit a message in chat 2026-07-29 10:02:33 +02:00
Anastasiya 07092ca21a chore(@e2e): wait on confirmation buttons in community popups 2026-07-27 15:06:22 +02:00
Anastasiya 70e645dc1c chore(@e2e): fixes for tests 2026-07-27 15:06:22 +02:00
Anastasiya 0c1c2b0287 chore(@e2e): fix for benchmarks test 2026-07-23 22:45:17 +03:00
Anastasiya 115c87f7b5 chore(@e2e): make test for empty history stable 2026-07-23 16:28:07 +03:00
Anastasiya 17d8a8d950 chore(@e2e): wait till content is loaded in benchmark charts 2026-07-22 13:07:37 +03:00
Anastasiya e25d2b16df chore(@e2e): add new perf tests 2026-07-17 22:08:08 +03:00
Sale Djenic 6efd314209 fix: fixed signing joining community request issues
In the previous implementation, there was a logic for signing each non-profile keycard migrated
key pair individually (cause each is using a different keycard) and when signing a profile key pair
to do a group joining community request signing for all other non-profile not keycard migrated
key pairs.

The old approach also used an "Authenticate" button for that action, which was not correct
since the joining community request had to be signed. That's also fixed in this commit.

With the new keycard rework, the app is explicit always, especially when it's a word about signing.
No background signing anymore, everything is transparent, which means that a single signing flow
is run for a single account. Once all accounts of all key pairs are signed the button to join gets
enabled, and the user is ready to send a request to join a community. That's implemented in this
commit.
2026-06-26 22:30:51 +02:00
Anastasiya 1b7b3af488 chore(@e2e): fix keycard screen test 2026-06-23 15:11:19 +03:00
Anastasiya e12ce48009 chore(@e2e): better handling of dropdown 2026-06-22 18:41:43 +03:00
Sale Djenic 091cd758f9 fix: e2e tests fix 2026-06-22 13:48:45 +02:00
Mag.andAnastasiya e6253c78b6 fix(a11y): expose message text and key controls to accessibility (#21242)
* fix(a11y): expose message body text to accessibility

A sent/received message's body is rendered as RichText (HTML), which
Qt's Android accessibility backend does not surface. As a result the
message bubble exposes only the sender name (via content-desc) and the
body text is absent from the accessibility tree entirely - screen
readers can't read messages, and e2e tests can't assert on message
content.

Add Accessible.role (StaticText) and Accessible.name carrying the plain
(HTML-stripped) message text to the text element on both the mobile
(StatusBaseText) and desktop (StatusTextArea) paths. This is additive:
the bubble's sender label is untouched, so both the sender and the body
become independently accessible.

* fix(a11y): expose chat composer, header, emoji, and timestamp handles

The mobile chat surfaces several controls and labels that the
accessibility tree either auto-names (class-based identifiers that
change between builds) or does not surface at all, forcing screen
readers and e2e to rely on positional fallbacks.

Add stable identifiers, mirroring the nearest accessible sibling in
each file:

- StatusChatInputToolBar emoji button: objectName
  statusChatInputEmojiButton (the send button already carries
  statusChatInputSendButton); both then resolve by resource-id suffix.
- StatusChatInputReplyPanel: objectName statusChatInputReplyArea on the
  panel root so the reply preview is addressable on phone.
- ChatHeaderContentView members button: objectName membersButton,
  matching the sibling more-options button pattern.
- StatusChatInfoButton title text: Accessible.role StaticText +
  Accessible.name carrying the title, so the chat title is readable
  (Qt's Android a11y does not surface the button's title:).
- StatusEmojiPopup grid cell: Accessible.name carrying the emoji glyph
  so a picker emoji is findable by character (shortname objectName
  already present).
- StatusTimeStampLabel: objectName messageTimestamp + Accessible
  StaticText/name carrying the formatted label, so a message timestamp
  is locatable and readable.

* fix(a11y): name the receive-from-non-contacts row and its switch

The messaging settings row that toggles receiving messages/requests
from non-contacts had no objectName, so e2e could only find it by its
English title and could not tell its switch apart from the other
switches on the page.

Give the row and its switch stable objectNames, following the
MessagingView_*_StatusListItem / per-control objectName pattern already
used by the GIF-previews and URL-unfurling controls in this file. The
row is a StatusListItem, whose Accessible.name already folds objectName
into the test-mode tid channel; the switch surfaces by resource-id.

* fix(a11y): name the add-account origin selector

The add-account popup's origin selector (where the user picks a keypair
or chooses to add a watch-only address) had no objectName on the
selector control itself, so e2e had to match it by the translated
'origin' label.

Add objectName AddAccountPopup-OriginSelector on the StatusSelect root.
The selected-origin row, each origin option, and the watch-only address
input already carry stable objectNames, so no further change is needed
there.

* chore(@e2e): change locators in tests to use new object names

---------

Co-authored-by: Anastasiya <anastasija.ig@gmail.com>
2026-06-17 16:37:33 +01:00
Lukáš Tinkl 571f818dc5 fix(Wallet): unbreak the All Accounts bg color
- seems like on Windows, an unstyled plain `Button` uses the native
control now; use our own StatusFlatButton

Fixes #21202
2026-06-16 14:22:16 -04:00
Anastasiya fea58e2c6f tests(@e2e): add test to check syncing of messages with local pairing 2026-06-10 21:55:59 +03:00
Anastasiya 28b734b8c3 chore(@e2e): fix failing tests 2026-05-25 13:21:12 +03:00
Anastasiya fb335a8cd8 tests(@e2e): open asset and check the prices graph 2026-05-21 14:15:00 +03:00
b416cdf22d chore: merge branch 'release/2.38.x' into master (#20950)
* Release 2.38.0

* fix(browser): hide sidebar when tapping outside (#20624)

* fix: payment modal padding (#20702)

fixes #20690

* fix(Browser): open URLs in a new tab from Downloads view

Fixes #20685

* fix(RenameAccountModal): responsive layout

- fix the overall layout, respecting the modal width
- fix the pre-selected color (color vs color-string mismatch)
- add the modal to Storybook

Fixes #19325

* feat(StatusTextField): provide a standard edit context menu
- allows to be styled propely using our Theme
- disabled on mobile (iOS/Android provide their own)

Fixes #20632
Iterates #20544

* fix(Portal): fix the community promo icon color

Fixes #20689

* fix: cannot login via keycard

Closes #20633

* chore: remove Polygon zkEVM chain

- Deleted constants and UI elements related to Polygon zkEVM from wallet_constants.nim, Constants.qml, and Utils.qml.
- Removed SVG icons for Polygon zkEVM from the assets directory.
- Updated translation files to eliminate references to Polygon zkEVM Explorer in multiple languages.

* chore: display "Unknown token" for tx in History tab if token details are missing

For the tokens that are not in any of the list that the app operates with "Unknown token"
should be used for the name, and raw value for crypto value instead of the token key.

* fix: amount colors of the token breakdown pills make the amounts hard to read

Closes #20701

* fix(Settings): fix overflow in Appearance view

- add the view to Storybook

Fixes #20645

* fix(Desktop) Increasing app height triggers portrait mode

- lower the `portraitBreakpoint` to 640x480, and make the
portrait/landscape criteria switch depend on `width` only
- let the PrimaryNavSidebar follow the same logic
- update TS files

Fixes #20318

* chore(@e2e): text input

* chore(@qml): object name for send button in chat

* chore(@e2e): temp exclude password change from PRs

* fix: don't try to (re)store window geometry/visiblity on mobile

* fix(AppMain): reapply font size and padding when the orientation changes

Fixes #20635

* fix(StatusSectionLayout): explicitly state the breakpoint

- when switching to portrait mode

* fix(main): restore visibility on mobile

- similar to setting it to `visible`

* fix(browser): android connector fixes (#20623)

* fix(browser): stale request when closing connection popup

* fix(browser): require webkit 1.12.1

* to enable addDocumentStartJavaScript

fixes #20602

* fix(Syncing): Ensure mobile network sync is enabled by default

Fixes `syncingOnMobileNetwork` DB value defaulting to false, causing status-go to block store node sync on mobile devices and leaving sent messages stuck in "sending" state.

Fixes #20663

* fix(CommunitiesPortal): community cards are cut on the right

- simplify the layout, use full width for the ScrollView
- remove the internal scaling, causes more issues than it solves
- use smaller card delegates when in compact mode
- fix some other minor responsive issues
- regenerate TS files

Fixes #20728

* chore: remove status l2 sepolia (#20748)

* ios: upgrade to SDK 26

* fix: avoid sync getAllTokens on every token refresh (#20786)

fixes #20784

* fix(StatusChatInfoButton): don't open Profile dialog with pinned message

- in 1-1 chats, the TapHandler would leak the click event to the
underlying MouseArea, thus invoking both the PinnedMessagesPopup and the
ProfileDialog

Fixes #20658

* ConfirmationDialog: refactor to derive from StatusDialog

* StatusDialog: delayed bindings to ensure proper height in bottom sheet mode

* Settings: prevent navigating to settings on sign out request in portrait mode

* AdvancdedView: prevent options switching before confirmation

* fix(StatusBaseInput): no placeholder with preeditText

- also hide the placeholderText when there are suggestions from the
native virtual keyboard on mobile

Fixes #20774

* fix(browser): android snapshot colors (#20791)

* fix(connector): parallel dapp requests race (#20703)

* fix(browser): fix crash

fixes #20591

* chore: bump status-go

* chore: hide data verified by Nimbus (#20811)

fixes #20788

* feat(connector): ephemeral dApp records (#20808)

* feat(connector): ephemeral dapp records

refs status-im/status-app#20676

* fix: copilot comments

* chore: bump status-go

* ChatColumnView: workaround for QTBUG-146653

It was causing that selecting mention from suggestions list was not possible on mobile.

Closes: #20798

* StatusChatInputTextArea: take preedit text into account when filtering mentions

It's necessary to handle suggestions correctly (filtering based on the user input).

Closes: #20743

* StatusChatInputTextArea: take preedit text into account when filtering emojis

* fix: swapped ui in history (#20818)

Swapped word is now staying in one row

* fix(iOS/FileDialog): Use native pickers for image selection

Route iOS file selection through native platform pickers to avoid Qt file dialog sizing issues on mobile.

- Use `UIDocumentPickerViewController` for document-based flows such as backups and JSON imports.
- Add a photo-library mode to `StatusFileDialog` for image selection flows.
- Use the native iOS photo picker for profile picture, community logo/banner, and image selector uploads.
- Return selected files/photos through the existing `StatusFileDialog` selected file API.
- Added support for multi file selection.

Closes #20704

* chore: a huge delay between balance/history update (#20812)

Closes #20751

* fix(wc): reconnect broken pipe (#20809)

* recreate wc client after Resume()

fixes #20767

* fix(Search): focus the user/channel/chat search fields

- StatusTextField: theme/style according to Status design
- SearchBox: derive from StatusTextField instead of the clunky
StatusInput; we only need one-line input here anyway
- fix usages of the SearchBox, notably fixup the need to use a native
validator if needed; greatly simplifies the code to use this component
- regenerate TS files

Fixes #20754

* chore(@e2e): fix locators for search boxes

* chore(@e2e): fix for seed phrase

* fix(ThirdpartyServicesPopup): prevent eliding the instructions

- use a simple RowLayout with StatusIcon+StatusBaseText, with wrap mode
turned on
- don't hardcode the InformationTag pill height
- remove the redundant Close button

Fixes #20706
Fixes #19981

* chore: don't show unknown token for nft name in history view

Fixes: #20817

* fix(Onboarding): Make sync pairing page scrollable

Make the sync pairing page scrollable so the instructions button stays reachable when the QR scanner content overflows.

Fixes #20638

* fix(StatusSectionLayout): Fix SwipeView panel positioning

Ensure the portrait `StatusSectionLayout` visually follows `SwipeView.currentIndex` changes on Android by repositioning the internal view after programmatic panel navigation. This prevents the layout from keeping the previous `contentX` while the logical index has already changed.

Fix #20771

* Android: workaround for triggering full-screen mode after screenshot

On Android 15, taking a screenshot and invoking sharing dialog was triggering full-screen mode, not restored when sharing is finished.

Closes: #20612

* fix: GifPopup and StickersPopup bottom-sheet layout improved

Closes: #20571

* StatusStickersPopup: layout improved

* emoji/gif/stickers popups sizing ad-hoc patches

* Perf/cherry pick v1 (#20802)

* perf: Async start messenger

The startMessenger backend call is a lengthy process, blocking the main thread for a few seconds. Moving it to async tasks gives the main thread the chance advance on the login work until the messenger starts successfully.

Perf improvement on my heavy account:

Before: 17 sec warm start-up
After: 14 sec warm start-up

- Added `onMessengerStarted` method to `AccessInterface` to handle messenger start errors.
- Implemented `onMessengerStarted` method in `Module` to emit error notifications.
- Introduced `SIGNAL_MESSENGER_STARTED` constant for signaling messenger start events.
- Created `asyncStartMessengerTask` to manage asynchronous messenger start operations.
- Updated `startMessenger` method in `Service` to utilize the new async task and handle responses.

* fix: Trim StartMessenger async task output

* fix: review coment - remove dead code

* perf(qml): Drop the file selectors

* fix(webviewLoader): log on error

* perf: seed contacts with community members

Iterates: https://github.com/status-im/status-app/issues/20228

Resolving community members creates a high frequency RPC flood at start-up when the app tries to eagerly resolve every community members. On Android Status community adds around 2 sec in CPU time on warm start-up.

The solution implements an enriched community member type and contact type returned from status-go. The app will receive this extra data and seed the contacts cache (instead of creating the contacts cache using 4 separate RPCs for each member/contact).

* perf: enhance contact seeding with MemberSeed structure and optimize duplicate handling

* feat: Migrate android binder from files to shared memory

This commit aligns the client-server communication with standard Android solutions - direct binder calls and shared memory. This is done both for perf reasons (has a big impact on high frequency callse) and security concerns (no unencrypted data is touching the disk).

There are two main changes in this commit:
1. Direct communication between client and service when the payload is below 64KB. This is for high frequency and ligh calls (like colorId). The file based communication overhead is just too high for such usage.
2. Shared memory - When the payload is bigger than 64KB we'll use the shared memory

* perf: Avoid unnecessary community and chat copies

The nim profile trace is dominated with community and chat object copies.

There are 3 main types of changes:
- using `lent` to borrow a community from the service. It can be used as a return type only
- using openarray in favor of seq for proc args, where `lent` cannot be used.
- use "communityId" instead of full community where openarray or lent migration would cascade into lots of changes

* perf: Optimize community role retrieval in getChatItemFromChatDto

* perf: Move `getCachedCurrencyFormats` to threadpool

* fix: Fixing merge errors

* perf: Granular control qml compilation and loading of main layouts

This commit aims to split the qml compilation into smaller chunks and  schedule the compilation at the appropriate time.

Approach: Each main section lives behind a loader component that has 2 purposes - load the component at appropriate times and defer the qml compilation until the loader is created.

The same approach was applied to AppMain.qml and on top of this we'll need to make sure we're loading the AppMain at an appropriate time so that we'll avoid many intermediary states if the nim layer isn't ready for it.

For this, I've introduced a new component - QmlCompiler. It has a list of main components and can precompile the qml component or make sure to load it all if needed (e.g while the onboarding runs we can use that time to preload everything)

This approach is fully compatible with Loader.asynchronous usage and implementing loading states for the components - the community and chat loaders already implement it partially.
Can be extended to preload all the sections in the background while the user is working on the current section.

- Added MarketLoader.qml to handle market-related UI loading.
- Introduced NodeLoader.qml for loading node-related UI components.
- Created PopupsLoader.qml to manage various popups within the application.
- Developed ProfileLoader.qml for loading user profile sections.
- Implemented WalletLoader.qml to manage wallet-related UI components.
- Added QmlCompiler.qml to centralize URL management for QML components.
- Updated qmldir to include new loaders for better modularity.
- Refactored main.qml to utilize the new AppMainLoader and improve loading logic.

* fix: Correct spelling, function args and bindings

* chore: bump vendors

* fix: home selection doesn't open the proper 1x1 chat

There are 2 bugs: property binding override from within the component internals and a signal signature mismatch

* fix: handle shutdown process to avoid race conditions

- Added a custom exit procedure (https://en.cppreference.com/c/program/_Exit) to bypass libc static destructors on mobile devices, preventing potential race conditions during shutdown
- Ensured proper teardown of the threadpool in the StatusFoundation delete method

Fixes #20855

* fix(nft): disable more chains (#20866)

* fix(collectibles): add ink, katana to unsupported list

fixes #20717

* fix(dapps): dapp name html injection (#20881)

* chore: add dapp fields html injection to storybook

* fix(dapps): use the PlainText format for dApp controlled strings

fixes #20879

* fix(Portal): do not autofocus the Search field

Fixes #20870

* fix: Community members in community settins

* fix(android): async webview construction (#20916)

fixes #20886

* fix(chat): restore iOS paste menu behavior

Use the platform popup for the chat input context menu on iOS so paste and selection actions follow native text editing behavior.

Avoid toggling readOnly during iOS paste handling, since that dismisses and restores the virtual keyboard. Keep Android using the existing null context menu path.

Closes #20588

* fix(StatusTextField): Use native paste menu for text fields on iOS

Use the native iOS context menu for StatusTextField and keep Android on the default behavior.

* fix(android): battery usage while the app is in the background

This commit bumps status-go to include https://github.com/status-im/status-go/pull/7440. As a result the message sending is paused while in the background to stop the high frequency mvds loops that will prevent Android from going into sleep.
To preserve message sending while the app is in the background/killed we'll have to wake messenger briefly on the OS intent. We'll resume messenger for 60 seconds - enough to push the message through and then it will be paused again unless the app goes back to foreground.

This results in less battery usage and less events piling up in the qt event loop while the app is in the background.

* chore(@e2e): temp disable syncing test in release 2.38

* fix(chat): prevent MessageView from stealing ImageMessage right-clicks (#20889)

fixes #20789

* fix: cliping modal input (#20944)

* feat(notifications): update notification settings copy

Refresh notification settings wording across desktop and mobile, renaming the settings entry to “Notifications” and updating the enable notifications popup copy for iOS and other platforms.

Add clearer privacy messaging for APNs, on-device mobile delivery, and desktop OS notifications. Restore the iOS centralized notification options section and reuse the sound/volume controls across general and iOS notification settings, while keeping platform-specific test notification behavior.

Part of #20628

* feat(PushNotifications): Update mobile notification banner display logic

Adds local display state for the mobile push notification banner so it can respect the “Don’t ask me again” choice and avoid reappearing within the same minor version.

The banner is now shown only on mobile when private notifications are disabled, the current app minor version is at least 2.38, the user has not opted out, and the banner has not already been shown for that minor version. Patch updates reuse the same stored minor version, so they do not retrigger the banner.

Also wires the current app version into the handler and adds the “Don’t ask me again” switch to the popup.

Closes #20902

* fix(NotificationsView): Fix filter exemptions with stable scroll position

Move exemption search filtering from delegate visibility toggles to a SortFilterProxyModel, so the list only instantiates matching items instead of hiding non-matching delegates.

Keep the exemptions list height stable while filtering, capped to the visible settings page height, to avoid the page scroll jumping when the filtered result count shrinks without leaving a long empty scroll area.

* fix: failed e2e test fixed

* chore(@e2e): fix after conflicts resolution

---------

Co-authored-by: Anthony Laibe <491074+alaibe@users.noreply.github.com>
Co-authored-by: Andrey Bocharnikov <andrey.bocharnikov@gmail.com>
Co-authored-by: Lukáš Tinkl <lukast@status.im>
Co-authored-by: Anastasiya <anastasija.ig@gmail.com>
Co-authored-by: Noelia <noelia@status.im>
Co-authored-by: Siddarth Kumar <siddarthkay@gmail.com>
Co-authored-by: Michał Cieślak <michalcieslak@status.im>
Co-authored-by: Alex Jbanca <47811206+alexjba@users.noreply.github.com>
Co-authored-by: Alex Jbanca <alexjb@status.im>
2026-05-21 10:54:47 +02:00
Anastasiya 2c1b23a297 chore(@e2e): fix for back up seed 2026-05-07 17:42:02 +03:00
Anastasiya c8e822dab6 chore(@e2e): fix for channel permission form 2026-05-07 17:42:02 +03:00
Anastasiya f875d64570 chore(@e2e): text input 2026-05-04 16:01:58 +02:00
Anastasiya cc986f66c1 tests(@e2e): verify community in profile showcase 2026-04-17 17:21:10 +03:00
Anastasiya eb10ac4de1 chore(@e2e): locators for new chat input 2026-04-14 16:07:56 +02:00
Michał Cieślak 703047238d StatusChatInput: Wrap mode fixed, placeholder text updated 2026-04-14 16:07:56 +02:00