* Add background color to collectibles
* Fix header text animation in unsupported collectibles
* Fix header height and animation color
* Fix image not showing when it's `nil` or `""`
* Add missing border to expanded-collectible
* Fix extra `0` in create/edit account title input
* Validate name, color and emoji in account creation/edition screen
* Refactor sub
* Fix button disabled condition and placeholder
This is a byproduct of the investigation on issue
https://github.com/status-im/status-mobile/issues/20203, more specifically, to
double-check if v1 users have their display names shown correctly.
Closes https://github.com/status-im/status-mobile/issues/20203
This is the scenario used to reproduce the bugs this PR is solving:
1. Alice creates an account in v1 (branch release/1.20.x).
2. Alice had 1 friend to chat with, Carol.
3. Alice sends and receives at least one message from Carol.
4. Alice installs the new app (latest develop branch suffices).
5. Alice login and try to edit her profile, but her 3-word name is not displayed
in the Settings > Edit Profile screen, nor in the Settings > Edit profile >
Name input field.
6. Alice also opens her chat with Carol, but her name appears as a public key
instead of her 3-word name she identifies herself with.
The solution presented here is to just fallback to Alice's 3-word name (name
field in the profile/contact app-db instance).
Areas that may be impacted
- Edit profile name.
- Name displayed in chats from the perspective of the sender who migrated from
v1.
Steps to test
In order to test this PR, it's necessary to migrate from v1 to v2 using two
separate builds. The v1 build can be obtained in PR
https://github.com/status-im/status-mobile/pull/20123. v2 build can be any one
from develop from today, for example.
This commit:
- fixes addresses are displayed without truncation
- fixes network preference (advanced icon) shown for ENS
- fixes navigation on adding a new saved address
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Introduces a new macro deftest-event to facilitate writing tests for event
handlers. Motivation came from the _problem of having to always extract event
handlers as vars in order to test them_.
Although the implementation of deftest-sub and deftest-event are similar,
deftest-sub is critically important because it guarantees changes in one
subscription can be caught by tests from all other related subscriptions in the
graph (reference: PR https://github.com/status-im/status-mobile/pull/14472).
This is not the case for the new deftest-event macro. deftest-event is
essentially a way of make testing events less ceremonial by not requiring event
handlers to be extracted to vars. But there are a few other small benefits:
- The macro uses re-frame and "finds" the event handler by computing the
interceptor chain (except :do-fx), so in a way, the tests are covering a bit
more ground.
- Slightly easier way to find event tests in the repo since you can just find
references to deftest-event.
- Possibly slightly easier to maintain by devs because now event tests and sub
tests are written in a similar fashion.
- Less code diff. Whether an event has a test or not, there's no var to
add/remove.
- The dispatch function provided by the macro makes reading the tests easier
over time. For example, when we read subscription tests, the Act section of
the test is always the same (rf/sub [sub-name]). Similarly for events, the
Act section is always (dispatch [event-id arg1 arg2]).
- Makes the re-frame code look more idiomatic because it's more common to define
handlers as anonymous functions.
Downside: deftest-sub and deftest-event are relatively complicated macros.
Note: The test suite runs just as fast and clj-kondo can lint code within the
macro just as well.
Before:
```clojure
(deftest process-account-from-signal-test
(testing "process account from signal"
(let [cofx {:db {:wallet {:accounts {}}}}
effects (events/process-account-from-signal cofx [raw-account])
expected-effects {:db {:wallet {:accounts {address account}}}
:fx [[:dispatch [:wallet/get-wallet-token-for-account address]]
[:dispatch
[:wallet/request-new-collectibles-for-account-from-signal address]]
[:dispatch [:wallet/check-recent-history-for-account address]]]}]
(is (match? expected-effects effects)))))
```
After
```clojure
(h/deftest-event :wallet/process-account-from-signal
[event-id dispatch]
(let [expected-effects
{:db {:wallet {:accounts {address account}}}
:fx [[:dispatch [:wallet/get-wallet-token-for-account address]]
[:dispatch [:wallet/request-new-collectibles-for-account-from-signal address]]
[:dispatch [:wallet/check-recent-history-for-account address]]]}]
(reset! rf-db/app-db {:wallet {:accounts {}}})
(is (match? expected-effects (dispatch [event-id raw-account])))))
```
* Fix "Bridge to" screen not showing
* Fix "Unkown flow" alert in bridge flow
* Fix warnings in transaction confirmation page
* Fix missing images and strings while bridging in transaction confirmation page
* Fix stale data shown for an instant in the suggested routes component
* Add support for bridge flow started in the wallet home screen
* Fix fetch-activities event
This commit adds a feature to search through the saved addresses list by name, address, ENS and chain names.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* Add missing circle in wallet-activity component
* Move activity calculations to subscription and fix wrong data
* Fetch activities when visiting an account
Fixes the slow login when users have joined large communities, such as the
Status one. Related status-go PR
https://github.com/status-im/status-go/pull/5229.
What we mean by "slow" is that the user was getting stuck on the login screen
for almost 20s in some devices (even on iOS things were bad). And this entire
process was happening in status-go, hence most changes come from there.
By "login" we mean the process to authenticate and initialize vital data in
status-go. Setting up message filters can be slow with large communities, and
that's exactly this part we moved out of the login phase in status-go. This step
now happens implicitly when the client calls wakuext_startMessenger.
In a way, the solution makes sense because setting up filters isn't essential
for the user to access other parts of the app, such as the Wallet, Settings,
Profile, and Activity Center.
How can we magically eliminate the login delay? In reality, the time we used to
spent during login, blocking the user, still happens, but it happens in the
background and after the user is redirected to the home screen. This also means
that, until the filters are established, all chats are still in their "loading
skeleton state".
In terms of UX, this is probably fine as long as it doesn't take too long for
this setup to finish in status-go. In the future, we have room to further
optimize how filters are set up in status-go.
Fixes https://github.com/status-im/status-mobile/issues/20059
This commit:
- adds a feature to process backed-up wallet data on account recovery (without the necessity to re-login)
- refactors keypair data store functions
- refactors wallet event to support calling for single account/address
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit:
- adds a feature to add network preferences for saved addresses while saving
- updates the network preferences in "Share save address" to show the address and color of the saved address
- fixes the screen qualifier for the settings screen when navigating to wallet settings
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* fix: ensure missing key pairs scroll with list
* chore: add translations for labels
* chore: promisify validate-mnemonic native module function
* chore: add events for validating seed-phrases and making key-pairs fully operable with seed-phrase
* chore: define re-usable effects for validate-mnemonic and make-seed-phrase-keypair-fully-operable and import-keypair-by-seedphrase
* tweak: refactor error handling logic when importing key-pair by seed-phrase
* tweak: handle vectors and functions between events and effects
* tweak: refactor recover-phrase form to support custom title, children, and navigation icon
* tweak: add support for accessing input-ref in recovery-phrase form
* tweak: always mask seed-phrase when passing to render-controls
* feature: add initial screen for importing key-pair with seed phrase
* tweak: conditionally render keypair context tag inside recovery-phrase form
* tidy: rename on-input-ref to ref
* tidy: remove unused property
* tidy: refactor to use case expression
* tidy: format
* 🔳 QR on success not being called
- IDK why, trying things out
* 🙃 Stupid of me
- My handler was not being called because I wrote the code in a
different QR scanner
* ✅ Approval screen taking shape
* 🧹 Lint fix
* 🎛️ Wallet connect session screen shows up
- Hard coded the first account
- The data item component doesn't support networks or accounts yet
- The quo category component cannot show a data-item yet
- Connected accept and decline button
* 🧰 Fix review issues
* 🔨 Fix lint
* 🔧 Rename event and move dispatch
* 🔧 Fix lint
* 🎏 Add ff for wc scanner
- Bring back missing event
This commit adds flow for adding new saved addresses from wallet settings
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* 🔳 QR on success not being called
- IDK why, trying things out
* 🙃 Stupid of me
- My handler was not being called because I wrote the code in a
different QR scanner
* ✅ Approval screen taking shape
* 🧹 Lint fix
* 🎛️ Wallet connect session screen shows up
- Hard coded the first account
- The data item component doesn't support networks or accounts yet
- The quo category component cannot show a data-item yet
- Connected accept and decline button
* 🧰 Fix review issues
* 🔨 Fix lint
* 🔧 Rename event and move dispatch
* 🔧 Fix lint
Adds a new linter to verify all test names are consistent with one common
convention we already follow, for the most part, which is:
> Test vars (test names) should be suffixed with -test.
There's no strong reason for following this convention, although it's quite
common in Clojure, but in any case, these are the reasons I can think of and
remember:
- Naming consistency. Sometimes tests start with "test-", others end with "test"
and others don't prefix/suffix at all.
- The suffix removes potential conflicts with core Clojure functions.
- The suffix mostly eliminates potential conflicts with other vars in the test
namespace. Example: you can declare a function delete and have a test named
delete-test.
- For someone using Emacs imenu feature, it helps differentiate which vars are
tests and which are just local functions supporting the tests.
This commit updates the navigation event `:open-modal` in Wallet Settings to `:navigate-to-within-stack` for slide-in/slide-out screen transitions.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit:
- Adds feature flag for saved addresses
- Displays the list of saved addresses in wallet settings
- Shows address options on tap of any saved address
- Adds the ability to remove saved address
- Refactors saved addresses data structure in app-db
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* Connected dApps screen with empty state and list of dApps and the ability to disconnect dapps
* Fix
* Smaller style fix
---------
Co-authored-by: Lungu Cristian <lungucristian95@gmail.com>
92ef58d4...c7397e18
Previously used to stage upgrades of `eth.prod`.
Now `eth.prod` fleet is in maintenance mode and no upgrades are expected.
And yes, I'm removing tests that reference old Waku v1 fleets because
I don't see a point in them.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Fixes a warning thrown by re-frame in the event
:wallet/blockchain-status-changed.
Here's a simplified example that generates the same warning.
```clojure
(rf/reg-event-fx :user/fx-warning
(fn []
{:fx nil}))
;; Prints warning re-frame: ":fx" effect expects a seq, but was given null
(rf/dispatch [:user/fx-warning])
```
- Debounce peer stats signals by 1s because they may happen 30 times during
login and the payload conversion using js->clj is not cheap.
- Change the order of case macro checks: put more frequent signals at the top.
- Better format code
* fix: no routes found error when disabling chains and current amount exceeds new max amount
* fix: disable button on routes loading
* add no-routes-found component
---------
Co-authored-by: Brian Sztamfater <brian@status.im>
* fix: ensure the keypairs use blur for their theme
* fix: allow for container-style to be passed to standard-title component
* chore: add translations for for missing-keypair labels
* tweak: add support for missing-keypair type for drawer-top component
* tweak: add initial implementation of missing-keypair list-item component
* tweak: add initial implementation of missing-keypairs list component
* feature: add initial implementation of displaying missing key-pairs
* tweak: update missing-keypair list-item to support blur, light, and dark mode
* chore: add missing-keypair list-item preview
* chore: add missing-keypairs preview
* chore: decode :operable key in account to be keyword
* tweak: remove unneeded keyword decoding
* tweak: update drawer-top component to use keypair and stored field
* tidy: revert change for checking for not default-keypair in actions menu
* Add subscription to get preferred networks given an address
* Fix preselected networks in receive screen
* Improve subscription
* Fix preselected networks in share screen
* Update test to include oeth
While investigating why login is slow
https://github.com/status-im/status-mobile/issues/20059 and when testing with
accounts with communities, I noticed we are logging huge payloads because they
include data URLs. This makes debugging the app harder.
Therefore, we will now log the full event payload only at the trace level, and
at the debug level we only log the event type.
This problem was first described by ulisesmac.
Change the implementation of component previews to support receiving either
state/set-state from use-state or a Reagent atom, thus allowing us to gradually
change preview namespaces to use hooks instead of having to refactor all at once
in a gigantic PR.
All types of preview fields were tested, including multi-select.
Only the components counter.step and selectors.react previews were adapted
to use-state.
feat: implement wallet send flow edge case when selected token is not supported on receiver's preferred networks
Signed-off-by: Brian Sztamfater <brian@status.im>
* fix: resolve warning about using subscription inside a lazy seq
* fix: avoid schema error when we do not have a port for the media server
* chore: add feature-flag for network-settings inside wallet-settings
* chore: add testnet mode label
* chore: add testnet labels for bottom-sheets
* chore: add label for changing testnet mode
* feature: add initial network-settings screen to wallet-settings
* test: add test for sub
* tidy: rename function to hide-bottom-sheet
* tweak: add info-box for testnet mode
* tidy: testnet-mode bottom-sheet
* tidy: use reduce-kv instead of map & into
* tidy: use noun naming convention for function creating options for settings
* tweak: add support for displaying testnet-mode status on each wallet network
* chore: add translation for labels referencing testnet-mode and sepolia
Preload the user namespace (src/user.cljs and src/dev/user.cljs) for the mobile
target and for dev-only purposes. The files are git-ignored.
Just a reminder that you'll be responsible for making sure your user namespace
is correct. If it's broken in any way (e.g. calling non-existent code) the app
will crash at initialization (dev-only environment obviously).
Why? When the app initializes, it loads namespaces that were required at least
once. If you create a user namespace, it won't be automatically required for
you. And if you, like some Clojure devs, like to use the user namespace as
your safe heaven for experimentation and dev-only utilities, you'll need to
remember to evaluate the namespace at least once.
This is tedious and many times I forgot to do so and the app crashed because the
compiler didn't know where the symbols were coming from.
This commit rewrites utils.re-frame/delay-render to use hooks. The new
implementation renders significantly better than what we have today, at least on
Android.
Why not hiccup instead of a function call to delay-render? The Settings screen
is rendered slightly faster if I use delay-render as a function call instead of
hiccup. My only guess is that this is just less work to be done by Reagent,
since the wrapper function is not creating a wrapper component with its own
lifecycle.
The full analysis can be found here, but it's copied for future reference:
--------------------------------------------------------------------------------
Based on my analysis of individual frames being rendered and having investigated
3 different scenarios:
1. Scenario 1: No delay whatsoever, i.e. not using `delay-render`.
2. Scenario 2: Using `delay-render` like in `develop`, that is, a form-2
component with a local Reagent atom.
3. Scenario 3: Using `delay-render` as in this PR, using hooks.
All 3 scenarios open the Settings screen with all rendered views in the same
amount of time. In terms of raw performance, they are completely identical. The
absolute value doesn't matter, but in my recordings, on average, 10 frames of
video after the first press on the user's profile image.
So how can it be that on Android the new solution is visibly smoother? It's all
about latency and our brains are very picky about it.
Scenario 1 - Not using delay-render: the user notices a longer delay after
pressing on the profile image because all components in the Settings screen are
mounted in one go. This gives the impression to the user of being slower. In
slower Android devices, we've seen a user even press twice because the Settings
screen was taking longer to open. On newer Android devices this is not much of a
problem. There's another problem in `Scenario 1`, on Android, with too many
elements and/or too many heavy elements being mounted, the opening animation is
sometimes completely cut off or very clunky (a similar problem can happen while
opening the Activity Center).
Scenario 2 - Use delay-render with a form-2 component: The Settings items are
always rendered after the opening animation completes. Our brains perceive this
as a slight delay because we can see the empty gray background for 1-3 frames.
This is quite noticeable on my physical Android device, even with a prod build.
Scenario 3 - Use delay-render as a hook: the optimal solution from the user's
perspective, Settings items sometimes can be rendered before the animation
completes. I say sometimes because other times the items are rendered only 1
frame before or right when the animation completes, which would be almost the
same as Scenario 2.
What the hooks solution gave us is a little bit of the Scenario 1 and
Scenario 2 in one package, and because the Settings items can be sometimes
rendered before the opening animation completes, our brains see that as being
faster.
In future performance investigations, we might want to focus on manipulating
latency more aggressively to see where that leads us.
Some devs reported invalid schemas in the develop branch during app
initialization. We knew this could happen when Malli was first
introduced, but we wanted to play safe in the beginning due to the
overall inexperience of the team with Malli.
This commit removes all guardrails on instrumented vars, i.e. during app
initialization the app will crash on any invalid schema. A reminder that
instrumentation only take effect when js/goog.DEBUG is true.
* chore: add "key pairs and accounts" label
* chore: feature flag wallet-settings
* tidy: extact navigate-back function into static defn
* wip: add initial keypairs and accounts list view to wallet settings
* tweak: wire-up initial action menu for key-pairs
* tidy: extract key-pair container styles into style namespace
* tweak: fix dark background for key-pair and account settings
* tidy: refactor on-press handler for key-pair options
* fix: move feature-flag usage to settings screen instead of settings items definition
* tidy: remove unneeded key props
* tidy: clean up de-structuring and passing of props
* tidy: use keep with when expressions instead of filter and map expressions
* tidy: rename the wallet-settings feature flag
* tweak: rename and add feature-flags for mobile wallet settings
* tweak: use scrollview for feature-flags and add spacing between feature-flag groups
* tweak: adjust the way feature-flags are displayed in groups
* tidy: remove unneeded prop
* tidy: use bottom-inset for padding key-pair and accounts list
* tidy: change `filterv` to `filter`
* tidy: use subscription for building account-props
* tidy: use subscription to build the entire keypair-account
* tweak: use key-pair type to determine default key-pair
* tidy: rename component to settings-category-view
* tidy: use assoc instead of merge
* tidy: extract function from subscription
* test: add tests for formatting key-pairs and accounts for wallet settings
* tweak: use `match?` instead of `=`
* tidy: use `swap!` without anonymous functions
This commit improves in-app feature flags to persist what is currently only
stored in a Reagent atom by using RN Async Storage
https://reactnative.dev/docs/asyncstorage. This should make them more convenient
to use, which is a good thing overall for developers.
Additionally, there's now a top-right button in screen Settings > Feature Flags
that will reset the flags to the initial values obtained from environment
variables.
These in-app feature flags are exclusively available in debug builds in
Settings > Feature Flags, and only visible when flag ENABLE_QUO_PREVIEW is
enabled. There's no impact whatsoever in prod builds. A reminder that they are
not meant to be used by users (yet).
It's worth noting that RN has deprecated Async Storage and now recommends other
community solutions, but for a dev-only feature, I think it's fine.
Detailed explanation:
The schema failure is due to utils.image-server/get-initials-avatar-uri being
called with a nil profile customization color right after the user confirms
logout.
Right after logging out, the subscription :profile/profile-with-image is
recomputed. One of its signal inputs is :profile/profile. Right after logout,
the output of sub :profile/profile is always nil (this is correct, nobody is
logged in). This means that the sub :profile/profile-with-image will try to
calculate the multiaccount URI by passing a nil profile. This is wasteful
computation and is also the cause of the schema for
utils.image-server/get-initials-avatar-uri to fail, because it expects the
profile's customization-color to be present.
* tweak: refactor image-uri helpers
* fix: add `:primary` as customization color for profile images
primary is being used as the default color for accounts that were migrated without customization color to a default color