Integrate Sentry and implement a feature flagged feature (disabled by default)
to force crash the app using the function mobile/status.go#IntendedPanic()
provided by status-go. Because the feature is feature flagged and disabled, it
is not available in release builds.
Fixes: https://github.com/status-im/status-mobile/issues/21656
Documentation about Sentry in status-go:
https://github.com/status-im/status-go/blob/3466ac2661bb19cd0eaa27761551de3b4d31b393/internal/sentry/README.md#L60
Areas that may be impacted: Whenever a panic happens in status-go and usage data
collection is enabled we will send error data to Sentry. In theory, nothing
should change for the user, therefore nothing should be visibly different in the
app's behavior.
Steps to test:
Before following the steps below, the CI must be configured with the appropriate
SENTRY_DSN_STATUS_GO value. You can also use a free tier cloud instance to do
your own testing in case you want to play around with Sentry.
1. Login with any profile.
2. Enable usage data collection (for now, Sentry and analytics are tied to the
same setting in status-go).
3. Go to Settings > Feature flags and enable app-monitoring > intentional-crash
4. Go to Settings > Advanced > and press on Force crash immediately
Usually you should see the error in the Sentry dashboard in a matter of seconds.
* [#22029] fix: bridge button when there is single account
* [#22029] fix: trigger start bridge if all condition met
* [#22029] docs: add clarification for bridge flow logic based on account selection
This PR fixes the path to hack deps script and re-generates `gradle` deps.
Previous PRs passed build phase because we already have the `gradle` deps we need.
However make `nix-update-gradle` would fail due to the incorrect path.
* [#21483] fix: update collectible amounts after sending
* [#21483] test: cover funcs with unit test
* [#21483] fix: add condition to update only pending collectible
* [#21483] fix: use parse int for conversion
* [#21483] fix: round up dispatch delay
To remove hardcoding of specific versions of missing gradle
dependencies, we will use `get_versions.sh` to fetch them dynamically.
Also disable default lint checks to remove redundant
`lintVitalReportRelease` task and dependency.
- Remove now unnecessary wrapper for reanimated/view
- Use kebab-case keywords for the hole-view component
- Use rn/StyleSheet.absoluteFill along with ClojureScript styles
- Fix keys inside view's `:transform` property
- Remove some uses of `merge` to pass styles to components
- Add tests for `convert-prop-value`
Add option to copy message ID when long pressing on a chat message. Similar to
how it's implemented in the desktop client, the option is only visible if the
user enables the DEBUG log level.
Fixes https://github.com/status-im/status-mobile/issues/21984
This commit:
- removes EIP-3770 address format (with chain prefix) from the UI and displays/uses only the address
- removes editing of preferred networks for an account and saved address
- copy/paste functions will remove the chain prefix from the address (if any)
- adds base chain explorer links to account and saved address
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* Add `buttons-style` prop to bottom actions to allow same button dimensions
* Make events to update a profile more generic
* Fix tests
* Add modal screen to update the profile
* Add introduce yourself modal
* Ask user to update their profile before sending a message or contact request
* Fix color picker selected styles
* Remove some `:f>` now unnecessary
* No longer shows the modal if the user manually updates their profile
This commit adds a script that overrides `git` to echo version required by `status-go` derivation.
Also fixes error messages like this when building `status-go` :
```
fatal: not a git repository (or any of the parent directories): .git
```
These messages can be often misleading to some developers.
This change resolves some issues related to text-overflow in the app, and it also ensures we use the correct drawer title when editing a user nickname.
* [#21305] fix: sort assets by value and collectibles by name
* [#21305] fix: use seq to check name is nil or empty
* [#21305] fix: normalize text to sort properly
This changes adds support for connecting remotely to re-frisk when running the app on a mobile device. This change is essentially aimed towards better support for introspecting on iOS devices, but these changes should also work for Android devices too. Note, that running in the Android simulator may still require port-forwarding with `adb reverse`.
This change integrates status-go changes that fix an underlying issue with generating identity images. Now identity images will be generated with a populated `clock` field, so we no longer need our existing workaround.
This commit fixes the user is not taken to the activity tab after the TX is placed if the user enters the send flow from collectible details screen (inside the account)
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* chore: add error logging events and effects
* chore: restructure tests and effects for delete-message-for-me
* chore: refactor events and effects and tests for chat-contacts
* chore: refactor and add tests for accepting and declining contact request
* chore: refactor chat-contacts rf/defn to defn
* chore: add :fx key as a mergeable effect for rf/merge when running tests
* chore: refactor rf/defn and add tests for delete-message-for-me
* chore: remove log effects for contacts
* chore: remove logs effects for delete-message-for-me
* fix: update chat usage of sync-all
* fix: resolve schema error with missing action-label for contact-request dismissed state
* fix: ensure chat-contacts event error handlers are compatible with re-frame
* fix: ensure delete-message-for-me event error handlers are compatible with re-frame
* chore: refactor and test delete-message events
* chore: refactor log events and effects
* chore: use log effect in delete-message
* chore: use log events and effects inside chat-contacts
* chore: use log effects inside delete-message-for-me
* chore: remove unneeded test for delete-message-for-me
* chore: format bottom-drawer component
* chore: format delete-message
* chore: format delete-message-for-me
This change refactors the codebase to avoid using deprecated functions and components related to the `custom-color` function (now removed) and the touchable-without-feedback component.
These warnings are fixed:
```
warning: ignoring the client-specified setting 'keep-derivations', because it is a restricted setting and you are not a trusted user
warning: ignoring the client-specified setting 'keep-outputs', because it is a restricted setting and you are not a trusted user
warning: ignoring the client-specified setting 'sandbox', because it is a restricted setting and you are not a trusted user
warning: ignoring the client-specified setting 'stalled-download-timeout', because it is a restricted setting and you are not a trusted user
warning: ignoring the client-specified setting 'trusted-public-keys', because it is a restricted setting and you are not a trusted user
warning: ignoring the client-specified setting 'trusted-substituters', because it is a restricted setting and you are not a trusted user
```
* Change multiple uses of `merge` to `assoc` in flat-list wrapper
* Fix fast-image wrapper to avoid blinking
* merge -> assoc usage in chat-item component
* Fix avatar not being updated when the user changes their username
* Fix scalable avatar issues
- On Android, the border was inconsistent depending on the theme.
- Fix animation, simplify the calculation, and now it matches designs
* Avoid blinking by using rn/memo
This commit fixes routes not cleaned properly ("Context Canceled" and "No Routes Found" errors thrown on generating the next route) when the user navigates back from the TX confirmation screen using the device's back button/gesture.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit fixes
- the send flow for collectibles (ERC721 and ERC1155)
- picking the right balance of the ERC1155 in the send flow from the account page, based on the account viewing by the user
- the balance of ERC1155 is sometimes incorrect if the collectible is present in more than one account of the user
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit fixes the slider-button doesn't reset after the completion of slider in standard authentication with keycard keypairs.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This change adds some metrics events for tracking when keycard users have reached an unavailable feature, when keycard users have successfully logged in, and when keycard users have succeeded or failed to migrate to keycard.
* Share usage data screen image done
* Update login by syncing and login using recovery phrase images
* Small refactor: remove `merge` and add a `let` binding
* Fix modal entering expected animation
* Remove password disclaimer, update copy and simplify implementation
* Remove non-existing wallet event
* Skip profile configuration for the "create profile" onboarding flow
* Include flow for new profiles when another profile already exists
* Add explanation about temp username
* Point 20 to a constant
* Simplify create profile password screen
* Fix password creation screen jump on mount
* e2e: updated tests
* Completely remove the "create profile" onboarding screen
* e2e: updated tests with recovering user
---------
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
This commit fixes the token/networks going to zero/disabled in the "Bridge to" screen when the user navigates back from the input screen.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This change adds a new action to the action-drawer for opened communities. Now opened communities can be closed by users by pressing on the "Close community" action. Note, that this action will only be available to communities displayed in communities list under the opened tab.
Add WebSocket keep-alive mechanism using ping/pong frames to maintain connection stability:
- Add ping timer that sends ping every 30 seconds
- Automatically reconnect if ping fails
- Properly cleanup timer on disconnect
- Add logging for StatusGo server requests
This helps prevent connection timeouts and ensures timely detection of connection issues.
Improves tracking of login and successful onboarding completion according to
requests from non-technical analytics users and to synchronize with desktop. We
now publish two new events user-logged-in and onboarding-completed.
Fixes https://github.com/status-im/status-mobile/issues/21679
Areas that may be impacted: no impact is expected whatsoever, but login and
onboarding code were lightly touched.
- Event user-logged-in is always published, whenever the profile login is
successful. If the user created a profile, we publish both
onboarding-completed and user-logged-in.
- Event onboarding-completed is published if the user created a profile,
recovered using seed phrase or paired devices successfully.
This commit replaces the fallback for an unknown token image (where we display the first letter of the token name) with the default token image
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This change adds support for displaying the keycards inside the keycards settings screen. Note, that the keycards that are displayed are the keycards that are associated to the user's profile keypair.
This change fixes some of the re-rendering issues that occur inside the contact list when creating a new chat. Most important is that we avoid extra re-renders by configuring the flat-list with stable props. And we also avoid re-rendering avatar images each time the avatar component re-renders.
This commit explicitly specifies location and version of `CryptoSwift` pod in attempt to fix errors like this in CI.
```
None of your spec sources contain a spec satisfying the dependencies: `CryptoSwift (= 1.8.0), CryptoSwift`.
```
This commit
- adds container-style prop to the wallet card component
- makes the Buy and Receive CTAs (cards) width flexible as we display two cards, and it needs to fill the screen width.
NOTE: The component's fixed width is 161, but in certain phones, it's small and does not fill the screen's whole width.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
In Google Play and App Store, it is desirable to use en-GB (English UK) as the
default locale for legal reasons. We heard from F-Droid folks that en-GB is not
as well supported as en-US
https://github.com/status-im/status-mobile/issues/21665.
In this PR we go back to en-US as the default locale in fastlane and update the
text for English (UK) standards. Google Play and App Store shouldn’t be affected
and will use en-GB as the default locale.
Fixes https://github.com/status-im/status-mobile/issues/21665
This commit:
- Removes the usage of deprecated "wallet_filterActivityAsync RPC" and updates it to "wallet_startActivityFilterSessionV2" with other supporting activity filter session RPCs
- Removes deprecated "wallet_checkRecentHistoryForChainIDs" RPC as we no longer support past transaction history
- Added support for Bridge, Swap and Approval activities
- Added context for the sender and receiver if the address is known (own accounts or saved addresses)
- Added support for viewing, copying and sharing links to TX details on block explorer
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit:
- adds wallet-card component
- adds Buy and Receive CTAs above the assets list in the wallet home if the balance is zero
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
https://github.com/status-im/status-go/compare/032eb5b6...c014fbfc
- Rename LOG_REQUEST_GO env variable to API_LOGGING_ENABLED across all env files
- Rename requests.log to api.log for consistency
- Remove standalone initLogging functionality from native modules as it's now
handled within InitializeApplication
- Add logging configuration (logEnabled, logLevel, apiLoggingEnabled) to
InitializeApplication params
- Add logDir parameter for Android to ensure proper log file location
This change consolidates logging initialization into the InitializeApplication
flow and makes the naming more consistent with its actual functionality.
This commit fixes the error thrown when tapping the From or To sections in the transaction confirmation screen.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Integrates the optimizations coming from the status-go PR
https://github.com/status-im/status-go/pull/6106. Now messenger filters are
set-up concurrently and we can call the endpoint wakuext_chatsPreview twice:
once for non-community chats and once for community chats. This way, the user
should be able to see some data render before the slow part ends
(community-related data).
Fixes https://github.com/status-im/status-mobile/issues/21456
Areas that may be impacted
- Login
- Loading of data after login (contacts, chats, etc)
Primarily, this change fixes an issue related to the Keycard PIN error message not being visible displayed on some devices. Additionally, this change also clears the PIN entry state after failing to enter the correct Keycard PIN. And this change also allows for the PIN entry component to have two separate error modes: one for the entire component and another for just the info text.
* [#21557] feat: show from account page in swap flow
* [#21557] feat: add disabled state to account-item
* [#21557] fix: apply suggestion
* [#21557] fix: add format address util and rename screen
* [#21557] fix: check and count account with token balance
* [#21557] fix: check for root screen
* chore: upgraded watchman, otherwise it's not used with current metro
The latest metro version requires watchman capabilities that are not
available in the version we locked, so it was not used. Instead we
used the "node watcher", which is slower and buggier (at least for me
metro was timing out quite often)
* fix: watchman ignore .clj-kondo, .shadow-cljs
* Rework login and logout flow to keep biometrics valid
- Move logout logic to a new namespace, the implementation no longer uses `rf/defn`
* Code style fixes
* Fix warning: "null is not an image" in login
* Fix biometric icons used all over the app
---------
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
This commit fixes ParaSwap contract address displayed on the setting approval cap for a token.
Since we get the approval contract address in the swap proposal, we take that as higher precedence over the hardcoded value in the constants file
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* feat: hide token price-change info if no token balance
* fix: show dapps header button only on account screen
* ref: renamed to above-zero? and using it where needed
* fix: removed bridge icon from submit button
This commit should help with potential freezes right after login, especially in
low-end devices and for users with more data.
The default behavior for the effect :json-rpc/call is to transform the
response to CLJS data using (js->clj data :keywordize-keys true), even if the
result is never used. The problem is that the response from
wakuext_startMessenger can be a very large struct! This PR simply adds the
missing line :js-response true.
https://github.com/status-im/status-mobile/blob/ca22b67d0e82a3cb123be2174b3ef2157e676e08/src/status_im/common/json_rpc/events.cljs#L85-L87
type MessengerResponse struct {
Contacts []*Contact
Invitations []*GroupChatInvitation
CommunityChanges []*communities.CommunityChanges
AnonymousMetrics []*appmetrics.AppMetric
Mailservers []mailservers.Mailserver
CommunityStorenodes []storenodes.Storenode
Bookmarks []*browsers.Bookmark
Settings []*settings.SyncSettingField
IdentityImages []images.IdentityImage
CustomizationColor string
WatchOnlyAccounts []*accounts.Account
Keypairs []*accounts.Keypair
AccountsPositions []*accounts.Account
TokenPreferences []walletsettings.TokenPreferences
CollectiblePreferences []walletsettings.CollectiblePreferences
DiscordCategories []*discord.Category
DiscordChannels []*discord.Channel
DiscordOldestMessageTimestamp int
BackupHandled bool
// notifications a list of notifications derived from messenger events
// that are useful to notify the user about
installations map[string]*multidevice.Installation
notifications map[string]*localnotifications.Notification
requestsToJoinCommunity map[string]*communities.RequestToJoin
chats map[string]*Chat
removedChats map[string]bool
removedMessages map[string]*RemovedMessage
deletedMessages map[string]string
communities map[string]*communities.Community
communitiesSettings map[string]*communities.CommunitySettings
activityCenterNotifications map[string]*ActivityCenterNotification
activityCenterState *ActivityCenterState
messages map[string]*common.Message
pinMessages map[string]*common.PinMessage
discordMessages map[string]*protobuf.DiscordMessage
discordMessageAttachments map[string]*protobuf.DiscordMessageAttachment
discordMessageAuthors map[string]*protobuf.DiscordMessageAuthor
currentStatus *UserStatus
statusUpdates map[string]UserStatus
clearedHistories map[string]*ClearedHistory
verificationRequests map[string]*verification.Request
trustStatus map[string]verification.TrustStatus
emojiReactions map[string]*EmojiReaction
savedAddresses map[string]*wallet.SavedAddress
ensUsernameDetails []*ensservice.UsernameDetail
updatedProfileShowcaseContactIDs map[string]bool
seenAndUnseenMessages map[string]*SeenUnseenMessages
}
This change resolves an issue with un-opened, joined, and pending communities being visible inside the "opened" communities tab. With this change, the "opened" community tab will only display spectated (opened) communities that have not been joined or pending to be joined.
This change fixes the appearance of the disclaimer checkbox inside the create/change password forms to use the user's customization color. Additionally, this change also changes the password-hint success icons to use the check-circle because of its solid opacity.
related issue : https://github.com/status-im/status-mobile/issues/15447
This commit makes use of https://github.com/gradle/github-dependency-graph-gradle-plugin to generate deps so that we may get rid of the AWK script that parses `gradle` output to figure out `gradle` dependencies.
credits to Vedran for doing initial research on this dependency generator plugin.
We still miss a few dependencies and are not completely able to get rid of the hack list step just yet.
I also moved `react-native-share` out of `pluginManagement ` block in `android/settings.gradle` because it does not belong there.
This commit
- fixes the networks/chains supported by the token based on the token list fetched from status-go instead of relying on the balance-per-chain map as status-go returns balance for chains only if there is a positive balance
- adds supported-networks key to token data map for network details
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This change refactors the navigation-screens namespace to organise each screen definition into a group based on the app features. It also adds some metrics tracking to all the of the screens defined in the navigation-screens namespace.
Additionally, in this change we've introduced a new build configuration for shadow-cljs which allows us to conditionally include code for certain shadow-cljs builds. In this case, we've decided to only exclude the metrics re-frame interceptor from being required when running the component-tests build. This is due to a complication with the metrics interceptor depending on the navigation-screens namespace, which would eventually require many other third-party dependencies that do not have mocks defined for the component tests. To avoid defining more mocks, we've avoided requiring the metrics interceptor for now.
* fix: filter tokens by balance on select asset
* feat: added network-list-with-positive-balance
* fix: swaps error when using networks with balance
* fix: hide send/bridge/swap when no token balance
This commit:
- Adds a PDF viewer screen to view PDFs within the app instead of opening them on the system browser
- Updates the swap provider (ParaSwap) terms and conditions to be displayed within the app
- Increases APK size limit to 80 MB
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Co-authored-by: Siddarth Kumar <siddarthkay@gmail.com>
* Make `->bignumbers` more general
* Fix case when there are not enough assets to pay gas fees:
- Fix the UI to match Figma
- Fix logic to handle the case
- Perform refactoring to surrounding code
* Change `defonce ^:const` -> `def ^:const` in `status-im.contexts.chat.messenger.messages.list.view` to be more REPL friendly
* Remove animations from `status-im.contexts.chat.messenger.messages.pin.banner.style`
* Simplify placeholder for messages
* Replace shared-value with a ratom usage since no animations were performed.
* Fix the style for the new designs and remove now unnecessary animations
* Improve chat component implementation
The previous implementation has two main problems:
1. It is creating atoms and ratoms in non-form-2-components.
2. Conditionally uses a hook: `rn/use-mount` in `lazy-chat-screen`.
The new implementation fixes the previous problems, improves the readability and passes only the props needed to its children.
* Remove action buttons from the chat screen
* Remove now unused code
* Replace reanimated/view -> rn/view where no animations are made
* feat: moved disconnect logic to function
* ref: moved rpc calls to rpc ns
* ref: moved session approval logic to function
* fix: small fixes for sessions
* test: wallet-connect/on-session-delete event test
* test: added event tests for wc sessions
* fix: require sessions events ns
* fix: the wallet was loaded after wc sometimes
* feat: added type data flattening + tests
* feat: added typed data flattened ui
* ref: moved typed data utils into their own ns
* ref: small changes & formatting
* feat: show typed data view only for typed data requests
* ref: moved typed-data? into sub
* fix: tests and styling
This commit
- Stops route calculation when the user
- changes FROM account
- changes the send (input) amount
- goes back from the routes calculation page
- after the transaction is successfully submitted
- goes back from tx confirmation page for collectibles
- Prevents the keyboard being dismissed while entering the password on the transaction confirmation page
- Fixes multiple edit tiles/boxes added to receiver routes
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This change adapts the code to avoid persisting the string `"<0.01"` in the wallet-send UI state. This change also modifies some of the BigNumber utility functions to validate that only BigNumbers are used with the utility functions. And the this change also tries to stop requesting route suggestions after exiting the wallet-send flow.
This change adds a re-frame event for `:open-url` which will allow UI components to open a url using the re-frame effect `:effects/open-url`. Additionally, some code was refactored to use the `:open-url` event instead of directly opening the urls with the `open-url` function.
This commit fixes the max value that is not updated when the user switches the token/network in the input amount screen
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
nix: use nixpkgs unstable for gradle 8.8
nix: ldflags are expected to be a list
chore: fix deprecated vendorSha256
nix: bump jdk to 17 & pass java version to gradle
make: set universalApk false in run-android target
nix: fix --replace deprecation warning
- https://github.com/NixOS/nixpkgs/pull/260776
ios: update pod and gem lockfiles
nix: bump nodejs to 20.12.2
nix: add Xcode 16.0 to allowed versions
chore: upgrade rn-image-crop-picker lib
nix: full path for missing dep in node_modules sh
e2e: removed redundant element
---------
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
* Fix not joined drawer options for token gated communities
* Remove `show-not-implemented-features?` flag for token gated options
* Fix component tests
As recommended in
https://github.com/status-im/status-go/pull/5570#discussion_r1692345230 [1] and
https://github.com/status-im/status-go/pull/5570#discussion_r1690794119 [2], we set
the Waku config flag WakuV2EnableMissingMessageVerification to true. The flag
can't be toggled in the UI because there's no supporting endpoint for that in
status-go at the moment.
[1] I doubt the hash based store-query going to be as expensive as legacy-store.
Because we only query hashes and if we miss any messages we fetch them which
would improve message reliability.
https://github.com/status-im/status-go/pull/5511 is expensive as it doesn't
query hashes rather full messages. I think we can keep this new flag enabled by
default and provide a switch in the app in case it becomes expensive to disable
it.
[2] we can keep this enabled for mobile by default. The reason
WakuV2EnableStoreConfirmationForMessagesSent was disabled is as it was giving
bad UX to users where messages were sent but still showing as not sent due to
storeNode performance issues. But this flag doesn't give any bad UX, so we can
keep it enabled by default.
Fixes https://github.com/status-im/status-mobile/issues/20879
* WC: Last account that established connection is not selected when connecting through global scanner
* WC: Last account that established connection is not selected when connecting through global scanner
* Fixes
this commit implemented logging request/response between status-mobile and status-go.
to access `requests.log`, shake your phone and share the logs.
TBD:
- adding `device id` into request to proxy server, we can implement it in a separate PR if needed.
- not sure if we need logging the request made in the backend that not asked by frontend directly
This commit:
- fixes crash while sending an ERC115 collectible
- fixes routes are fetched if we enter 0 in the input
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit fixes the delay in showing the currency symbol in the wallet by moving the RPC call to login phase 1 along with wallet initialisation. This helps us to improve the wallet UX by skipping the waiting to start the messenger.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* fixed overlapping last message by the composer when there is a pinned message
* prevent a user who is not a member of a community from pinning or unpinning channel messages
---------
Co-authored-by: Ulises M <ulises.ssb@hotmail.com>
* Fix input amount step skipped while sending a token
* Rename events to remove the `wallet` unnecessary suffix
* Code style fixes
* Fix React warnings:
1. About unique key in `select-address.tabs.view` along with a refactor
2. The deprecated `:keyboard-should-persist-taps` as `true` in `send.select-address.view`
* Hide account switcher while sending a collectible
* Fix tests
In my previous PR -> https://github.com/status-im/status-mobile/pull/21163 I had attempted to build universalAPK only for release builds but had missed out on these changes.
This commit ensures `universalApk` value of `gradle` config is properly set.
This commit also points to my branch in `status-jenkins-lib` which modifies the APK size restrictions.
Its not `110 MB` for Universal APKs and `70 MB` for Individual Architecture APKs
* [#20150] feat: wallet connect pairing via deep links
* [#20150] feat: redirect to the dapp after finish response
* [#20150] test: add tests for events and utils
* [#20150] fix: reviewer's feedback
This change attempts to fix the calendar component specs to avoid errors with finding multiple elements with the same text. Prior to this change it was possible for multiple elements to be found with the same number of the day, like "5", which caused the tests helpers to thrown an exception. Now the specs will use a different test helper to avoid the exceptions, and we've adjusted the test data to avoid duplicate day numbers too.
This commit:
- fixes profile with ENS can edit their name
- fixes identicon ring is shown for the profile with ENS
- updates the profile URL for the profile with ENS
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* wip, small renamings
* Added metamask regex
* Added tests for metamask conversion
* Add metamask address to shell scanner and wallet address scanner
* unify address functions usage
* address-related functions moved to a dedicated namespace
* minor fixes
* fix lint and tests
* review notes fixes
* return back function
* lint fix
* Support metamask addresses without suffix, prefixed `:ethereum`
This commit removes passing random emoji on account creation for the default wallet account, as status-go will set this.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This change updates the Android icon assets for all builds (debug, PR, and release). This change attempts to support the Android adaptive icons and the monochrome/themeable icons for upcoming Android releases.
The issue occurred because we updated the theme value after setting the root
(not before), which caused the root to be initialized with the old theme value.
* Open metrics modal when changing metrics in settings
* Move privacy policy & terms of use components under `status-im.common`
* Add a link to the Privacy Policy in the metrics modal
* Update privacy policy and terms of use content
* Remove extra function wrapper
This commit:
- hides keypairs with empty origin in selection while creating an account
- hides remove account button for accounts with empty origin
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
We make the wallet closer to being offline-first, that is, once data is loaded,
going offline won’t cause unnecessary data re-fetches which currently cause all
balances and data to stay loading forever or eventually balances end up zeroed.
Areas that may be impacted: read-only data displayed in the wallet and editing
accounts.
Fixes https://github.com/status-im/status-mobile/issues/21066
This change changes the initial onboarding screen to require users to manually accept the terms-of-use and privacy-statement before continuing to onboard into the app.
---------
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
* chore: add english translation for "Beta"
* tweak: add beta tags to communities and chat home screen titles
* fix: use smaller size for beta tags on chat and communities home screens
* chore(wallet): feature flag adding watch only accounts
* e2e: disabled test for watch-only accounts
---------
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
This change will now allow for customizing the port number when running the metro server. The environment variable `RCT_METRO_PORT` can now be set when executing commands like `make run-ios`, `make run ios-device`, and `make run-android`. Though, it should be noted that `make clean` may need to be ran before attempting to set or change `RCT_METRO_PORT` since the react-native app will have statically built code that references the value of RCT_METRO_PORT from compile time and not runtime.
* 📈 Capture onboarding funnel
* ⏩ Faster lookup
* ✅ Capture how many people enabled metrics
- It technically captures disabled too
- But we'll never know if someone disabled
- Because that info won't be transmitted
* ✏️ Fix tests
* 🧯 Fix lint
Creating this PR for regression testing the comparability of feature sync
between different versions(mainly current PR build vs v2.29) after adding
backend fallback pairing support. Because frontend haven't added the invocations
relate to fallback pairing API yet, so fallback pairing won't support with
current build.
relate status-go PR https://github.com/status-im/status-go/pull/5614
Testing notes expected: sync should work as before between different versions
like following: v2.29 <-> PR build PR build <-> recent desktop build
NOTE: It breaks with v1 of pairing, but that's ancient (last year I believe), so
safe to break.
This commit uses "usd" currency as default for the fiat price calculation for the tokens.
Every currency has a different format - decimal which we need to rely on a separate RPC to fetch currency format and do the calculation. So, this PR will change to use usd as the default for v2.30.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* fix(wallet): fix bridge transactions
Signed-off-by: Brian Sztamfater <brian@status.im>
* add support for approve transactions
Signed-off-by: Brian Sztamfater <brian@status.im>
---------
Signed-off-by: Brian Sztamfater <brian@status.im>
* feat: removed wallet connect feature flag
* fix: show pending requests when logging out and in
* fix: don't show requests across (test/main)nets
* format: added env newlines
* fix: network state reset on network type change
* fix: reject typed-data if wrong chain-id
* chore: added logs for future debugging
* fix: create password for small screen
* feat: use floating button page
Signed-off-by: yqrashawn <namy.19@gmail.com>
* fix: use keyboard will show for ios
Signed-off-by: yqrashawn <namy.19@gmail.com>
* fix: safe area bottom on devices without physical home button
Signed-off-by: yqrashawn <namy.19@gmail.com>
* feat(create-password): tips and checkbox stick with confirm button
* fix: floating button blur after rebase
* fix(floating-button): absolute content avoid keyboard view
---------
Signed-off-by: yqrashawn <namy.19@gmail.com>
In this commit:
- we set `ANDROID_ABI_SPLIT` to `true`
- we set `ANDROID_ABI_INCLUDE` to `arm64-v8a` for debug & PR android builds
- release builds would still contain `armeabi-v7a;arm64-v8a` and there is no change for E2E android builds
- we point to relevant changes in `status-jenkins-lib` which also introduces a size check for this `apk`.
The agreed threshold is 100 MB.
* 🥅 Filter connected dapps based on testnet mode
- Fixes#20794
* 🥅 Remove map, just filter
* 💿 Rebase
* ❌ Remove greedy fetch
* 🙅♀️ Properly reject proposals and requests
* 🎗️ Remove newline and move `set`
- `set` was applied at the wrong place here
* ✏️ Address review comments
* 👀 Read proposal to reject from state
* ◀️ Bring back network filtering
* 🧹 Cleanup
* ✏️ Move comment around
* 🎣 Use filter operable accounts helper
* ➕ Add back events deleted during rebase
* 🧰 Fix Issue 2, Testnet sessions not visible
* 🖊️ Fix lint
* 🔗 Make testnet filtering more explicit
* 🥢 Use union instead of two subsets call
* ✏️ Fix lint
* 🔇 Undo changes that creeped in an unrelated ns
* add v2 method
* rename v2 to get-suggested-route
* remove timestamp check on success
* handle async signal for suggestion
* fix stop get suggested routes
* address feedback
* rename get-suggest-route
* prefer lazy seq
* fix formatting
* update suggested routes success
* refactor get-in calls in start-get-suggested-routes
* move transformations to data store
* clean suggested routes immediately
* fix lint
* pass precision as ar
* change test name
* fix big number division error (issues 1,2)
* only trigger router fetch when there address (to/from)
* check response data for error response when routes received via signal
* update status-go
* fix: test failure
* update status go
* handle error message for generic errors
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>
* 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.
This commit removes the non-operable accounts in the "Addresses for permission" and "Airdrop address" selections while joining a community
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Tabs "Open" and "Gated" in Discover communities screen were never implemented in
the code, they are dummies. We now hide them under the flag
config/show-not-implemented-features?, which is disabled for users.
Fixes: https://github.com/status-im/status-mobile/issues/20682
To avoid regressions and be quicker, I opted to not remove the "All" tab even
though is the only one shown now, as that would require me to check non-trivial
code due to the fact that the tabs can be sticky as the user scrolls.
Revamps the legacy "Privacy and security" screen to meet the new designs.
Fixes https://github.com/status-im/status-mobile/issues/20618
- Removed setting "Set dApp access permissions" (won't be used anymore).
- Removed setting "Display collectibles" (won't be used anymore).
- Removed setting "Chat link previews setting" (they already had no effect).
- Removed "Reset password setting". This setting is already supported in Profile
> Password > Change password.
- Removed "Delete my profile". Profile deletion is already supported in the
login screen.
- Moved setting "Show your profile picture" to Profile > Privacy and security.
- Moved setting "Accept new chats from <XYZ>" to "Allow new contact requests" in
Profile > Messages. Now it's just a toggle.
- Moved Block screenshots (Android) or Hide Preview (iOS) which are both
accessible in Profile > Privacy and security.
- Created function utils.navigation/navigate-back, but I only used this in 2
namespaces to keep the PR under scope.
Areas that may be impacted: old legacy settings that are still relevant.
This commit:
- update the connection string validation method to use the method from status-go
- updates the error message if the user tries to scan a different key pair QR for importing a missing key pair
- updates the text for exporting an individual key pair
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
https://github.com/status-im/status-go/compare/6e056348...1ef2434b
This commit adds support for pushing centralized metrics to mixpanel.
It uses an interceptor and only picks a few selected events to push
through.
In order to test:
1) Create an account in the app
2) Go to Settings->Privacy
3) Enable metrics
You should now see the events on the mixpanel dashboard (login with your
status-im account for access).
Only some example events are tracked, they are just for testing
* chore: remove identifiers screens so users are navigated straight to enable notifications during onboarding
* removed navigated back button from enable notification screen
* fix top margin
* e2e: updated sign in flow
* make lint-fix
---------
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
* Add variant unknown variant for collectibles
* Fix blank collectibles listed
* Improve `expanded-collectible` animation and add support for different gradient-colors
* Make :wallet/collectible-details-owner subscription depend on `wallet/accounts` instead of `:wallet`
* Make collectible tabs component more flexible
* Remove now unused subscriptions
* Improve UX navigation to collectible detail page
* Pass the current collectible gradient-color when a collectible is pressed
* Fix tests
This change attempts to only to override the default `pointer-events` behaviour for the `quo/keypair` component when the component uses the `selector` action. Now when the `quo/keypair` component is rendered with a selector, only the top-level view of the component will be pressable. And when the `quo/keypair` component is rendered without a selector it will allow for the children of the component to be pressable too.
Removes code integrating with the signal wakuv2.peerstats. The response from
this signal is rather large and it can sometimes happen in short bursts.
- Fixes https://github.com/status-im/status-mobile/issues/20176
We were using it to keep track of the number of peers in real-time. We now only
fetch the peer count in two instances (synchronously inside rn/use-mount):
- When the user opens the legacy screen Settings > Advanced > Peers stats.
- When the user opens the visibility status dropdown in Settings, because the
peers count will be used when the user chooses "Offline" (status inactive).
Note: we don't send anymore the peers count when the user shakes the phone. We
assume this value is already available in :peers-summary (which will be shared
by the user).
status-go still publishes the signal, we just ignore it to remove the
performance overhead of transforming to cljs and mutating the app-db (thus
interrupting the queue from more important stuff).
Steps to test:
- Verify user can see peers count in Settings > Advanced > Peers stats
- Verify changing the visibility status of user Alice in the Settings screen
leads to the desired effect to the other party seeing Alice's visibility
status.
This commit adds syncing saved addresses across paired devices whenever a new saved address is added or an existing one is edited or removed.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Fixes the scroll behavior in a community channel member list. The problem was
that the code wasn't enforcing the correct height.
Partially solves https://github.com/status-im/status-mobile/issues/20514
Steps to test: Long press on any community channel and press View channel
members and details. The user should be able to correctly scroll throughout the
entire list of members.
BigNumber instances are not comparable to other data types, except numbers and
strings (supported directly by the library). This commit makes = safe on
bignumbers (no exceptions should be thrown), even when comparing a bignumber
with a nil value.
There's another important benefit from having a custom comparator: performance,
because re-frame will be able to correctly compare data with bignumbers and thus
reuse cached subscriptions and also Reagent will be able to skip processing when
props are equal.
The IComparable interface was not changed. Similarly to core CLJS data types,
sorting heterogeneous collections throws (ignore nils).
```clojure
;; This throws with message: cannot compare 10 to foo
(sort ["foo" 10])
```
We could make sorting work with heterogeneous collections, but then we would
need to extend many core data types to play nice with BigNumber and that sounds
more like a hack, and it's also not a problem we have nowadays.
* Fix color of non-selected keypairs
* Fix pressable area in keypairs
* Make validation more robust
* Make confirm button always pressable
* Fix wrong sentence in errors
* Solve account creation by fixing a memoized callback
* Improve logging
* tweak: use support blur colors for action drawer icons
* tweak: support blur colors for drawer-top icon
* tweak: support blur colors for account list inside keypair component
* tweak: use blur colors for missing-keypair bottom sheet actions
* feat: remove feature-flag for key-pairs and accounts inside wallet settings
* fix: ensure key-pairs-and-accounts settings are visible
* tweak: display key-pair rename screen as full-screen modal
* tweak: animate key-pair scanning screen as modal
* fix: do not allow user to rename key-pair to an existing key-pair name
* fix: ensure we visualise the validation error for key-pair name that is too long
* fix: ensure we can see the recovery-phrase suggestions when testnet-mode is active
* tweak: show recovery-phrase errors when keyboard is hidden
* fix: ensure we do not re-hash password
* fix: ensure we call `on-close` function when successfully handling biometrics auth
* fix: ensure we clear error states when editing the recovery-phrase input
* fix: use blur styles for standard authentication password input
* chore: add labels for qr validation
* tweak: handle display import-qr error and allow for re-scanning
* tweak: update blur background for all bottom-sheets
* chore: add feature-flag for import-all key-pairs button for missing key-pairs
* tidy: remove unused variable
* fix: ensure layout for android is correct when entering seed-phrase in testnet-mode
* fix: ensure we return the updated db when updating the db with backup key-pair
* tweak: coerce nil to empty string
* tweak: change validation error message for short key-pair name
* tweak: hide the options icon for the default key-pair inside key-pairs and accounts settings
* chore(wallet): make recent tab fullscreen for empty view
* chore(wallet): hide advanced button on send page
* chore(wallet): hide estimated fees when no routes found
* chore(wallet): update emoji icon to edit
* chore(wallet): update key pair placeholder to use keypair example
* chore(shell): feature flag saved address option in scanner
After migrating from v1 to v2, some user names may be too long to fit in some
devices in the "Settings > Edit Profile > Name" setting. The solution was to
truncate in the UI the name to the max valid length in v2, which is 20
characters.
Other small improvements:
- Don't use entire Clojure maps as the :key in React. This is known to be slow
because it's expensive for Clojure to generally transform a data structure
into its string representation.
- Don't find the last item of a list using last and an equality between two
maps. This will force each iteration to call last, which in turn will iterate
over the entire list of items (we can think of the Clojure lazy seq as a
linked list). Instead, we now cache the index outside the loop and do a number
comparison.
- Don't pass entire props to style functions when not needed because
destructuring has a cost. I wouldn't personally worry about this 99% of the
time, but when there's only argument like in this PR where we were passing a
single blur? argument, it's preferable to not use a map.
Solves a problem encountered in unit tests, where instances of BigNumber (used
in the utils.money namespace) can't be compared with = or match?
If you try the following code you will always get false because they're
different instances in memory.
(= (money/bignumber 0) (money/bignumber 0))
We now extend BigNumber (from lib bignumber.js) so that their instances are
comparable (e.g. necessary to sort) and understand equality.
We also extend BigNumber to work with the match? directive. For example, this is
the output of comparing a nested map containing bignumbers (colored in the
terminal):
(match? {:a {:b {:c (money/bignumber 42)}}}
{:a {:b {:c (money/bignumber 43)}}})
FAIL in (equivalence-test) (at cljs$test$run_block (status-mobile/target/test/cljs-runtime/cljs.test.js:366:13)
expected: (match? {:a {:b {:c (money/bignumber 42)}}} {:a {:b {:c (money/bignumber 43)}}})
actual: {:a
{:b {:c (mismatch (expected "42") (actual "43"))}}}
This commit refactors the keypairs data in app-db to save them by indexed by key-uid which will help to fetch, update, and delete easily instead of using filter and some methods every time we need to perform those operations.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* 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
* 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
* 🔳 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>
* add NSAppleMusicUsageDescription permission to play audio messages to the right plist file
* add NSAppleMusicUsageDescription update public string message
---------
Co-authored-by: Parvesh Monu <parvesh.dhullmonu@gmail.com>
With go 1.20 its necessary to pass `lresolv` flag when building c-archives and `netgo` for networking on MacOS.
This was the primary reason why integration tests were failing.
ref
-> https://github.com/golang/go/issues/58416
-> https://github.com/golang/go/issues/58159
This commit adds those flags to the derivation which builds status-go-library for integration tests and fixes the missing symbol crash.
https://github.com/status-im/status-go/compare/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.
This commit enables proguard minification and adds exceptions in proguard rules for the following classes :
- org.bouncycastle
- im.status.ethereum.BuildConfig
- com.reactnativenavigation
This commit also upgrades okhttp gradle dependency to 4.11.0
This should shave off a few MBs in the android bundle.
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.
## Summary
This commit fixes broken `make test-watch-for-repl` on MacOS.
We make sure that default target is passed for this make command because the `node-pre-gyp` requires `python 3.1`
This commit also adds the missing `yarn.lock` file which was missed in this PR https://github.com/status-im/status-mobile/pull/20026
This commit also modifies the `_test_clojure` command a bit to swap out its dependence on `status-go-library` since we do that on `yarn install` anyways.
status: ready
fixes: #20041
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
## Summary
As reported by @ajayesivan and @seanstrom
`Xcode 15.2` worked in their local environments and I then tried to use that version and found no issues with it.
This commit adds `Xcode 15.2` to versions list in Xcode Wrapper `nix` derivation.
## Testing notes
not needed.
## Platforms
- iOS
status: ready
Upgrade re-frame to latest, from v1.3.0 (released on
2022-08-27) to latest v1.4.3 (released on 2024-01-25).
Important changes:
- [Added] re-frame.alpha namespace, for testing proposed features (see flows
(https://github.com/day8/re-frame/discussions/795) and polymorphic
subscriptions https://github.com/day8/re-frame/issues/680#issuecomment-1676487563).
- [Added] dispatch-sync now emits a :sync trace to indicate when it has
finished.
- Re-frame upgraded its dependency on Reagent to latest v1.2.0.
- There are two breaking changes in v1.4.0, but they don't affect us because we
don't use interceptors path and unwrap.
Due to some dark magic by Xcode `make run-ios` breaks with :
```
An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=60):
Unable to boot the Simulator.
launchd failed to respond.
Underlying error (domain=com.apple.SimLaunchHostService.RequestError, code=4):
Failed to start launchd_sim: could not bind to session, launchd_sim may have
crashed or quit responding
make: *** [run-ios] Error 60
```
Sometimes rebooting the laptop worked but a more reliable solution was to clean up simulator caches.
This commit adds the a make command : `make ios-simulator-cache-clean` which cleans up the Simulator caches.
And now `make run-ios` starts working again.
This commit also modifies `make clean` to clean android & iOS
`make clean` should not break for you.
Not needed since this change is local development environment related.
- iOS
- macOS
status: ready
Reverts the preloading mechanism from PR
https://github.com/status-im/status-mobile/pull/19927, which introduced a
problem I couldn't find any satisfactory solution. The namespaces user and
dev.user were being preloaded by shadow-cljs, but the problem is that preloading
will fail if those namespaces don't exist in your file system.
I couldn't find any solution to conditionally preload namespaces via shadow-cljs
and ClojureScript unfortunately doesn't support conditional requires like
Clojure.
At least we got to keep the code to not lint them and the whole idea to start to
commit dev-only code inside src/dev/.
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.
fixes#19802
Contract Tests are failing with missing symbols runtime error on `MacOS` after `golang` version was upgraded to 1.20
A simple hack fix such a case is to use `go 1.19` only to build the status-go library that is used specifically for these integration tests.
Its ugly but it works and unblocks devs from running tests locally.
- execute `make test-contract` on MacOS and it should not fail.
not needed since this impacts only the integration tests.
- macOS
status: ready
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.
## Summary
any `yarn` command calls `node-pre-gyp rebuild` which prints out this warning message :
```
make[1]: Entering directory '/Users/siddarthkumar/code/experiments/status-mobile/build'
CXX(target) Release/obj.target/status_nodejs_addon/modules/react-native-status/nodejs/status.o
../modules/react-native-status/nodejs/status.cpp:1153:11: warning: ignoring return value of function
declared with 'warn_unused_result' attribute [-Wunused-result]
func->Call(isolate->GetCurrentContext(), v8::Null(isolate), argc, argv);
^~~~ ~~~~~~~~~~~~~
1 warning generated.
```
This happens due to return value of `func->Call` here :
https://github.com/status-im/status-mobile/blob/52a6f5c17d3055a98a403505a354cde135b1966f/modules/react-native-status/nodejs/status.cpp#L1153
not being used.
Which is not a huge red flag but produces a warning which is not nice when looking at logs and can be sometimes misleading for other devs.
This commit fixes that warning by assigning return value of that function and checking if its empty or not.
## Testing notes
not needed since this impacts only the integration tests.
## Platforms
- macOS
status: ready
* 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 PR upgrades clj-kondo (our Clojure linter) from v2023-09-07 to
v2024-03-13, so ~6 months of development updates.
You can check out the changes starting at
https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#20231020.
Nothing terribly useful to us this time, but as usual, clj-kondo can catch
more problems and more reliably than before.
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
fixes#19770
Devs are often unaware of the supported Xcode version and often run into weird build issues with either higher or lower Xcode versions.
We currently only support Xcode 15.1
This change ensures we convey that change when devs execute `make run-ios`
This commit also attempts to ensure `xcodebuild` command is wrapped with `XcodeWrapper`.
- iOS
- macOS
status: ready
On brand new ubuntu setup `make run-android` fails with :
```
Task :app:mergeExtDexDebug
FAILURE: Build failed with an exception.
What went wrong:
Execution failed for task ':react-native-reanimated:configureCMakeDebug[arm64-v8a]'.
[CXX1300] CMake '3.22.1' was not found in SDK, PATH, or by cmake.dir property.
BUILD FAILED in 2m 30s
673 actionable tasks: 673 executed
error: cannot unlink '/tmp/tmp-status-mobile-a094d218d/
nix-build-status-mobile-build-debug-android.drv-0/tmp.moQHI1tJWE/caches/8.4': Directory not empty
removed '/tmp/tmp-status-mobile-a094d218d/tmp.RpThXxcRZR'
make: *** [Makefile:278: run-android] Error 1
```
we do have `cmake` present in Android Shell and yet the build process is not able to find it.
This commit makes sure that we explicitly provide that reference.
* tweak: add support for displaying channel qr codes with quo/share-qr-code component
* chore: add channel qr-code example to quo preview components
* tweak: integrate common/qr-code component for sharing community channel qr-code
* tweak: add support for showing community channel avatar in share-qr-code header
* tweak: hide wallet tabs for channel qr-code
* tweak: integrate share handler for community channel qr-code
* fix: prevent accidentally rendering the community channel qr-code with nil while closing the share-qr modal
* tidy: extract navigate-back dispatch function
* tidy: use styles namespace
* tidy: use case statement to determine which qr-code components have a header
* tweak: check for share-qr-types that support headers
* tidy: extract navigate-back into static function
* fix: prevent community qr-code from glitching when closing modal
* fix: ensure :communities/share-community-url-with-data is defined
* fix: ensure we show the share-sheet when pressing the community share-action
* fix: ensure we use the correct share-sheet title when sharing a community
* e2e: updated inviting contacts to community flow
* tweak: remove extra url message when sharing community url on android
* tweak: remove extra url message when sharing community channel url on android
* tidy: remove redundant event handler for sharing community url
---------
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
This commit enables `Fabric` and `Hermes` for `iOS` and in my initial tests the app seemed to behave well.
We can't do this for Android yet because the blur view implementation is not ported to `Fabric` properly.
needed for https://github.com/status-im/status-mobile/issues/18138
In this commit we nuke the unmaintained library `react-native-mail` and move over the logic to our native modules.
This also helps to fix `make nix-update-gradle` which would fail because of that library.
- Android
- iOS
status: ready
* 💚 Enable wallet on header navigation
- Add settings screen
- Add save address settings screen
- Need to add empty state next
* 🥡 Added empty state for saved-addresses
- Fixed the standard title quo component
- It's flex behaviour was buggy, and it's not being used anywhere
* 🧂PR fixes and lint
- Use callback everywhere
* 🗞️ Move wallet settings to wallet namespace
This PR completely removes support for editing shared addresses while a user's
request to join is pending approval.
The reason for the removal is that, in status-go, the control node that will
process the message
protobuf.ApplicationMetadataMessage_COMMUNITY_EDIT_SHARED_ADDRESSES verifies
the user is already a member of the community, but a user waiting for approval
to join is not yet a member. Removing this check doesn't sound like a good idea
and we want to avoid bugs/complications for the next release. The feature isn't
working anyway, so the purpose of this PR is also to cleanup code that doesn't
work and won't be re-done anytime soon.
We log the entire signal data when it arrives from status-go in the native
layer, where our Clojure logging mechanism is unavailable. Sometimes, the
developer may not want that much noise during development, e.g. when managing
integration or contract tests.
This commit removes the native calls to log signals and adds a timbre
(log/debug ...) call in the event handler :signals/signal-received. We know
timbre will elide log calls at compile time given the minimum log level set,
therefore, we don't need to worry about performance because we will log signals
at the debug level only.
## Summary
This commit upgrades `react-native-permissions` library to latest version 4.1.5
needed for : https://github.com/status-im/status-mobile/issues/18138
## Review & Test notes
Please test permissions related flows on onboarding, selecting images, notifications and any other areas you can think of.
## Platforms
- iOS
- Android
status: ready
This commit fixes the display of the correct keypair name (where the account is generated from) in the About tab.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Currently paths looks wrong like this:
```
.../ios/ios/logs/StatusIm-StatusIm.log
```
Which is wrong because it means CI does not save the file.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
## Summary
This commit swaps the fork of @react-native-community/blur with a patch and upgrades the library to latest version of 4.4.0
needed for : https://github.com/status-im/status-mobile/issues/18138
## Review & Test notes
Verify if blur stuff still works.
## Platforms
- iOS
- Android
status: ready
* tweak: hide the identity verification tab inside the activity center
* tweak: hide not-implemented features by default in dev
* fix: remove nil tabs from when rendering quo tabs
## Summary
This commit also points to status-go branch where we have upgraded go to 1.20
Related status-go PR -> https://github.com/status-im/status-go/pull/5027
### Testing notes
Please test everything, specially the store node stuff.
#### Platforms
- Android
- iOS
status: ready
## Summary
This commit swaps the fork of react-native-mail with a patch.
needed for : https://github.com/status-im/status-mobile/issues/18138
## Review & Test notes
Verify if mailing logs still works.
## Platforms
- iOS
- Android
status: ready
This commit swaps the fork of @react-native-camera-roll/camera-roll with a patch and upgrades this library to the latest version.
needed for : https://github.com/status-im/status-mobile/issues/18138
Verify if camera album related features still work.
- iOS
status: ready
* tweak: allow for env variable to configure undo-time-limit when deleting a message in chat
* tweak: add env variable undo timeout for deleting messages for everyone
* tweak: extend timeout duration for undo toast when deleting a message for a user
* tweak: extend timeout duration for undo toast when deleting a message for everyone
Sometimes an integration test was throwing "TypeError: Cannot read properties of
null (reading 'call')" because a value was nil in the app-db, but the code was
treating it as if it was always a map and could be called as a function.
The original code wasn't respecting Clojure's nil punning good practices. In
Clojure, it's often recommended to not use dynamic data as functions, because if
they're nil, in CLJS we'll get an exception and as usual in CLJS, the stacktrace
won't be very readable.
We should prefer contains? or get, which will work just fine with nil values,
and only use data as a function if it's static, e.g. a map defined in a def.
* tweak: implement the share button inside the profile settings page
* chore: define event and effect handler for opening share sheet
* tidy: refactor share buttons to use open-share event
* tidy: refactor open-share effect to use react-native-share bindings
* tidy: remove unused code for old bindings to react share sheet
* tidy: move effects.share/open definition to navigation effects
* tweak: ensure navigation effects are loaded
* tidy: use open-share dispatch in ui
* tidy: use open-share dispatch instead of calling open function directly
* tidy: refactor react-native.share/open to only receive options and return promise
* tidy: refactor open-share effect to receive map of content and handlers
* tidy: replace strings with keywords
* tweak: always handle failure case when opening share-sheet
* tweak: rename :content to :options
* fix: conditionally call on-error
* tweak: add extra information when logging error from attempting to share-sheet
Desktop QA tests also use Pytest packages and their versions are
different, so we can't install them globally, it needs to be done per
build using `WORKSPACE_TMP` as destination.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
## Summary
A patch is added to `gomobile` on status-go side to fix building with Xcode 15.
related status go PR -> https://github.com/status-im/status-go/pull/5035
## Platforms
- Android
- iOS
status: ready
parent issue: https://github.com/status-im/status-mobile/issues/18310
This commit converts the following `Java` files to `Kotlin` :
- modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java
- modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.java
- modules/react-native-status/android/src/main/java/im/status/ethereum/module/Utils.java
This commit converts Java code to `Kotlin` which involves a helper function that is used to execute `statusgo` methods.
It may impact everything or nothing.
- Android
* Refactor :wallet/tokens-filtered sub to filter only when `query` is provided
* Make token input logo pressable and make components more flexible
* Change asset-list's rn/scroll-view -> gesture/scroll-view to make it scrollable on bottom-sheets
* Add bottom-sheet to edit the token to send
fixes#19449
In this commit we change the way patches are applied.
We no longer have to write patches in a patch phase like we used to, we can now place individual changes in a patch file inside the `patches` directory and they will be automatically applied.
Because of this change we can get rid of forks and instead have those changes in patch files.
To generate a patch file this make command can be used `make patch-file`
This will open an interactive shell which will allow you to specify which file you want to patch and then wait till you make those changes and generate a patch for it.
```
make patch-file
Configuring Nix shell for target 'default'...
Enter the path of the file to patch: ./node_modules/is-glob/index.js
File to patch: ./node_modules/is-glob/index.js
Temporary directory created: /tmp/tmp-status-mobile-40bc588fa/tmp.xrXarXoTPZ
Original file copied to temporary directory.
Please make the necessary changes to the file: ./node_modules/is-glob/index.js
Press any key when you are done with the changes...
Generating patch file...
Patch file created at /Users/siddarthkumar/code/status-im/PR/status-mobile/patches/index.js.patch
Info: Please execute 'make run-clojure' to test if the patch file works as expected.
```
- Android
- iOS
* tweak: truncate text inside contact request notifications to be a max of two lines
* tweak: truncate text inside the activity-center contact-requests to be a max of two lines
This commit:
(UI changes)
- adds the feature to filter assets (tokens and collectibles) and balances based on networks
- fixes network color for eth not shown on the multichain address (e.g. Account Options bottom sheet)
- fixes blur type in the confirm button in the network preferences sheet
- fixes the User ability to unselect all networks in the network preferences sheet
- fixes account address and color not shown in network-preferences sheet on Shell > Share Multichain address
- added STT token image
(Non-UI changes)
- Refactors the functions used for balance calculations and network details
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* tweak: re-structure layout of quo/author component to use flex-baseline for alignment
* tweak: use top on container to balance layout while using top to offset primary-name
* tidy: remove margin-bottom: 0
* tweak: add comments and fix layout glitch
* tweak: augment bottom-sheet component to be aware of keyboard height
* tweak: augment quo input component to allow for styling of the input, the input container, and container
* tweak: augment contact request input to grow until max screen size is reached for the bottom-sheet
* tweak: handle blurring the contact request input when keyboard is dismissed on android
* tidy: refactor with the use-keyboard hook
* tweak: use on-layout for measuring sheet max-height
* tweak: remove use of input-style and flex-direction column
* tidy: remove unused requires
* tidy: use container-style prop
* tidy: fix formatting
* fix: default layout-height to window-height
* 🖇️ Connect getSavedAddresses
- The save button will not show if the address is already saved
* ⚒️ Fix PR reviews
* 🗑️ Remove code from wallet events ns
* updated community rules to display the actual rules
* updated scroll behaviours on community rules inside the bottom sheet
* added standard rules for communities without rules
* fix android scroll issues
iOS nightly builds were failing with :
```
07:54:15 The following build commands failed:
07:54:15 PhaseScriptExecution Run\ Script /Users/jenkins/Library/Developer/Xcode/DerivedData/
StatusIm-hasrsefeolwghadhqaakilqvfzrk/Build/Intermediates.noindex/ArchiveIntermediates/StatusIm/
IntermediateBuildFilesPath/StatusIm.build/Release-iphoneos/StatusIm.build/
Script-E3914A731DF919ED00EBB515.sh (in target 'StatusIm' from project 'StatusIm')
07:54:15 (1 failure)
07:54:15 [05:24:14]: Exit status: 65
.
.
.
07:54:15 [05:24:14]: ▸ /bin/sh -c /Users/jenkins/Library/Developer/Xcode/DerivedData/
StatusIm-hasrsefeolwghadhqaakilqvfzrk/Build/Intermediates.noindex/ArchiveIntermediates/StatusIm/
IntermediateBuildFilesPath/StatusIm.build/Release-iphoneos/StatusIm.build/
Script-E3914A731DF919ED00EBB515.sh
07:54:15 [05:24:14]: ▸ /Users/jenkins/Library/Developer/Xcode/DerivedData/
StatusIm-hasrsefeolwghadhqaakilqvfzrk/Build/Intermediates.noindex/ArchiveIntermediates/StatusIm/
IntermediateBuildFilesPath/StatusIm.build/Release-iphoneos/StatusIm.build/
Script-E3914A731DF919ED00EBB515.sh: line 2: ./logs/set_xcode_version.log: No such file or directory
07:54:15 [05:24:14]: ▸ Command PhaseScriptExecution failed with a nonzero exit code
```
In this commit the path to the logfile `set_xcode_version.log` has been fixed.
* feat: added undo action to mute chat toast
* fix: removed trailing spaces from toast text
* test: integration test for mute-chat undo
* fix: added space before newline to toast messages text
* feat: add undo to community mute toast
* fix: integration tests
* fix: integration tests
---------
Co-authored-by: Volodymyr <52490791+VolodLytvynenko@users.noreply.github.com>
## Summary
This PR removes all of the unused `npm` libraries and their corresponding `gradle`/`cocoapods` dependencies.
The list of npm dependencies removed are :
- `@babel/preset-typescript`
- `create-react-class`
- `react-native-haptic-feedback`
- `react-native-image-viewing`
- `react-native-languages`
- `react-native-randombytes`
- `react-syntax-highlighter`
- `rn-emoji-keyboard`
- `tdigest`
This saves us some bytes in the bundle size.
## Platforms
- Android
- iOS
## Summary
PR made to add logs to help determine why integration test hangs on logout.
## Testing notes
No need for testing since we only ever add logs in test code here.
related to: #19256
* fix: allow name-container inside message content to shrink so secondary-name can be truncated
* fix: responsively truncate contact profile secondary-name
* fix: ensure home chat-list-items use full available width in layout
* fix: adjust layout of home chat-list-item shrinking with notification counter
* fix: adjust layout of home chat-list-item when displaying notification counter
* tidy: simplify alignment
* tweak: adjust alignment of quo/author component for different text sizes
* tidy: extract styles and reformat notification-layout
* Fix key extractions in re-frame/reg-sub
* Add `:width` to share-qr-code
By adding this prop, `on-layout` can be skipped and the component can be properly rendered faster.
* Use `share-qr-code`'s `:width` prop in share profile shell
* Fix share qr code for wallet addresses
* Fix the height of the component being cropped.
* Fix the bottom dots not being accurately highlighted.
* Fix the blink when the component is mounted
The killing of metro terminal upset a few people and this PR fixes that.
## Summary
Modify build step to check if metro is running already.
If so then we do not attempt to start metro again.
If not then we start metro after building android / iOS.
## Review notes
* case 1
- `make run-clojure`
- `make run-metro`
- `make run-android` or `make run-ios` should work the way it did before.
* case 2
- `make run-clojure`
- `make run-android` or `make run-ios` should also work.
## Platforms
- Android
- iOS
fixes#18311
This PR upgrades `nixpkgs` to latest release version of 23-11
ref -> https://github.com/NixOS/nixpkgs/releases/tag/23.11
- `Gradle` from `8.0.1` -> `8.4`
- `Git` from `2.40.1` -> `2.42.0`
- `Curl` from `8.0.1` -> `8.4.0`
- `OpenSSL` from `3.0.8` -> `3.0.13`
- `NodeJS` from `18.16.0` -> `18.19.1`
- `Python` from `3.10.11` -> `3.10.13`
- `Clojure` from `1.11.1.1273` -> `1.11.1.1413`
- and some more stuff
- `xcbeautify` , this was added in 23-11 ->https://github.com/NixOS/nixpkgs/pull/289446
- `idb-companion`, this was also added in 23-11 -> https://github.com/NixOS/nixpkgs/pull/296440
* Fix linear-gradient breaking when `customization-color` is unknown
* Fix exception when scanning an address due to non-existing navigation route
* Dispatches universal QR code scanner on share address modal
This commit enables Test Networks in Dev, E2E and PR Builds by default and disables in Release/Nightly Builds.
This enables in create account or restore account flow. If you upgrade the app from the old build with an existing profile, it will use the last saved (test networks enabled) state of that profile.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* Remove 'Community admins will review your request' text from community overview screen
* Use the button label 'Request to join' for all communities
* e2e: updated test
---------
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
* feat: replaced old emoji component with new one
* feat: replaced old sticker component with the new one
* ref: pass only url to sticker
* fix: renamed ns and passing only needed props
* fix: destructuring instead of select-keys & assoc
* fix: formatting
* fix: ensure contact-request notifications are displayed as notifications
* fix: provide context-theme for notification sub-components
* fix: adjust font weight for notification text
* fix: adjust alignment of user-avatar inside a notification with a header and body
* tidy: rename override-theme to theme inside notifications
* fix: update notifications component to use `user` prop instead of `avatar`
* tweak: adapt notification to avatar to vertically center when only displaying header or title
* fix: use title font-size for contact-request-accepted notification
* fix: allow for custom avatar component prop in quo notification component
* fix: ensure we use the correct font-weight for contact-request-accepted notification
* tidy: fix formatting
fixes#19081
## Summary
This PR aims to improve android build step for debug variants by ensuring we do not rebuild the android derivation for any change made to `clojurescript` code.
We also do the following things :
- enable `JVM` parallel garbage collector.
- get rid of `dexOptions` which was deprecated in `gradle 8`.
- add additional `parallel` flag to `gradle` to speed up builds.
## Review notes
- `make run-clojure`
- `make run-android`
- ctrl + C on android terminal and edit any `cljs` file
- `make run-android` ( should build almost instantly )
fixes#18291
## Summary
Changes worth mentioning are :
- More hacks/patches
- Force app to use `Java 17` everywhere to compile `kotlin,java`
- `gems` were upgraded after a long time
- `aapt2` was bumped to `8.1.1`
- `metro` is now at `0.80.4`
- `xcbeautify` was bumped to `1.4.0`
- `@react-native-community/clipboard` lib was replaced with `@react-native-clipboard/clipboard`
- `react-native-dialogs` lib was upgraded to `1.1.2`
- `react-native-gesture-handler` lib was upgraded to `2.14.1`
- `react-native-navigation` was upgraded to `7.37.2`
## Platforms
- Android
- iOS
* Fix schema error
* Implement feature to edit shared addresses
* fix: show tokens when sharing all future addresses toggled
* fix: eligibility not checked when toggling all addresses
* Revert "fix: show tokens when sharing all future addresses toggled"
This reverts commit 8443a3432e.
* fix: don't fetch balances on mount if toggled share all
---------
Co-authored-by: Cristian Lungu <lungucristian95@gmail.com>
* fix: change nav buttons to :photo when scrolled to top
Signed-off-by: Cristian Lungu <lungucristian95@gmail.com>
* fix: renamed to use-messages-scrolled-to-threshold
Signed-off-by: Cristian Lungu <lungucristian95@gmail.com>
* fix: nav buttons are shown without flicker on mount
Signed-off-by: Cristian Lungu <lungucristian95@gmail.com>
---------
Signed-off-by: Cristian Lungu <lungucristian95@gmail.com>
* 🚧 Save address UI reached teenage years
* 🚧 Save point
* 📑 Use bottom sheet effect properly
* 📝 Can't get title input to work
* 🎨 Design in place
* 🗺️ Add address box and trigger for network prefs
* 💅 Pixel perfect UI and hide save address button
* ⏫ Upgrade to screen tech
* 🤚 Undo changes made to color picker during rebase
* 🧰 Fix screens I broke during rebase
* ❄️ Fix json indent
* ⚒️ Implement PR feedback
* ⛏️ Remove unrelated translations
* 🖼️ Remove container to fix margin issue
- Use rn/use-callback instead of defined functions
* 😶🌫️ Hide save address button
* 🔨 Fix lint
* ❌ Remove bottom sheet screen updates
* ❌ Remove empty lines between elements
* chore: add english translation for contact-request-review
* feature: integrate contact-request-review button
* tweak: render the locked-input label when provided
* tweak: allow locked-input component to grow in height
* chore: add english translation for "ignore"
* feature: add subscription for retrieving a pending contact-request by contact-id
* feature: integrate initial contact request review flow
* tweak: display send-message button on contact profile when contact-request-state is mutual
* tidy: refactor button-wrapper view to be button container-styles
* feature: add toast for accepting contact request
* Add memoized versions to convert keys
* Add placeholder for SVG collectibles due to errors and warnings
* Add events to request collectibles per account
* Update subs to list all accounts collectibles evenly
* Update collectibles tab to pull new data when end is reached
* Use memoized version of key transformation
This commit adds the feature to handle blockchain status signals from the status-go and shows a toast if the provider for any of the blockchains is down.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* chore: add send-contact-request to i18n translations
* feature: add send-contact-request button on contact profile
* chore: prop drill full-name and profile-picture for the context-tag inside drawer-top component
* chore: add english translation for contact-request-message-prompt text
* feature: integrate contact-request sheet
* tidy: subscribe to contact data inside contact-request view
* tidy: wrap callback with use-callback
* tweak: hide contact-request button if contact-request is already sent
This commit removes the POKT (Grove) URL for Sepolia and Goerli as POKT dropped support.
Now, we will use Infura RPC for Sepolia and Goerli as default.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* tweak: allow for optional message to be sent when making a contact request
* chore: migrate contact-request event handler from `rf/defn` to `rf/reg-event-fx`
* test: add tests for sending a contact request
* chore: make it easier to test on-success and on-error behaviour after sending a contact request
* tidy: use reframe fx for declaring json-rpc/call
* tidy: remove unused success event handler for send a contact request
This commit brings numerous improvements to integration tests. The next step
will be to apply the same improvements to contract tests.
Fixes https://github.com/status-im/status-mobile/issues/18676
Improvements:
- Setting up the application and logged account per test is now done with an
async test fixture, which is a very idiomatic way to solve this problem. No
need anymore to write macros to wrap day8.re-frame.test/wait-for. The macros
in test-helpers.integration will be removed once we apply the same
improvements to contract tests.
- Integration test timeouts can be controlled per test, with a configurable,
global default (60s).
- Now the integration test suite will fail-fast by default, i.e. a test failure
short-circuits the entire suite immediately. This option can be overridden on
a test-by-test basis. This improvement is very useful when investigating
failures because the error will be shown on the spot, with no need to search
backwards across lots of logs.
- Noisy messages from re-frame can be silenced with a test fixture. We can
silence even more in the future if we remove the hardcoded printf call from
C++ on every signal and control it with Clojure. We can disable most logs as
well with the more direct (status-im.common.log/setup "ERROR") at the top of
tests.integration-test.core. We can make verbosity even more convenient to
control, but I think this should be designed outside this PR.
- Removed dependency on lib day8.re-frame/test for integration tests (see
detailed explanation below).
- Each call to (our) wait-for can customize the timeout to process re-frame
event IDs passed to it.
- Syntax is now flat, instead of being nested on every call to wait-for. You
can now compose other async operations anywhere in a test.
Notes:
- promesa.core/do is essential in the integration test suite, as it makes sync &
async operations play nice with each other without the developer having to
promisify anything manually.
- There are lots of logs related to async storage ("unexpected token u in JSON at
position..."). This isn't fixed yet.
Are we not going to use day8.re-frame.test?
We don't need this library in integration tests and we won't need it in contract
tests. Whether it will be useful after we remove it from integration and
contract tests is yet to be seen (probably not).
A few reasons:
- The async model of promises is well understood and battle tested. The one
devised in the lib is poorly understood and rigid.
- There's basically no way to correctly integrate other async operations in the
test, unless they can be fully controlled via re-frame events. For instance,
how would you control timeouts? How would you retry in a test? How would
forcefully delay an operation by a few seconds? These things are useful (to me
at least) when developing integration/contract tests.
- Every call to day8.re-frame.test/wait-for forces you to nest code one more
level. Code readability suffers from that choice.
- Have you ever looked up the implementation of wait-for? It's quite convoluted.
One could say the source code is not that important, but many times I had to
look it up because I couldn't understand the async model they built with their
macro approach. The de facto primitive in JS for asynchronicity is promises,
and we fully leverage it in this PR.
- The lib has an interesting macro run-test-sync, but we have no usage for it. I
used it in status-mobile for a while. At one point, all event unit tests for
the Activity Center used it (e.g. commit
08fb0de7b0), but I replaced them with the
simpler pure function style.
* chore: add community color subscription
* fix: use configured chat color for chat ui and fallback to community color
* test: ensure community-color subscription returns the community color
* tidy: use resolve-color function instead of custom-color function
* revise: rename community-color to customization-color and default non-community channel color to turquoise
fixes#19012
### Summary
The legacy wallet code was removed here -> https://github.com/status-im/status-mobile/pull/18749
as part of that purge we also cleaned up re-frame subscriptions for wallet push notifications.
Since the new wallet is under active development we would not need this toggle in settings just yet.
This commit fixes the app crashing on settings UI.
## Platforms
- Android
- iOS
fixes#18915
In this PR https://github.com/status-im/status-mobile/pull/18900 we added a `logs` folder in the root directory and it was discovered that we also have an `ios/logs` folder which the CI uses to generates logs during build time.
Its more consistent if we move those logs to the log folder in the root of the repo.
This commit fixes that and updates leftover usages.
chore: create profile-picture schema with profile-picture-fn field
fix: update context-tag schema to allow for profile-picture-fn
tidy: move profile-picture schema into the common schema namespaces
tidy: revise docs for user-avatar-internal component to mainly warn about `profile-picture-fn` usage
tidy: rename `profile-picture` schema to `profile-picture-source`
tidy: use profile-picture-source schema in user-avatar schema
* Use page-top in bridge screen
* Use page-top in bridge-to screen
* Use page-top in add-address-to-watch screen
* Use page-top in backup-recovery-phrase screen
* Use page-top in check-your-backup screen
* Add support for title right options to page-top
* Use page-top in check-your-backup screen
* Use page-top in send-to screen
* Use page-top in select-asset screen
* Use page-top in :wallet-share-address screen
* Deprecate text-combinations
fixes#16310
We used to reply on `react-native cli` and would pass a `--device` flag to deploy the debug variant of `iOS` app on connected `iPhone`.
`react-native cli` under the hood uses `ios-deploy` library to achieve this functionality.
This showed many weird issues, specifically in locating connected devices and failures at build step with ambiguous error messages.
This commit fixes it by using our custom script `run-ios-devices.sh` which does not rely on `ios-deploy`.
We use `libimobiledevice` to identify `UDID` of a connected `iPhone`.
We use `xcrun devicectl device install app` and `xcrun devicectl device process launch` to install and launch the app.
This works well with `Xcode 15` and `iOS 17.x`.
We can now remove `ios-deploy` from `iOS` shell and `nix` overlay.
We also set up a logs folder and add a Readme.
## Review notes
- connect your iPhone to your Laptop via a cable
- `make run-clojure`
- `make run-ios-device`
(note: no need to pass device name now)
## Platforms
- iOS
## Summary
Improve iOS Simulator selection via `make run-ios` command.
Currently : `make run-ios SIMULATOR="iPhone SE (3rd generation)"` would fail because of our scripts inability to deal with this kind of a pattern.
This commit fixes that and makes this script more robust by storing output of `xcrun simctl list devices` in a json file `ios_simulators_list.json` and then using `jq` to properly get `UDIDs` of those simulators.
This script will now also prompt you to download a simulator image if you do not already have it.
The file `ios_simulators_list.json` will also help in future debugging when we want to check a quick summary of iOS simulator status of devs in the future.
We also append `-verbose` to `xcodebuild` for debug `iOS` builds, this helps debugging.
## Review notes
try such options -> `make run-ios SIMULATOR="iPhone SE (3rd generation)"`
## Platform
- iOS
`make run-android` would fail for connected Android devices because the android device was not able to talk to metro bundler.
This was discovered by @J-Son89
This was easily fixed by reverse tcping port 8081.
## Review notes
connect Android device by USB or Wifi
- `make run-clojure`
- `make run-android`
status app must run without any errors on the connected Android device.
we also replace during install on emulator.
otherwise on old emulators `make run-android` fails with :
```
adb: failed to install ./result/app-debug.apk: Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install im.status.ethereum.debug without first uninstalling.]
```
fixes#18888
## Summary
`make run-android` was sometimes flaky because we used to send metro to background via `nohup` and then bring it back to foreground after we read metro logs.
Now we do not send metro to background. We first wait for a successful build.
we then install the app on the simulator. After this is done we give command to sleep until metro server has started, Once metro server has started we open the installed app.
In this workflow the command to open the installed app goes in background and metro stays in foreground.
The new workflow should now be less flaky.
## Review notes
`make run-clojure`
`make run-android` OR `make run-ios` should just work
#### Platforms
- Android
- iOS
Resolved the scrolling issue pertaining to community rules. Additionally, will ensure compatibility with iOS devices lacking safe-area-view in the follow-up.
Fixes
- 'Confirm changes' button unexpected enabled state
- The Confirm button remains enabled even after deselecting all addresses when the user has watch-only wallet accounts.
- Disable the Confirm button when the user deselects the accounts with the token required to join.
- Use community color for address checkbox
* QR scanner
* More options for QR
* Router fixes
* Updates for `on-qr-code-scanned`
* Update for communities
* Updates
* Scan profile path
* More fixes
* Last fixes for scanning
* Fixes
* Fixes
* Fixes
* Test fixes
* Fixes
* Updated Utils.m
* Test fix
This commit fixes the broken wallet account emoji when syncing devices by adding a sanitization method for the wallet account emoji. The desktop can handle both variants (raw emoji and img tag); this PR adds the same for mobile.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
fixes#18836
## Summary
While introducing https://github.com/status-im/status-mobile/pull/18784 I missed out on adding an install step to `run-ios.sh` script.
`make run-ios` would work fine for simulators that already have the app installed but would fail for new emulators.
@flexsurfer discovered this problem.
This commit fixes that by adding an install step to the script.
## Review notes
- `make run-clojure`
- `make run-ios`
should just work.
## Platforms
- iOS
fixes#18831
We update the nix derivation to build android by passing `hermesEnabled` flag which checks the environment variable and if the environment variable is not set we default `hermesEnabled` to `true`.
This ensures that `hermes` is disabled for debug builds and enabled for release builds.
In this commit we also
- rename `nix/mobile/android/release.nix` → `nix/mobile/android/build.nix` since that nix file no longer generates release only builds.
- cleanup 2 other env vars and use the `gradle` project format
- replace `BUILD_NUMBER` with `verisonCode` for consistency
- replace `androidGradleOpts ` with `buildUrl `
- bump `status-jenkins-lib` to v1.8.7
After upgrading `react-native` to `0.72.5` we frequently started seeing the _red screen of death_ on both `Android` and `iOS` simulators right after the app was built and installed.
This used to happen because our workflow required us to do the following :
- `make run-clojure`
- `make run-metro`
- `make run-ios` OR `make run-android`
The problem with this approach was after `metro` was started the `iOS`, `Android` build step would change the files that `metro` couldn't handle and hence metro would go out of sync.
The quick fix back then was to restart `metro` terminal and to open the app again from the simulator.
This was however not a good DX.
This commit fixes that.
We no longer rely on `react-native` cli to generate and deploy debug builds on simulators. We take control of the process via our own script. The new workflow introduced in this commit will first build the app, then install the app on the simulators and then start metro terminal. When `metro` is successfully running the script will then open the app.
The new workflow now is :
- `make run-clojure`
- `make run-ios` OR `make run-android`
https://github.com/status-im/status-go/compare/c15f9e73...1ea2bd99
This PR reduces the amount of rendering in community overview.
It limits the amount of data is passed to components to the necessary,
and it creates functions on component initialization so that they won't
cause a re-render.
Performance of the header are very noticeably better on my local
environment, though on nightly builds is less noticeable.
It also removes data from `communities/communities id` as that cause a
re-render of any component subscribed to it.
https://github.com/status-im/status-go/compare/c15f9e73...b7b7660a
There were a few issues with the permission screen:
1) Wrong permission was displayed when able to join
2) If not able to join, we were showing both admin/member permissions
3) Trailing zeros in token amount
We are moving location of symlinks for build derivations for `gcroots`
from `/nix/var/nix/gcroots/per-user` to `.nix-gcroots` in the repo to
avoid errors like this caused by profile migration in `2.14` release:
```
error: creating directory '/nix/var/nix/gcroots/per-user/joe': Permission denied
```
For more details see: https://github.com/NixOS/nix/issues/8564
To upgrade without using `make nix-purge` use `make nix-upgrade`.
Related infra change:
https://github.com/status-im/infra-ci/commit/37c6ce47
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* 🚟 Add schema batch 2
* ⏬ Add maybe and optionals
* 🧑⚖️ Make theme a required prop
* 🍙 Fix misplaced square brackets that broke spec
* 🎨 Assume default theme and fix tests
- Fixes#18734
* ⬆️ Update schema and rebase
* 🧪 Update tests
* 🆙 Update progress bar value to be string or int
* 🔩 Tighten schema
* register and basic imports for collectible tag component
* implement variations and design for collectible tag component
* Refined based on review feedback and implemented schema enhancements
Show "relevant tokens" in account selection step. Related status-go PR
https://github.com/status-im/status-go/pull/4631.
- Balances are fetched on the account selection screen. Assuming most users
won't care about selecting addresses, this eliminates unnecessary calls to get
balances, at the expense of refetching them every time the component is
mounted. I think for now this is acceptable.
- Relevant tokens is a terminology used in Figma, but more specifically, it
means "balances for all assets that have at least one Token Criteria
associated, and for a given address". Or, as I tried to give it a more
distinct name, "permissioned balances".
Areas that may be impacted: None because all affected code is behind a disabled
feature flag.
Fixes https://github.com/status-im/status-mobile/issues/18126
The purpose of this commit is to allow running `maestro` automations to enhance productivity by **automating** mundane tasks.
Other flows like
- send contact request
- sync devices
- join a community
etc will be a part of follow ups.
In this commit we provide a `make` command to run a very common task like creating account & login :
`make auto-login`
We also allow another `make` command to run any other custom flow :
`make auto-custom FLOW="maestro/create-account-or-login.yaml"`
A `maestro` folder has been added with 3 `yaml` files which are very easy to understand
ref : https://maestro.mobile.dev/api-reference/commands
We recently disabled `hermes` for debug builds here -> https://github.com/status-im/status-mobile/pull/18675
A side effect of that is when we run `make nix-update-gradle` the `hermes` pom gets removed from `deps.list`
This pom is necessary for release builds.
Currently that pom exists in `deps.list` but someone may accidentally remove it when running `make nix-update-gradle`
In this commit we remove the conditional implementation of `hermes` or `jsc` in `build.gradle`
This ensures that the `hermes` pom we need during release builds is not removed from `deps.list`.
I also ran `make nix-update-gradle` just to be sure.
I compared the apk in this commit to other PRs and the size increased by 2MB.
A small price to pay so that the team can run Malli locally without crashing their debug app frequently.
I've added a FIXME comment in the code for when we want to cut back on bundle size later.
* Fix exception thrown re-frame don't have the subs' value ready
* Make Token malli schema more lenient
* Make `get-standard-crypto-format` able to work with `nil` values
* Refactor token screen to move subscriptions inside render function
* Make token input reactive to on-swap
* Remove `crypto-currency?` atom to properly react to state changes
* Fix component tests
fixes#18493
We enabled `hermes` for android in the `react-native` upgrade to `0.72.5`
Although things seemed fine but developers were seeing frequent crashes in their local environment.
After some investigation the crashes were traced to max native call stack depth in `hermes` engine.
Disabling `hermes` for local debug builds helps fix that issue.
This commit disables `hermes` by default with the help of a exporting an environment variable in the `make run-android` command.
It is annoying that this also modifies `android/gradle.properties` so we keep `hermesEnabled` as `false` there as well.
We also enable `hermes` when generating release builds so that we can take advantage of `hermes` engine in release builds.
We also add a log to print whether `hermes` is enabled or not. I think its helpful to have this so that we know whether `hermes` is enabled or not.
Token requirements that are not role permissions (currently channel permissions)
should not be displayed to the user while they see permissions to join.
Admin, Master, Owner or minted token permissions are not membership permissions,
but they still should be displayed so the user understand the role they will
assume after joining.
Co-authored-by: Icaro Motta <icaro.ldm@gmail.com>
- Hack fix
- Scroll on press breaks something with FlatList
- Which causes some items to not render
- Could be related to scroll view inside scroll view
- But fixing this bug by compromising the UX a tiny bit
* feat: added react-native-biometrics dependency
* chore: added malli schema to auth
* fix: malli schema
* feat: using react-native-biometrics
* fix: removed biometry not-enrolled error supression
* feat: added check for enabled biometric
* fix: biometrics error handling on ios
* chore: remove touch-id library
* chore: cleanup
* removed proj.list dep
* fix: gradle get_projects regex edge-case
Handles cases when the gradle project has a description, which shows up when running `gradle projects` as (`react-native-biometrics` - react-native-biometrics), breaking `make nix-update-gradle`. Here we're just adjusting the regex to ignore everything in the line after the closing (`).
* build: ran "make nix-update-gradle"
* chore: comment typo
* chore: replaced old lib in test mocks
* fix: addressed review comments
* fix: using event for standard-auth biometrics
* ref: using ex-cause for biometric error codes
* fix: removed promesa changes
* fix: auth slide biometric success not triggered
* feat: get revealed accounts for joined community
Signed-off-by: yqrashawn <namy.19@gmail.com>
* Show token requirements only when membership permissions are present.
- Add membership-permissions? to community state.
* feat: show highest permission role in overview and req to join
Signed-off-by: yqrashawn <namy.19@gmail.com>
* feat: get highest perm role in addr for perms
Signed-off-by: yqrashawn <namy.19@gmail.com>
* feat: ui for address for perm drawer
* test: unit test and spec for handle-community
Signed-off-by: yqrashawn <namy.19@gmail.com>
* fix: for #18581
* refactor: based on PR feedback
- move <-rpc to data store
- `role->translation-key`
- highest-permission-role-text -> highest-role-text
- filter out nils for handle community test
Signed-off-by: yqrashawn <namy.19@gmail.com>
---------
Signed-off-by: yqrashawn <namy.19@gmail.com>
Co-authored-by: Ajay Sivan <ajayesivan@gmail.com>
## Summary
I introduced `xcbeautify` inside `make run-ios` command which would sometimes skip spitting crucial logs to the terminal.
In cases where the `react-native-cli` would prompt me of a port being used by another metro server, those prompts would also never reach me since they were piped into `xcbeautify` essentially giving me the impression that `make run-ios` is still doing something when it was actually hung.
This is how `react-native-community/cli` looks for `xcbeautify` ->
https://github.com/react-native-community/cli/blob/main/packages/cli-platform-apple/src/commands/buildCommand/buildProject.ts#L139
This commit fixes the problem by exporting an env variable making `react-native-cli` aware that we have `xcbeautify` installed and this way we now get the full log output we were used to.
This commit adds
- RPC call for start wallet which will signal the client to refresh data (tokens, prices, ...etc) every 10 minutes
- Refreshes tokens and prices every 10 minutes on receiving the "wallet-tick-reload" signal
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit:
- Adds a filter to remove tokens with no name or symbol to prevent displaying tokens with no data
- Adds a fallback value (zero) for token fiat value calculation and to prevent crash on token price calculation
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
fix: composer space when expanding after re-entering
fix: composer bottom shadow and maximized state atom
fix: removing composer bottom gradient style changes
Here we remove `yarn install` from `make component-test` and `make component-test-watch` commands.
We also fix an extra `@` present ahead of `@scripts/check-metro-shadow-process.sh` inside `component-test-watch` command.
### Summary
We need to bump `kotlin` Plugin version to `1.9.0` because the `nixpkgs` upgrade will set default `gradle` version to `8.4`.
`gradle` version `8.4` comes with a base `kotlin` version of `1.9.0` which becomes incompatible with our existing version of `1.7`
Otherwise we get errors like this :
```
e: /Users/siddarthkumar/code/experiments/status-mobile/node_modules/@react-native/
gradle-plugin/src/main/kotlin/com/facebook/react/utils/TaskUtils.kt: (25, 7): Class
'kotlin.collections.CollectionsKt__CollectionsKt' was compiled with an incompatible version of Kotlin.
The binary version of its metadata is 1.9.0, expected version is 1.7.1.
The class is loaded from /nix/store/3a228ppiiljfvsrxyq15h25chmiwsmbh-gradle-8.4/lib/gradle/lib/
kotlin-stdlib-1.9.10.jar!/kotlin/collections/CollectionsKt__CollectionsKt.class
.
.
.
```
needed for https://github.com/status-im/status-mobile/pull/18321
In this commit we set `kotlinPluginVersion` to `1.9.0` and update `gradle` dependencies.
#### Platforms
- Android
The native module : `react-native-status` has always been 1 big fat file per platform which contained all of the native modules.
In case of Android it was `StatusModule.java`
This commit modularises it & attempts to thin out this 1 big file into these categories:
- `AccountManager.java`
- `EncryptionUtils.java`
- `DatabaseManager.java`
- `UIHelper.java`
- `LogManager.java`
- `NetworkManager.java`
- `Utils.java`
In case of iOS it was `RCTStatus.m`
This commit modularises it & attempts to thin out this 1 big file into these categories:
- `AccountManager.m`
- `EncryptionUtils.m`
- `DatabaseManager.m`
- `UIHelper.m`
- `LogManager.m`
- `NetworkManager.m`
- `Utils.m`
In this commit we also remove a lot of unused native code which has no reference on cljs side.
* Show collectibles to send and add filter capabilities
Additionally,
* Replace the sub `:wallet/collectibles-per-account` by `:wallet/current-viewing-account-collectibles` since
it was only used for the current viewing account and simplified the code.
* Refactor the select-asset view.
* Generalize collectibles-tab view
* Add translations for "not found" state
### Summary
Metro server often crashes with
```
status-mobile/node_modules/nullthrows/nullthrows.js:9
throw error;
^
Error: Got unexpected null
```
This commit resolves metro to a commit where this specific issue was fixed.
related PR in metro repo : https://github.com/facebook/metro/pull/1083
Fix our issues with auto-generated clj-kondo config files.
- To be extra precise, we now exclude ".clj-kondo/*" from being processed by
clojure-lsp clean-ns.
- Formatted the .zprintrc file.
Fixes https://github.com/status-im/status-mobile/issues/17947
`getEnvWithDefault.nix` prints a trace message in console when a default value is not set.
In this commit we add a check to see if default value matches the value of that env var.
Otherwise we get log messages like these when running `make run-ios`
```
trace: getEnvWithDefault IOS_STATUS_GO_TARGETS
(default: ios/arm64;iossimulator/amd64): ios/arm64;iossimulator/amd64
trace: getEnvWithDefault IOS_STATUS_GO_TARGETS
(default: ios/arm64;iossimulator/amd64): ios/arm64;iossimulator/amd64
```
We also fix a tiny mistake in `make run-ios` status-go target by updating the delimiter to be a semi-colon instead of a comma.
* Modify reanimated/view to support vectors contained in styles
* Add code examples of animated inline styles
Additionally,
* Fix warning about reactive deref not supported in lazy-seqs
In this commit we build iOS `status-go` for both targets `amd64` and for `arm64` otherwise we get random failures when running `make run-ios`.
Maybe this was an impact of Xcode Upgrade Or RN Upgrade or MacOS Upgrade, it is not clear at the moment.
This will increase the time it took for iOS to be built locally, but it is better to be slow rather than have random build failures.
This commit:
- Introduces new event ":wallet/initialize" to group events that need to be called on login
- Refactors wallet networks to use the nested structure in re-frame
- Fixes a bug when updating the testnet network preferences of an account the production network preferences update
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* feat: added biometrics setting to new-settings
* fix: fix renaming issues from status-im2
* ref: addressed @cammellos' review comments
* fix: open password settings in a modal
* ref: addressed review comments
* fix: disabling biometric clears auth-method from keychain
* chore: quo/overlay seqs the childrend so need to add keys
* fix: don't pass the password unmasked between events to avoid leaks
I tried doing a clean pod install and was faced with this :
```
Installing Yoga (1.14.0)
Installing boost (1.76.0)
[!] Error installing boost
Verification checksum was incorrect, expected
f0397ba6e982c4450f27bf32a2a83292aba035b827a5623a14636ea583318c41, got
5e89103d9b70bba5c91a794126b169cb67654be2051f90cf7c22ba6893ede0ff
```
related issue in react-native repo : https://github.com/facebook/react-native/issues/42180
In this commit we patch the pod specs provided by react native to rely on `sourceforge` instead `jfrog` to get boost.
- make test still exists, so if you have been using it, as well as make
test-watch, they should all work exactly the same.
- [Changed] As part of the check stage, Jenkins will run Lint and Unit Tests
in parallel. Integration Tests run later because running them at the same
time as Unit Tests caused errors.
- [Added] "make unit-test" and "make unit-test-watch" run unit tests only.
Watching all unit tests is faster now because we ignore integration tests and
we only compile shadow-cljs :mock target once. We are at approximately 10-15s
to re-run all unit tests after saving a watched file, depending on your
hardware. If you change mocks.js_dependencies.cljs, you must re-run the make
target.
- [Added] "make integration-test" and "make integration-test-watch" run
integration tests only. These are much slower than the unit tests.
Fixes https://github.com/status-im/status-mobile/issues/18112
* fix: generate_profile_url.cljs$core$IFn$_invoke$arity$2 crash when login
'status_im.common.universal_links.generate_profile_url.cljs$core$IFn$_invoke$arity$2' is undefined
update the function to a fixed arity function
* fix: schema/=> macro for :function schema
Signed-off-by: yqrashawn <namy.19@gmail.com>
---------
Signed-off-by: yqrashawn <namy.19@gmail.com>
* Update wallet events and subs to handle collectibles per account
Additionally,
- Move collectibles related events to a new events namespace (`status-im.contexts.wallet.events.collectibles`).
- Update tests to consider collectibles per account.
* Update collectibles tab to handle a current viewing account
This commit converts
`android/app/src/main/java/im/status/ethereum/StatusOkHttpClientFactory.java` to
`android/app/src/main/java/im/status/ethereum/StatusOkHttpClientFactory.kt`
This commit is a pre-requisite to upgrading `react-native` to `0.73.x`, now that react-native has completely moved their android code over from `Java` to `Kotlin` , it is also necessary for us to begin doing the same.
This commit converts just 2 files which are important at the moment.
- `android/app/src/main/java/im/status/ethereum/MainActivity.java`
- `android/app/src/main/java/im/status/ethereum/MainApplication.java`
I will can convert the remaining files in follow ups.
Fix all component tests after the latest RN upgrade.
Fixes https://github.com/status-im/status-mobile/issues/18157
Closes https://github.com/status-im/status-mobile/pull/18235
Dependency changes
- Upgraded Jest: from 26.6.3 to latest 29.7.0.
- Upgraded @testing-library/jest-native: from 5.3.0 to latest 5.4.3
- Upgraded @testing-library/react-native: from 11.5.4 to 12.4.2
- Removed explicit dependency on jest-circus, this is now the default test
runner.
- Removed explicit dependency on jest-environment-node. This is handled by the
package manager.
- Added jest-silent-reporter at version 0.5.0.
### Why component tests were failing?
Many tests were failing because we were using RN Testing Library (RNTL) in an
unreliable fashion. With the recent library upgrades, the unreliability was
excerbated. Other times, the tests were incorrectly arranging data.
### with-redefs does not work with async code
Generally speaking, with-redefs should not be used with async code, assume the
worst. The scope of the macro will cease to exist by the time the async code
runs. In many tests we were using with-redefs, then calling render, but for some
components that use use-effect, JS timers, animations, etc it's unreliable and
were the reason for failures.
It's easy to reproduce too:
```clojure
(defn foo []
:foo)
(foo)
;; => :foo
(with-redefs [foo (constantly :bar)]
(foo))
;; => :bar
(js/setTimeout
(fn []
(tap> [:calling-foo (foo)]))
100)
;; Taps [:calling-foo :foo]
;; As you would expect, when running without with-redefs, it prints :foo.
;; So far so good, but whatch what happens with async code:
(with-redefs [foo (constantly :bar)]
(js/setTimeout
(fn []
(tap> [:calling-foo (foo)]))
100))
;; Taps [:calling-foo :foo]
;; ====> PROBLEM: Taps :foo, not :bar as one might expect
```
### Not waiting on wait-for
When test-helpers.component/wait-for is used, subsequent assertions/etc should
be done after the promise returned by wait-for is resolved. But remember to not
perform side-effects inside the wait-for callback (check out the docs
https://callstack.github.io/react-native-testing-library/docs/api#waitfor).
Most, if not all of our usages of wait-for were not waiting.
#### Improvement 1 - Silence Jest on demand
If you need to re-run component tests frequently, you may want to reduce the
output verbosity. By passing JEST_USE_SILENT_REPORTER=true to make
component-test or make component-test-watch you will see a lot less noise and be
able to focus on what really matters to you.
#### Improvement 2 - Selectively focus/disable tests
Because of our need to first compile CLJS to JS before running tests via Jest,
we couldn't easily skip or focus on specific tests. From this commit onwards, we
should never again have to change the list of requires in files core_spec.cljs.
Commenting out required namespaces gives a bad DX because it causes constant
rebasing issues.
#### Improvement 3 - Translations now work as in prod code (but only English)
Translations performed by *-by-translation-text can be done now without any
workaround under the hood. The query functions are now linted just like
i18n/label, which means static translation keywords must be qualified with :t/,
which is good for consistency.
I can't remember the number of times I have had to ask developers to run `make run-ios | xcbeautify` when debugging iOS build failures and they do not have `xcbeautify` installed on their environment.
`xcbeautify` helps make `xcodebuild` output more readable and to identify problems quickly.
This commit adds `xcbeautify` to iOS shell and to `make run-ios` so that we get readable output by default.
This commit:
- Updates the "skeleton-list" component to support the "assets" type
- Adds the assets skeleton to the assets tab in the wallet home and account screen
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This PR does a few things:
1) Add fetch messages implementation on any kind of chat. It's behind a
toggle (on by default) as design is still unsure whether we want it,
but it's very useful for debugging.
2) Allow setting light client from mobile
It also partially remove node config management from the clojure part,
as it's better if that's not explicitly managed by clients.
Some parts are still relying on it but they are not functional
(keycard), while others are still using it and will need to be updated
eventually (syncing), in order to get rid completely of node config.
Sets fleet to shards.test
https://github.com/status-im/status-go/compare/90c31afe...1adcf02f
The existing purge script for Darwin would fail and stop at many stages.
This commit makes the script more robust to certain failures that were observed and documented in https://github.com/status-im/status-mobile/issues/16404
This commit:
- Updates the account switcher in the "page-nav" component to use "account-avatar" instead of "dropdown"
- Updates the account avatar (on the top right corner of the account screen) to display the watched account variant correctly
- Updates the accounts list in the account switcher to display the correct background for the watched account with the eye icon
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
`react-native-reanimated` generates write protected files during build time which are problematic because we copy over `node_modules` from `nix` store and when replacing them with new node modules we are manually asked to confirm this overwrite.
This used to happen before with `.cxx` files but now it also happens with `.so` files.
This commit fixes those permissions.
partially fixes#18211
The metro terminal no longer needs to have `android` target anymore.
I had to do this in https://github.com/status-im/status-mobile/pull/17241
This commit sets the target of metro terminal back to `clojure`.
I tested building `android` and `iOS` on my MacOS and on my linux machines and found no side effect.
Now metro terminal is fast again.
This commit:
- adds support for different currencies in token price calculation in the new wallet UI.
- fixes the token units and prices displayed in the individual account screen
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* fix: chat header position when only a few messages
* fix: system_message add contact icon margin
* fix: fixed last grouped message vertical padding
* fix: show message user info on long press of grouped message
* feat: added mute button to chat's channel-actions
* fix: no custom color in message list background
* fix: composer placeholder color (light theme)
* draft: fix android initial chat position
* fix: scrolling chat to top changed content size
* fix: chat message list header animation and behavior
* fix: android initial chat state
* fix: adjusted the chat avatar animation position
* fix: chat content change with keyboard visible
* ref: small refactor and added some notes
* fix: removed broken require
* fix: mute label for channel chat
* fix: merge conflict fixes
This commit:
- adds another variant ("Select account" bottom sheet) of the account switcher for wallet - send flow
- adds watch-only? key in the account to prevent repetitive account type checks across the codebase
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit does many things :
- Upgrade `react-native ` to `0.72.5`
- Upgrade `react-native-reanimated` to `3.5.4`
- Upgrade `react-native-navigation` to `7.37.0`
- `ndkVersion` has been bumped to `25.2.9519653`
- `cmakeVersion` has been bumped to `3.22.1`
- `kotlinVersion` has been bumped to `1.7.22`
- `AGP` has been bumped to `7.4.2`
- `Gradle` has been upgraded to `8.0.1`
- Android `CompileSDK` and `TargetSDK` have been bumped to 33
- `@react-native-async-storage/async-storage` has been upgraded to `1.19.3`
- `@walletconnect/client` has been nuked
- some of the old `react-native-reanimated` code has been nuked
- `react-native-keychain` fork has been replaced with `8.1.2`
- On Android we are currently relying on `Hermes` Engine.
- On iOS we are currently relying on `JSC`
- We are not enabling new architecture for now (I have plans for that in the future) ref: https://github.com/status-im/status-mobile/issues/18138
IOS only PR : https://github.com/status-im/status-mobile/pull/16721
Android only PR : https://github.com/status-im/status-mobile/pull/17062
- `make run-metro` now has a target of `android` which was `clojure` earlier, this will increase the time it takes to start metro terminal but this is needed otherwise you will get a nasty error while developing for android locally.
* Create token component
* Replace token images by new token component
The new component is being used in the following components:
- token-input
- network-amount
- token-tag
- summary-tag
- context-tag
- token-value
- token-network
- preview-list
* Rename token image file: eth-token -> eth
* Remove resources/get-token function
* Add `utils.money/add` version able to work with `nil`s
* Store token raw-balance as big-number
* Improve account balance calculations using `utils.money` existing functions
* Update `:wallet/tokens-filtered` sub
* Make `prettify-balance` able to work with bignumbers
* Move docstring to be available while using `colors/resolve-color`
* Add text combinations - username component and tests
* Add username related svg icons
After upgrading MacOS to Sonoma and Xcode to 15, pod install stage would fail with clang errors.
Turns out that react-native's configure glog script sets 2 additional flags, CC and CXX which conflicts with flags already set in nix iOS shell.
In this commit we :
- bump clang from 10.0.0 to 15.0.7
- patch glog configure script to avoid setting those flags
This fixes the iOS builds.
Problem: failed equality checks as in "(is (= expected actual))" will give a
single, long line of output that for anything but the simplest data structures
is unreadable by humans, and the output doesn't give a useful diff.
Solution: use library https://github.com/nubank/matcher-combinators and its test
directive "match?" which will pinpoint where two data structures differ. Then,
instead of "(is (= ...", use "(is (match? expected actual)". It works
beautifully.
The library offers other nice matchers, but the majority of the time match? is
sufficient.
Can we use another test runner like Kaocha? kaocha-cljs2
(https://github.com/lambdaisland/kaocha-cljs2) would be able to print better
test errors out of the box, among other features, but I have no clue if it would
work well or at all in our stack (in theory yes, but it's a larger piece of
work).
* update scan qr code page
* update scan qr code page
* fixed: populate the search input with new identity
* dismiss keyboard when scan qr page is activated
This commit:
- Implements the Wallet Account Switcher for easy switching between wallet accounts
- Updates the About tab in the accounts screen to display the correct account address and derivation path along with the profile.
- Updates the account-item component to pass the state from the parent and refactors the depreciated color functions
- Moves the handle-bar in the bottom sheet to a standalone component
- Adds customization-color in account-origin component
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit removes the restriction of uploading iOS release builds to Diawi
Its helpful to have the status app uploaded to Diawi to test release builds on our iPhones.
The installer is very straightforward and makes life easier when we want to try out release builds.
This commit is the foundational step to start using malli
(https://github.com/metosin/malli) in this project.
Take in consideration we will only be able to realize malli's full power in
future iterations.
For those without context: the mobile team watched a presentation about malli
and went through a light RFC to put everyone on the same page, among other
discussions here and there in PRs.
To keep things relatively short:
1. Unit, integration and component tests will short-circuit (fail) when
inputs/outputs don't conform to their respective function schemas (CI should
fail too).
2. Failed schema checks will not block the app from initializing, nor throw an
exception that would trigger the LogBox. Exceptions are only thrown in the
scope of automated tests.
3. There's zero performance impact in production code because we only
instrument. Instrumentation is removed from the compiled code due to the
usage of "^boolean js.goog/DEBUG".
4. We shouldn't expect any meaningful slowdown during development.
**What are we instrumenting in this PR?**
Per our team's agreement, we're only instrumenting the bare minimum to showcase 2 examples.
- Instrument a utility function utils.money/format-amount using the macro
approach.
- Instrument a quo component quo.components.counter.step.view/view using the
functional approach.
Both approaches are useful, the functional approach is powerful and allow us to
instrument anonymous functions, like the ones we pass to subscriptions or event
handlers, or the higher-order function quo.theme/with-theme. The macro approach
is perfect for functions already defined with defn.
**I evaluated the schema or function in the REPL but nothing changes**
- If you evaluate the source function, you need to evaluate schema/=> or
schema/instrument as well.
- Remember to *var quote* when using schema/instrument.
- You must call "(status-im2.setup.schema/setup!)" after any var is
re-instrumented. It's advisable to add a keybinding in your editor to send
this expression automatically to the CLJS REPL, or add the call at the end of
the namespace you are working on (similar to how some devs add "(run-tests)"
at the end of test namespaces).
**Where should schemas be defined?**
For the moment, we should focus on instrumenting quo components, so define each
function schema in the same namespace as the component's public "view" var.
To be specific:
- A schema used only to instrument a single function and not used elsewhere,
like a quo component schema, wouldn't benefit from being defined in a separate
namespace because that would force the developer to constantly open two files
instead of one to check function signatures.
- A common schema reused across the repo, like ":schema.common/theme" should be
registered in the global registry "schema.registry" so that consumers can just
refer to it by keyword, as if it was a built-in malli schema.
- A common schema describing status-go entities like message, notification,
community, etc can be stored either in the respective
"src/status_im2/contexts/*" or registered globally, or even somewhere else.
This is yet to be defined, but since I chose not to include schemas for them,
we can postpone this guideline.
* fix: composer height when entering and canceling edit
* fix: blur the composer input when canceling edit
* fix: focusing animation and composer height after blur
* fix: input height when canceling edit while unfocused
* ref: removed arbitrary keyboard check
* fix: moved edit-mentions logic to use-edit to fix unresolved mention
* fix: composer edit should put the cursor at the end
* fix: (potentially) fixing the mention not resolved during edit
* fix: emoji-kb handler changing the height when default kb appears
* Fix text content when editing and reentering chat
* prevent composer when focusing on opening chat with edit/reply
* clean
* Clauxx comments
* Apply for reply
* Lintil soup = yummy
* refactor variable name
* Extract the focusing logic from the data setting logic
* Edge case
* fix: composer mention key & edit re-enter issues
* fix: reply cancel input blur and smooth reply focus
---------
Co-authored-by: Ibrkhalil <vampirekid017@gmail.com>
Fixes the bug by explicitly passing all available addresses to be revealed
to wakuext_requestToJoinCommunity and picking up the first available address
as the airdrop address. This is a temporary solution while we work on the
feature to allow users to choose which addresses to expose.
Fixes https://github.com/status-im/status-mobile/issues/17861
*Areas that may be impacted*: join community flows.
----------------------------------------------------------------------
Community "Request to join" option is enabled.
User holds more than X ETH.
Anyone who holds <X> ETH is allowed to Become member in <COMMUNITY>.
Expected: request to join is received by desktop client and accepted,
mobile user joins the community.
----------------------------------------------------------------------
----------------------------------------------------------------------
Community "Request to join" option is enabled.
User holds less than X ETH.
Anyone who holds <X> ETH is allowed to View and post in <CHANNEL>.
Expected: request to join is received by desktop client and accepted, mobile
user joins the community, but can't post in <CHANNEL>.
----------------------------------------------------------------------
----------------------------------------------------------------------
Community "Request to join" option is enabled.
No token permissions.
Expected: request to join is received by desktop client and accepted,
mobile user joins the community.
----------------------------------------------------------------------
* Refactor edit-account view and events:
- Fix `(fn [])` code style.
- Avoid overriding clojure.core/type by destructuring the `:type` key.
- Split the toast callback to a different function.
- `:wallet/save-account` receives `:on-success` instead of `:callback` to improve readability.
* Refactor app-db for `:wallet/tokens` & `:wallet/tokens-loading?`
- Remove the root sub `:wallet/tokens-loading?`, now it's in app-db in `[:wallet :ui :tokens-loading?]`.
- Remove the root subs `:wallet/tokens`, now the value is returned along with the account data by the sub
`:wallet/accounts`, it's stored in app-db in `[:wallet :address "0x..." :tokens]`.
- Fix the format of the token data returned by the endpoint `"wallet_getWalletToken"` and the fn `js->clj`,
- Addresses are no longer keywords (since keywords mustn't start with a number).
- Keys are now kebab-case.
- Chain-ids are no longer keywords, now they are integers.
- Update tests.
* Move logic to calculate `:wallet/balances` and change value returned
- Move logic to `status-im2.contexts.wallet.common.utils`
- The `:wallet/balances` value returned by the sub had the following structure:
[{:address "0x1...", :balance 12345}
{:address "0x2...", :balance 67890} ...]
This required a helper function to get the balance for an address (`get-balance-by-address`)
It has been changed to a map:
{"0x1..." 12345
"0x2..." 67890, ...}
So now we don't need a helper function (just the hashmap itself or `clojure.core/get`).
- Because of the previous change, now the `get-balance-by-address` has been removed.
- The function `get-account-by-address` has zero uses, so it has been removed.
- The test for the sub has been updated.
* Create sub `:wallet/account-cards-data`
This sub returns a vector of maps to render the account cards in the wallet page.
This logic was previously in the `view` namespace, but it was completely calculated from
the subs `:wallet/accounts`, `:wallet/balances` and `:wallet/tokens-loading?`, so it was
clear that's a derived value.
We get these 2 files auto generated locally as part of make lint-fix
`.clj-kondo/taoensso/encore/config.edn`
`.clj-kondo/taoensso/encore/taoensso/encore.clj`
We don't need them checked in its fine if they're ignored.
This commit adds these folders to `.gitIgnore`
- `.clj-kondo/taoensso/`
- `.clj-kondo/babashka/`
- Fix: when there are only channel token permissions, don't show the text "You
hold 0 of these:" because there are no requirements to show.
- Fix: do not show channel token permissions when the user wants to join a
community. In other words: only "become admin", "become member", "become token
master", and "become token owner" are taken in consideration.
- Fix: render correct channel lock icon in 3 states (no permission, with
permissions and locked and with permissions and unlocked).
- Fix: Previously, before having joined a community, all channels had a lock
icon closed, now the lock icon is only closed when there's a permission set,
otherwise no icon is shown (the lock is never open before the user joins the
community).
- Fix: small UI spacing fix, only display community tags component when there's
at least one tag.
- Bonus fix: community Overview and Discover screens top bar had a regression,
see the screenshots.
Fixes https://github.com/status-im/status-mobile/issues/17267
### Areas that may be impacted
- Community overview, before and after joining a community.
### Steps to test
Code tested using the Goerli network and with the testnet flag enabled in the
Desktop client. Out of scope: minted tokens.
This commit moves the emoji categories selector height from the "showcase-nav" component to the "emoji-picker" as we should not use any "quo" ns (except "quo.core") inside the "status-im2" ns.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit updates the following:
- Allow users to create new wallet accounts without having to re-login (latest account data is fetched immediately)
- Updates the max length of the wallet account name to 20
- Updates the account cards in the wallet home screen to render the actual account colour
- Updates the (individual) account screen to show the correct color, emoji, name and address
- Allows users to edit account name, colour and emoji
- The rest of the wallet screens would see the updated account information immediately
- Fixes the color (uses profile color) of the context tag and button color in the authentication (enter password) bottom sheet
- Fixes the overflowing of the "+" card in the wallet home when there are two or more accounts.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Add account creation screen
remove icons
remove extra utility and create a new one that would use conventional way of getting an emoji
fix lint
Use button component instead of bottom-actions
Provide global customization color to buttons
Use conventional approach to extract account name
Move to another address
Move to another namespace
Refactor bottom-actions to have button props in maps
Update doc with new icon location
Add spaces between styles
Work on pr comments
Use :on-change-text instead of :on-change for input component
Subscribe to :profile/customization-color directly
Use bottom button from the create-or-edit-account wrapper
Remove extra code
Sort requires
Move ns to proper fileˆ
Fix styles
The design team has now decided to keep iPhone 13 as the baseline standard instead of iPhone 11 Pro.
This commit updates the docs on pixel perfection and starting guide.
We also update the default simulator to iPhone 13 for `make run-ios`
This commit updates the following in the selectors component:
- Introduces the "type" prop (Figma 1-1 property) to the selectors component for easy switching between the selector types while using it on lists.
- Updates the component styles to use the "resolve-color" function as the "custom-color" function is deprecated
- Updates the component usage across the codebase
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Fix the unreliable swipe behavior of link previews in the chat composer. In many
occasions, we noticed the horizontal scroll wasn't being triggered properly or
not at all. In other occasions, the swipe gesture would incorrectly register a
press on the parent `Touchable` component.
Fixes https://github.com/status-im/status-mobile/issues/16599
fix: improving UI and gestures
fix: expanding on press now works reliably
fix: center text and disable gestures for short messages
feat: added styling for one-lined messages
fix: small opacity fix
ref: small condition change
fix: horizontal swiping being unreliable with vertical scrolling
ref: reusing shared value from lightbox animations
fix: text-sheet bottom gradient not visible on android
fix: addressed qa issues 1,2,4
fix: zoomable-image stuck if moved vertically when full screen
clean: removed unused var
chore: removed unused require
fix: don't allow returning text-sheet down and up in one move
fix: text-sheet bar styling was wrong
fix: adjusted gradient animation with designs
fix: text-sheet bar opacity
* Align docstring
* Create share-qr-code component
* Remove empty style file
* Implement common.share-qr-code including call to media server
* Add share-qr-code preview screen
* Use share-qr-code component in shell's share screen
* Add tests and some fixes
* feat: debug/show components from the REPL
* ref: some renames and cleanup
* chore: removed comments/imports
* feat: added remount on every eval & small changes
* doc: added tip to debugging doc
* doc: formatting
* doc: more formatting
* fix: fixed docs and other review comments
* fix: moved & renamed into the dev.component-preview ns
* style: adjusted debugging readme spacing
* fix: removed trailing line
Many times devs run
`make component-test` or `make component-test-watch` when there is already a metro or clojure terminal running on their system.
This causes weird behaviour and it is advised to not run these commands together.
This commit prevents that and shows a warning.
Document how a VSCode user can configure their editor to auto-format
Clojure(Script) files that respect all the formatter (zprint) settings specified
in status-mobile/.zprintrc.
The result should be that on every file save, the file should be identically
formatted as if you used make lint-fix, at least the part about zprint. If
lint-fix does other things now or in the future that are outside the scope of
zprint, those won't be covered by the VSCode extension.
Upgrades and cleans up all production Clojure dependencies and 1 dev-only
dependency (com.taoensso/tufte).
- Remove warning "WARNING: update-keys already refers to:
#'clojure.core/update-keys in namespace: io.aviso.exception"
- Remove hickory and mvxcvi/alphabase dependencies they are not used.
- Upgrade com.taoensso/tufte from 2.1.0 to 2.6.3
- Upgrade transit-cljs from 0.8.248 to 0.8.280
- Upgrade cljs-bean from 1.3.0 to 1.9.0
- Remove workaround for com.taoensso/timbre in shadow-cljs.edn
- Upgrade com.taoensso/timbre from 4.10 (Status fork) to 6.3.1
This commit
- Adds the base Screen base for the Create/Edit Account/Address
- Adds the Wallet Edit Account screen
- Adds the gradient in the account options bottom sheet
- Adds a new key/prop "right-icon" in the data-item component to prevent overlapping with the icon used in the description and updates its usage.
- Updates the "section-label" component to receive "container-style" (this will prevent adding a wrapping view in the screens)
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
We've often seen cases of devs attempting to change dependencies outside a nix-shell and run into weird side effects
This commit stops them from :
- updating pods outside a nix shell
- updating node deps outside a nix shell
This commit also cleanup unused scripts in package.json and adds a fake comment script.
Since the `default` shell doesn't have Ruby, the `nix-update-gems`
target would incorrectly use the system Ruby instead of the one from Nix.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Adapt the JSON RPC response to the new shape returned by `wakuext_unfurlURLs` on
v0.170.0. The changes were introduced PR
https://github.com/status-im/status-go/pull/4033. There are no behavioral
changes in the API as far as mobile is concerned at the moment.
Clojure dependencies require only JARs to work. Downloading POMs is both
a waste of time, space, and bandwidth. In addition POMs create edge
cases that we would have to handle, an would rather avoid.
For example, the `guice` package which shows up in the classpath
includes a JAR named `guice-4.2.2-no_aop.jar`. The issue with that is
that there is no corresponding POM in the directory:
https://repo1.maven.org/maven2/com/google/inject/guice/4.2.2/
Either we have to make a special case for such packages, or we can just
skip POMs entirely and avoid the mess.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
This commit adds a custom linter to verify i18n/label is called with a qualified
keyword, like :t/foo. More sophisticated linters are possible too.
We also set the stage for other developers to consider more lint automation
instead of manually reviewing conventions in PRs.
If you want to understand how to write custom linters, check out
https://github.com/clj-kondo/clj-kondo/blob/master/doc/hooks.md. You can fire
the Clojure JVM REPL in status-mobile and play with the clj-kondo hook too, it
works beautifully.
Why do we care? By making sure all translation keywords are qualified with "t",
it is trivial to grep or replace them because they're unique in the repo, and
can't be confused with other words if you search by ":t/<something>".
Note: It's a best practice to commit clj-kondo configuration from external
libraries in the .clj-kondo directory. The directory .clj-kondo/babashka is
auto-generated, that's why it was added.
This commit fixes the following issues in the bottom sheet:
- the sheet is cut off at the bottom in the shell (dark blur) theme (the drawers in the onboarding/login flow)
- the incorrect background in the shell (dark blur) theme (the drawers in the onboarding/login flow)
Bug
- the spacing at the bottom is doubled
- the gradient cover is not shown in the bottom sheet
- the spacing between the selected item and the bottom sheet
- the bottom sheet type in "Create Profile" and "Activity Center" screens
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* Rename wallet-user-avatar's `:color` prop to `:customization-color`
* Refactor QR code component and implement all variants
- Improve preview screen
* Update QR code usages
* Remove `status-im2.common.qr-code-viewer.view/qr-code-view` component
to keep only one implementation.
* Remove the node dependency:
"qrcode": "^1.4.1"
This commit fixes the "X" mark in the clear icon displayed in inputs and URL preview components by updating the props for "svg-icon" to add the "color" and "color-2" keys only if it's present and valid.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit shows how to move away from rf/defn
https://github.com/status-im/status-mobile/blob/f12c7401d167d7adb81f97bdf9c0902b39ee37bc/src/utils/re_frame.clj#L1-L90
& rf/merge
https://github.com/status-im/status-mobile/blob/f12c7401d167d7adb81f97bdf9c0902b39ee37bc/src/utils/re_frame.cljs#L39-L85
and why we should do it.
## Problems
Before jumping to solutions, let's understand the problems first, in no order of
importance.
### Problem 1: Cyclic dependencies
If you ever tried to move event handlers or the functions used inside them to
different files in status-mobile, you probably stumbled in cyclic dependency
errors.
When an event is registered in re-frame, it is globally available for any other
place to dispatch. The dispatch mechanism relies on globally unique keywords,
the so called event IDs, e.g. :chat/mute-successfully. This means that event
namespaces don't need to require other event namespaces, just like you don't
need to require subscription namespaces in views.
rf/merge increases the likelihood of cyclic dependencies because they force
event namespaces to require each other. Although not as common, this happened a
few times with devs in the team and it can be a big hassle to fix if you are
unlucky. It is a problem we should not have in the first place (at least not as
easily).
### Problem 2: We are not linting thousands of lines of code
The linter (clj-kondo) is incapable of understanding the rf/defn macro. In
theory, we could teach clj-kondo what the macro produces. I tried this, but gave
up after a few tries.
This is a big deal, clj-kondo can catch many issues and will continue to catch
more as it continue to evolve. It's hard to precisely count how many lines are
affected, but `find src/ -type f -name 'events.cljs' -exec wc -l {} +` gives us
more than 4k LOC.
### Problem 3: Blocking RN's UI thread for too long
Re-frame has a routing mechanism to manage events. When an event is dispatched,
it is enqueued and scheduled to run some time later (very soon). This process is
asynchronous and is optimized in such a way as to balance responsiveness vs the
time to empty the queue.
>[...] when processing events, one after the other, do ALL the currently queued
>events. Don't stop. Don't yield to the browser. Hog that CPU.
>
>[...] but if any new events are dispatched during this cycle of processing,
>don't do them immediately. Leave them queued.
>
>-- https://github.com/day8/re-frame/blob/master/src/re_frame/router.cljc#L8-L60
Decisions were made (way back in 2017) to reduce the number of registered
re-frame events and, more importantly, to coalesce events into bigger ones with
the rf/merge pattern. I tried to find evidence of real problems that were trying
to be solved, but my understanding is that decisions were largely based on
personal architectural preferences.
Fast-forward to 2023, and we are in a situation where we have many heavy events
that process a LOT of stuff in one go using rf/merge, thus blocking the UI
thread longer than we should. See, for example,
[status-im2.contexts.profile.login.events/login-existing-profile](https://github.com/status-im/status-mobile/blob/3082605d1e9897da1b1784588aa22fdc65c84823/src/status_im2/contexts/profile/login/events.cljs#L69),
[status-im2.contexts.profile.login.events/get-chats-callback](https://github.com/status-im/status-mobile/blob/3082605d1e9897da1b1784588aa22fdc65c84823/src/status_im2/contexts/profile/login/events.cljs#L98),
and many others.
The following excerpt was generally used to justify the idea that coalescing
events would make the app perform better.
> We will reduce the the amount of subscription re-computations, as for each
> distinct action, :db effect will be produced and swapped into app-db only once
>
> -- https://github.com/status-im/swarms/issues/31#issuecomment-346345981
This is in fact incorrect. Re-frame, ever since 2015 (so before the original
discussions in 2017) uses a concept of batching to process events, which means
subscriptions won't re-run after every dispatched event, and thus components
won't re-render either. Re-frame is smarter than that.
> groups of events queued up will be handled in a batch, one after the other,
> without yielding to the browser (previously re-frame yielded to the browser
> before every single event).
>
> -- https://github.com/day8/re-frame/blob/39adca93673f334dc751ee2d99d340b51a9cc6db/docs/releases/2015.md#050--2015-11-5
Here's a practical example you can try in a shadow-cljs :mobile REPL to see the
batching behavior in practice.
```clojure
;; A dummy event that toggles between DEBUG and INFO levels.
(re-frame/reg-event-fx :dummy-event
(fn [{:keys [db]}]
{:db (update-in db
[:profile/profile :log-level]
(fn [level]
(if (= "DEBUG" level)
"INFO"
"DEBUG")))}))
(def timer
(js/setInterval #(re-frame/dispatch [:dummy-event])
50))
;; 1. In component status-im.ui.screens.advanced-settings.views/advanced-settings,
;; add a print call to see when it's re-rendered by Reagent because the
;; subscription :log-level/current-log-level will be affected by our dummy event.
;;
;; 2. Also add a print call to the subscription :log-level/current-log-level to
;; see that the subscription does NOT re-run on every dispatch.
;; Remember to eval this expression to cancel the timer.
(js/clearInterval timer)
```
If you run the above timer with 50ms interval, you'll see a fair amount of
batching happening. You can infer that's the case because you'll see way less
than 20 print statements per second (so way less than 20 recomputations of the
subscription, which is the max theoretical limit).
When the interval is reduced even more, to say 10ms (to simulate lots of
dispatches in a row), sometimes you don't see a single recomputation in a 5s
window because re-frame is too busy processing events.
This shows just how critical it is to have event handlers finishing as soon as
possible to relinquish control back to the UI thread, otherwise responsiveness
is affected. It also shows that too many dispatches in a row can be bad, just as
big event handlers would block the batch for too long. You see here that
dispatching events in succession does NOT cause needless re-computations.
Of course there's an overhead of using re-frame.core/dispatch instead of calling
a Clojure function, but the trade-off is clearly documented: the more we
process in a single event, the less responsive the app may be because re-frame
won't be able to relinquish control back to the UI thread. The total time to
process the batch increases, but re-frame can't stop in the middle compared to
when different dispatches are used.
Thus, I believe this rf/merge pattern is harmful as a default practice in an
environment such as ours, where it's desirable end-users feel a snappy RN app. I
actually firmly believe we can improve the app's responsiveness by not
coalescing events by default. We're also preventing status-mobile from taking
the most advantage from future improvements in re-frame's scheduler. I can
totally see us experimenting with other algorithms in the scheduler to best fit
our needs. We should not blindly reduce the number of events as stated here
https://github.com/status-im/status-mobile/pull/2634#discussion_r155243127.
Solution: only coalesce events into one pile when it's strictly desirable to
atomically update the app db to avoid inconsistencies, otherwise, let the
re-frame scheduler do its job by using fx, not rf/merge. When needed, embrace
*eventual app db consistency* as a way to achieve lower UI latency, i.e. write
fast and short events, intentionally use :dispatch-later or other timing effects
to bend the re-frame's scheduler to your will.
There's another argument in favor of using something like rf/merge which I would
like to deconstruct. rf/merge gives us a way to reuse computations from
different events, which is nice. The thing here is that we don't need rf/merge
or re-frame to reuse functions across namespaces. rf/merge complects re-frame
with the need to reuse transformations.
Instead, the solution is as trivial as it gets, reuse app db "transformers"
across events by extracting the logic to data store namespaces
(src/status_im/data_store). This solution has the added benefit of not causing
cyclic dependency errors.
### Problem 4: Clojure's language server doesn't understand code under rf/defn
Nowadays, many (if not most) Clojure devs rely on the Clojure Language Server
https://github.com/clojure-lsp/clojure-lsp to be more effective. It is an
invaluable tool, but it doesn't work well with the macro rf/defn, and it's a
constant source of frustration when working in event namespaces. Renaming
symbols inside the macro don't work, finding references, jumping to local
bindings, etc.
Solution: don't use rf/defn, instead use re-frame's reg-event-fx function and
clojure-lsp will understand all the code inside event handlers.
### Problem 5: Unit tests for events need to "test the world"
Re-frame's author strongly recommends testing events that contain non-trivial
data transformations, and we do have many in status-mobile (note: let's not
confuse with integration tests in status_im/integration_test.cljs). That, and
non-trivial layer-3 subscriptions should be covered too. The reasoning is that
if we have a well developed and tested state layer, many UI bugs can be
prevented as the software evolves, since the UI is partially or greatly derived
from the global state. See re-frame: What to Test?
https://github.com/day8/re-frame/blob/39adca93673f334dc751ee2d99d340b51a9cc6db/docs/Testing.md#what-to-test.
See PR Introduce subscription tests
https://github.com/status-im/status-mobile/pull/14472, where I share more
details about re-frame's testing practices.
When we use rf/merge, we make unit testing events a perennial source of
frustration because too many responsibilities are aggregated in a single event.
Unfortunately, we don't have many devs in the team that attempted to write unit
tests for events to confirm my claim, but no worries, let's dive into a real
example.
In a unit test for an event, we want to test that, given a cofx and args, the
event handler returns the expected map of effects with the correct values
(usually db transformations).
Let's assume we need to test the following event. The code is still using the
combo rf/defn & rf/merge.
```clojure
(rf/defn accept-notification-success
{:events [:activity-center.notifications/accept-success]}
[{:keys [db] :as cofx} notification-id {:keys [chats]}]
(when-let [notification (get-notification db notification-id)]
(rf/merge cofx
(chat.events/ensure-chats (map data-store.chats/<-rpc chats))
(notifications-reconcile [(assoc notification :read true :accepted true)]))))
```
As you can see, we're "rf/merging" two other functions, namely ensure-chats and
notifications-reconcile. In fact, ensure-chats is not registered in re-frame,
but it's 99% defined as if it's one because it needs to be "mergeable" according
to the rules of rf/merge. Both of these "events" are quite complicated under the
hood and should be unit tested on their own.
Now here goes the unit test. Don't worry about the details, except for the expected output.
```clojure
(deftest accept-notification-success-test
(testing "marks notification as accepted and read, then reconciles"
(let [notif-1 {:id "0x1" :type types/private-group-chat}
notif-2 {:id "0x2" :type types/private-group-chat}
notif-2-accepted (assoc notif-2 :accepted true :read true)
cofx {:db {:activity-center {:filter {:type types/no-type :status :all}
:notifications [notif-2 notif-1]}}}
expected {:db {:activity-center {:filter {:type 0 :status :all}
:notifications [notif-2-accepted notif-1]}
:chats {}
:chats-home-list nil}
;; *** HERE ***
:dispatch-n [[:activity-center.notifications/fetch-unread-count]
[:activity-center.notifications/fetch-pending-contact-requests]]}
actual (events/accept-notification-success cofx (:id notif-2) nil)]
(is (= expected actual)))))
```
Notice the map has a :dispatch-n effect and other stuff inside of it that are
not the responsibility of the event under test to care about. This happens
because rf/merge forces the event handler to compute/call everything in one go.
And things get MUCH worse when you want to test an event A that uses rf/merge,
but A calls other events B and C that also use rf/merge (e.g. event
:profile.login/get-chats-callback). At that point you flip the table in horror
😱, but testing events and maintaining them should be trivial.
Solution: Use re-frame's `fx` effect.
Here's the improved implementation and its accompanying test.
```clojure
(defn accept-notification-success
[{:keys [db]} [notification-id {:keys [chats]}]]
(when-let [notification (get-notification db notification-id)]
(let [new-notifications [(assoc notification :read true :accepted true)]]
{:fx [[:dispatch [:chat/ensure-chats (map data-store.chats/<-rpc chats)]]
[:dispatch [:activity-center.notifications/reconcile new-notifications]]]})))
(re-frame/reg-event-fx :activity-center.notifications/accept-success accept-notification-success)
(deftest accept-notification-success-test
(testing "marks notification as accepted and read, then reconciles"
(let [notif-1 {:id "0x1" :type types/private-group-chat}
notif-2 {:id "0x2" :type types/private-group-chat}
notif-2-accepted (assoc notif-2 :accepted true :read true)
cofx {:db {:activity-center {:filter {:type types/no-type :status :all}
:notifications [notif-2 notif-1]}}}
;; *** HERE ***
expected {:fx [[:dispatch [:chat/ensure-chats []]]
[:dispatch [:activity-center.notifications/reconcile [notif-2-accepted]]]]}
actual (events/accept-notification-success cofx [(:id notif-2) nil])]
(is (= expected actual)))))
```
Notice how the test expectation is NOT verifying what other events do (it's
actually "impossible" now). Using fx completely decouples events and makes
testing them a joy again.
### Problem 6: Unordered effects
status-mobile still uses the legacy way to describe the effects map, which has
the problem that their order is unpredictable.
> Prior to v1.1.0, the answer is: no guarantees were provided about ordering.
> Actual order is an implementation detail upon which you should not rely.
>
> -- https://github.com/day8/re-frame/blob/39adca93673f334dc751ee2d99d340b51a9cc6db/docs/Effects.md#order-of-effects
> In fact, with v1.1.0 best practice changed to event handlers should only
> return two effects :db and :fx, in which case :db was always done first and
> then :fx, and within :fx the ordering is sequential. This new approach is more
> about making it easier to compose event handlers from many smaller functions,
> but more specificity around ordering was a consequence.
>
> -- https://github.com/day8/re-frame/blob/39adca93673f334dc751ee2d99d340b51a9cc6db/docs/Effects.md#order-of-effects
### Problem 7: Usage of deprecated effect dispatch-n
We have 35 usages, the majority in new code using dispatch-n, which has been
officially deprecated in favor of multiple dispatch tuples in fx. See
https://github.com/day8/re-frame/blob/39adca93673f334dc751ee2d99d340b51a9cc6db/docs/api-builtin-effects.md#L114
### Problem 8: Complexity 🧙♂️
Have you ever tried to understand and/or explain how rf/merge and rf/defn work?
They have their fare share of complexity and have tripped up many contributors.
This is not ideal if we want to create a project where contributors can learn
re-frame as quickly as possible. Re-frame is already complicated enough to grasp
for many, the added abstractions should be valuable enough to justify.
Interestingly, rf/merge is a stateful function, and although this is not a
problem in practice, it is partially violating re-frame's spirit of only using
pure functions inside event handlers.
### Problem 9: Using a wrapping macro rf/defn instead of global interceptors
When rf/defn was created inside status-mobile, re-frame didn't have global
interceptors yet (which were introduced 3+ years ago). We no longer have this
limitation after we upgraded our old re-frame version in PR
https://github.com/status-im/status-mobile/pull/15997.
Global interceptors are a simple and functional abstraction to specify functions
that should run on every event, for example, for debugging during development,
logging, etc. This PR already shows this is possible by removing the wrapping
function utils.re-frame/register-handler-fx without causing any breakage.
## Conclusion
By embracing re-frame's best practices for describing effects
https://github.com/day8/re-frame/blob/39adca93673f334dc751ee2d99d340b51a9cc6db/docs/FAQs/BestPractice.md#use-the-fx-effect,
we can solve long standing issues that affect every contributor at different
levels and bring the following benefits:
- Simplify the codebase.
- Bring back the DX we all deserve, i.e. Clojure Language Server and clj-kondo
fully working in event namespaces.
- Greatly facilitate the testability of events.
- Give devs more flexibility to make the app more responsive, because the new
default would not coalesce events, which in turn, would block the UI thread
for shorter periods of time. At least that's the theory, but exceptions will
be found.
The actions to achieve those benefits are:
- Don't use the macro approach, replace rf/defn with
re-frame.core/reg-event-fx.
- Don't use rf/merge, simply use re-frame's built-in effect :fx.
- Don't call event handlers as normal functions, just as we don't directly call
subscription handlers. Use re-frame's built-in effect :fx.
## How do we refactor the remainder of the code?
Some numbers first:
- There are 228 events defined with rf/defn in src/status-im2/.
- There are 34 usages of rf/merge in src/status_im2/.
## Resources
- Release notes where fx was introduced in re-frame:
https://github.com/day8/re-frame/blob/39adca93673f334dc751ee2d99d340b51a9cc6db/docs/releases/2020.md#110-2020-08-24
Change the make "lint" target default behavior to NOT show clj-kondo warnings.
In the CI, I kept the same behavior, i.e. show all warnings and errors
simultaneously.
Motivation:
When devs run make lint, most of the time, they don't want to see a long list of
warnings. Their focus is on the errors. Additionally, the majority of devs in
the mobile team see clj-kondo warnings in their editors of choice already.
We (some of us) believe the editor feedback/warnings are sufficiently noisy.
Add the following somewhere in your config files if you want to see
warnings.
export CLJ_LINTER_PRINT_WARNINGS=true
This commit:
- Removes the existing dropdown component which uses the old button component under the hood
- Implements the Dropdown component
- Updates the usage in the page-nav component for types dropdown, token and wallet-networks
- Updates the usage in the photo selector bottom sheet
- Updates the usage in the Quo2 preview main screen
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
to accomplish #17288
migrated :
notifications
Issue Opened: A bug has been identified within the activity-logs component and is currently under investigation.
This commit updates
- the preview-list component to use "number-tag" for overflow items in the list as a follow-up of the PR Update "Preview list" component.
- the usage of the preview-list component in the context-tag (multiuser and multinetwork type) is updated as it was broken.
- the size APIs of preview-list and number-tag and their usage across the codebase to respect the new guidelines.
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* chore: update guidelines for sizes
* chore: update to size uses in codebase to follow new convention
---------
Co-authored-by: Ulises M <ulises.ssb@hotmail.com>
After upgrading to Xcode 15 make run-ios would fail with
```
❌ /Users/siddarthkumar/code/status-im/PR/status-mobile/ios/Pods/boost/boost/container_hash/hash.hpp:131:33: no template named 'unary_function' in namespace 'std'; did you mean '__unary_function'?
struct hash_base : std::unary_function<T, std::size_t> {};
```
This commit fixes the issue and makes existing codebase compatible with newer Xcode.
reference issue in react-native repo : facebook/react-native#37748
* use new API for ens name registration
https://github.com/status-im/status-go/compare/4cc53630...223d215e
* update status-go-version.json
* update status-go-version.json
* fix Error:Field validation for 'KeycardPairingDataFile' failed on the 'required' tag
* update status-go-version.json
* fix lint issue
Recently, we changed clj-kondo default fail-level from "warning" to "error", but
we missed the fact that we needed to raise the default level for all linters set
to "warning".
Every keypress on an input field of the preview descriptor re-rendered the whole
functional component and the input focus was lost.
As we know from past issues, we should never use this pattern:
(defn component
[]
[:f>
(fn []
...)])
Force re-frame to stop warning about subscriptions in non-reactive contexts
while executing subscription tests (i.e. unit tests using the macro
test-helpers.unit/deftest-sub).
The net result? No more hundreds of useless warnings in the output of make test.
re-frame: Subscribe was called outside of a reactive context.
See: https://day8.github.io/re-frame/FAQs/UseASubscriptionInAJsEvent/
The warning is actually useful in production code, but in a subscription test we
already know we're never inside a reactive context.
This PR resolves the issue where Composer becomes detached from the footer during the chat history loading phase, specifically when the skeleton screen is displayed. Fixes#17237.
### Commit Summary
This pull request updates our coding guidelines to include a process for marking deprecated functions using metadata in ClojureScript.
fixes#17103
### Follow up from #16865
This commit focuses on enhancing the user experience by replacing our legacy skeleton loaders with the latest version. Additionally, it introduces a refined approach for deprecating outdated components and functions to maintain a cleaner codebase.
### Key Changes
Replace existing skeleton loaders with the latest skeleton-list component for improved performance and usability.
Implement a standardized deprecation method, using either naming conventions or metadata annotations, for phasing out old components and functions.
Disable :fn-deprecated warnings from the Closure compiler for the mobile
shadow-cljs target during development. The compiler warnings are no longer
necessary, because we're managing deprecation via clj-kondo.
Without the compiler setting's change, every code reload will generate warnings
for each and every deprecated call in the repo, which can quickly grow to the
hundreds or more, thus making the terminal output horrendous to understand.
Also set clj-kondo's "fail-level" to "error" (the default is "warning").
This commit removes the dependency of the IOS Target for `show-ios-devices` command.
We no longer need the IOS target because the default shell contains the `ios-deploy` library, which is used by this command already.
Unshadows all remaining vars in status-mobile, including non
cljs.core/clojure.core ones. The only exceptions are cljs.core/type and
cljs.core/name (which happen quite often, so I'm not sure if it's worth
unshadowing them).
Fixes: #16123
This commit changes the behavior when joining communities:
1) If the user hasn't joined a community, they will see the
non-collapsed header.
2) If the user has already joined the community, they will see a
collapsed version of the header, in order to have quicker access to
the chats of the community without having to scroll a lot.
One edge case that is taken care of is the following:
1) User visits a community that has not joined, requests to join.
2) The user is on the community page when the state changes from
not-joined -> joined.
In this case the user won't see the collapsed header until they leave
the community view (go back to home say and back to communities).
This is done in order to avoid some janky transition between the non
collapsed & collapsed version of the header.
This is slightly different from as mentioned in the issue "visiting the
page for the 2nd time", as that will require larger changes but it
should be an acceptable behavior, since most of the times they will have
to visit the overview to request access.
Add icon-name to group avatar
Add missing context-tags variants and fix the API to match figma
Updates context-tag previous uses
Update use of group-avatar api
* Refactor page-nav and fix API
* Update and fix page-nav in scroll-page component
* Update page-nav uses in quo-preview
* Update page-nav uses in syncing
* Update page-nav uses in communities
* Update page-nav uses in wallet
* Update page-nav uses in onboarding
This commit updates the "Preview list" component to support the following types (according to Figma):
- collectibles
- dapps
- accounts
- network
- tokens
Additionally, imports the images for wallet networks and dApps.
---------
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Fixes partially #15595
In order to build less targets, when not needed we introduce this
mapping logic.
If only specific ABI is required - status-go will have the same
arhitecuture.
This commit adds Gradient Background in the bottom sheet which will be used in Wallet Account Actions, and Switcher bottom sheet.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Improvements to quo previews:
- Change quo-preview.preview code to be more aligned with our guidelines.
- Remove duplication when setting up preview screens in quo-preview.main. Now we
only need to specify the :name and :component keys and fallback to a good
default for "{:options {:topBar {:visible true}}".
- Auto-generate descriptor labels based on the key.
- Fix form field colors for dark & light, especially for Android.
- Redesigned form fields to look nicer 💄
- Create component that abstracts away the code for rendering the form fields
and the preview area. This will aid us in creating more consistent looking
preview screens and keep things DRY.
How do we use the new code?
Just as before, define a state binding and use it to build up the arguments of
the component. Then, use the preview/preview-container to wrap the component.
You can use certain props to control how the preview is styled, etc, but that's
about it.
(def descriptor
[{:type :text :key :label}
{:key :chevron-position
:type :select
:options [{:key :left}
{:key :right}]}])
(defn view
[]
(let [state (reagent/atom {:chevron-position :left
:label "Welcome"})]
(fn []
[preview/preview-container {:state state :descriptor descriptor}
[quo/divider-label @state]])))
* Inherit custom colour for unread notification dots
* Code style update; notification-dot as a separate component
* Code style update; notification-dot as a separate component
* Removed leftovers
* Updates
* Lint fix
* chore: update quo2 group avatar to best practices
* chore: update quo2 browser-input to best practices
* chore: update quo2 dynamic-button to best practices
* chore: update quo2 tabs to best practices
* chore: cleanup quo2 core file
* chore: use best practices in quo2 banner
* chore: use best practices in quo2 step
This pr. add blur background on continue button on create profile screen should the button container cover the profile color picker when the keyboard is shown
* show button background on scroll
* fix show button on scroll different platforms
* fix: button container loading
* fix: button container background delay
* Add bind-component function to `react-native.navigation`
* Create helper function to use react-native-navigation lifecycle methods
* Fix sync QR code not recognized after trying again & refactor
* Add atom to manage callbacks when qr code scan fails
This commit implements the "Progress bar" component which is needed for wallet screen development.
Additionally, this commit adds a new test helper method "render-with-theme-provider" to test components in different themes.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* Small typo fix
* Move header-spacing & empty-state to common.home namespace
* Create common animated banner component for chats and communities
* Add animated banner to chats tab
This commit adds two new entry points (button on the top right corner in the navigation bar) for the Quo2 preview screen without having to log in to the app:
- "New to Status"
- "login"
Additionally, this commit updates the theme switcher to be sticky at the top of the Quo2 preview screen to quickly change the theme without having to scroll all the way top.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit adds the "on-press" prop to the "collectible" component which is required for navigating to other screens, such as the details screen when we will start building the wallet.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit implements the "gradient cover" component which is needed for wallet screen development, and upgrades the "react-native-linear-gradient" library to "v2.8.0".
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* Small refactor & add customization color to `info-count` component
* Fix notification mark in group chats for no mentions, also notification alignment styles in the component
* Code style: `change > 0` for `pos?`
* Simplifies community banner and adds style property
* Add animation for communities banner card
* Moves value-in-range to `utils.number` and removes `bounded-val`
* Moves animated values to view namespace
* Make `community.banner` component themeable
This commit upgrades Shadow CLJS from 2.11.16 (released on Feb/21) to latest
2.25.0 (Jul/23), so ~1.5 years worth of upgrades. By upgrading shadow we
can finally use the latest major Clojure version 1.11.x.
Why upgrade shadow?
- Shadow CLJS controls the ClojureScript version we can use. In order to use the
latest major Clojure version we must upgrade Shadow CLJS.
- Shadow CLJS releases new versions very frequently, and if you take a look at
its changelog https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md, you'll see
it had tons and tons of bug fixes over the years. I hope some of them help
improve the DX for certain contributors who recently reported issues with
it.
- Clojure 1.11 brings new features, bug fixes and even performance improvements
(although I think the performance mostly impacts Clojure on the JVM). See the
changelog https://github.com/clojure/clojure/blob/master/changes.md#changes-to-clojure-in-version-1110
Things that can be beneficial to us, or are interesting nonetheless:
- New :as-alias to be used in require, which is like :as but does not require
the namespace to load. This means namespaced keywords using :as-alias can't
cause circular dependency errors. This feature would very useful if we used
namespaced keywords, but we don't, so...
https://github.com/clojure/clojure/blob/master/changes.md#22-as-alias-in-require
- New macros run-test and run-test-var to run single test with fixtures and
report.
- New iteration function, useful for processing paginated data.
https://www.abhinavomprakash.com/posts/clojure-iteration/
- New update-keys function: applies a function to every key in a map.
- New update-vals function: applies a function to every value in a map.
Examples for update-vals and update-keys. They should perform better than the
common reduce-kv approach since they use a transient data structure.
(let [m {:a 1 :b 2}]
(update-vals m inc)) ; => {:a 2, :b 3}
(let [m {:a 1 :b 2}]
(update-keys m name)) ; => {"a" 1, "b" 2}
Why change namespaces within __tests__ directories?
Any namespace with the word --tests-- throws an error, like the one below. I
didn't bother investigating why, so I changed the guidelines to reflect the new
convention. It's probably related to the double dashes in the name.
Namespace quo2.components.dividers.--tests--.divider-label-component-spec has a
segment starting with an invalid JavaScript identifier at line 1
This commit initialises the status-go method `startSearchForLocalPairingPeers` which in turn will produce logs that are important for peer discovery while local pairing and will produce logs important to detect local pairing crashes.
This is a continuation of https://github.com/status-im/status-mobile/pull/16500 (Lint
& fix some shadowed core Clojure(Script) vars).
Notes: As a reminder, the goal is to eventually disallow shadowing core Clojure
vars entirely, but to get there and avoid rebase hell and regressions, we need
to do in smaller steps, especially because we can't safely automate the process
of unshadowing vars.
We are already down from ~500 shadowed core vars to 350 in total.
Why is this PR is using names such as "s", "v" or "sym"? Names such as s or v
are the so called idiomatic names, and are listed in the Clojure Style Guide
https://guide.clojure.style/#idiomatic-names. I used them whenever I felt
appropriate. For the var cljs.core/symbol I opted to use sym, even though the
symbol in question is not necessarily a Clojure symbol, I think the alias
conveys the meaning well enough
(https://www.clojure.org/guides/learn/syntax#_symbols_and_idents).
New vars linted:
- comparator
- identity
- str
- symbol
- val
Outstanding shadowed vars include type, name, hash, comp.
This commit refactors the "Toast" component to use theme context for consistency across the codebase.
Each toast will have its theme provider, which will help the children to use the context properly without interfering with other toast's context.
The following components are refactored to use with-theme / theme-context as it is used in the "Toast":
- "text" component
- "user-avatar" component
- "icon" component
- "circle-timer" component
This commit also updates the icon keyword used in the ":toasts/upsert" event dispatch to respect icon guidelines.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* chore: refactor button and add use for community colors
* chore: update color in button to work with community color
* chore: correct uses of button across app
This commit updates "Bottom Sheet" to use the theme (for theme provider) provided on the bottom sheet args when dispatching. This will ensure the theme is passed down to its child components where it can consume and render based on the theme.
Changes done:
In Bottom Sheet:
- Fix Bottom Sheet to use the correct background colour (neutral-95) for dark mode (as per Figma)
- Fix the Icon colour for danger in light mode
- Updated Quo2 Preview to provide an option for the bottom sheet theme
In Action Drawer:
- Refactor the Action Drawer component to consume theme context
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit fixes (by skipping) the scroll to the bottom of messages when the user edits a message and sends it.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Rewrite the shadows foundation API:
- Fix (implementation & usages): theme changes were not causing shadows to be
reevaluated.
- Optimization: define all possible shadow values at compile time. Good to
reduce cycles on garbage collection since recreating the shadow map all the
time is unnecessary and also to save cycles on computing colors since calls to
colors/alpha are not memoized.
- API redesign: unify access to Design System shadows in a single function.
None of the actual shadow values changed.
Fixes https://github.com/status-im/status-mobile/issues/16526
API rationale
=============
The quo2.foundations.shadows namespace reflects what's in the Design System >
Foundations > Shadows https://www.figma.com/file/v98g9ZiaSHYUdKWrbFg9eM/Foundations?type=design&node-id=624-965&mode=design&t=CvIotdjbHKHcHjpd-0).
Figma users see these shadows in other components as "Shadow/Normal/Light/03".
Notice the shadow's weight is shown as a number (not the semantic name in Figma,
e.g. "intense", "strong"):
So to make things as easy as possible, I opted for exposing a single public
function named "get", which receives arguments in order of frequency of usage
and which expects shadow weights as numbers so that devs don't need to mentally
translate 1 to "soft", or 3 to "intense".
Re-implements the component Community List according to guidelines
and, most importantly, fixes a bunch of issues and tries to achieve 100%
compatibility with Figma.
The new implementation is trying to mirror Figma properties as much as possible.
Fixes https://github.com/status-im/status-mobile/issues/16447
Changelog:
- Refactor to guidelines.
- Fix: original implementation in money/format-amounts had a bug caught by new
unit tests ("1000000" was formatted incorrectly).
- Fix: Community permission tag correct background when theme is overridden and
when blur is enabled.
- Fix: Notification dot uses correct colors for dark mode and blur variants.
- Fix: Community stats background when blur is enabled.
- Fix: Community stats icon color when blur is enabled.
- Add: The component's Quo preview screen is smarter and will only show form
fields (aka descriptors) that are relevant for each component type (engage,
discover or share).
- Add: replace hardcoded community statistics with an implementation that
actually accepts real numbers and which are correctly formatted.
- Add: New Quo descriptor type number.
- Add: Component uses correct shadows according to foundations/shadows.
This commit fixes the seen state of notifications, if the user is in the Activity Center screen while receiving a new notification.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
This commit fixes the profile colour in the following screens:
- "View Profile" button on the "Add a contact" page
- "Jump to" button inside the chat
- "Jump to" button in the "Community Overview" screen
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
- Community channels may not have an emoji, and in such cases, it should fall
back to a single letter. The component was recently updated in Figma after
this concern was brought up to designers.
- The default (fallback) color to be used in the list of community channels
should be the community color, not a default "primary-50" as was before. It's
a subtle change because the colors are rendered at 10% transparency.
- Rewrote the channel-avatar component to follow guidelines.
Fixes:
- https://github.com/status-im/status-mobile/issues/16332
- https://github.com/status-im/status-mobile/issues/16327
This commit gets rid of the app-state check which is buggy,
The app-state becomes `active` after the universal link code has executed always resulting in the redirect not happening.
This commit does the following:
- Moves `get-abbreviated-profile-url` from shell share view into `utils.address` and update its usage.
- Adds `get-shortened-compressed-key` to `utils.address` and update the code using `get-shortened-key` to now use `get-shortened-compressed-key` instead.
- Adds test for newly introduced utils.
It's well known that shadowing core Clojure vars can lead to unexpected bugs. In
fact, it's a common source of bugs in other languages too. In the status-mobile
repository there are, in total, 562 shadowed vars, ~500 are core vars. Excluding
the "old code" we still have 285 offenders.
In status-mobile I've already seen two bugs caused by shadowed vars, both with
the shadowed var "name". But probably other problems happened in the past, and
others will happen in the future if we don't do something about this. This PR is
also my response to my frustration trying to review PRs and checking for
shadowed vars, humans were not meant for that!
In this commit we are enabling ":shadowed-var" to lint certain (not all) core
vars as errors (not warnings). In future PRs we can gradually unshadow more
vars. For the record, name is shadowed 40 times in the new code and 130 in
total, and type is shadowed 93 times in the new code and 124 in total!
What about non-core vars, should we allow shadowing? There are ~70 non-core
shadowed vars. In my opinion, we should also lint and disallow shadowing
non-core vars, since it may cause the same kind of bugs of shadowing core vars.
But this decision can be left for another moment/issue, after we have fixed the
most prominent problem of shadowing core vars.
Which vars are unshadowed in this PR? I fixed 62 errors and unshadowed
cljs.core/iter, cljs.core/time, cljs.core/count, cljs.core/key,
clojure.core/key.
Resources:
- [clj-kondo linter: shadowed-var](https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#shadowed-var)
* Refactor: Remove use of f-component
* Fix documentation drawer styles
* Refactor: move title styles to style ns
* Fix StaticSafeAreaInsets not being defined on component tests
* Fix bottom sheet height on Android
* Makes `divider-label` styles more lenient
* Small refactor to `list-items.channel` component
* Fix styles for `channel-list-component`
- Refactor `channel-list-component`
- Add some missing `:style` keys in `status-im2.contexts.communities.overview.view`
- Fix a warning related to using a `deref` in a `lazy-seq`
* Changes icon keyword namespace from `:main-icons` to `:i`
This commit updates the `bottom-sheet-screen` component (which used `override-theme` from `screen-params` subs) to use the theme from the context provider.
The bottom sheet screen will pick the theme specified in the screen options (to override) as expected. If it's not specified, then it will fall back to the user's theme.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
watchman was upgraded significantly during the last #14944 (4.9.0 (Aug 16, 2017) to 2023.01.30.00 - 6 years between):
status-im/nixpkgs@4e9c02b
Probably causing developers to have "too many files open" issue #16341
This PR is an attempt to fix the issue by downgrading the watchman
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Otherwise if in Nix context we can accidentally use GNU stat which
results in a different output due to different command line flags:
```
[nix-shell:~/status-mobile]$ stat -Lf "%Sg" "/nix/store"
stat: cannot read file system information for '%Sg': No such file or directory
File: "/nix/store"
ID: 10000110000001a Namelen: ? Type: apfs
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 242837545 Free: 199242283 Available: 199242283
Inodes: Total: 7971454780 Free: 7969691320
```
And it should be just owner group name or ID. Which in turn results in:
```
Unknown Nix installtion type!
```
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Android SDK in nixpkg doesn't support `aarch64-darwin`, for details see
https://github.com/status-im/status-mobile/issues/12794
The workaround was to run terminal application with Rosetta or make with `aarch` tool.
This PR overrides system architecture to always be `x86_64` for Android shell and build targets ran by make.
CI is not affected as it runs `nix` directly.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
This commit updates the broken link of `Status development` in the `Start and connect the REPL` section of `ide-setup.md`.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
After the nixpkgs upgrade we started to have Xcode command line tools installation popup on each make test, dtrace-provider was failing meanwhile: #16356
It appeared, that it was failing before the upgrade with different issue: #16356
dtrace-provider is a dependency for detox, which was added for visiual tests in #14329
These tests don't run.
This build issues didn't cause any problems, because it was not obligatary.
See NODE_DTRACE_PROVIDER_REQUIRE option, which can enforce this requirement.
See #16356 for more details.
In this PR we disable detox dependency for now.
And also Visual Tests.
This commit refactors the "How to pair" bottom screen (introduced in #15710) on Syncing page, to be reused in "Sign In" and "Sync new device" screens by moving the UI rendering functions to the common place.
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
On macOS `git-lfs` checks fail sometimes and they also take a lot of time to execute.
```log
FAIL github.com/git-lfs/git-lfs/v3/lfshttp 0.820s
FAIL
error: builder for '/nix/store/abd6spw876qvcmlpcwsljsnbpbnvx1fg-git-lfs-3.3.0.drv' failed with exit code 1;
last 10 log lines:
> Error Trace: certs_test.go:210
> Error: Expected value not to be nil.
> Test: TestCertFromSSLCAPathEnv
> certs_test.go:210:
> Error Trace: certs_test.go:210
> Error: Expected value not to be nil.
> Test: TestCertFromSSLCAPathEnv
> FAIL
> FAIL github.com/git-lfs/git-lfs/v3/lfshttp 0.820s
> FAIL
For full logs, run 'nix-store -l /nix/store/abd6spw876qvcmlpcwsljsnbpbnvx1fg-git-lfs-3.3.0.drv'.
```
Failures initially observed by me and @smohamedjavid and then today again reported by @yqrashawn
This commit adds a `nix` overlay that skips those checks
This is a workaround for a well known issue of Nix failing to download
bigger packages from Nix cache due to errors like this:
```
HTTP error 200 (curl error: Transferred a partial file)
```
or
```
HTTP error 200 (curl error: Stream error in the HTTP/2 framing layer)
```
From docs: https://nixos.org/manual/nix/stable/command-ref/conf-file.html#conf-fallback
>If set to true, Nix will fall back to building from source if a binary
>substitute fails. This is equivalent to the --fallback flag. The default is false.
Realted: https://github.com/status-im/infra-ci/issues/17
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Otherwise it fails early and doesn't work for branches.
I also refactored it a bit so the `pipefail` disbaling is local.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Fixes following error:
```
ld: framework not found IOKit
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [status_nodejs_addon.target.mk:175: Release/status_nodejs_addon.node] Error 1
```
The `make test` target started to fail on macOS after #14944.
This PR adds 2 Apple SDK frameworks to default shell: `IOKit` and `CoreServices`
The other 2 mentioned in `binding.gyp` are not added, but build is ok.
Resolves: https://github.com/status-im/status-mobile/issues/16356
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Otherwise Nix produces warnings like this:
```
warning: ignoring untrusted substituter 'https://nix-cache.status.im/', you are not a trusted user.
```
Since adding users to `trusted-users` essentially gives them `root`:
>Adding a user to trusted-users is essentially equivalent to giving that user root access to the system.
> — https://nixos.org/manual/nix/stable/command-ref/conf-file.html#conf-trusted-users
A more kosher approach might be to just add the cache config itself globally.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* remove b&w color as an option
* change system message for minimum display name length to match designs
* update display name validation to match desktop
Should resolve errors like this:
```
error: file 'nixpkgs' was not found in the Nix search path (add it using $NIX_PATH or -I)
```
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Fixes the main issue #16313, but also other correlated bugs.
- Fix: quo2 component navigation.page-nav does not stretch out to the maximum
available height when there are only 1 to ~6 community channels.
- Fix: options menu button didn't use the correct background color (it should
have 40% transparency).
- Fix: Remove bottom-left & bottom-right rounded borders from the bottom of the
page-nav container.
- Fix: Remove top-left & top-right rounded borders from the screen's header.
- Fix: Use correct background color in the page-nav, now neutral-95 instead of
neutral-90.
We use `builtins.fetchTarball` to avoid having to first import a
`nixpkgs` from existing channels, which breaks if there are no channels.
Otherwise new Nix 2.14 version can result in:
```
error: file 'nixpkgs' was not found in the Nix search path (add it using $NIX_PATH or -I)
```
Which happens due to no default `nixpkgs` channel existing:
```
> nix-channel --list
```
Resolves: https://github.com/status-im/status-mobile/issues/16342
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* fix: remove placeholder icons
* fix: swipe action button style
* lint fix
* fix: swipe action button space
* fix: lint
* Fix for two separate sections with different colors shown on the chat screen (dark mode) (#16265)
* Fix for two separate sections with different colors shown on the chat screen (dark mode)
* lint-fix
* temporary hide mutual update's messages (#16290)
* chore: fix unit test for slide button (#16302)
* nix: upgrade interpreter from 2.11.1 to 2.14.1
This is a mild upgrade that should not cause any controversy.
You can read about changes here:
- https://nixos.org/manual/nix/stable/release-notes/rl-2.12.html
- https://nixos.org/manual/nix/stable/release-notes/rl-2.13.html
- https://nixos.org/manual/nix/stable/release-notes/rl-2.14.html
Relevant `infra-ci` change:
- https://github.com/status-im/infra-ci/commit/e4e9796f
The simplest way to upgrade to `2.14` your version locally is using:
```sh
nix-channel --update
nix-env -iA nixpkgs.nixVersions.nix_2_14 nixpkgs.cacert
sudo systemctl daemon-reload
sudo systemctl restart nix-daemon
```
For MacOS the instructions are a bit different:
https://nixos.org/manual/nix/stable/installation/upgrading.html
Keep in mind you should use `nixpkgs.nixVersions.nix_2_14` instead
of just `nixpkgs.nix` to avoid getting newer than `2.14`.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* nix: add upgrade script for Nix interpreter
Now developers can upgrade to current Nix version using just:
```sh
make nix-upgrade
```
For manual instructions see:
https://nixos.org/manual/nix/stable/installation/upgrading.html
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* fix switcher cards position in ios (#16301)
* Fix community tags and button spacing (#16292)
Linked to https://github.com/status-im/status-mobile/issues/16119, fixes
these issues:
- Clipped community tags. They should extend to the edge of the screen.
- Outdated information box message. Updated according suggestion in Figma
https://www.figma.com/file/h9wo4GipgZURbqqr1vShFN/Communities-for-Mobile?type=design&node-id=7035-462899&t=wED97E4Mtv9v6OXf-0
- Add correct padding between community tags and the Request to join Community
button.
* Add decision about team structure & wallet team
* [#16118] bottom nav tab notification color (#16236)
* [#16066] bottom sheet height (#16285)
* Update prettier config for the project. (#16303)
* Update prettier config for the project.
* Add prettier to make lint-fix.
* fix: placeholder icons for join community, identity verification request
* fix: lint
* Make profile photos visible by default (#16095)
* Fix incorrect channel option (#16314)
* e2e: tests fixes
* tests: fix type of shell used for linting
Otherwise Node modules are not installed.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* nix: upgrade nixpkgs to latest nixos-22.11
Notable upgrades:
* Bash `5.1` to `5.2`
* Git `2.37.3` to `2.40.1`
* Curl `7.85.0` to `8.0.1`
* OpenSSL `3.0.5` to `3.0.8`
* Go `1.18.6` to `1.18.9`
* NodeJS `18.9.1` to `18.16.0`
* Java `1.8.0_322` to `11.0.11`
* Ruby `3.1.2` to `3.1.4`
* Python `2.7.18` to `3.10.11`
* Clojure `1.11.1.1165` to `1.11.1.1273`
* Clj-kondo `v2022.10.05` to `v2023.04.14`
* Zprint `1.2.5` to `1.2.6`
* Bundler `2.3.22` to `2.4.13`
* Gradle `6.9.2` to `6.9.4`
* Android Platform Tools `33.0.2` to `33.0.3`
* Android SDK Tools to Android SDK Command-Line Tools
Removals:
* Zprint since the version in `nixpkgs` was newer than in overlay.
* Xcode wrapper definition was removed since my fixes were merged:
- https://github.com/NixOS/nixpkgs/pull/204278
- https://github.com/NixOS/nixpkgs/pull/228696
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* ci: build generic status-go and all shells
When discussing caching of `status-go` with Sid I noticed that the build
we cache daily created from our nightly build is different from the
build we create locally due to a single input.
In a release CI host we can see the IPFS URL is that of Infura:
```
> find /nix/store -maxdepth 1 -name '*-status-go-*android' | tail -n1
/nix/store/2cc8ilhx5g3k2awbn4sla61n4cml2405-status-go-0.130.1-d2cce5e-android
> RESULT=$(find /nix/store -maxdepth 1 -name '*-status-go-*android' | tail -n1)
> nix show-derivation $RESULT | tr ' ' '\n' | grep IpfsGateway
github.com/status-im/status-go/params.IpfsGatewayURL=https://status-im.infura-ipfs.io/ipfs/
```
But for a local build the URL is the default, which is our own gateway:
```
> nix-build --no-out-link -A targets.status-go.mobile.android
/nix/store/1p53m7a6y1kg3vcyd8d06scf3bsyn5rk-status-go-0.157.2-47711c4-android
> RESULT=$(nix-build --no-out-link -A targets.status-go.mobile.android)
> nix show-derivation $RESULT | tr ' ' '\n' | grep IpfsGateway
github.com/status-im/status-go/params.IpfsGatewayURL=https://ipfs.status.im/
```
This difference causes builds of `status-go` that get uploaded to our
Nix cache to not match what developers locally would build, which
results in a cache miss.
This changes the Nix cache CI jobs to instead of building only dependencies
(`buildInuts`) to simply build the generic versions of `status-go` without
nightly specific inputs.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* nix: fix applying nix.conf by using correct env var
According to this line from the docs:
>The system-wide configuration file sysconfdir/nix/nix.conf (i.e. /etc/nix/nix.conf),
>or $NIX_CONF_DIR/nix.conf if NIX_CONF_DIR is set. Values loaded in this file are not
>forwarded to the Nix daemon. The client assumes that the daemon has already loaded them.
https://nixos.org/manual/nix/stable/command-ref/conf-file.html#description
Our usage of `NIX_CONF_DIR` has been wrong for a while now.
The correct way of applying this config is using `NIX_USER_CONF_FILES`.
In addition the `extra-substituters` no longer exists in the docs.
Use of `trusted-substituters` is necessary according to:
>At least one of the following conditions must be met for Nix to use a substituter:
>
>- the substituter is in the trusted-substituters list
>- the user calling Nix is in the trusted-users list
https://nixos.org/manual/nix/stable/command-ref/conf-file.html#conf-substituters
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* Upgrade `react-native-camera-kit` library to resolve camera issues in Sign In screen (#16248)
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
* Update prettier script. (#16324)
* Update prettier script.
* Add target and component-spec to prettierignore.
---------
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
Co-authored-by: Alexander <alwxndr@gmail.com>
Co-authored-by: flexsurfer <flexsurfer@users.noreply.github.com>
Co-authored-by: Jamie Caprani <jamiecaprani@gmail.com>
Co-authored-by: Jakub Sokołowski <jakub@status.im>
Co-authored-by: Parvesh Monu <parvesh.dhullmonu@gmail.com>
Co-authored-by: Icaro Motta <icaro.ldm@gmail.com>
Co-authored-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
Co-authored-by: Ulises Manuel Cárdenas <90291778+ulisesmac@users.noreply.github.com>
Co-authored-by: Rahul Pratap <rahulpsingh@users.noreply.github.com>
Co-authored-by: Yevheniia Berdnyk <ie.berdnyk@gmail.com>
Co-authored-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
https://github.com/status-im/status-go/compare/47711c4f...47711c4f
This commit changes the login endpoint so that it uses LoginAccount.
The main difference is that is consistent with the two others we use for
creation/importing, and this will override the networks and use the
secrets provided.
According to this line from the docs:
>The system-wide configuration file sysconfdir/nix/nix.conf (i.e. /etc/nix/nix.conf),
>or $NIX_CONF_DIR/nix.conf if NIX_CONF_DIR is set. Values loaded in this file are not
>forwarded to the Nix daemon. The client assumes that the daemon has already loaded them.
https://nixos.org/manual/nix/stable/command-ref/conf-file.html#description
Our usage of `NIX_CONF_DIR` has been wrong for a while now.
The correct way of applying this config is using `NIX_USER_CONF_FILES`.
In addition the `extra-substituters` no longer exists in the docs.
Use of `trusted-substituters` is necessary according to:
>At least one of the following conditions must be met for Nix to use a substituter:
>
>- the substituter is in the trusted-substituters list
>- the user calling Nix is in the trusted-users list
https://nixos.org/manual/nix/stable/command-ref/conf-file.html#conf-substituters
Signed-off-by: Jakub Sokołowski <jakub@status.im>
When discussing caching of `status-go` with Sid I noticed that the build
we cache daily created from our nightly build is different from the
build we create locally due to a single input.
In a release CI host we can see the IPFS URL is that of Infura:
```
> find /nix/store -maxdepth 1 -name '*-status-go-*android' | tail -n1
/nix/store/2cc8ilhx5g3k2awbn4sla61n4cml2405-status-go-0.130.1-d2cce5e-android
> RESULT=$(find /nix/store -maxdepth 1 -name '*-status-go-*android' | tail -n1)
> nix show-derivation $RESULT | tr ' ' '\n' | grep IpfsGateway
github.com/status-im/status-go/params.IpfsGatewayURL=https://status-im.infura-ipfs.io/ipfs/
```
But for a local build the URL is the default, which is our own gateway:
```
> nix-build --no-out-link -A targets.status-go.mobile.android
/nix/store/1p53m7a6y1kg3vcyd8d06scf3bsyn5rk-status-go-0.157.2-47711c4-android
> RESULT=$(nix-build --no-out-link -A targets.status-go.mobile.android)
> nix show-derivation $RESULT | tr ' ' '\n' | grep IpfsGateway
github.com/status-im/status-go/params.IpfsGatewayURL=https://ipfs.status.im/
```
This difference causes builds of `status-go` that get uploaded to our
Nix cache to not match what developers locally would build, which
results in a cache miss.
This changes the Nix cache CI jobs to instead of building only dependencies
(`buildInuts`) to simply build the generic versions of `status-go` without
nightly specific inputs.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Notable upgrades:
* Bash `5.1` to `5.2`
* Git `2.37.3` to `2.40.1`
* Curl `7.85.0` to `8.0.1`
* OpenSSL `3.0.5` to `3.0.8`
* Go `1.18.6` to `1.18.9`
* NodeJS `18.9.1` to `18.16.0`
* Java `1.8.0_322` to `11.0.11`
* Ruby `3.1.2` to `3.1.4`
* Python `2.7.18` to `3.10.11`
* Clojure `1.11.1.1165` to `1.11.1.1273`
* Clj-kondo `v2022.10.05` to `v2023.04.14`
* Zprint `1.2.5` to `1.2.6`
* Bundler `2.3.22` to `2.4.13`
* Gradle `6.9.2` to `6.9.4`
* Android Platform Tools `33.0.2` to `33.0.3`
* Android SDK Tools to Android SDK Command-Line Tools
Removals:
* Zprint since the version in `nixpkgs` was newer than in overlay.
* Xcode wrapper definition was removed since my fixes were merged:
- https://github.com/NixOS/nixpkgs/pull/204278
- https://github.com/NixOS/nixpkgs/pull/228696
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Fixes UI bugs described in
https://github.com/status-im/status-mobile/issues/16271, and it also rewrites
the component to follow our guidelines i.e. move code to style namespace, fix
docstring, add component specs, move to separate quo2 directory, etc.
This commit is part of the effort to fix the Community Overview screen.
Various fixes related to spacing in the "I'm new to Status" screen. Fixes
https://github.com/status-im/status-mobile/issues/16064
Out of scope:
- Bottom sheet in Android doesn't occupy the full available height. This problem
exists in develop.
- Bottom sheet blur.
- [x] Use correct icon to mark notifications as read
- [x] Add support for the disabled state in action drawer actions
- [x] Update quo2 preview `drawers` > `action-drawers`
- [x] Rewrite the action drawer component spec to use our test helpers
Fixes https://github.com/status-im/status-mobile/issues/14983
This commit upgrades re-frame to v1.3.0 (latest stable release), released ~9
months ago, in 2022-08-27. This is a solid upgrade, with no breaking changes as
far as I tested status-mobile. It's a great testament of re-frame's stability
and commitment to backwards compatibility, as are many Clojure libs.
Fixes https://github.com/status-im/status-mobile/issues/15963
The big, and truly relevant addition is the introduction of the :fx built-in
effect that was added ~3 years ago in Aug/2020 in v1.1.0.
Relevant changelog:
- Global interceptors are now supported (added in v1.0.0).
- reg-event-fx will just warn (not generate an error) if the effect map returned
contains an unknown effect key.
- re-frame will now warn us when we are calling subscribe outside of a reactive
context.
- "re-frame now guarantees that a :db effect, if present, will be actioned
before any other sibling effects. re-frame continues to provide NO guarantees
about the order in which other effects will be actioned."
(https://day8.github.io/re-frame/releases/2020/#110-2020-08-24)
- There's syntactic sugar for trivial reg-sub declarations (added in v1.3.0).
See the documentation for reg-sub for more details
https://day8.github.io/re-frame/api-re-frame.core/#reg-sub
- "The built-in effect :dispatch-later can now take a single map value.
Supplying a sequence of maps is now deprecated in favor of using multiple
:dispatch-later effects within the new :fx effect."
https://day8.github.io/re-frame/releases/2020/#111-2020-08-26
For an unknown reason the original Diawi plugin for Fastlane has been
removed from GitHub and RubyGems pages and can no longer be used.
This replaces it with a Node.js script which does the same job.
I tried using `diawi` and `diawi-nodejs-uploader` but both had issues,
one of them being depending on far too many useless packages.
Resolves: https://github.com/status-im/status-mobile/issues/15951
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Fixes the maximum height overflow of the composer when there are images and/or
link previews (any *extra content* as we call it in the code).
Fixes https://github.com/status-im/status-mobile/issues/15949
Cause: The bug happened because the on-focus event of the composer happens
before subscriptions arrive, and thus it uses the incorrect max-height.
Fix: The fix makes the animation values of height, last-height, and saved-height
be truncated based on the newest calculated max-height, and they happen in a
separate use-effect, outside of the on-focus event.
It only blocks CI builds for no good reason when branch has not been
rebased recently, which has no real benefit as GitHub already enforces
not merging outdated PRs. It's just annoying and wastes time.
Depends on: https://github.com/status-im/status-jenkins-lib/pull/68
Signed-off-by: Jakub Sokołowski <jakub@status.im>
For some unknown to me reason we are using a different Yarn call to
Shadow-cljs to generate the JSBundle for iOS builds, while the one
created by the Android derivation shoudl be exactly the same.
I'm changing the target to just be `make jsbundle` while keeping aliases
referencing old naming, and moving things around in `nix` folder to
reflect the fact that the derivation is no longer Android-specific.
Also, crucially, I've changed the `import` in `index.js` to use the
`./result/index.js` path, since that's what Nix creates. I'm not sure if
this clashes with any developer workflow that takes place locally, so
I'd appreciate some testing from developers.
Depends on: https://github.com/status-im/status-jenkins-lib/pull/67
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* onboarding sync devices after scan to sign in
* using subscription to get the status of pairing progress
* update following reviews
* polished code following reviews
* fixed showing unknown devices
* community home screen updates
* removed green border color on status indicator
* added accent color to plus button and jump-to button
* code reviews
* e2e: fix acc id new comm button
* resolved bugs
---------
Co-authored-by: pavloburykh <pavlo@status.im>
This is the introductory work to support the new requirements for unfurling
URLs (while the message is a draft) and displaying link previews (after the
message is sent). Refer to the related status-go PR for a lot more interesting
details https://github.com/status-im/status-go/pull/3471.
Fixes https://github.com/status-im/status-mobile/issues/15469
### Notes
- The old link preview code will be removed separately, both in status-go and
status-mobile.
- I did the bulk of the work in status-go
https://github.com/status-im/status-go/pull/3471. If you want to understand
how this is all implemented, do check out the status-go PR because I heavily
documented the solution, rationale, next steps, etc.
### Performance
Does the feature perform well? Yes, there's very little overhead because
unfurling URLs happen in status-go and the event is debounced. I also payed
special attention to use a simple caching mechanism to avoid doing unnecessary
RPC requests to status-go if the URLs are cached in the client.
I have some ideas on how to improve performance further, but not in this PR
which is already screaming for reviews.
Changes effect :json/rpc-call to accept on-success and on-error parameters
either as functions OR as re-frame event vectors. The changes are 100% backwards
compatible.
## Why?
Re-frame is very explicit in its documentation and its architecture, saying that
event handlers should be pure. Calling re-frame.core/dispatch in event handlers
makes them sort of stateful.
> So, you can "get away with it". But it ain't pure.
>
> -- https://day8.github.io/re-frame/EffectfulHandlers/#90-solution
In status-mobile, arguably one of our most important effects (not to be confused
with event handlers) is :json-rpc/call, but at the moment, the on-success and
on-error values are expected to be stateful functions (e.g. usually used for
logging and dispatching subsequent events).
This creates two important problems:
1. The value returned by event handlers is more opaque and cannot be easily
inspected (for example using tap>, log/debug or just println). If we try to
inspect or log them, on-success and on-error will be printed as
#object[Function].
2. Testing event handlers using :json-rpc/call becomes an exercise of
frustration, because we can't simply compare the results of the event handler
with a good expected value, which is one of the big selling points of testing
pure functions.
### The testability of event handlers
> For any re-frame app, there's three things to test:
>
> - Event Handlers - most of your testing focus will be here because this is
> where most of the logic lives
> - Subscription Handlers - often not a lot to test here. Only Layer 3
> subscriptions need testing.
> - View functions - I don't tend to write tests for views.
>
> -- https://day8.github.io/re-frame/Testing/#what-to-test
So re-frame is saying event handlers should be pure, and that event handlers
should be tested.
In order to achieve the divine simplicity of testing event handlers as pure
functions, we need to make :json-rpc/call also accept on-success and
on-error as event vectors.
Good news is that there is a known pattern to solve this problem, e.g. used by
the library https://github.com/Day8/re-frame-http-fx.
The pattern is simple once we see it: behind the scenes, :json-rpc/call conj'es
the results of the RPC call into the event vectors on-success and on-error, and
:json-rpc/call dispatches the events itself. This eliminates the need for the
stateful dispatch call in event handlers.
* Dont check app-state for android before routing PN
On Android devices, right after account creation and before a log out, the :app-state value in reframe db is set to background. The value becomes active after a log out and then log in which causes tapping on push notifications to do nothing.
This behaviour breaks E2E and hence in this PR, I remove the checking of this case only for Android platforms.
More work should be done to figure out why the app state event handler is behaving this way on Android but for now I would like to unblock E2E.
* e2e: remove xfailed tests
---------
Co-authored-by: Churikova Tetiana <tatiana@status.im>
fixes: #13439
Summary
- Update `quo2/qr-code` component to use `fast-image` instead of `rn/image`
- Adds profile tab in share section, wallet tab is marked as WIP
- Shows profile QR code along with link to user's profile and the user's emoji hash.
- profile link is shareable and copyable on tap.
- emoji hash is shareable and copyable on tap.
- fixed weird android issues
* use debounce-and-dispatch to improve mention performance
* increase time to 400ms
* decrease time to 300ms
* update status-go-version.json
* update status-go-version.json
This way we will use the same format as Nix logs and errors when a hash
changes, which avoids confusion.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
We've been seing longer runs on release CI for nightlies, possibly due
to more than 2 parallel builds running on one host.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Otherwise we see weird errors like this:
```
/nix/store/g0jijpgcb4q54zbvz5p8yvxcnb6lshnk-stdenv-darwin/setup: line 1391: /nix/store/sja8sqq4y5s9ijkb97i3pi2jrhsy40cz-xcode-wrapper-14.3/bin/xcodebuild: Operation not permitted
We require xcodebuild version: 14.3
error: builder for '/nix/store/d1dji0ywl851wgj9vv58ibpm32gq3wsm-xcode-wrapper-14.3.drv' failed with exit code 1;
last 2 log lines:
> /nix/store/g0jijpgcb4q54zbvz5p8yvxcnb6lshnk-stdenv-darwin/setup: line 1391: /nix/store/sja8sqq4y5s9ijkb97i3pi2jrhsy40cz-xcode-wrapper-14.3/bin/xcodebuild: Operation not permitted
> We require xcodebuild version: 14.3
```
Related to: https://github.com/NixOS/nixpkgs/pull/228696
Signed-off-by: Jakub Sokołowski <jakub@status.im>
This PR adds the ability to :
- Generate a QR by passing any url.
- See different error correction levels.
- Shows the media server url for that specific QR code.
- Moved media server URI generation logic to `image_server.cljs`
https://github.com/status-im/status-go/compare/e8ceed11...213dc463
Both replies and pinned messages relied on subscribing their data from messages.
This worked only as long as we loaded the message in the database, so it would break say if another user replied to a message that wasn't in the current user view.
It also changes the way pinned messages are handled, before the notification was actually sent over the wire, but that's unnecessary, since it can be generated locally on both parts.
This is a bit of a breaking change with the previous version, since if you pin a message with this version, older version will not see a system message. this can be easily fixed by restoring the previous behavior of sending the message, but not sure it's worth it.
It also adds the ability to Delete message for everyone that have Deleted for me (discussed with John) and the ability of unpin messages that have been deleted for me.
Otherwise builds fail with:
```
15:15:22 [16:15:22]: Cloning remote git repo...
15:15:22 [16:15:22]: If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.
15:15:23 Cloning into '/tmp/d20230425-79805-70bge2'...
15:15:23 git@github.com: Permission denied (publickey).
15:15:23 fatal: Could not read from remote repository.
```
Depends on: https://github.com/status-im/status-jenkins-lib/pull/63
Signed-off-by: Jakub Sokołowski <jakub@status.im>
This commit solves the problem described in detail in issue #15606, but in
essence, it fixes the clear icon by integrating rudimentary support for SVG
icons.
Fixes https://github.com/status-im/status-mobile/issues/15606
- Hopefully, if SVG icons prove to be a solid solution, we can easily and
progressively migrate PNG icons to SVGs, but for the moment, it was aligned
with @flexsurfer
https://github.com/status-im/status-mobile/issues/15606#issuecomment-1514631270
that we'll only use SVG icons on demand.
- Note that it's possible to import SVGs directly via js/require by installing
the library react-native-svg-transformer, but this approach is only good when
we don't want/need color customization, which is rarely the case with icons
where we want to change the foreground and/or background colors. I opted for
rendering the SVG icon as hiccup to support color customization.
- Since icons are fully memoized, the app's performance is on the same ballpark
as PNGs rendered with RN Image.
- It's possible to trim down SVGs by using a tool such as
https://github.com/svg/svgo, but this is obviously outside the scope of this
PR.
This commit does the following :
- Adds a command in makefile to show connected iOS devices via make `show-ios-devices`
- Developers can then copy their connected iPhone's Device Name and use it to deploy debug builds
on the device by `make run-ios-device DEVICE_NAME="their-device-name"`
- Enables automatic code signing ( only for Debug scheme )
Some users have reported local `make run-ios` failures with errors like:
```
Command PhaseScriptExecution failed with a nonzero exit code
```
Where the actual error that can be found in `ios/logs/react-native-xcode.log` is:
```
node: bad option: --openssl-legacy-provider
```
Caused by a flag we apply to our pinned Node.js `18.9.1` to fix:
```
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
```
From: https://github.com/status-im/status-mobile/pull/15167
And the need for that should go away once we upgrade Node.js further.
But for now a decent fix is to not apply that flag directly in Xcode
config so as to avoid the `bad option` error when Xcode us called
outside of Nix context.
Fixes: https://github.com/status-im/status-mobile/issues/15631
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* Add missing color variants for selectors
* Rename test ns and replace rtl fns by helper ones
* Add missing disclaimer blur style in onboarding - create password
* [IOS Only] react-native 0.63 to 0.67
* [Android Only] react-native 0.63 to 0.67
* bring back all the jenkinsfiles
* make auto-complete prop for text-input compatible
* [IOS Only] react-native 0.63 to 0.67
* [Android Only] react-native 0.63 to 0.67
* bring back all the jenkinsfiles
* nix: drop unnecessary set -x from status-go build
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* add explicity implementation line for soloader
And add deleteDebugFilesForVariant fix for libhermes.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* use fast-image for link previews
* fix extra line in message composer on android
This elevation prop is un-necessary and causes an extra line to appear which looks like a border but its actually a shadow.
* don't use `fast-image` for url preview favicon
* fix audio record button interfering cancel android
This fix was not needed in react-native 0.63.4 but is needed after we upgraded to 0.67.5
* get rid of unused platform import
---------
Co-authored-by: Jakub Sokołowski <jakub@status.im>
Without this fix:
https://github.com/NixOS/nixpkgs/commit/d0c06fa3
The `apksigner` utility is unavailable on macOS:
```
error: Package ‘apksigner-33.0.1’ in .../pkgs/development/tools/apksigner/default.nix:86
is not supported on ‘x86_64-darwin’, refusing to evaluate.
```
Signed-off-by: Jakub Sokołowski <jakub@status.im>
This commit makes the test-helpers.component namespace loadable in the REPL,
plus other changes that allow for a reasonably enjoyable RDD (REPL-Driven
Development) workflow.
Why? I want to be able to get instant feedback when I render a component with
the RN Testing Library (RNTL), and only once I'm satisfied with my findings is
when I proceed to write/update the tests. This nearly instant feedback loop is
only feasible using the ClojureScript REPL, and I'd rather not endure long
recompilation cycles.
Note that by REPL I mean connecting to the CLJS REPL of the Shadow-CLJS :mobile
target.
Essentially, this is what this commit does:
- [x] Allow the test-helpers.component namespace to be evaluated in the REPL.
This is now possible because I changed all functions that assumed js/jest
existed with a guard clause using the CLJS macro exists?. Without the
guard clauses, evaluating the namespace explodes due to stuff like
js/jest.useFakeTimers that fail in compile time (it's a syntax sugar
macro).
- [x] Change the family of functions to get the translation by text to either
translate using i18n/label or translate with the dummy prefix tx:,
depending if the code is running inside the Jest runtime or not.
- [x] Wrap remaining RNTL query functions, except for the find-* ones, since
they don't work at all outside the Jest runtime.
- [x] All wrapped functions support the original arguments supported by RNTL.
Arguments are always converted with clj->js.
- [x] All wrapped functions can optionally take a node (ReactTestInstance) as
their first argument, otherwise the global screen object will be used.
This is very important! See the explanation on section Doesn't RNTL
recommend using the screen object?
- [x] Update Shadow-CLJS preloads, so that (in development) you can fire off the
REPL and always be ready to call component test helpers. This is critical!
What else would be possible? Just an idea, but now that we can easily render
components using the same machinery provided by RNTL in the tests, we can
roughly implement Storybook's Play function
https://storybook.js.org/docs/react/writing-stories/play-function
Lesson learned: In the REPL, you may need to call
(re-frame.core/clear-subscription-cache!), otherwise you will experience
subscriptions returning the same value if their arguments are the same. For
example, I faced this while playing with the namespace
status-im2.contexts.communities.menus.community-options.component-spec. There
are better ways to solve this particular problem in the context of tests if we
use the tooling provided by day8.re-frame.test.
Doesn't RNTL recommend using the screen object? Indeed, it is recommended to use
the screen object instead of destructuring the results of RNTL render. It's just
easier and less error prone, but this only works reliably within the Jest
runtime, since it automatically cleans up rendered state after each test. When
using the REPL this is no longer the case, and I faced some errors, like Unable
to find node on an unmounted component, where RNTL would refuse to re-render
components, even if I explicitly unmounted them or called cleanup.
The only reliable solution I found was to store the result of render (a node)
and pass it to every subsequent call. This is not a workaround, it's officially
supported, but it's a tad less convenient. You can also not pass the node
reference and it should work most of the time.
Practical examples
Workflow suggestion: write your local experiments in the same namespace as the
component spec and within the comment macro. This way, you can have the Jest
watcher running and a REPL connected to :mobile, and they won't step on each
other. For the test watcher, I usually change quo2-core-spec or
status-im2.core-spec to only require what I'm interested, otherwise Jest
consumes way too many resources.
```clojure
;; Namespace quo2.components.colors.color-picker.component-spec
(h/test "color picker color changed"
(let [selected (reagent/atom nil)]
(h/render [color-picker/view {:on-change #(reset! selected %)}])
(h/fire-event :press (get (h/get-all-by-label-text :color-picker-item) 0))
(-> (h/expect @selected)
(.toStrictEqual :blue))))
(comment
(def selected (atom nil))
(def c (h/render [color-picker/view {:on-change #(reset! selected %)}]))
(h/fire-event :press (get (h/get-all-by-label-text c :color-picker-item) 0))
;; Options are passed down converted to JS types.
(h/debug c {:message "Rendering header"})
@selected ; => :blue
)
```
```clojure
;; Namespace quo2.components.tags.--tests--.status-tags-component-spec
(h/test "renders status tag with pending type"
(render-status-tag {:status {:type :pending}
:label "Pending"
:size :small})
(-> (h/expect (h/get-all-by-label-text :status-tag-pending))
(.toBeTruthy))
(-> (h/expect (h/get-by-text "Pending"))
(.toBeTruthy)))
(comment
(def c (render-status-tag {:status {:type :pending}
:label "Pending"
:size :small}))
(h/get-all-by-label-text c :status-tag-pending))
```
```clojure
;; Namespace status-im2.contexts.communities.menus.community-options.component-spec
(h/test "joined and muted community"
(setup-subs {:communities/my-pending-request-to-join nil
:communities/community {:joined true
:muted true
:token-gated? true}})
(h/render [options/community-options-bottom-sheet {:id "test"}])
(-> (h/expect (h/get-by-translation-text :unmute-community))
(.toBeTruthy)))
(comment
(setup-subs {:communities/my-pending-request-to-join nil
:communities/community {:joined true
:muted true
:token-gated? true}})
(def c (h/render [options/community-options-bottom-sheet {:id "test"}]))
(some? (h/get-by-translation-text c :invite-people-from-contacts)) ; => true
)
```
Removes the feature that allows users to cancel outgoing contact requests (possible spam vector). From now on, the user who sent the contact request will only be able to see the notification in the pending state. It seems this feature will be revisited in the future, but for now the agreement is to do the simplest thing and remove it.
Fixes https://github.com/status-im/status-mobile/issues/15357
Steps to test:
- Send CR from A to B.
- A should see a new notification in the pending state.
- B should receive a notification. If B accepts the CR, then A's pending CR disappears. If B declines the CR, then A's notification stays pending forever.
Note: As expected, A can swipe left->right to mark the outgoing pending notification as read or swipe right->left to delete it.
Otherwise we can end up with Gradle failing to find the dependencies
because we've patched away all entries referencing external repos.
Also made the regex in AWS parser a but more strict.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
https://github.com/status-im/status-go/compare/290579f7...44a0f5b7Fixes: #15290
This commit adds collapsing of categories.
It also adds ordering of chats/categories as it was previously ignored.
It also removes the communities/enabled? flag as it's not used anymore,
and communities should always be enabled.
- Display Activity Center unread badge with the unread counter.
- Use the new seen state stored in `status-go` to change the color of the
notification.
- Performance: split the `top-nav` component into left and right section
components and render the unread indicator in a separate component to not
trigger the re-render of the entire `top-nav` (as was before).
Fixes https://github.com/status-im/status-mobile/issues/14851
Demo: https://user-images.githubusercontent.com/46027/224299978-770dd5f1-302b-4375-af2b-3cd181ffdc9d.webm
Notes
=====
- Fix/improve: `quo/counter` displayed `NaN` to the user if the input value was
an empty string.
- In Figma, there's a border around the unread indicator. I didn't implement
this because the ideal solution IMO involves changing the `quo/counter`
component a little bit because the width of the component varies according to
the content displayed (1, 9, 99, 100, etc) and I wanted to the right thing in
a separate PR.
Design notes
============
There's an ongoing conversation with the Design team to decide what to do with
the gray indicator on top of the bell icon, since there's little contrast when
it's is in the `seen` state.
Platforms
=========
- Android
- iOS
Steps to test
=============
- Open Status
- Receive one or more notifications in the Home screen and check the unread
indicator is blue and has a counter.
- Open the AC and close it, notice the unread indicator is now in the `seen`
state. You can close the app and re-open and the state is persisted.
- Mark notifications as read/unread at will, check the unread counter is
correct.
Implements swipe actions for notifications with call to action (e.g. pending
contact requests, unverified identity verifications, etc).
Fixes https://github.com/status-im/status-mobile/issues/15118
According to the Design team, the goal is to deliver a consistent experience to
users, so whenever the user sees a notification with buttons, the same actions
can be taken via the swipe buttons.
Note: swipe buttons are using placeholder icons while the Design team works out
which ones to use
Additionally, a bunch of fixes:
- Fix: outgoing pending contact requests were not being removed from the UI when
cancelled.
- Fix: Membership tab not showing unread indicator.
- Fix: dismissed membership notification not marked as read.
- Fix: dismissed membership notification was displaying decline/accept buttons.
Regression came from changes in status-go related to soft deletion of
notifications.
- Fix: incorrect check for the pending state of a contact request.
- Fixed lots of bugs for identity verification notifications, as it was
completely broken. Unfortunately, somebody made lots of changes without
actually testing the flows.
- Add basic error handling and log if accepting, declining or canceling contact
requests fail.
The demo shows an identity verification with swipe actions to reply or decline.
[identity-verification-swipe-to-reply.webm](https://user-images.githubusercontent.com/46027/223565755-b2ca3f68-12e2-4e1e-9e52-edd52cfcc971.webm)
Out of scope: The old quo input is still in use in the identity verification
notification. This will eventually be solved by issue
https://github.com/status-im/status-mobile/issues/14364
### Steps to test
Notifications with one or more buttons (actions) are affected by this change,
because now the user can also swipe left/right to act on them.
- Membership notifications: private group chat. The following PR explains how to
generate them https://github.com/status-im/status-mobile/pull/14785
- Contact requests, and community gated requests to join (Admin tab).
- Identity verifications. I believe the only way to test identity verification
flows at the moment is to use the Desktop app, since initiating the challenge
is not implemented in Mobile yet.
- Mentions and replies don't have new swipe buttons because they don't have call
to action buttons throughout their lifecycle.
Steps to test identity verification flows:
#### Identity verification flow 1
- `A` and `B` are mutual contacts.
- `A` sends a verification request to `B`.
- `A` should not see any notification yet.
- `B` should receive an identity verification notification. `B` can either
decline or reply.
- `B` declines and the status `Declined` is shown instead of buttons.
- `B` can now either swipe to toggle read/unread or swipe delete the
notification.
- `A` should not receive any notification after `A` declined.
#### Identity verification flow 2
- `A` and `B` are mutual contacts.
- `A` sends a verification request to `B`.
- `A` should not see any notification yet.
- `B` should receive an identity verification notification. `B` can either
decline or reply.
- `B` press `Reply` and a bottom sheet is displayed with a text input.
- `B` sends the reply/answer message and the status `Replied` is shown instead
of buttons.
- `B` can now either swipe to toggle read/unread or swipe to delete the
notification.
- `A` should receive a notification with the reply from `B`.
- `A` can either mark the answer as untrustworthy or accept it (trust it) via
the normal buttons, as well as via the swipe left/right buttons.
- If `A` accepts the answer, then the status `Confirmed` is shown instead of
buttons. On the other hand, if `A` marks as untrustworthy, then the status
`Untrustworthy` is shown instead of buttons.
- `B` should receive no further notifications due to `A`s actions.
- `A` can now either swipe to toggle read/unread or swipe delete the
notification.
Cocoapod installations can fail with errors like:
```
tclsh /Users/jenkins/Library/Caches/CocoaPods/Pods/Release/SQLCipher/3.4.2-f9fcf/tool/addopcodes.tcl parse.h.temp >parse.h
./configure: line 11729: tclsh: command not found
./configure: line 12262: tclsh: command not found
./configure: line 12276: tclsh: command not found
```
If a pure shell is used. Also `pgrep` would be missing from a pure shell.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* [Feature][#15267] Status Tag UI Update
* [Fix] Typo in comment
* [Fix] Feedback from PR
* [Fix] Feedback from PR
* [Fix] Blur Type on Preview Screen
* [Fix] Blur Type on Preview Screen
Otherwise in some cases we can get:
``
.../Script.sh: line 6: ./logs/react-native-xcode.log: No such file or directory
Command PhaseScriptExecution failed with a nonzero exit code
```
Signed-off-by: Jakub Sokołowski <jakub@status.im>
This way people don't have to ask me for access to logs from CI hosts to
be acquired using SSH access, but instead they will be simply included
in Jenkins build artifacts.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Before we were patching only `build.gradle`, which is not the only type
of Gradle config file. If we do not cover them all we can encounter
errors about missing package because they will continue using remote
repositories instead of `mavenLocal()`, to which pass Nix store path.
We also need to cover `gradlePluginPortal()` to provide plugins.
This is also necessary for the React Native upgrade:
https://github.com/status-im/status-mobile/pull/15203
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Refactoring the derivation that fetches all the POMs, JARs,
and AARs in order to make it more generic and easier to extend.
The main change is adding `files` key in `deps.json` which contains
a dict of all the files reletad to given package.
This way we can more easily include other files that might be available
for download, like AARs with ASC suffix, or `nodeps` JARs.
This is also necessary for the React Native upgrade:
https://github.com/status-im/status-mobile/pull/15203
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Fixes#15230 - The popover state in the app db must be discarded before trying to
open the Activity Center. This workaround is used in other parts of the app too.
It's ugly, but the only quick fix I found.
It's plenty obvious the popover component and all its surrounding logic should
be revisited in the future.
Fixes#15215. Redesign the app db state for the Activity Center. Please, see the issue being fixed for more details about the problems being solved.
TL;DR: There's a lot less state to keep track and reconcile and way less nesting in the app db because we're only managing the state of the *current tab*, not all tabs.
Additionally:
- [x] While updating unit tests, found a bug on the sorting notifications' logic.
- [x] While updating unit tests, found a bug where notifications that are not of the type *contact request* were being removed from the app db.
- [x] Fixed regression where pressing on a notification would not open the chat.
- [x] Hardened unit tests.
#### Platforms
- Android
- iOS
##### Non-functional
- Less memory consumption.
- Faster reconciliation of notification coming from signals and from synchronous responses from RPC calls.
As discovered in:
https://github.com/status-im/status-mobile/pull/15225
The attempt to fix this in:
https://github.com/status-im/status-mobile/pull/15180
But it doesn't appear to work, so instead I'm allowing an override of
`NODE_BINARY` variable and spetting it when defining the Nix shell.
The key things here are:
* Xcode injects its own paths into `PATH` which breaks Nix env.
* Combining Nix shells with `inputsFrom` does not inherit all vars.
It's important to set these variables in `shellHook` and not elsewhere.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Make the popover delay in milliseconds configurable.
To open the Activity Center, 30ms delay seems to be more than enough. It's a quick fix because the current 250ms to open the AC gives the wrong impression to users (and confuses even us developers) who think the AC has a performance issue to open.
See issue https://github.com/status-im/status-mobile/pull/15222 for the full discussion.
* nix: update gradle dependencies
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* nix: include nodeps JARs in Gradle deps
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* nix: include nodeps JAR for semver4j 0.16.4
Can cause failures like in some cases:
```
A problem occurred configuring project ':react-native-hole-view'.
> Could not resolve all files for configuration ':react-native-hole-view:classpath'.
> Could not find semver4j-0.16.4-nodeps.jar (com.github.gundy:semver4j:0.16.4).
Searched in the following locations:
file:/nix/store/3n2pxsqa2izlx8c23s6jgqai0bqaklm1-status-mobile-maven-deps/com/github/gundy/semver4j/0.16.4/semver4j-0.16.4-nodeps.jar
```
Signed-off-by: Jakub Sokołowski <jakub@status.im>
---------
Signed-off-by: Jakub Sokołowski <jakub@status.im>
In some cases might result in failures due to empty shebang:
```
Command PhaseScriptExecution failed with a nonzero exit code
```
Because the script file looks like this:
```
\#!
set -o errexit
export NODE_BINARY="node"
export NODE_ARGS=" --openssl-legacy-provider --max-old-space-size=16384 "
bash -x ../node_modules/react-native/scripts/react-native-xcode.sh > ./react-native-xcode.log 2>&1
```
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Adds support for swiping left/right on some types of notifications. Swiping left
(from left to right) shows a blue button allowing the user to mark the
notification as read/unread. Swiping right (from right to left) shows a red
button, allowing the user to delete the notification for good.
Related PR in status-go https://github.com/status-im/status-go/pull/3201.
Fixes https://github.com/status-im/status-mobile/issues/14901
Fixes https://github.com/status-im/status-mobile/issues/14900
Technical notes
===============
How's the performance? It feels near native performance in a production release
in a mid-range smartphone. So I'd say it's pretty good, but let me know if you
find any issue.
- I refrained from trying to eliminate all code duplication in this PR. Some
notifications will behave differently, especially the ones with call to
action, so I ask you to please take that in consideration when reviewing. See
https://github.com/status-im/status-mobile/issues/15118
- React Native Gesture Handler has a component named
[Swipeable](https://docs.swmansion.com/react-native-gesture-handler/docs/api/components/swipeable/).
I used it instead of writing a monstrosity 👹 of code in
Reanimated to achieve the same results.
- RN Gesture Handler touchables are the only ones that work with the Swipeable
component, so I used them and added vars to `react-native.gesture`.
- I had to manually interpolate the translation X of the buttons behind
notifications because notifications are transparent. To make interpolation
work with `Swipeable` it's mandatory to use RN `Animated.View` and not
`Reanimated.View` (see next point).
- `Swipeable` expects us to pass functions that will receive RN
`AnimatedInterpolation` instances and the rendering lifecycle does not work as
usual. Hooks didn't trigger as expected, functional Reagent components didn't
behave as expected, etc. This means `Reanimated.View` and its interpolation
function is out of question. I did try for almost two days, nothing works.
Testing notes
=============
These are some of the manual tests I ran. There are more scenarios to cover
obviously. Assuming no unread notifications before each flow:
Contact request notification
============================
From the perspective of an user A:
1. Receive a contact request from a non-mutual contact B.
2. Verify the unread count is displayed over the bell icon.
3. Verify the unread count is displayed on the `Messages > Contacts` tab, as
well as on the AC `Contact requests` tab.
4. Open the AC and before accepting/declining the contact request, check that
you CAN'T swipe left or right.
5. Accept or decline the contact request.
6. Check the unread indicator disappears in all necessary places.
7. Press on the notification and see if you're redirected to the chat.
8. Go back to the AC and swipe left to mark as `Unread`. Notice that opening the
chat marks the notification as `Read`. Also very important, notice that the
`Messages > Contacts` tab will NOT show the *pending contact requests*
section at the top. This is on purpose, given the notification is unread, but
the user has already accepted/declined the contact request, hence it's not
pending.
9. Swipe left againg to mark as `Read`. Check all unread indicators are updated.
10. Swipe right to delete the notification (it won't be displayed ever again).
Admin notification
==================
1. Generate an admin notification, e.g. a community owner receiving a request
notification to join.
2. Verify the unread count is displayed over the bell icon, as well as the AC
Admin tab.
3. Verify the community unread indicator is correctly displayed.
4. As an admin, open the AC and before accepting/declining the request, check
that you CAN'T swipe left or right.
5. Accept or decline the membership request.
6. Check the unread indicator disappears accordingly.
7. Swipe left to mark as `Read`.
8. Swipe left to mark as `Unread`.
9. Swipe right to delete the notification (it won't be displayed ever again).
Mentions & replies
==================
Similar steps outlined for `Admin` notifications, but there's one important
difference. Mention and reply notifications don't require a call to action from
the user, so the user can swipe left/right **without** first having to do
anything on the notification (such as pressing on it). See issue
https://github.com/status-im/status-mobile/issues/15118
What about other types of notifications?
========================================
Swipe gestures for other notification types will be implemented in a separate
PR.
Otherwise Xcode uses system Node.js version which is different from Nix
version and can result in weird failures like:
```
admin@macm1-01.he-eu-fsn1.ci.devel:~/status-mobile % node --version
v16.19.0
admin@macm1-01.he-eu-fsn1.ci.devel:~/status-mobile % node --openssl-legacy-provider
node: bad option: --openssl-legacy-provider
admin@macm1-01.he-eu-fsn1.ci.devel:~/status-mobile % make shell
Configuring Nix shell for target 'default'...
[nix-shell:~/status-mobile]$ node --version
v16.17.1
[nix-shell:~/status-mobile]$ node --openssl-legacy-provider
Welcome to Node.js v16.17.1.
Type ".help" for more information.
>
```
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Fixes issue with following failure:
```
Failed to construct transformer: Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:71:19)
at Object.createHash (node:crypto:130:10)
at stableHash (/Users/jenkins/workspace/status-mobile/platforms/ios/node_modules/metro-cache/src/stableHash.js:19:8)
at JsTransformer.getCacheKey (/Users/jenkins/workspace/status-mobile/platforms/ios/node_modules/metro/src/JSTransformer/worker.js:471:7)
at getTransformCacheKey (/Users/jenkins/workspace/status-mobile/platforms/ios/node_modules/metro/src/DeltaBundler/Transformer/getTransformCacheKey.js:39:29)
at new Transformer (/Users/jenkins/workspace/status-mobile/platforms/ios/node_modules/metro/src/DeltaBundler/Transformer.js:147:28)
at /Users/jenkins/workspace/status-mobile/platforms/ios/node_modules/metro/src/Bundler.js:54:29
at runMicrotasks (<anonymous>)
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
```
https://roytuts.com/how-to-fix-err_ossl_evp_unsupported-in-react-js-application/
Signed-off-by: Jakub Sokołowski <jakub@status.im>
We were using old ID for the encryption compliance from old Org.
Because of this the iOS release builds failed at TestFlight upload:
```
Error: Asset validation failed Invalid Export Compliance Code.
The export compliance key value [1aa92c4d-6194-4d7d-b70a-16b48256b87e]
in the app's Info.plist doesn’t match the key value of the app’s export
compliance documentation.
To find the correct value, go to My Apps on App Store Connect. (90592)
```
Related:
- https://stackoverflow.com/questions/53326492/
- https://help.apple.com/app-store-connect/#/dev38f592ac9
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Otherwise we get multiple APKs in the `results` folder.
```
admin@linux-01.he-eu-hel1.ci.devel:/home/jenkins/workspace/status-mobile/e2e/status-app-prs % ls -l result
total 502236
-rw-r--r-- 1 jenkins jenkins 57334087 Feb 7 10:25 StatusIm-Mobile-230207-101618-991339-pr14988-x86.apk
-rw-r--r-- 1 jenkins jenkins 57080127 Feb 7 13:18 StatusIm-Mobile-230207-131114-098c05-pr14977-x86.apk
-rw-r--r-- 1 jenkins jenkins 57088322 Feb 7 14:19 StatusIm-Mobile-230207-141155-05cc4c-pr15002-x86.apk
...
```
And `utils.findFile()` just pick the first one alphabeticlly.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
- New section: Use [] instead of () in Reagent components: New section after
this comment https://github.com/status-im/status-mobile/pull/15005#discussion_r1098220176
- Updated section "Don't use percents to define width/height": reworded to
follow the style of the rest of the document.
- Update section "Accessibility labels": added example about avoiding dynamic
labels.
Using `copyArtifacts()` is more reliable and faster then fetching APKs
based on URLs acquired by parsing GitHub comments from Jenkins builds.
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Update certain `style.cljs` files to more strictly follow our guidelines. Except for animations and theme colors, *style* functions should be pure.
It turns out `style` namespaces are well behaved and are almost perfectly following guidelines 🚀
The motivation for the PR came from this thread https://github.com/status-im/status-mobile/pull/14925#discussion_r1090485454
Partially implements https://github.com/status-im/status-mobile/issues/14712Fixes#14744
### Summary
This PR implements the first, among what will probably be many different kinds of membership notifications. For this PR, I started with implementing a particular flow for private group chats because it's already supported by `status-go` (albeit I had to make some changes, see [PR in status-go](https://github.com/status-im/status-go/pull/3088).
1. `A` and `B` are mutual contacts.
2. `A` creates a private group chat with `B` as member.
3. `B` sees the group chat in the app, but doesn't interact with it.
4. `B` reinstalls the app (remember to back up the seed phrase).
5. `A` mentions `B` in the group chat.
6. `B` should see a group chat notification, which can be accepted/declined.
- [x] Also fixes#14744
### Demo
In the video I'm simulating the steps outlined in the *Summary*, but using the approach described in *Steps to test*, because it's way easier to iterate during development.
[demo.webm](https://user-images.githubusercontent.com/46027/212470798-c135d229-948d-4ba5-98db-ee73cc5495cd.webm)
### Review Notes
Some changes had to be made in `status-go` ([PR](https://github.com/status-im/status-go/pull/3088)), namely:
- According to [Figma](https://www.figma.com/file/eDfxTa9IoaCMUy5cLTp0ys/Shell-for-Mobile?node-id=3806%3A586901&t=xLTAjLXjG1UtorpI-0), users should be able to see `accepted` group chat notifications. Until now, `status-go` hardcoded that `accepted` notifications would *not* be returned in query results, and so it would be impossible to show them to users. This was changed and now the RPC endpoint accepts an additional filter. The implementation on the backend is backwards compatible so as to not break Status desktop.
- The `Membership` tab needs to display various types of notifications (group chat, community, etc), but the membership type doesn't exist on the backend. To overcome this constraint, this PR makes the membership type a logical/virtual type, i.e. a Clojure set of types. `status-go` was changed to support querying for multiple notification types (also backwards compatible).
#### Platforms
- Android
- iOS
### Steps to test
Please, follow the steps described in the Summary and you should be able to test.
But during development, I followed these steps (recommended by @cammellos). I documented them here for reference.
1. Checkout `feature/e2e` in status-go. Apply the diff below.
2. `cd cmd/e2e && ./e2e`
3. This will create a temporary account automatically, let's call it `A`.
4. On another device, create account `B`.
5. Follow the steps documented in https://github.com/status-im/status-go/blob/bdc406ea2e6eb990ce5c0fed7ea2e84b63c92139/cmd/e2e/README.md#L2 in order for user `A` to create a group chat with `B` as member. Don't make `A` and `B` mutual contacts.
6. On `B`'s device, a notification should appear, and `B` should be able to accept or decline the "invitation" (actually *invitation* is another concept and related to another feature).
```diff
modified cmd/e2e/main.go
@@ -283,6 +283,11 @@ func defaultNodeConfig(installationID string) (*params.NodeConfig, error) {
nodeConfig.NetworkID = 1
nodeConfig.LogLevel = "ERROR"
nodeConfig.DataDir = "/ethereum/mainnet_rpc"
+ nodeConfig.HTTPEnabled = true
+ nodeConfig.HTTPPort = 8545
+ nodeConfig.HTTPHost = "localhost"
+ nodeConfig.HTTPVirtualHosts = []string{"localhost"}
+
nodeConfig.APIModules = "wakuext,ext,waku"
nodeConfig.UpstreamConfig = params.UpstreamRPCConfig{
modified protocol/messenger_group_chat.go
@@ -26,17 +26,17 @@ func (m *Messenger) validateAddedGroupMembers(members []string) error {
}
contact, _ := m.allContacts.Load(contactID)
- if contact == nil || !(contact.Added && contact.HasAddedUs) {
- return ErrGroupChatAddedContacts
- }
+ if contact == nil {
+ contact, err = buildContactFromPkString(contactID)
+ if err != nil {
+ return err
+ }
+ }
}
return nil
}
func (m *Messenger) CreateGroupChatWithMembers(ctx context.Context, name string, members []string) (*MessengerResponse, error) {
- if err := m.validateAddedGroupMembers(members); err != nil {
- return nil, err
- }
var response MessengerResponse
logger := m.logger.With(zap.String("site", "CreateGroupChatWithMembers"))
```
* [Fix][#14823] Admin Notification unread issue
* [Fix][#14823] Changed dispatch of event from the PR feedback
* [Fix][#14823] Organize dispatch of event from the PR feedback
* [Fix][#14823] Organize dispatch of event from the PR feedback
* make sure node uses the UTC timezone
we have a few timebomb tests in the codebase that would break and making sure node specifies a timezone fixes them.
The linter would fail if there were removed files, as it would
try to lint them but would not find them.
Similarly, untracked files would not be linted.
This commit changes the behavior so that untracked files are linted and
removed files are ignored, that way we can run it before committing if
there are unstaged changes that include removed/untracked files.
This commit adds a new helper method `executeRunnableStatusGoMethod`
The helper method accepts arguments and calls the status go method in a new thread.
* [Feature][#14550] Added Replies UI in Activity Center
* [Fix][#14550] Removed underlay color from touchables in Replies UI in Activity Center
* [Fix][#14550] Comments from review
* [Fix][#14550] Comments from review
* [Feature][#14550] Added community support on tags in AC
* [Feature][#14550] Date utils test
* we are now able to navigate to desktop communities
https://github.com/status-im/status-go/compare/b4bdfd3d...d2e95eee
In this commit we add support for various status-go methods in mobile :
- `multiformatSerializePublicKey`
- `multiformatDeserializePublicKey`
- `compressPublicKey`
- `decompressPublicKey`
- and my personal favourite `deserializeAndCompressKey`
When someone pastes a community joining share url into chat and taps on it, we check whether the community was generated on a desktop or mobile.
We need to do this because currently both the clients have different urls for joining a community.
Once we have identified that the url is generated via desktop we then convert that url to something that the mobile client is used to.
This enables the mobile client to view this community and interact with it.
However more work needs to be done in the future to ensure that mobile implements these compressed keys end to end, we need to get this feature in so that
by the time RC1 is released mobile client is able to join communities created by Desktop.
* [Update][#14555] Channel name update in Context Tag
* [Update][#14555] Changes requested on Context Tag Component
* [Update][#14555] Changes requested on Context Tag Component
Adding a series of // characters (i.e., a "comment bar") above every method in an Objective-C file would not provide any real benefit, and would in fact be redundant, as the method list in Xcode already serves as a visual separator for methods in a class.
The #pragma mark directive, is a more concise and effective way to add separators and group related methods in a class. We should use #pragma mark to create a separator line and add a heading to describe the methods in a particular section.
* ui for local pairing
lint-fix
removed un-necessary +
addressing some of the feedback on PR
more feedback + removing feature toggle from ui
getting rid of comments/log messages over here
tidy up logs
fix typos and more i18n stuff
swap % with a named parameter
getting rid of global state + lint-fix
get rid of un-used function
icon guidelines and more kebab case stuff :>
moving stuff to events and utils namespace
:main-icons -> :i :)
address feedback and adhere to guidelines etc
fixed the :t/ qualification
moree feedback :-D
referring status-im.utils.security for now
adding "cs" to constants
make tests pass
re-frame to rf
addressing feedback
moving icons to icons2 & renaming stuff
trying to make this file the way it was before
missed out on updating these references
getting rid of the icons moved to icons2
This reverts commit be8552c0d3daaf7a7333cfeaf304d97c86d50d3e.
fixing mistakes
getting rid of the s
* this rename makes sense to me
* adding an alias to the view
* fixed broken up namespaces
We are trasnferring the Apple app to the new Switzerland based Apple
development organization/team from the old Singapore one, and to make
this work we also need to update the development team ID.
This should fix the following failure:
```
Could not find App ID with bundle identifier 'im.status.ethereum'
You can easily generate a new App ID on the Developer Portal using 'produce':
```
https://ci.infra.status.im/job/status-mobile/job/platforms/job/ios/854/console
Signed-off-by: Jakub Sokołowski <jakub@status.im>
* [Feature][#14352] Added mentions in Activity Center
* [Update][#14352] Update in namespace
* [Update][#14352] Code Style
* [Update][#14352] Created commons for AC and fix warning on text
* [Fix] Activity Centre UI bug
* [Fix] Namespace update for config
* [Chore] Moved navigation to Activity Center as reframe event
* [Chore] Code Format
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="80"/>](https://play.google.com/store/apps/details?id=im.status.ethereum)
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="80"/>](https://f-droid.org/packages/im.status.ethereum/)
[<img src="doc/github_badge.png" alt="Get it on Github" height="80"/>](https://github.com/status-im/status-mobile/releases)
Join us in creating a browser, messenger, and gateway to a decentralized world. Status is a free (libre) open source mobile client targeting Android & iOS built entirely on [Ethereum](https://ethereum.org/) technologies. That's right, no middle men and `go-ethereum` running directly on your device.
[Get it on Github](https://github.com/status-im/status-mobile/releases)
Join us in creating a browser, messenger, and gateway to a decentralized world. Status is a free (libre) open source mobile client targeting Android & iOS built entirely on [Ethereum](https://ethereum.org/) technologies. That's right, no middlemen and `go-ethereum` running directly on your device.
[](https://www.youtube.com/watch?v=oDCSEmS9c3o "Getting started with Status")
## Why?
We believe in a medium of pure free trade, economies with fair, permission-less access and a world without intermediaries. We want to create policies that can exist between friends or scale globally, we want to communicate securely and be uninhibited by legacy systems.
We believe in a medium of pure free trade, economies with fair, permission-less access and a world without intermediaries. We want to create policies that can exist between friends or scale globally, we want to communicate securely and be uninhibited by legacy systems.
We want to take responsibility for our data, the way we conduct ourselves privately and promote this way of life to a mass audience.
We want to take responsibility for our data, and the way we conduct ourselves privately and promote this way of life to a mass audience.
We want deep insights into our own economies so we can make informed, data-driven decisions on how to make our lives better. The Ethereum blockchain, Smart Contracts, Swarm and Whisper provides us a path forward.
We want deep insights into our own economies so we can make informed, data-driven decisions on how to make our lives better. The Ethereum blockchain, Smart Contracts, Swarm and Whisper provide us with a path forward.
If this interests you, **help us make Status a reality** - anyone can contribute and we need everyone at any skill level to participate.
## How to Contribute?
Go straight to the [docs](https://status.im/docs) or [join our chat](https://join.status.im/chat/public/status) and choose what interests you:
Go straight to the [docs](doc/) and choose what interests you:
- **Developer**
Developers are the heart of software and to keep Status beating we need all the help we can get! If you're looking to code in ClojureScript or Golang then Status is the project for you! We use React Native and there is even some Java/Objective-C too!
Want to learn more about it? Start by reading our [Developer Introduction](https://status.im/developer_tools/) which guides you through the technology stack and start browsing [beginner issues](https://github.com/status-im/status-mobile/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20). Then you can read how to [Build Status](https://status.im/technical/build_status/), which talks about managing project dependencies, coding guidelines and testing procedures.
- **Developer** Developers are the heart of software and to keep Status beating
we need all the help we can get! If you're looking to code in ClojureScript or
Golang then Status is the project for you! We use React Native and there is even
some Java/Objective-C too! Want to learn more about it? Start by reading our
[Developer Introduction](doc/starting-guide.md) which guides you
through the technology stack and start browsing [beginner
Status](doc/starting-guide.md), which talks about managing
project dependencies, coding guidelines and testing procedures.
Check out our [coding guidelines](doc/new-guidelines.md).
- **Community Management**
Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and longlasting relationships you form will be well worth it, check out our [Mission and Community Principles](https://status.im/about)
- **Community Management**
Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and the long-lasting relationships you form will be well worth it, check out our [Mission and Community Principles](https://status.app/manifesto)
- **Specification / Documentation**
John Dewey once said "Education is not preparation for life; education is life *itself* ". Developers & Designers need guidance and it all starts from documentation and specifications. Our software is only as good as its documentation, head over to our [docs](https://status.im/docs) and see how you can improve what we have.
- **Specification / Documentation**
John Dewey once said, "Education is not preparation for life; education is life *itself* ". Developers and Designers need guidance and it all starts from documentation and specifications. Our software is only as good as its documentation, check out our [docs](doc/) and see how you can improve what we have.
- **Blog Writing**
Content is King, keeping our blog up to date and informing the community of news helps keep everyone on the same page. [Jump into our chat](https://join.status.im/chat/public/status) and discuss with the team how you can contribute!
- **Blog Writing**
Content is King, keeping our blog up to date and informing the community of news helps keep everyone on the same page.
- **Testers**
It's bughunting season! Status is currently under active development and there is sure to be a bunch of learning, [build status from scratch](https://status.im/technical/build_status/) or if an android user check out our [nightly builds](https://status.im/nightly). You can shake your phone to submit bug reports, or start browsing our [Github Issues](https://github.com/status-im/status-mobile/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy!
- **Testers**
It's bug-hunting season! Status is currently under active development and there is sure to be a bunch of learning, [build status from scratch](doc/starting-guide.md) or if an android user checks out our [nightly builds](https://status.im/nightly). You can shake your phone to submit bug reports, or start browsing our [Github Issues](https://github.com/status-im/status-mobile/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy!
- **Security**
- **Security**
Status is a visual interface to make permanent changes on the Blockchain, it handles crypto-tokens that have real value and allows 3rd party code execution. Security is paramount to its success. You are given permission to break Status as hard as you can, as long as you share your findings with the community!
- **Evangelism**
Help us spread the word! Tell a friend *right now*, in fact tell **everyone** - yell from a mountain if you have to, every person counts! If you've got a great story to tell or have some interesting way you've spread the word about Status let us know about it in our [chat](https://join.status.im/chat/public/status)
## Status API
View our [API Docs](https://status.im/developer_tools/status_web_api.html) and learn how to integrate your DApp into Status. You can read more about how to add your DApp to Status [here](https://status.im/developer_tools/add_your_dapp.html).
- **Evangelism**
Help us spread the word! Tell a friend *right now*, in fact, tell **everyone** - yell from a mountain if you have to, every person counts! If you've got a great story to tell or have some interesting way you've spread the word about Status let us know about it in our [chat](https://join.status.im/chat/public/status)
## Give me Binaries!
You can get our Beta builds for both Android and iOS on our [website](https://status.im), through our [nightly builds](https://status.im/nightly/) or by [building it yourself](https://status.im/technical/build_status/).
You can get our Beta builds for both Android and iOS on our [website](https://status.app), through our [nightly builds](https://status.im/nightly/), or by [building it yourself](doc/starting-guide.md).
## Core Contributors
@@ -60,12 +67,8 @@ Without the dedication of these outstanding individuals, Status would not exist.
## Contact us
Feel free to email us at [support@status.im](mailto:support@status.im) or better yet, [join our chat](https://join.status.im/chat/public/status).
Feel free to email us at [support@status.im](mailto:support@status.im).
## License
Licensed under the [Mozilla Public License v2.0](https://github.com/status-im/status-mobile/blob/develop/LICENSE.md)
// disable PNG optimization as for some reason it cannot be trusted to provide deterministic output (see https://f-droid.org/en/docs/Reproducible_Builds/)
Log.v("RNBootstrap","Available system memory "+getAvailableMemory(activityManager).availMem+", maximum usable application memory "+activityManager.getLargeMemoryClass()+"M");
setSecureFlag();
// NOTE: Try to not restore the state https://github.com/software-mansion/react-native-screens/issues/17
// Make sure we get an Alert for every uncaught exceptions
registerUncaughtExceptionHandler(this)
// Report memory details for this application
valactivityManager=getActivityManager()
Log.v("RNBootstrap","Available system memory "+getAvailableMemory(activityManager).availMem+", maximum usable application memory "+activityManager.largeMemoryClass+"M")
setSecureFlag()
// NOTE: Try to not restore the state https://github.com/software-mansion/react-native-screens/issues/17
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.