We do a few things to reduce the initial load and make the app more responsive
after login. The scenario we are covering is a user who joined communities with
a large number of members and/or which contain token-gated channels with many
members.
- Related to https://github.com/status-im/status-mobile/issues/20283
- Related to https://github.com/status-im/status-mobile/issues/20285
- Optimize how we convert a community from JS to CLJS. Community members and
chat members are no longer transformed to CLJS, they are kept as JS. Read more
details below.
- Delay processing lower-priority events by creating a third login phase. The
goal is to not put on the same queue we process communities less important
events, like fetching the count of unread notifications. Around 15 events
could be delayed without causing trouble (and this further prevent a big chain
of more events to be dispatched right after login).
- Tried to use re-frame's flush-dom metadata, but removed due to uncertainty,
check out the discussion:
https://github.com/status-im/status-mobile/pull/20729#discussion_r1683047969
Use re-frame’s support for the flush-dom metadata whenever a signal arrives.
According to the official documentation, this should tell re-frame to only
process the event after the UI has been updated. It’s hard to say if this
makes any difference, but the theory is sound.
- Reduce the amount of data returned to the subscription that renders a list of
communities. We were returning too much, like all members, chats, token
permissions, etc.
Other things I fixed or improved along the way:
- Because members are now stored as JS, I took the opportunity to fix how
members are sorted when they are listed.
- Removed a few unused subs.
- Configured oops to not throw during development (in production the behavior is
to never throw). This means oops is now safe to be used instead of interop
that can mysteriously fail in advanced compilation.
- Show compressed key instead of public key in member list for the account
currently logged in.
Technical details
The number one reason affecting the freeze after login was coming from
converting thousands of members inside communities and also because we were
doing it in an inefficient way using clojure.walk/stringify-keys. We shouldn't
also transform that much data on the client as the parent issue created by
flexsurfer correctly recommends. Ever since PR
https://github.com/status-im/status-mobile/pull/20414 was merged, status-go
doesn't return members in open channels, which greatly helps, for example, to
load the Status community. The problem still exists for communities with
token-gated channels with many members.
The current code in develop does something quite inefficient: it fetches the
communities, then transforms them recursively with js->clj and keywordizes keys,
then transforms again all the potentially thousands of member IDs back to
strings. This PR changes this. We now shallowly convert a community and ignore
members because they can grow too fast. From artificial benchmarks simulating
many members in token-gated channels, or communities with thousands of members,
the improvement is noticeable.
You will only really notice improvements if you have spectated or joined a
community with 1000+ members and/or a community with many token-gated channels,
each containing perhaps hundreds of members.
What's the ideal solution?
We should consider removing community members and channel members from the
community entity returned by status-go entirely. The members should be a
separate resource and paginated so that the client doesn't need to worry
about the number of members, for the most part.
This commit removes two toggles from legacy advanced settings
- "Testnet mode" - duplicate toggle as the user can switch to testnet from wallet settings
- "Enable Goerli as test network" - Goerli is depreciated and wallet services use Sepolia testnet as default.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit adds the beta info box with links to chain explorers to the activity tab in the wallet.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* feat: only initialize wc if internet online
* feat: no internet toast for session establishment
* feat: no internet banner on session requests
* feat: reloading walletconnect on connection change
* fix: re-initialize only when previously failed to
* fix: removed legacy net-info ns
* ref: renamed :network-status to :network/status
* ref: moved network subs to own "category"
* fix: device network fx args
* fix: tests & showing persisted dapps when offline
* fix: addressed review comments
* fix: rebase issues
* fix: linting
* fix: usage of web3-wallet (#20864)
* fix: moved networks to contextx and renaming
* ref: moved building supported namespaces into fx
Equality checks in tests using = give a bad experience by default on test
failures containing nested data structures. We use the cljs.test directive
match? from matcher-combinators library to help compare nested structures. The
problem with match? is that its default matcher for maps (embeds) can be too
permissive, and this causes surprises.
Here we upgrade matcher-combinators to latest, where a new matcher called
nested-equals is available. This matcher won't allow extra keys in maps. This
matcher eliminates the need for manually adding nested equals matchers as we
have to do currently.
- Upgrades matcher-combinators from 3.8.8 to 3.9.1 (latest as of 2024-07-19)
What changes?
When asserting in tests, we now have the option to use match-strict? or match?.
Both directives are available by integrating with cljs.test. The code
implementing the new match-strict? directive was 100% copied from the library
matcher-combinators because we need to wrap the expected value ourselves with
matcher-combinators.matchers/nested-equals. It's ugly code, but it's how we can
integrate with cljs.test/assert-expr.
This commit:
- prevents the user from saving their wallet address as the saved address
- fixes button not capturing taps when the keyboard is open in saved address flows
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Fix a long standing problem where we can't run in parallel the make target
run-clojure and test-watch-for-repl, or in other words, we can't run tests via
the REPL while the app is running.
Details:
I found out that shadow-cljs fails to build because it does not expand the
environment variables SHADOW_OUTPUT_TO and SHADOW_NS_REGEXP if and only if the
run-clojure target was executed.
This is the top of the stacktrace, and it happens because it doesn't know where
to output the test build because the env var wasn't expanded:
[build] NullPointerException:
[build] shadow.build.node/configure (node.clj:59)
[build] shadow.build.node/configure (node.clj:45)
[build] shadow.build.targets.node-script/configure (node_script.clj:37)
The solution is to pass the option --config-merge to shadow-cljs and override
both :ns-regexp and :output-to because CLI args override options from env vars
in shadow-cljs.
Document some of our current testing practices in hopes of helping reduce
friction in PRs and communication in general. In theory, nothing in the text
should be a surprise because these are things we have been discussing over many
months (some things for almost 1.5 years) and are already present in the code.
- Update tests
- Omit from page while sending a token in home page
- Hide send and bridge option for not owned tokens
- Fix subscription to return accounts owning an asset
Sorts keys (non-recursively) in translations/en.json. The solution uses
the prettier plugin https://github.com/Gudahtt/prettier-plugin-sort-json.
We only format translations/en.json because it’s the only file we need to
manually change.
- Dependency added: prettier-plugin-sort-json version 4.0.0
- Dependency upgraded: prettier, from version 2.8.8 to 3.3.3.
Potentially a solution to https://github.com/status-im/status-mobile/issues/15706
- [x] Fixes swipe button on Android and iOS.
- [x] Performance: we now subscribe only to the minimum from each community.
This could be the reason the AC would lag as described in the parent
issue.
- [x] Performance: was able to use flex and removed swipe button height
calculation that was using `onLayout` and was causing a re-render.
- [x] Performance: reduced the initial number of items to render in the flatlist
from 10 to 7.
- [x] Performance: delay rendering the heavy list of notification components.
See in the video below how slow it is to open the AC with just 6
notifications and that the opening animation is never displayed. And then
check the improved version with the artificial delay provided by
`rn/delay-render`. By opening the AC first and animating, this gives the
user something to look for, and hopefully a few milliseconds more to think
the app is not stuck, which will be preciously used to render
notifications.
We refactor all views in the AC to:
- [x] Follow our newest standards with React hooks.
- [x] Removed prop-drilling by creating a separate React context to store the
current swipeable item (because we need to call `.close` on a `Gesture
Swipeable` instance whenever a new swipeable opens.
* Fix schema for networks in context-tags
* Fix wallet-activity component overflowing the activity tab
* Improve robustness of the activity tab fetching mechanism
* Handle `wallet-activity-filtering-entries-updated` signal
* Improve processing of data received for the activity tab
This commit add a confirmation for centralized metrics.
It is added in 3 places:
1) Onboarding -> Create new account
2) Onboarding -> Sync profile
3) On the accounts view if the user is upgrading
To test 1 & 2, you should just be able to do that on a newly installed
device.
To test 3, you will have to upgrade from a PR without this feature that
has at least an account. It should show the confirmation modal until you
either click on Not now or Share usage data.
The modal should also be added in settings, but I will do that as a
separate PR.