Compare commits

...
Author SHA1 Message Date
Andrey Shovkoplyas ff6cb2292d fix crash on ios
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-05-02 11:43:45 +02:00
Andrey Shovkoplyas 25727bc281 1.3.1 2020-05-02 11:43:45 +02:00
Andrea Maria Piana 00d63edf93 Handle when message confirmations arrive out of order.
In some cases message confirmations might arrive out of order, before
status-go calls the callback for a sent message.

This commit changes the behavior so that confirmations out of order are
not ignored and they are checked when the callback for sending message
is called.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-22 16:56:05 +02:00
Andrey Shovkoplyas 67ceb74c6e [#10396] Quoted text (using markdown) in dark mode is hardly visible
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-22 15:58:38 +02:00
Andrea Maria Piana 4aa90f2b9b Fix replies emoji messages
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-21 15:00:14 +02:00
Andrey Shovkoplyas 51ce235948 [#10369] App freezes on transaction signing after entering wrong password
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-20 20:05:36 +02:00
Andrey Shovkoplyas cf63839a86 [#10366] App Dark mode: signing phrase+message not visible when Signing message in Dapps
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-20 14:36:38 +02:00
Andrey Shovkoplyas 4904e923a5 enable group chats 2020-04-17 17:52:53 +02:00
Andrey Shovkoplyas 427d9f05a1 1.3.0 2020-04-17 16:54:16 +02:00
Andrey Shovkoplyas de4e73a256 signals processing performance improvements [#10287]
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-17 16:52:02 +02:00
Roman Volosovskyi c9308af4d8 [#10277] [keycard] Fix tx signing for derived accounts 2020-04-17 16:57:45 +03:00
Jonathan Rainville 4f120d99f7 fix: show message when loading new transactions instead of no tx msg
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-17 11:43:38 +02:00
Andrey Shovkoplyas cc70a7e8da [#10203] Endless spinner when sending two TX in a batch in Dapp
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-17 10:31:39 +02:00
yenda aebe68fa1a fix #8717 change ens welcome screen
english only
needs work for translations

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-17 10:29:41 +02:00
jakub d68b757589 upgrade Xcode to 11.4.1
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-16 22:13:47 +02:00
Andrea Maria Piana 28a2bca012 Get replies directly from status-go
Fixes: #10297
Fixes: #10274

Before if a reply was missing (for example if it the message replied to
arrived after the reply) status-react would subscribe to it dynamically
and use that. This caused some flickering issues when offloading the
messages from the database, as the message being replied to would be
offloaded and later loaded back again, triggering scroll and ending up
in a loop.

This commit changes the behavior so that status-go always adds the
reply to the message. In case the message being replied to arrives after
the reply, this will be included in the message update, and status-react
will replace it in the local storage.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-16 15:54:33 +02:00
yenda 23af624305 fix #10052 make finding the public key easier in profile
Signed-off-by: yenda <eric@status.im>
2020-04-16 13:33:49 +02:00
jakub 035e07f7be upgrade to Xcode 11.4
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-16 12:56:03 +02:00
Michael Bradley, Jr 0a9919c991 fix: strip leading and trailing whitespace from QR Code data
All leading and trailing whitespace is now removed from strings derived from QR
codes, both in the case of `get-qr-code-data` (real camera) and
`qr-test-view` (mock camera).

Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-16 12:02:11 +02:00
Roman Volosovskyi c94977c8d3 [keycard] Faster multiacc creation and login 2020-04-16 12:11:16 +03:00
jakub ae411a432f fix Gradle permission errors during build
Specifically:
org.gradle.internal.service.ServiceCreationException: Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory().
Caused by: org.gradle.api.UncheckedIOException: Failed to create parent directory '/build/project/android/.gradle/5.6.4' when creating directory '/build/project/android/.gradle/5.6.4/fileHashes'

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-16 10:47:17 +02:00
yenda 5307fdfbce fix #10039
- wasn't able to reproduce the issue as it seems that all inputs are already
properly turned to lower case
- added :auto-capitalize :none property to the input field though to ensure
the keyboard doesn't force the user to start with an uppercase later

Signed-off-by: yenda <eric@status.im>
2020-04-16 00:50:02 +02:00
yenda 7046543533 fix autoCapitalize warning
Signed-off-by: yenda <eric@status.im>
2020-04-16 00:49:00 +02:00
Gheorghe Pinzaru c9e6f0aff7 Add animation to wallet header transition
Add reanimated lib

Wallet header animation

Animate android elevation

Move constants into styles

Ensure line width

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-04-15 17:41:15 +03:00
Churikova Tetiana 7a89b2852a fix nightly e2e + new scan EIP qr e2e
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-04-15 16:28:58 +02:00
yenda a5a00e0a2c fix #10058 wrong domain name shown when connecting .eth
add a check on the function that adds the stateofus domain to
usernames. if the username already contains a domain, don't
concat stateofus domain to it

Signed-off-by: yenda <eric@status.im>
2020-04-15 12:21:10 +02:00
Vitaliy Vlasov e11385e350 Add web3.keycard.signTypedData
Signed-off-by: Vitaliy Vlasov <siphiuel@gmail.com>
2020-04-14 20:07:35 +03:00
jakub 1b43e4c16b fix Android build on MacOS due to lack of OS var
changes:
- Drop use of /dev/stderr, doesn't work on MacOS
- Use uname -s instead of $OS which was removed
- Remove leading whitespace that fucks with Nix
- Check if `/etc/os-release` exists before reading it

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-14 18:31:52 +02:00
jakub 5c8a8e83ac show proper error if nkd-build is missing
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-14 18:31:36 +02:00
Pascal Precht 64580f0ad1 Show correct error message when signing typed data
Prior to this commit `sign-message-completed` effect would always use
the `wrong-password` label for error handling. We now ensure that `wrong-password`
is only used in case the error in question has a code `5`, which is
associated to unmatching passwords.

In any other case we'll use the `message` attached to the `error`.

Fixes #8275

Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-14 18:17:43 +02:00
jakub 435c6a7943 update help messages in Makefile targets
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-14 15:08:19 +02:00
hesterbruikman a1a64ce5f4 Update en.json
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-14 15:00:27 +02:00
hesterbruikman 75c5a13d7b Minor copy changes wallet
Set default currency > Set currency
These three words prove that a transaction is safe. > You should see these 3 words before signing each transaction
You should see these words before signing each transaction. If you don’t, cancel and sign out. > If you see a different combination, cancel the transaction and sign out

Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-14 14:59:39 +02:00
jinhojang6 6424c59c8b Update Russian, Korean, and Chinese translation
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-14 14:58:19 +02:00
Andrea Maria Piana a9c580e82c Increment retry count when ENS fails to verify
When an ENS name fails to verify, we should increment the retry count so
that it back offs. All the changes are in status-go.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-14 14:26:01 +02:00
Serhy 453c1bf824 Logging in networks
Signed-off-by: Serhy <sergii@status.im>
2020-04-14 14:50:33 +03:00
Gheorghe Pinzaru ea3735d938 Add profile screen in profile stack
Fixes #7437

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-04-14 13:42:12 +03:00
Andrey Shovkoplyas 45dae49fc0 qr testing mode, fixed qr pure address and EIP681 issues
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-14 11:53:01 +02:00
Andrea Maria Piana e813d1e4e4 Use ms instead of seconds
Fixes: #10249

We were using seconds instead of seconds, therefore the gap would always
end up as last.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-14 08:58:49 +02:00
Roman Volosovskyi fee6864d56 [#10272] Hide key-uid from keycard login screen 2020-04-13 14:25:40 +03:00
Roman Volosovskyi 962d0fb6cd [#9665] Allow to change pin after keycard multiacc creation 2020-04-10 18:50:16 +03:00
Gheorghe Pinzaru c41727c1b3 Add minor improvments to text input
Set font-size and line-height for text-input

Add min height to seed phrase

Min 3 lines for phrase fixes #10121

Increase touchable area for text-input

Fix wrong styles on mailserver inputs

Fix wallet wrong styling on text input

Make seed phrase centred on ios

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-04-10 15:24:45 +03:00
Churikova Tetiana 966b6e5a33 refactor group e2e + send_stt_in_1_1 + deleted obsolate e2e
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-04-10 13:05:24 +02:00
Gheorghe Pinzaru 461b6cdb74 Update the UI for the group chat
Add search for contacts

Add format name inside contact

Add back button on create group

Fix current contact name and alias

fixup

Update UI for group chat profile

Fix tests

Ui clean up

fix change group chat name

Add leave group chat option

Hide options if user has left the chat

Use modal for all required chat screens

Add dark mode to group chats

Fix offset 10 pt off screen on presentation modals

Wrap keyboard avoiding view with safe area offset

Keep only leave chat

Fix search input focus

Make edit name active when title not changed

Fix lint

review cleanup

QA review

Fix group chat inviter name

Fit flat list into container

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-04-10 13:58:04 +03:00
Roman Volosovskyi 8b9a245f54 [#10275] Can't finish card setup if creating card flow is canceled on PUK / Pairing code screen 2020-04-09 16:59:27 +03:00
Roman Volosovskyi 8b4bc0290a [#10199] fix No message when sending funds in 1-1 chat with keycard 2020-04-09 11:34:30 +03:00
jakub 0cc7ec92bd fix displaying of version and build number in app
Changes:
- Includes `VERSION` file in source for `jsbundle` derivation
- Includes `BUILD_NUMBER` file and it's generation scripts
- Includes minimal `.git` files to make `git rev-parse --short HEAD` work
- Implements `ignoreVCS` for `mkFilter` to be able to include `.git` files
- Adds missing `git` and `bash` to `buildInputs` for `jsbundle` derivation
- Dropped `bash -c` from Clojure code calling `git`

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-08 22:55:53 +02:00
Andrea Maria Piana 55a955d8dd Load messages on will-focus
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-08 17:45:52 +02:00
Roman Volosovskyi 19fdced2bc update tooltip in recover view
Signed-off-by: Serhy <sergii@status.im>
2020-04-08 13:01:42 +03:00
jakub 47eb863a3c nix: add cleaning up status-go sources
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-07 18:19:21 +02:00
jakub 5b1e0b3bdf nix: fix status-go source override
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-07 18:19:12 +02:00
Churikova Tetiana 901f091929 tooltips e2e
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-04-07 17:00:58 +02:00
Andrea Maria Piana c2d129d04e Fix mark as read for hidden messages
If a message is hidden and is not currently loaded, it will not be
marked as read, resulting in the count being always positive. To avoid this
we always mark it as read, and from the backend we return whether it has
been marked as read or was already seen.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-07 13:27:06 +02:00
Andrea Maria Piana a914334fed Fix incorrect loading of messages
In some instances when receiving messages from a mailsever in the chat
you are in, the flag `all-loaded?` would not be reset, meaning that
messages not in the current view would be added to the db, but would not be seen until actually
reloading the chat (go back home, open again).

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-07 11:42:41 +02:00
Vitaliy Vlasov 749faaeb1b Update react-native-webview to 8.0.7_6; use shouldInterceptRequest on
Android

Signed-off-by: Vitaliy Vlasov <siphiuel@gmail.com>
2020-04-07 12:32:05 +03:00
jakub 5ddd605328 fix missing asset images
jsbundle derivation needs to have images available because it stat's
them to verify they exist. They are actually included by Gradle.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-04-07 09:24:45 +02:00
Roman Volosovskyi 9df455088e [#8567] Accessible tooltips for e2e tests 2020-04-07 09:21:36 +03:00
Serhy 14d1a6cfb2 Mark all as read in public and e2e fix
Signed-off-by: Serhy <sergii@status.im>
2020-04-06 20:49:00 +03:00
Andrea Maria Piana e7a213fe95 Validate enode url when blank
Fixes: #7333

Validates enode url if blank as well, so `Save` button is disabled.
Handles as well if for any reason invalid values are passed.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-06 09:20:18 +02:00
jinhojang6 5eea4ba218 Update translations and remove unreviewed languages
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-06 08:38:09 +02:00
Churikova Tetiana 9b6e7cad6d basic e2e keycard
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-04-03 17:11:58 +02:00
Serhy efab1d30ed E2E to receive message while in different tab
Signed-off-by: Serhy <sergii@status.im>
2020-04-03 14:11:57 +03:00
Roman Volosovskyi 151b6a3cbf Disable keycard on ios 2020-04-03 11:42:55 +03:00
Roman Volosovskyi 71ab9c9d9d Disable keycard testing menu (#10236 leftover) 2020-04-02 15:21:07 +03:00
Roman Volosovskyi 45b296a2c5 [#10243] Handle wrong pin on keycard account creation 2020-04-02 15:17:43 +03:00
Roman Volosovskyi f1e83158d9 Testing menu for keycard e2e tests 2020-04-02 15:10:29 +03:00
Churikova Tetiana ff9cd359e9 3 e2e commands and skip e2e due to bug
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-04-02 12:35:16 +02:00
Andrea Maria Piana e5dbac877e Handle new universal links
Fixes: #10192
Fixes: #10083
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-04-01 21:51:42 +02:00
André Medeiros c47aca0ddb Fix camera usage description (#10263)
* Fix camera usage description

* Remove contacts usage description as we never access those
2020-04-01 13:19:02 -04:00
yenda b344322475 fix ens contenthash resolution
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-01 13:52:04 +02:00
yenda 430a8fb27c fix ens contenthash resolution
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-01 13:02:48 +02:00
Andrey Shovkoplyas 3d1a1c5be9 [#10077] Can't accept agreement on ENS registration when app translated into French
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-04-01 12:22:16 +02:00
jakub fd0a328106 Revert "use default target for run-android"
This reverts commit 9243daa405.
2020-04-01 09:52:57 +02:00
jakub 9243daa405 use default target for run-android
this should stop rebuilds of things like
- status-react-patched-npm-gradle-modules
- status-react-source-gradle-install

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-31 17:18:12 +02:00
jakub f75cb14588 refactor and simplify mkFilter, use more restrictive rules
This should reduce rebuilds of status-react-npm-gradle-modules

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-31 17:03:39 +02:00
Gheorghe Pinzaru 12bcd79c2c Clear text input on blur
Fixes #10237

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-31 15:59:35 +03:00
Volodymyr Kozieiev 9e5cc74ea9 Loading indicator shown when prices loading is in progress
Signed-off-by: Volodymyr Kozieiev <vkjr.sp@gmail.com>
2020-03-31 15:06:18 +03:00
yenda 49fd306f25 disable biometric auth when device can't save password (rooted)
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-31 14:04:27 +02:00
Andrey Shovkoplyas fc1bc48fdc ignore back button on signing panel
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-31 12:53:09 +02:00
jinhojang6 c5ec451692 Update Filipino, Indonesian, Korean, and Chinese translation
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-31 10:59:08 +02:00
Andrea Maria Piana 97a953cc64 Upgrade status-go
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-03-30 15:50:10 +02:00
Andrea Maria Piana dcca501b0a Enable waku node default
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-03-30 10:59:29 +02:00
Churikova Tetiana 2f53c7f914 removed log level testing for release build
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-03-30 10:31:55 +02:00
Andrey Shovkoplyas 2122c5518f fix colors android
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-27 15:36:09 +01:00
jakub 5fab3268bd allow lint stage fail in CI and still upload build result
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-27 09:19:46 +01:00
Andrey Shovkoplyas fb86b4d367 switch control color android
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-26 16:40:25 +01:00
Andrey Shovkoplyas 5a955cd4d2 fix short version
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-26 15:45:43 +01:00
Serhy a7c2ecda42 Remove label 2020-03-26 13:18:57 +01:00
jinhojang6 a090a059ec add Filipino translation 2020-03-26 13:18:56 +01:00
Churikova Tetiana 68f0a02cbc fix e2e
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-26 10:36:21 +01:00
Andrey Shovkoplyas a447bed4ac dark mode 2020-03-26 08:34:13 +01:00
jakub efc2fa9cf2 use the proper source of publish method
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-25 17:10:24 +01:00
Roman Volosovskyi 3760d2a2e5 [#10197] More retries when requesting balances 2020-03-25 17:10:21 +02:00
Roman Volosovskyi c9cdd48849 [#9705] fix java.lang.IllegalArgumentException: 16 > 0 after entering PIN code 2020-03-25 16:47:18 +02:00
Artur Zabeyvorota cda7564bbe [#9657] system messages ui changes in group chat
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-03-25 15:33:41 +01:00
Gheorghe Pinzaru 81070f07b0 Fix android tabbar animation
Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-25 16:10:46 +03:00
Vitaliy Vlasov dd7b3c21ae Unlink webview
Signed-off-by: Vitaliy Vlasov <siphiuel@gmail.com>
2020-03-25 14:34:18 +02:00
jakub 0306f1cfbd ci: re-add Play Store upload case for release
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-25 11:17:06 +01:00
Churikova Tetiana 5809cba0df 1-1 send ETH test
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-03-25 10:33:47 +01:00
Vitaliy Vlasov 85d0022b26 Use community WebView
Signed-off-by: Vitaliy Vlasov <siphiuel@gmail.com>
2020-03-24 18:07:03 +02:00
Vitaliy Vlasov 86d85df5d3 Use atom for webview ref instead of storing it in re-frame's db
Signed-off-by: Vitaliy Vlasov <siphiuel@gmail.com>
2020-03-24 11:48:41 +02:00
Roman Volosovskyi b6e0bb0a0e [#9686] Fix brief change of identiocon on keycard login 2020-03-24 08:43:12 +02:00
Andrey Shovkoplyas 2272fafc05 [#9962] Update prices in fiat more frequently
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-21 12:15:54 +01:00
jinhojang6 1e44b433c5 update Spanish and Latin American Spanish translations
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-19 18:30:10 +01:00
Churikova Tetiana 2f446a73bb fix e2e + disable e2e deep links
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-03-19 17:38:06 +01:00
Roman Volosovskyi 53883e4be1 [#10183] Fix balance updating on first transaction 2020-03-19 15:50:46 +02:00
Roman Volosovskyi fadda87ac2 [#9680] Show proper storage for keycard accounts 2020-03-19 14:25:11 +02:00
jinhojang6 9496bfa2a8 update Italian translations
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-19 12:15:28 +01:00
vidal cd02175144 Adding BTU (BTU Protocol) token
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-19 12:14:38 +01:00
Gheorghe Pinzaru ed8b5b265b Handle hardware back on popover and bottom sheet
Closes all popovers. Fixes #9992

Add hardware back button on bottom sheet

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-19 13:20:54 +03:00
Roman Volosovskyi ebf2600fdc [#10101] Reintroduce account generation on keycard multiaccount 2020-03-19 11:42:24 +02:00
Gheorghe Pinzaru d24f4690b8 Fix failing test for navigation task
Handle default case for ens confirmation

Before navigation away the registration state is cleared and case does not handle default value for nil

Remove extra space on home button

Remove outdated options

Fix e2e

Change navigation replace arguments as per rn5

Fixes #10178

Dispatch navigation later

Do not restore state for react-native-screens

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-18 17:47:03 +03:00
Volodymyr Kozieiev d2478bbd34 use 'next' label when sending transaction requires a sign
Signed-off-by: Volodymyr Kozieiev <vkjr.sp@gmail.com>
2020-03-18 16:43:05 +02:00
jakub 4a7c03b1cc avoid building jsbundle twice, drop jsbundle stage
Because we run nix/scripts/clean.sh after building JSBundle it is
removed from Nix store and can't be reused in the Bundle stage.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-17 22:11:54 +01:00
Churikova Tetiana 8aff7f487d refactoring e2e
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-03-17 18:37:16 +01:00
Gheorghe Pinzaru a2b2f55996 Use react native screens on ios and android
Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-17 19:56:26 +03:00
jinhojang6 009ea990bc remove outdated translations and add new translations
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-17 16:55:00 +01:00
Gheorghe Pinzaru d823a2082a Update react navigation and rework wrapper
Get rid of navigation wrapper

Use new API to declare navigation

Update tabbar component

Update to use new navigation events

Add ios presentation modal

Navigation cleanups

Android specific updates

Use letsubs for stack subscriptions

Keycard did load event backward compatibility

Fix tabbar and wallet on-focus bad rebase

Do not keep welcome screen into the stack

Comment outdated test

Fix rebase on home PR

Cancel back button on screens which can't be popped

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-17 11:52:31 +03:00
Roman Volosovskyi 61d465a343 Ensure that keycard flows continue when card is already connected
This commit ensures that a user can flawlessly interact with a keycard,
regardless of the moment when the card was tapped to the device. To make
it so:
- in case if the card was tapped before the interaction the user doesn't
  need to re-connect card to continue
- in case if the connection with the card was lost during the interaction
  the application restarts that interaction as soon as the card was
  connected again (unless the user canceled the flow)
2020-03-16 14:58:25 +02:00
Andrea Maria Piana 947b1c2b2e Correctly load messages when on tab
While on tabs we want a slightly different behavior:
Unread counter should increase, message should be loaded in the chat
On moving to the chat tab from one of these tabs, it should mark the
messages as seen.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-03-16 13:34:07 +01:00
jakub 2f412d95ee nix: rename adb target to android-env
Makes more sense since it contains entire Android SDK and NDK.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-16 12:11:08 +01:00
jakub eb5fe57e90 fix keystore generation, pass keystore vars to build
Changes:
* Drop --keep from nix/scripts/build.sh as it does nothing
* Allow scripts/release-android.sh take passwords from env
* Use env file in extra-sandbox-paths to pass keystore passwords
* Quote ever segment of Nix options to avoid parsing errors

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-16 12:11:00 +01:00
Gheorghe Pinzaru 10fab4e77c Add billing permission android
Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-16 12:26:41 +03:00
Andrea Maria Piana 619e176087 Set waku mode dynamically
This commit allows setting waku-mode and waku-bloom-filter-mode
dynamically.
It requires a relogin for the changes to take effect.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-03-16 08:09:27 +01:00
Andrey Shovkoplyas b8861c6c14 [#10141] Unable to login to multiaccount if it is already restored as account in another multiaccount (IOS)
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-12 14:21:56 +01:00
Andrey Shovkoplyas 3cf282e75a fixes home loading indicator
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-12 12:33:45 +01:00
Roman Volosovskyi 4f95e0bcf4 [#10011] Listen to nfc state changes 2020-03-12 09:04:41 +02:00
Andrey Shovkoplyas c4a7849c9d chat screens performance
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-12 07:39:08 +01:00
jakub 4e567cf782 use status-react-jenkins as CI library
This PR extracts all the ci/*.groovy scripts into a separate private repo located at:
https://github.com/status-im/status-react-jenkins

The main reasons for a separate repo are:

* Hiding the internal details of our CI setup
* Hiding names of Jenkins credentials available in CI jobs
* Lowering attack surface for malicious external contributors
* Increasing focus on PRs related to CI setup

You can read more about how Jenkins pipeline shared libraries work here:
https://jenkins.io/doc/book/pipeline/shared-libraries/

In simple terms I've added the repo to the main Jenkins configuration in "Global Pipeline Libraries" section and load it using:

  library 'status-react-jenkins@master'

Which makes globally available all of the libraries defined in the `vars` directory of that repo.
This also eliminates the need for statements like `android = load 'ci/android.groovy'`.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-11 19:11:36 +01:00
Gheorghe Pinzaru 826b7df982 Use new keycard flow with animation
Remove screens that are not needed for new flow

Replace keycard flows with new interaction

If card connected start processing on sheet open

Remove outdated pin screens

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>

Do not hide sheet when tag was lost during generating keys

Change cancel action for no-key on card recovery

Change pin screen when loading keys to an initialised card

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-11 17:21:24 +03:00
Roman Volosovskyi cc520a1f27 [#9987] Stop fetching new blocks while app is not active 2020-03-11 09:17:58 +02:00
Andrea Maria Piana c2e195979c Use first-not-visible message instead of last-visible
Using last visible message ignores an edge case:

If we are on top of the list (i.e oldest message), any received message
should be appended (it must be visible).

When using last-visible message for this, a newer message will have <
clock-value, therefore it will be offloaded to the database, which is
not correct.

Instead if we use the first-not-visible message, this should not be a
problem. If we are on top of the list, this will be nil, and therefore
the message will be appended.

Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-09 12:21:19 +01:00
jakub 9594bb49e2 drop unused lein deps
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-06 18:26:27 +01:00
Roman Volosovskyi 51c80a8f8e [#9630] Clear keycard's app info before showing login screen 2020-03-06 14:22:34 +02:00
jakub 8b3c7f29b2 fix bundle install by disabling Nix sandbox
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-06 12:36:25 +01:00
Andrey Shovkoplyas 9b1150df29 temporary fix for contacts signal
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-05 13:53:24 +01:00
jakub de53581ef4 nix: don't generate keystore inside of Nix build
changes:
- Stops scripts/generate-keystore.sh runnig for every new TARGET=android shell
- Moves running scripts/generate-keystore.sh to keystore Makefile target
- Makes generate-keystore.sh accept STATUS_RELEASE_STORE_FILE as env variable
- Fixes error about missing lsof from start-react-native.sh
- Fixes error about unknown -keystore command in scripts/generate-keystore.sh
- Fixes getting OS_NAME without calling Nix shell
- Fixes getting TMP_BUILD_NUMBER without calling Nix shell
- Adds lsof used in start-react-native.sh to Android release Nix derivation
- Simplified how nix/scripts/build.sh appends the --keep flag
- Made use of colors.sh in more scripts

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-03-05 10:56:54 +01:00
jakub efa420def4 disable playstore upload
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-03-05 10:52:19 +01:00
Andrey Shovkoplyas 5f2b29ee52 [#10119] Android app UI is slow after backgorund
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-04 14:56:55 +01:00
Churikova Tetiana 696ebbf67e one accessibility-id for account name input
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-03-04 11:31:32 +01:00
jinhojang6 cfe25b8b45 update Arabic, Spanish, French, Italian, Korean and Chinese
Signed-off-by: Serhy <sergii@status.im>
2020-03-04 11:53:58 +02:00
Gheorghe Pinzaru 6d3ef2282f Redirect to multiaccounts only on explicit logout
Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-04 11:53:17 +03:00
Andrey Shovkoplyas 5301d421f2 [#10084] Make commands in chat available on Ropsten for e2e builds
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-03-04 09:49:54 +01:00
Churikova Tetiana 4d0fd4389e access-id + start new chat fix
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-03-03 16:02:45 +01:00
Serhy f5488e1f61 Update e2e
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-03 14:28:02 +01:00
Andrey Shovkoplyas 0e4c7a23bf [#10089] Override the behaviour of public chat' unread messages indicator 2020-03-03 14:27:55 +01:00
Churikova Tetiana 7b7f567361 e2e for importing accounts
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-03 12:51:44 +01:00
Andrey Shovkoplyas f645d3fbb5 accessibility-labels 2020-03-03 12:51:28 +01:00
Andrey Shovkoplyas a79a72fccb [#9749] Support importing private key and seed 2020-03-03 12:51:28 +01:00
Roman Volosovskyi c9486dc634 [#10115] Trim address/name on adding 1-1 chat 2020-03-02 18:18:23 +02:00
Andrey Shovkoplyas d64ba1b540 [#9789] Add a loading indicator and button to username input of start new chat
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-03-02 12:35:05 +01:00
Gheorghe Pinzaru 87ce82e10a Allow 2 lines for user name on intro screen
Add max-height to scroll-view

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-03-01 11:01:53 +03:00
Andrea Maria Piana 6a9eef1c2a Upgrade status-go
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-29 14:01:52 +01:00
jakub 8ac20b442e don't use sandbox for Nix Cache builds
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-29 12:28:40 +01:00
Andrea Maria Piana f9af0825ce upgrade status-go
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-28 18:51:12 +01:00
jakub 001264bd1a fix creation of pkg folder for latest.json
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-28 15:07:53 +01:00
Serhy de8d109ba1 Fix balance adress check
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-28 11:14:03 +01:00
Gheorghe Pinzaru 3ad9cfa269 Rework bottom-sheet component
Fixes #9848

Update initial content height

Review followup

Fix sheet disappear during drag

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-02-28 10:46:54 +03:00
jakub 8abea59196 don't use Jenkins master host for combined jobs
This lowers the risk of someone extracting sensitive data from master.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-27 17:58:19 +01:00
Roman Volosovskyi 89535ea8fc Fix geth logs on Android 10
From now on geth logs are stored at
`/storage/emulated/0/Android/data/im.status.ethereum.debug/files/Download/geth.log`
because app cant write to `sdcard/Download/geth.log`
2020-02-27 14:10:05 +02:00
jakub cb78293db7 use Android keystore from Jenkins credentials
This way we don't have to store it on individual CI hosts.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-27 06:54:28 +01:00
Roman Volosovskyi 988a7f6b0c [#10010] Start wallet service for keycard acc 2020-02-26 20:50:34 +02:00
Serhy 490c8f8776 Remove unused translatins
Signed-off-by: Serhy <sergii@status.im>
2020-02-26 20:36:48 +02:00
Vitaliy Vlasov 8c23975ad7 Do not use naked-address when hashing messages prior to Keycard signing
Signed-off-by: Vitaliy Vlasov <siphiuel@gmail.com>
2020-02-26 18:56:39 +02:00
Churikova Tetiana a76a4f6878 skipped rest of e2e with deep links and attempt to fix mailserver test
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-26 15:12:35 +01:00
Andrea Maria Piana 21ef5a68b8 Add mark all read
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-26 13:35:31 +01:00
Gheorghe Pinzaru c9d1adbc27 Add animation for keycard interaction
Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-02-26 14:48:42 +03:00
Vitaliy Vlasov bca946aa78 Add missing keycard event handlers 2020-02-26 12:14:43 +02:00
jakub 1c81d6e190 nix: force sandbox in CI
For more details see:
https://github.com/status-im/security-internal/blob/master/overview/infra.md#continuous-integration-ci

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-26 11:10:19 +01:00
Churikova Tetiana 8d95515480 fix scroll
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-26 11:07:52 +01:00
Andrey Shovkoplyas 6e3784d671 [#9886] App shows 'buy' for stickerpack user owns when pressing on sticker in chat
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-26 09:51:33 +01:00
jakub 17e5fc4dd4 fix detecting NixOS, uname can be deceptive
specifically inside of Docker containers

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-25 17:52:23 +01:00
Roman Volosovskyi 999bb9940e Fix leftover after #10073 changes 2020-02-25 15:45:44 +02:00
Churikova Tetiana 9f2e2f9d3e added scroll and disable deep link e2e
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-25 13:06:27 +01:00
Gheorghe Pinzaru ff1022f337 Do not change keychain method on auth-bio fail
Do not change auth method if user does not save password

Sanity check - fix only for biometric method

Check for new auth method only when save password

ScrollView Persist taps on login view

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-02-25 14:27:10 +03:00
Gheorghe Pinzaru f18e7d746b Separate hardwallet events into multiple ns
Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-02-25 14:06:18 +03:00
Roman Volosovskyi 9a713148c7 [#10002] Follow up after #10008
- ensure that `:key-uid` is always added to `app-db` with proper case
- tests which cover multiacc duplication case
2020-02-25 12:27:14 +02:00
jakub e5f7a94ee2 upgrade react-native-status-keycard to 2.5.18
This adds the exportKeyWithPath() method we use in:
src/status_im/hardwallet/card.cljs

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-25 09:59:14 +01:00
Roman Volosovskyi 59184b12d0 [#10012] Show remaining PIN attemts only after entering wrong PIN 2020-02-25 09:37:10 +02:00
Roman Volosovskyi 807c8377d4 Clean up after recent tx history changes:
- unused code is removed
- "load more" button is hidden for a new account
- each next page of tx history contains 20 transfers
  unless thare is no enough transfers in history
2020-02-25 09:27:18 +02:00
jakub 46bd2b2e4c cleanup of shell scripts
Changes:
- Add missing lazy assignment for OS_NAME, fixes double Nix shells
- Moved `scripts/add-nix-gcroots.sh` to `nix/scripts/gcroots.sh`
- Moved Nix package manager setup to `nix/scripts/setup.sh`
- Created `nix/scripts/source.sh` to reuse in all Nix scripts
- Created `STARTING_GUIDE.md` with instructions for contributors
- Created `scripts/colors.sh` for definition of shell colors
- Removed `scripts/setup` in favor of `nix/scripts/setup.sh`
- Removed all of `scripts/lib` since it was useless

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-24 19:31:55 +01:00
tbenr eb1cc65a3d watch only qrcode and already exists check
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-24 16:33:21 +01:00
Churikova Tetiana 7485093398 attempt to fix 6225
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-24 15:22:32 +01:00
jakub 90bae33689 e2e: fix handling of GitHub token
Signed-off-by: Jakub Sokołowski <jakub@status.im>
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-24 14:58:09 +01:00
Churikova Tetiana b8c7e44326 fix e2e
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-24 12:32:08 +01:00
tbenr 81c4d16f9f componentizied input-search and added in curency and token
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-20 11:40:40 +01:00
Gheorghe Pinzaru 40c12241e0 Add bottom sheet to chat top bar options
Add bottom sheet to message long press

Make whole bottom sheet panel dragable

Fixes #9846

Use spring animation for bottom size of bottom sheet

Remove extra border height from bottom sheet

The height is already added to content height

Remove extra set value for animation

Timing and spring already mutates the animation value

Reuse chat bottom sheet in chat list

Update the size of new chat bottom sheet

Add remove to group chat

add chat id for clear history to be reused outside of current chat

Fix public chat bottom sheet missing destructoring

Replace icon for chat fetch history

Could be rotated arrow up, but this requires special handling in icons or list item

Fix remove public chat event

Dismiss keyboard on sheet mount

iOs rename arrow down icon

Fix unusable screen after close of bottom shet

The callback is called after 1.5 seconds after the animation starts. This happens because spring animation takes more time on animating post animation oscillations.

Add accessibility labels

Fix bad message destructoring

add view profile on long message press

Reset bottom value after animation

Remove pending circle from avatar in chat sheets

Do not show open profile on own messages

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-02-19 14:29:33 +03:00
jakub 8ffbf61b79 e2e-tests: update GitHub token used
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-18 20:50:21 +01:00
jakub 7ff412722d drop eth.beta fleet, it's been decommissioned
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-18 20:49:47 +01:00
Gheorghe Pinzaru 505ef626cc Increase height of recovery word text input
Fixes #9658

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-02-18 18:00:07 +03:00
Andrea Maria Piana a2af83f034 Add option to enable waku-mode
This commit adds an option to enable waku mode through ENV settings.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-17 18:22:50 +01:00
tbenr 705b80ef8f improvement on snackbar by considering login time
Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-02-17 15:50:40 +01:00
jakub 3d52d1cb9c jenkins: build() doesn't like mixed arguments
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-14 17:53:02 +01:00
Roman Volosovskyi 965dce053d [#10041] Request token price after adding 2020-02-14 18:32:54 +02:00
Roman Volosovskyi 3f6051c22b [#10044] Responsive new chat input 2020-02-14 17:46:43 +02:00
Andrea Maria Piana b30d002efb Fix malformed file
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-14 16:43:10 +01:00
Andrea Maria Piana 4734a4ee04 offload chat messages
This commit does a few things:

1) Messages are offloaded from any chat once we go back from the home.
This allows us to ignore any message that is coming in from a chat we
are not currently focused.
2) After 5 seconds of not-scrolling activity, any received message that
is not currently visible will be offloaded to the database.
3) Similarly received messages that are not visible will be offloaded to
the database directly

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-14 15:56:28 +01:00
Serhy d281c560dc Recover same acc twice test
Signed-off-by: Serhy <sergii@status.im>
2020-02-13 16:56:45 +02:00
Volodymyr Kozieiev e6c859dd2d Pending stickers status maintains after app restart
Signed-off-by: Volodymyr Kozieiev <vkjr.sp@gmail.com>
2020-02-13 15:02:00 +02:00
krzyzowiec 553f2c0e01 Fixed cryptokitties loading/ordering
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-13 13:45:14 +01:00
jakub dc0d0b59cb re-enable site updates on nightly builds
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-12 20:55:25 +01:00
jakub 13c7f06317 don't multiply version codes by 1048576, could mess up upgrades
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-12 14:20:00 +01:00
jakub 1ea49a80fc rename get.status.im to join.status.im
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-11 18:09:21 +01:00
Andrey Shovkoplyas c1eb98691c temporary fix for slow chats with long ens names
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-11 11:00:18 +01:00
Andrey Shovkoplyas ff41394d9e back to infura
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-11 10:59:28 +01:00
Gheorghe Pinzaru 0a7dc8fdd2 [#9902] Make Sign out go to Multiaccount overview 'Your keys' screen
Fix e2e tests

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-02-11 10:34:56 +03:00
Roman Volosovskyi b2a70c8331 Disallow recovering of an existing multiaccount
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-10 15:11:39 +01:00
Andrey Shovkoplyas 481092dd25 [#8797] Error scrollToIndex when tapping [Fetch messages] twice in a row
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-10 14:08:03 +01:00
Andrey Shovkoplyas 671e5f4540 [#10005] Show only 1 line of ens name
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-10 12:12:45 +01:00
Roman Volosovskyi 39ea685adc [#9975] Do not throw exception on invalid ens recipient 2020-02-07 18:43:07 +02:00
Roman Volosovskyi 8a612a3807 [#9975] Trim recipient address before validation 2020-02-07 16:29:57 +02:00
Andrea Maria Piana 3d4ee8fe6a Check for empty public key
We check that ENS does not return an empty public key. In addition to
that validation is done on status-go in order to avoid saving the chat.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-07 14:43:54 +01:00
Andrey Shovkoplyas 06025ce26f [#9961] Update glossary view
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-07 13:38:29 +01:00
Andrey Shovkoplyas 25fd297573 fixes ENS to new registry for verification
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-07 10:41:41 +01:00
Dean Eigenmann 7c5decbbfc uses new ENS registry. see: GHSA-8f9f-pc5v-9r5h 2020-02-06 17:02:14 +01:00
Serhy dcfac1c4e2 Fix tests and disable non-relevant
Signed-off-by: Serhy <sergii@status.im>
2020-02-05 21:30:31 +02:00
jakub f9c15be1d4 update-status-go: don't accept SHA1s, accept PR numbers
There was some confusion when given ref/tag did not exist.
Script would just use the value as commit SHA1 even if it was not one.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-02-05 14:57:35 +01:00
Andrea Maria Piana 27a001b0f0 fix status-go version
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-05 11:35:04 +01:00
Andrea Maria Piana b1ec418133 Resolve ENS names in the background
This commits resolves ENS names in the background, implementing retries
and exponential backoff.
All is handled in the background in status-go.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-02-05 11:12:06 +01:00
Andrey Shovkoplyas 76f9703afe update prices for v1
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-04 15:05:14 +01:00
Gheorghe Pinzaru 6ad84f4232 Update your keys screen
Fixes #9782

Change theme of new key action

Update translations

Fix e2e tests

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-02-04 13:51:29 +03:00
Roman Volosovskyi ef49699222 [#9942] Upgradable paths in configs
Storing absolute path for different configs breaks compatibility on iOS
as app's dir is changed after upgrade. The solution is to store relative
paths and to concatenate it with `backend.rootDataDir`. The only
exception is `LogFile` as it is stored outside `backend.rootDataDir` on
Android. `LogDir` config was added to allow adding of custom dir for log
file.
Configs concerned:
`DataDir`
`LogDir`
`LogFile`
`KeystoreDir`
`BackupDisabledDataDir`
2020-02-03 20:34:40 +02:00
Andrey Shovkoplyas e0bafb842e load more ui fix
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-02-03 16:38:35 +01:00
Andrey Shovkoplyas 6e9292c1e1 remove event duplication
Signed-off-by: yenda <eric@status.im>
2020-02-03 13:22:24 +01:00
Andrey Shovkoplyas c1245d7b1d [#9954] Add 'view profile' to message long tap
Signed-off-by: yenda <eric@status.im>
2020-02-03 09:47:17 +01:00
Gheorghe Pinzaru 785f829554 Git ignore trace.edn and config.cljs
They are auto generated and should not be present in git

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-01-31 17:02:09 +03:00
Gheorghe Pinzaru 47732e7b5b Remove contact indicator from userpic
Add contact indicator in 1:1 as a text. Fixes #9826

Fix e2e

explicitly define line height

On android and iOs line height is different, explicitly define so it will be the same in both platforms.

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-01-31 14:58:10 +03:00
yenda b2feca723c fix hardcoded value in spanish translation
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-01-30 19:20:08 +01:00
yenda cc3ae6c693 fix #9903 hide buttons of actions that are not yet implemented
fix ens release button which showed a hardcoded date
link to release instructions on hackmd

Signed-off-by: yenda <eric@status.im>
2020-01-30 18:49:47 +01:00
Roman Volosovskyi b41df2f2fc [#9927] Fast blocks sync after being offline
Front end changes:
 As there is no guarantee that `newblock` event will be dispatched
consequently (e.g. if there was a delay after block#1 the next event
might be dispatched for a block#2000, no guarantee that block#2 will be
the next one), `newTransactions` field was added with a map of accounts
to the number of new transactions received to this block. In result if
there are new transactions we request them all of db instead of fetching
them on for the block specified in `newblock` event, as it was done
previously.

Back end changes:
- In order to avoid handling of the reorganized blocks we use an offset
from the latest known block when start listening to new blocks. Before
this commit the offset was 15 blocks for all networks. This offset is
too big for mainnet and causes noticeable delay of marking a transfer as
confirmed in Status (comparing to etherscan). So it was changed to be 5
blocks on mainnet and is still 15 blocks on other networks.
- Also before this commit all new blocks were handled one by one with
network specific interval (10s for mainnet), which means that in case of
lost internet connection or application suspension (happens on iOS)
receiving of new blocks would be paused and then resumed with the same
"speed" - 1 blocks per 10s. In case if that pause is big enough the
application would never catch up with the latest block in the network,
and this also causes the state of transfers to be delayed in the
application. In this commit in case if there was more than 40s delay
after receiving of the previous block the whole history in range between
the previous received block and ("latest"-reorgeSafetyDepth) block is
checked at once and app catches up with a recent state of the chain.
2020-01-30 19:40:19 +02:00
Jinho Jang 58afae07ba update Italian, Arabic, Spanish(LatAm), Chinese and Korean
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
2020-01-30 11:30:14 +01:00
Andrea Maria Piana 6ff878c836 Explicitly start messenger
We should only start receiving messages/processing topics once all the
initializiation is completed, so an endpoint that start the messenger
has been added.
Before we would initialize the topics/receiving messages at the same time,
which resulted in a race condition where a topic was signaled from
status-go and was considered new just because was not loaded yet.

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-01-29 21:17:32 +01:00
jakub 128f44f58b fastlane: disable oldest_build_allowed for TestFlight clean
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-01-29 15:58:17 +01:00
Serhy 9fb513cea0 Disable editprofile tests
Signed-off-by: Serhy <sergii@status.im>
2020-01-29 11:53:31 +02:00
Andrea Maria Piana a64eb79065 Correctly dispatch on updates & disable them
Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
2020-01-28 15:43:18 +01:00
Roman Volosovskyi 9dfb908678 [#9280] Make sure number-of-retries is not negative 2020-01-28 16:24:24 +02:00
Gheorghe Pinzaru 028543aa31 Support universal link for ens name
Handle ens-name in qr reader

If user has an username generate link with it

Ensure no infinite recursion happens on qr scan event

Fix test for custom profile ens-name

Fix QR code read for ens-name

Extra check for ens name in QR code

Do not open unknown profile for bad ens name

Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
2020-01-28 15:21:11 +03:00
yenda 60af04ff06 add Augur token (REP) images
Signed-off-by: yenda <eric@status.im>
2020-01-27 17:29:19 +01:00
Serhy 5203fc6fd8 Fix e2e after removed custom pic
Signed-off-by: Serhy <sergii@status.im>
2020-01-27 14:05:15 +02:00
Andrea Maria Piana 238b559981 [Fixes: #9900] Use component-did-update
When moving from chat to chat, component-did-mount is not fired as the
component is never unmounted, therefore messages were not loaded.
This changes the behavior to use the component-did-update lifecycle
method.

Signed-off-by: yenda <eric@status.im>
2020-01-27 11:56:54 +01:00
yenda 33abdf559a disable custom picture
Signed-off-by: yenda <eric@status.im>
2020-01-27 11:55:46 +01:00
Gheorghe Pinzaru 14242a7877 Use default keyboard for username input
Signed-off-by: yenda <eric@status.im>
2020-01-27 11:54:32 +01:00
yenda 81d2c35f4d [9853] add missing translatable labels
Signed-off-by: yenda <eric@status.im>
2020-01-27 11:53:32 +01:00
Andrea Maria Piana a8c39370d5 Fire request once network status changes & periodically check connection
This commit fixes a couple of issues.

The first one is that when we go from offline->cellular-network->wifi
historical requests were not triggered (only when going from
offline->online, but if they are disabled in cellular network they won't
fire).

The second is due to the fact that it is possible that the connection
status gets into a bad state, (this happens for example if get-latency
returns all errors, but we are online, and it won't be retried), and no
connection attempt is made anymore.

I have changed the logic to periodically check the connection state, and
try to connect if too much time has passed since last error (10s),
similarly to what we did before, but in a tick, so we are less reliant
on having the right state in the db.

Signed-off-by: yenda <eric@status.im>
2020-01-27 11:52:34 +01:00
Roman Volosovskyi ea02f8e3cf [#9280] Add retries on error when fetching balances 2020-01-24 18:26:33 +02:00
jakub 5a64745fce nix: throw error if 'make nix-purge' is called on NixOS
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-01-24 17:07:09 +01:00
Roman Volosovskyi 30545f77d2 Add a screen for debugging blocks lag 2020-01-24 16:58:20 +02:00
hesterbruikman 19f92413de Update copy Choose key storage
Error with previous update:

Intro-wizard-3 (OLD): Own a Keycard? Store your keys on it; you'll need it for transactions
Intro-wizard-3 (NEW): If you own a Keycard, store your keys there for enhanced security.

Signed-off-by: Churikova Tetiana <churikova.tm@gmail.com>
2020-01-24 15:05:19 +01:00
jakub c91fe5fa82 ci: use full timestamp for iOS CFBundleVersion
And we have to trim the one used for Android.
For more details see:
>Warning: The greatest value Google Play allows for versionCode is 2100000000.
https://developer.android.com/studio/publish/versioning

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2020-01-23 19:42:19 +01:00
605 changed files with 26653 additions and 20370 deletions
+2
View File
@@ -22,3 +22,5 @@ CONTRACT_NODES=1
MOBILE_UI_FOR_DESKTOP=1
STATUS_GO_PROTOCOL=0
STATUS_GO_ENABLE_NIMBUS=0
KEYCARD_TEST_MENU=0
QR_READ_TEST_MENU=1
+4
View File
@@ -5,6 +5,7 @@ ETHEREUM_DEV_CLUSTER=1
EXTENSIONS=0
FLEET=eth.prod
GROUP_CHATS_ENABLED=1
HARDWALLET_ENABLED=1
LOG_LEVEL_STATUS_GO=info
LOG_LEVEL=debug
MAILSERVER_CONFIRMATIONS_ENABLED=0
@@ -20,3 +21,6 @@ CONTRACT_NODES=1
MOBILE_UI_FOR_DESKTOP=1
BLANK_PREVIEW=0
TOOLTIP_EVENTS=1
COMMANDS_ENABLED=1
KEYCARD_TEST_MENU=1
QR_READ_TEST_MENU=1
+1 -1
View File
@@ -4,7 +4,7 @@ ERC20_CONTRACT_WARNINGS=0
ETHEREUM_DEV_CLUSTER=0
EXTENSIONS=0
FLEET=eth.prod
GROUP_CHATS_ENABLED=0
GROUP_CHATS_ENABLED=1
LOG_LEVEL_STATUS_GO=
LOG_LEVEL=info
MAILSERVER_CONFIRMATIONS_ENABLED=1
+1 -1
View File
@@ -11,7 +11,7 @@ These are just guidelines, not rules. Use your best judgment, and feel free to p
* [Mission and Core Values](https://status.im/contribute)
* [Principles](https://status.im/contribute/our_principles.html)
* [Read our FAQ](https://status.im/docs/FAQs.html)
* [Join our Chat](http://get.status.im/chat/public/status-core-dev)
* [Join our Chat](http://join.status.im/chat/public/status-core-dev)
* [Developer Introduction](https://status.im/developer_tools/)
* [Build Status Yourself](https://status.im/build_status)
* [Find issues to work on](https://github.com/status-im/)
+2
View File
@@ -183,3 +183,5 @@ status-modules/resources
/fiddle/node_modules/
/fiddle/target/
/fiddle/resources/public/images/
trace.edn
+45 -28
View File
@@ -16,7 +16,7 @@ RESET := $(shell tput -Txterm sgr0)
HELP_FUN = \
%help; \
while(<>) { push @{$$help{$$2 // 'options'}}, [$$1, $$3] if /^([a-zA-Z\-]+)\s*:.*\#\#(?:@([a-zA-Z\-]+))?\s(.*)$$/ }; \
print "Usage: make [target]\n\n"; \
print "Usage: make [target]\n\nSee STARTING_GUIDE.md for more info.\n\n"; \
for (sort keys %help) { \
print "${WHITE}$$_:${RESET}\n"; \
for (@{$$help{$$_}}) { \
@@ -47,6 +47,12 @@ ifdef TARGET_OS
export TARGET ?= $(TARGET_OS)
endif
# Useful for checking if we are on NixOS
OS_NAME := $(shell [ -f /etc/os-release ] && awk -F= '/^NAME/{print $2}' /etc/os-release)
# Useful for Andoird release builds
TMP_BUILD_NUMBER := $(shell ./scripts/version/gen_build_no.sh | cut -c1-10)
# MacOS root is read-only, read nix/README.md for details
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
@@ -80,11 +86,15 @@ nix-clean: ##@nix Remove all status-react build artifacts from /nix/store
nix-purge: SHELL := /bin/sh
nix-purge: ##@nix Completely remove the complete Nix setup
ifeq ($(OS_NAME), NixOS)
$(error $(RED)You should not purge Nix files on NixOS!$(RESET))
else
sudo rm -rf $(_NIX_ROOT)/* ~/.nix-profile ~/.nix-defexpr ~/.nix-channels ~/.cache/nix ~/.status .nix-gcroots
endif
nix-add-gcroots: export TARGET := default
nix-add-gcroots: ##@nix Add Nix GC roots to avoid status-react expressions being garbage collected
scripts/add-nix-gcroots.sh
nix/scripts/gcroots.sh
nix-update-gradle: ##@nix Update maven nix expressions based on current gradle setup
nix/mobile/android/maven-and-npm-deps/maven/generate-nix.sh
@@ -145,19 +155,24 @@ update-fleets: ##@prepare Download up-to-date JSON file with current fleets stat
| jq --indent 4 --sort-keys . \
> resources/config/fleets.json
keystore: export TARGET := keytool
keystore: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
keystore: ##@prepare Generate a Keystore for signing Android APKs
@./scripts/generate-keystore.sh
#----------------
# Release builds
#----------------
release: release-android release-ios ##@build build release for Android and iOS
release-android: export TARGET ?= android
release-android: export TARGET := android
release-android: export BUILD_ENV ?= prod
release-android: export BUILD_TYPE ?= nightly
release-android: export BUILD_NUMBER ?= 9999
release-android: export STORE_FILE ?= $(HOME)/.gradle/status-im.keystore
release-android: export BUILD_NUMBER ?= $(TMP_BUILD_NUMBER)
release-android: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
release-android: export ANDROID_ABI_SPLIT ?= false
release-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86
release-android: ##@build build release for Android
release-android: keystore ##@build build release for Android
scripts/release-android.sh
release-ios: export TARGET ?= ios
@@ -215,7 +230,7 @@ jsbundle-desktop: ##@jsbundle Compile JavaScript and Clojure into index.desktop.
node prepare-modules.js
#--------------
# REPL
# Clojure REPL
# -------------
_watch-%: ##@watch Start development for device
@@ -224,22 +239,18 @@ _watch-%: ##@watch Start development for device
clj -R:dev build.clj watch --platform $(SYSTEM) --$(SYSTEM)-device $(DEVICE)
watch-ios-real: export TARGET := ios
watch-ios-real: _watch-ios-real ##@watch Start development for iOS real device
watch-ios-real: _watch-ios-real
watch-ios-simulator: export TARGET := ios
watch-ios-simulator: _watch-ios-simulator ##@watch Start development for iOS simulator
watch-ios-simulator: _watch-ios-simulator
watch-android-real: export TARGET := android
watch-android-real: _watch-android-real ##@watch Start development for Android real device
watch-android-real: _watch-android-real
watch-android-avd: export TARGET := android
watch-android-avd: _watch-android-avd ##@watch Start development for Android AVD
watch-android-avd: _watch-android-avd
watch-android-genymotion: export TARGET ?= android
watch-android-genymotion: _watch-android-genymotion ##@watch Start development for Android Genymotion
watch-android-genymotion: _watch-android-genymotion
watch-desktop: export TARGET ?= $(HOST_OS)
watch-desktop: ##@watch Start development for Desktop
watch-desktop:
clj -R:dev build.clj watch --platform desktop
desktop-server: export TARGET ?= $(HOST_OS)
@@ -247,15 +258,15 @@ desktop-server:
node ubuntu-server.js
#--------------
# Run
# -------------
# Run React-Native app
#--------------
_run-%:
$(eval SYSTEM := $(word 2, $(subst -, , $@)))
npx react-native run-$(SYSTEM)
# TODO: Migrate this to a Nix recipe, much the same way as nix/mobile/android/targets/release-android.nix
run-android: export TARGET := android
run-android: ##@run Run Android build
run-android: ##@run Build Android APK and start it on the device
npx react-native run-android --appIdSuffix debug
run-desktop: export TARGET ?= $(HOST_OS)
@@ -263,7 +274,7 @@ run-desktop: _run-desktop ##@run Run Desktop build
SIMULATOR=
run-ios: export TARGET := ios
run-ios: ##@run Run iOS build
run-ios: ##@run Build iOS app and start it in a simulator/device
ifneq ("$(SIMULATOR)", "")
npx react-native run-ios --simulator="$(SIMULATOR)"
else
@@ -311,7 +322,7 @@ react-native-ios: export _NIX_PURE ?= true
react-native-ios: ##@other Start react native packager for Android client
@scripts/start-react-native.sh
geth-connect: export TARGET := adb
geth-connect: export TARGET := android-env
geth-connect: ##@other Connect to Geth on the device
adb forward tcp:8545 tcp:8545 && \
build/bin/geth attach http://localhost:8545
@@ -320,22 +331,22 @@ android-clean: ##@prepare Clean Gradle state
git clean -dxf -f ./android/app/build
[ -d android/.gradle ] && cd android && ./gradlew clean
android-ports: export TARGET := adb
android-ports: export TARGET := android-env
android-ports: ##@other Add proxies to Android Device/Simulator
adb reverse tcp:8081 tcp:8081 && \
adb reverse tcp:3449 tcp:3449 && \
adb reverse tcp:4567 tcp:4567 && \
adb forward tcp:5561 tcp:5561
android-devices: export TARGET := adb
android-devices: export TARGET := android-env
android-devices: ##@other Invoke adb devices
adb devices
android-logcat: export TARGET := adb
android-logcat: export TARGET := android-env
android-logcat: ##@other Read status-react logs from Android phone using adb
adb logcat | grep -e RNBootstrap -e ReactNativeJS -e ReactNative -e StatusModule -e StatusNativeLogs -e 'F DEBUG :' -e 'Go :' -e 'GoLog :' -e 'libc :'
android-install: export TARGET := adb
android-install: export TARGET := android-env
android-install: export BUILD_TYPE ?= release
android-install:
adb install result/app-$(BUILD_TYPE).apk
@@ -362,13 +373,19 @@ _startdev-%:
startdev-android-avd: export TARGET = android
startdev-android-avd: _startdev-android-avd
startdev-android-avd: ##@startdev Compile Clojure for Android AVD
startdev-android-genymotion: export TARGET = android
startdev-android-genymotion: _startdev-android-genymotion
startdev-android-genymotion: ##@startdev Compile Clojure for Genymotion
startdev-android-real: export TARGET = android
startdev-android-real: _startdev-android-real
startdev-desktop: export TARGET ?= $(HOST_OS)
startdev-desktop: _startdev-desktop
startdev-android-real: ##@startdev Compile Clojure for Android real device
startdev-ios-real: export TARGET = ios
startdev-ios-real: _startdev-ios-real
startdev-ios-real: ##@startdev Compile Clojure for iOS device
startdev-ios-simulator: export TARGET = ios
startdev-ios-simulator: _startdev-ios-simulator
startdev-ios-simulator: ##@startdev Compile Clojure for iOS simulator
startdev-desktop: export TARGET ?= $(HOST_OS)
startdev-desktop: _startdev-desktop
+6 -6
View File
@@ -17,7 +17,7 @@ If this interests you, **help us make Status a reality** - anyone can contribute
## How to Contribute?
Go straight to the [docs](https://status.im/docs) or [join our chat](http://get.status.im/chat/public/status) and choose what interests you:
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:
- **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!
@@ -30,16 +30,16 @@ Metcalfe's law states that the value of a network is proportional to the square
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.
- **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](http://get.status.im/chat/public/status) and discuss with the team how you can contribute!
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!
- **Testers**
It's bug hunting season! Status is currently in Alpha and there is sure to be a bunch of learning, [build status from scratch](https://status.im/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](http://github.com/status-im/status-react/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy!
It's bug hunting season! Status is currently in Alpha and there is sure to be a bunch of learning, [build status from scratch](https://status.im/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-react/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy!
- **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://get.status.im/chat/public/status)
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).
@@ -57,7 +57,7 @@ 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](http://get.status.im/chat/public/status).
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).
## License
@@ -67,4 +67,4 @@ Licensed under the [Mozilla Public License v2.0](https://github.com/status-im/st
[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=SFBWQ3k5R2tnT2t6UGsxU1h1U0g3VFlCNnoxVTRHYWNoTDhsb1laaTJZWT0tLUZMUm5sSVFBSU9qSWM1RUJvK1I3Z3c9PQ==--ad15ae7992b432b33743749d40318952415bd98f)](https://www.browserstack.com/automate/public-build/SFBWQ3k5R2tnT2t6UGsxU1h1U0g3VFlCNnoxVTRHYWNoTDhsb1laaTJZWT0tLUZMUm5sSVFBSU9qSWM1RUJvK1I3Z3c9PQ==--ad15ae7992b432b33743749d40318952415bd98f)
[![Coverage Status](https://coveralls.io/repos/github/status-im/status-react/badge.svg?)](https://coveralls.io/github/status-im/status-react)
[![Coverage Status](https://coveralls.io/repos/github/status-im/status-react/badge.svg?)](https://coveralls.io/github/status-im/status-react)
+61
View File
@@ -0,0 +1,61 @@
# Description
This document provides information on how to start developing Status App.
# Getting Started
To start developing start a shell for platform you are interested in.
```
make shell TARGET=android
```
This step will take a while the first time as it will download all dependencies.
To build the app, your can simply run on of the following:
```
make release-android
make release-ios
```
For more `make` targets run `make help`.
# Development
There are three steps necessary to start development, in this case for Android:
1. `make startdev-android-real` - Compiles Clojure into JavaScript for real device
2. `make react-native-android` - Watches JavaScript code and updates the App
3. `make run-android` - Builds the Android app and starts it on the device
The first two will continue watching for changes and keep re-building the app.
The last one will exit once the app is up and ready.
# Manual Steps
There are a few manual steps you might want to do in order to start contributing.
## Genymotion Virtualization
Optionally set up Genymotion if you don't want to use Android Virtual Device:
https://www.genymotion.com
## Android Development Environment
You can also setup Android Development Environment + Simulator:
https://facebook.github.io/react-native/docs/getting-started.html
## Configure GitHub Account
The optimal way of pushing to GitHubis using SSH instead of user/pass auth.
It's recommented that you [add your public SSH key to your GitHub account](https://help.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account).
## Configure GPG Keys for signing commits
In order to increase security we require all commits in `status-react` repo to be signed with a GPG key.
Steps:
1. [Generate a new GPG key](https://help.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key)
2. [Setup Git to use your GPG key](https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key)
3. [Setup Git to sign commits](https://help.github.com/en/github/authenticating-to-github/signing-commits)
4. [Setup GitHub to validate commits](https://help.github.com/en/github/authenticating-to-github/adding-a-new-gpg-key-to-your-github-account)
+1 -1
View File
@@ -1 +1 @@
0.14.0
1.3.1
+34 -21
View File
@@ -219,10 +219,10 @@ android {
}
release {
/* environment variables take precedence over gradle.properties file */
storeFile file(getEnvOrConfig('STATUS_RELEASE_STORE_FILE').replaceAll("~", System.properties['user.home']))
storePassword getEnvOrConfig('STATUS_RELEASE_STORE_PASSWORD')
keyAlias getEnvOrConfig('STATUS_RELEASE_KEY_ALIAS')
keyPassword getEnvOrConfig('STATUS_RELEASE_KEY_PASSWORD')
storeFile file(getEnvOrConfig('KEYSTORE_PATH').replaceAll("~", System.properties['user.home']))
storePassword getEnvOrConfig('KEYSTORE_PASSWORD')
keyAlias getEnvOrConfig('KEYSTORE_ALIAS')
keyPassword getEnvOrConfig('KEYSTORE_KEY_PASSWORD')
}
}
splits {
@@ -244,7 +244,6 @@ android {
release {
// Caution! In production, you need to generate your own keystore file.
// see https://facebook.github.io/react-native/docs/signed-apk-android.
signingConfig signingConfigs.debug
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
@@ -268,8 +267,7 @@ android {
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
output.versionCodeOverride = versionCodes.get(abi) + defaultConfig.versionCode
}
}
@@ -298,6 +296,10 @@ dependencies {
implementation jscFlavor
}
// react-native-screens
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
implementation 'androidx.multidex:multidex:2.0.1' // only needed if minSdkVersion is less than 21 (https://developer.android.com/studio/build/multidex)
implementation project(':react-native-dialogs')
// Force using exact RN version instead of relying on gradle dependency resolution
@@ -305,29 +307,40 @@ dependencies {
// NOTE: Uncomment if building RN from a fork
//compile ("com.facebook.react:react-native:0.55.4") { force = true } // From node_modules
implementation project(':react-native-status')
implementation project(':react-native-webview-bridge')
implementation project(':react-native-status-keycard')
implementation 'com.github.status-im:function:0.0.1'
implementation 'com.facebook.fresco:fresco:2.0.0'
implementation 'com.facebook.fresco:animated-gif:2.0.0'
}
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task hemroidBuild(type: Exec) {
def getLocalNDKDir = { ->
def rootDir = project.rootDir
def localProperties = new File(rootDir, "local.properties")
def ndkDir = System.env.ANDROID_NDK
if (localProperties.exists()) {
Properties properties = new Properties()
localProperties.withInputStream { instr ->
properties.load(instr)
}
ndkDir = properties.getProperty('ndk.dir')
if (!localProperties.exists()) {
return null
}
executable "$ndkDir/ndk-build"
Properties properties = new Properties()
localProperties.withInputStream { instr ->
properties.load(instr)
}
return properties.getProperty('ndk.dir')
}
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task hemroidBuild(type: Exec) {
def localNdkDir = getLocalNDKDir()
def ndkDir = System.env.ANDROID_NDK
if (localNdkDir != null) {
ndkDir = localNdkDir
}
def execPath = "$ndkDir/ndk-build"
def exec = new File(execPath)
if (!exec.exists()) {
throw new GradleException("No ndk-build binary found!")
}
executable execPath
}
preBuild.dependsOn hemroidBuild
+5 -3
View File
@@ -21,6 +21,8 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="com.android.vending.BILLING" />
<!-- these permissions should be removed -->
<!-- React Native unnecessary permissions (https://github.com/facebook/react-native/issues/5886) -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>
@@ -39,7 +41,7 @@
android:label="@string/app_name"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:resizeableActivity="false"
android:launchMode="singleTask">
<intent-filter>
@@ -57,8 +59,8 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="get.status.im" />
<data android:scheme="https" android:host="get.status.im" />
<data android:scheme="http" android:host="join.status.im" />
<data android:scheme="https" android:host="join.status.im" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
@@ -108,6 +108,17 @@ public class MainActivity extends ReactFragmentActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) {
case Configuration.UI_MODE_NIGHT_YES:
setTheme(R.style.DarkTheme);
break;
case Configuration.UI_MODE_NIGHT_NO:
setTheme(R.style.LightTheme);
break;
default:
setTheme(R.style.LightTheme);
}
// Make sure we get an Alert for every uncaught exceptions
registerUncaughtExceptionHandler(MainActivity.this);
@@ -117,7 +128,8 @@ public class MainActivity extends ReactFragmentActivity
setSecureFlag();
SplashScreen.show(this, true);
super.onCreate(savedInstanceState);
// NOTE: Try to not restore the state https://github.com/software-mansion/react-native-screens/issues/17
super.onCreate(null);
if (!shouldShowRootedNotification()) {
configureStatus();
@@ -229,10 +241,6 @@ public class MainActivity extends ReactFragmentActivity
if (mPermissionListener != null && mPermissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
mPermissionListener = null;
}
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission has been granted. Start camera preview Activity.
com.github.alinz.reactnativewebviewbridge.WebViewBridgeManager.grantAccess(requestCode);
}
}
@Override
@@ -11,7 +11,6 @@ import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import com.github.alinz.reactnativewebviewbridge.WebViewBridgePackage;
import java.util.List;
@@ -33,7 +32,6 @@ public class MainApplication extends MultiDexApplication implements ReactApplica
packages.add(statusPackage);
packages.add(new ReactNativeDialogsPackage());
packages.add(new RNStatusKeycardPackage());
packages.add(new WebViewBridgePackage(BuildConfig.DEBUG_WEBVIEW == "1"));
return packages;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 B

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 B

After

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 439 B

@@ -3,7 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background">
android:background="?attr/backgroundColor">
<ImageView
android:layout_width="wrap_content"
@@ -1,6 +0,0 @@
<resources>
<color name="primary">#4360df</color>
<color name="primary_dark">#FFFFFF</color>
<color name="accent">#5c6bc0</color>
<color name="background">#FFFFFF</color>
</resources>
+16 -9
View File
@@ -1,13 +1,20 @@
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
<item name="colorControlNormal">@color/primary</item>
<item name="colorControlActivated">@color/primary</item>
<item name="android:windowBackground">@color/background</item>
<item name="android:textColor">#000000</item>
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="colorPrimary">#4360df</item>
<item name="colorPrimaryDark">?attr/backgroundColor</item>
<item name="colorControlActivated">#4360df</item>
<item name="android:windowBackground">?attr/backgroundColor</item>
<item name="android:textColor">?attr/textColor</item>
<item name="android:forceDarkAllowed">true</item>
</style>
<style name="LightTheme" parent="AppTheme">
<item name="textColor">#000000</item>
<item name="backgroundColor">#ffffff</item>
</style>
<style name="DarkTheme" parent="AppTheme">
<item name="textColor">#ffffff</item>
<item name="backgroundColor">#000000</item>
</style>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="backgroundColor" format="color"/>
<attr name="textColor" format="color"/>
</resources>
+5 -4
View File
@@ -21,6 +21,7 @@
# $keytool -genkey -v -keystore ./status-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias status
# Version requirements used throughout the Gradle scripts
kotlinVersion=1.3.11
minSdkVersion=23
compileSdkVersion=29
targetSdkVersion=29
@@ -31,10 +32,10 @@ gradlePluginVersion=3.4.1
android.useAndroidX=true
android.enableJetifier=true
STATUS_RELEASE_STORE_FILE=~/.gradle/status-im.keystore
STATUS_RELEASE_STORE_PASSWORD=password
STATUS_RELEASE_KEY_ALIAS=status
STATUS_RELEASE_KEY_PASSWORD=password
KEYSTORE_PATH=~/.gradle/status-im.keystore
KEYSTORE_PASSWORD=password
KEYSTORE_ALIAS=status
KEYSTORE_KEY_PASSWORD=password
# By default we build a mostly universal APK
ANDROID_ABI_SPLIT=false
-2
View File
@@ -16,5 +16,3 @@ include ':react-native-status'
project(':react-native-status').projectDir = new File(rootProject.projectDir, '../modules/react-native-status/android')
include ':react-native-status-keycard'
project(':react-native-status-keycard').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-status-keycard/android')
include ':react-native-webview-bridge'
project(':react-native-webview-bridge').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview-bridge/android')
+20 -21
View File
@@ -1,3 +1,5 @@
library 'status-react-jenkins@master'
pipeline {
agent { label 'linux' }
@@ -29,8 +31,6 @@ pipeline {
BUILD_ENV = 'prod'
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
FASTLANE_DISABLE_COLORS = 1
/* since we are mounting it we need to specify location */
STATUS_RELEASE_STORE_FILE = '/home/jenkins/status-im.keystore'
/* We use EXECUTOR_NUMBER to avoid multiple instances clashing */
LEIN_HOME = "/var/tmp/lein-${EXECUTOR_NUMBER}"
/* coverage report identification */
@@ -42,14 +42,11 @@ pipeline {
stage('Prep') {
steps {
script {
/* Necessary to load methods */
android = load 'ci/android.groovy'
cmn = load 'ci/common.groovy'
btype = cmn.utils.getBuildType()
btype = utils.getBuildType()
print "Running ${btype} build!"
cmn.ci.abortPreviousRunningBuilds()
jenkins.abortPreviousRunningBuilds()
/* Cleanup and Prep */
cmn.prep(btype)
commonPrep(btype)
}
}
}
@@ -58,7 +55,7 @@ pipeline {
/* Build implicit dependencies if needed (we run `lein deps :tree` but it's not really required, for this purpose)
Implicit dependencies include building a patched node_modules, fetching maven dependencies, and anything else required.
We do this before the parallel steps so we have a known starting situation. */
script { cmn.nix.shell('lein deps :tree', attr: 'shells.lein') }
script { nix.shell('lein deps :tree', attr: 'shells.lein') }
}
}
stage('Parallel Assemble') {
@@ -66,23 +63,25 @@ pipeline {
stage('Checks') { stages {
stage('Lint') {
steps {
script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') }
script {
/* We want the build result to be uploaded */
catchError(
message: 'Linting check failed!',
buildResult: 'FAILURE',
stageResult: 'FAILURE'
) {
nix.shell('lein cljfmt check', attr: 'shells.lein')
}
}
}
}
stage('Tests') {
steps {
script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') }
script { nix.shell('lein test-cljs', attr: 'shells.lein') }
}
}
} }
stage('Build') { stages {
stage('JSBundle') {
steps {
script {
cmn.nix.shell('make jsbundle-android', pure: false)
}
}
}
stage('Bundle') {
steps {
script { apks = android.bundle() }
@@ -101,7 +100,7 @@ pipeline {
stage('Upload') {
steps {
script {
def urls = apks.collect { cmn.uploadArtifact(it) }
def urls = apks.collect { s3.uploadArtifact(it) }
/* return only the universal APK */
if (urls.size() > 1) {
env.PKG_URL = urls.find { it.contains('universal') }
@@ -129,8 +128,8 @@ pipeline {
}
}
post {
success { script { load('ci/github.groovy').notifyPR(true) } }
failure { script { load('ci/github.groovy').notifyPR(false) } }
success { script { github.notifyPR(true) } }
failure { script { github.notifyPR(false) } }
always { sh 'make _fix-node-perms' }
}
}
+24 -25
View File
@@ -1,5 +1,7 @@
library 'status-react-jenkins@master'
pipeline {
agent { label 'master' }
agent { label 'linux' }
options {
timestamps()
@@ -18,36 +20,33 @@ pipeline {
stage('Prep') {
steps { script {
println "Current JOB: ${env.JOB_NAME}"
/* load common lib */
cmn = load('ci/common.groovy')
gh = load('ci/github.groovy')
/* just for a shorter access */
btype = cmn.utils.getBuildType()
btype = utils.getBuildType()
} }
}
stage('Build') {
parallel {
stage('iOS') { steps { script {
ios = cmn.ci.Build('status-react/combined/mobile-ios')
ios = jenkins.Build('status-react/combined/mobile-ios')
} } }
stage('Android') { steps { script {
apk = cmn.ci.Build('status-react/combined/mobile-android')
apk = jenkins.Build('status-react/combined/mobile-android')
} } }
stage('Android e2e') { steps { script {
apke2e = cmn.ci.Build('status-react/combined/mobile-android-e2e')
apke2e = jenkins.Build('status-react/combined/mobile-android-e2e')
} } }
}
}
stage('Archive') {
steps { script {
sh('rm -f pkg/*')
cmn.ci.copyArts(ios)
//cmn.ci.copyArts(iose2e)
cmn.ci.copyArts(apk)
cmn.ci.copyArts(apke2e)
jenkins.copyArts(ios)
//jenkins.copyArts(iose2e)
jenkins.copyArts(apk)
jenkins.copyArts(apke2e)
dir('pkg') {
/* generate sha256 checksums for upload */
sh "sha256sum * | tee ${cmn.utils.pkgFilename(btype, 'sha256')}"
sh "sha256sum * | tee ${utils.pkgFilename(btype, 'sha256')}"
archiveArtifacts('*')
}
} }
@@ -57,37 +56,37 @@ pipeline {
/* object for easier URLs handling */
urls = [
/* mobile */
Apk: cmn.pkgUrl(apk), Apke2e: cmn.pkgUrl(apke2e),
iOS: cmn.pkgUrl(ios), /*iOSe2e: cmn.pkgUrl(iose2e),*/
Diawi: cmn.utils.getEnv(ios, 'DIAWI_URL'),
Apk: utils.pkgUrl(apk), Apke2e: utils.pkgUrl(apke2e),
iOS: utils.pkgUrl(ios), /*iOSe2e: utils.pkgUrl(iose2e),*/
Diawi: utils.utils.getEnv(ios, 'DIAWI_URL'),
/* upload the sha256 checksums file too */
SHA: cmn.uploadArtifact(cmn.utils.pkgFind('sha256')),
SHA: s3.uploadArtifact(utils.pkgFind('sha256')),
]
/* add URLs to the build description */
cmn.ci.setBuildDesc(urls)
jenkins.setBuildDesc(urls)
/* Create JSON file with newest build URLs */
switch (btype) {
/* legacy naming, should have named it nightly.json */
case 'nightly': cmn.updateBucketJSON(urls, 'latest.json'); break
case 'release': cmn.updateBucketJSON(urls, 'release.json'); break
case 'nightly': s3.updateBucketJSON(urls, 'latest.json'); break
}
} }
}
stage('Publish') {
steps { script {
switch (btype) {
//case 'nightly': build('misc/status.im'); break
case 'release': gh.publishReleaseMobile(); break
case 'nightly': build(job: 'misc/status.im', wait: false); break
case 'release': github.publishReleaseMobile(); break
}
} }
}
stage('Run e2e') {
when { expression { btype == 'nightly' } }
steps { script {
e2eApk = cmn.utils.getEnv(apke2e, 'SAUCE_URL')
e2eApk = utils.getEnv(apke2e, 'SAUCE_URL')
build(
job: 'end-to-end-tests/status-app-nightly', wait: false,
parameters: [string(name: 'APK_NAME', value: e2eApk)]
job: 'end-to-end-tests/status-app-nightly',
parameters: [string(name: 'APK_NAME', value: e2eApk)],
wait: false
)
} }
}
+4 -3
View File
@@ -1,3 +1,5 @@
library 'status-react-jenkins@master'
pipeline {
agent { label 'macos' }
@@ -26,10 +28,9 @@ pipeline {
stages {
stage('Prep') {
steps { script {
nix = load('ci/nix.groovy')
nix.shell(
'bundle install --gemfile=fastlane/Gemfile',
attr: 'shells.fastlane'
attr: 'shells.fastlane',
)
} }
}
@@ -44,7 +45,7 @@ pipeline {
]) {
nix.shell(
'bundle exec --gemfile=fastlane/Gemfile fastlane ios clean',
keep: ['FASTLANE_APPLE_ID', 'FASTLANE_PASSWORD']
keepEnv: ['FASTLANE_APPLE_ID', 'FASTLANE_PASSWORD'],
attr: 'shells.fastlane',
)
}
+21 -13
View File
@@ -1,5 +1,7 @@
library 'status-react-jenkins@master'
pipeline {
agent { label 'macos-xcode-11.3.1' }
agent { label 'macos-xcode-11.4.1' }
parameters {
string(
@@ -39,14 +41,11 @@ pipeline {
stage('Prep') {
steps {
script {
/* Necessary to load methods */
ios = load 'ci/ios.groovy'
cmn = load 'ci/common.groovy'
btype = cmn.utils.getBuildType()
btype = utils.getBuildType()
print "Running ${btype} build!"
cmn.ci.abortPreviousRunningBuilds()
jenkins.abortPreviousRunningBuilds()
/* Cleanup and Prep */
cmn.prep(btype)
commonPrep(btype)
}
}
}
@@ -55,19 +54,28 @@ pipeline {
stage('Checks') { stages {
stage('Lint') {
steps {
script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') }
script {
/* We want the build result to be uploaded */
catchError(
message: 'Linting check failed!',
buildResult: 'FAILURE',
stageResult: 'FAILURE'
) {
nix.shell('lein cljfmt check', attr: 'shells.lein')
}
}
}
}
stage('Tests') {
steps {
script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') }
script { nix.shell('lein test-cljs', attr: 'shells.lein') }
}
}
} }
stage('Build') { stages {
stage('JSBundle') {
steps {
script { cmn.nix.shell('make jsbundle-ios') }
script { nix.shell('make jsbundle-ios') }
}
}
stage('Bundle') {
@@ -88,7 +96,7 @@ pipeline {
stage('Upload') {
steps {
script {
env.PKG_URL = cmn.uploadArtifact(api)
env.PKG_URL = s3.uploadArtifact(api)
/* e2e builds get tested in SauceLabs */
if (btype == 'e2e') {
env.SAUCE_URL = ios.uploadToSauceLabs()
@@ -108,8 +116,8 @@ pipeline {
}
}
post {
success { script { load('ci/github.groovy').notifyPR(true) } }
failure { script { load('ci/github.groovy').notifyPR(false) } }
success { script { github.notifyPR(true) } }
failure { script { github.notifyPR(false) } }
always { sh 'make _fix-node-perms' }
}
}
+19 -11
View File
@@ -1,3 +1,5 @@
library 'status-react-jenkins@master'
pipeline {
agent { label 'linux' }
@@ -42,14 +44,11 @@ pipeline {
stage('Prep') {
steps {
script {
/* Necessary to load methods */
desktop = load 'ci/desktop.groovy'
cmn = load 'ci/common.groovy'
btype = cmn.utils.getBuildType()
btype = utils.getBuildType()
print "Running ${btype} build!"
cmn.ci.abortPreviousRunningBuilds()
jenkins.abortPreviousRunningBuilds()
/* Cleanup and Prep */
cmn.prep(btype)
commonPrep(btype)
}
}
}
@@ -58,12 +57,21 @@ pipeline {
stage('Checks') { stages {
stage('Lint') {
steps {
script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') }
script {
/* We want the build result to be uploaded */
catchError(
message: 'Linting check failed!',
buildResult: 'FAILURE',
stageResult: 'FAILURE'
) {
nix.shell('lein cljfmt check', attr: 'shells.lein')
}
}
}
}
stage('Tests') {
steps {
script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') }
script { nix.shell('lein test-cljs', attr: 'shells.lein') }
}
}
} }
@@ -95,7 +103,7 @@ pipeline {
}
stage('Upload') {
steps {
script { env.PKG_URL = cmn.uploadArtifact(app) }
script { env.PKG_URL = s3.uploadArtifact(app) }
}
}
}
@@ -108,7 +116,7 @@ pipeline {
}
}
post {
success { script { load('ci/github.groovy').notifyPR(true) } }
failure { script { load('ci/github.groovy').notifyPR(false) } }
success { script { github.notifyPR(true) } }
failure { script { github.notifyPR(false) } }
}
}
+20 -12
View File
@@ -1,5 +1,7 @@
library 'status-react-jenkins@master'
pipeline {
agent { label 'macos-xcode-11.3.1' }
agent { label 'macos-xcode-11.4.1' }
parameters {
string(
@@ -40,14 +42,11 @@ pipeline {
stage('Prep') {
steps {
script {
/* Necessary to load methods */
desktop = load 'ci/desktop.groovy'
cmn = load 'ci/common.groovy'
btype = cmn.utils.getBuildType()
btype = utils.getBuildType()
print "Running ${btype} build!"
cmn.ci.abortPreviousRunningBuilds()
jenkins.abortPreviousRunningBuilds()
/* Cleanup and Prep */
cmn.prep(btype)
commonPrep(btype)
}
}
}
@@ -56,12 +55,21 @@ pipeline {
stage('Checks') { stages {
stage('Lint') {
steps {
script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') }
script {
/* We want the build result to be uploaded */
catchError(
message: 'Linting check failed!',
buildResult: 'FAILURE',
stageResult: 'FAILURE'
) {
nix.shell('lein cljfmt check', attr: 'shells.lein')
}
}
}
}
stage('Tests') {
steps {
script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') }
script { nix.shell('lein test-cljs', attr: 'shells.lein') }
}
}
} }
@@ -93,7 +101,7 @@ pipeline {
}
stage('Upload') {
steps {
script { env.PKG_URL = cmn.uploadArtifact(dmg) }
script { env.PKG_URL = s3.uploadArtifact(dmg) }
}
}
}
@@ -106,7 +114,7 @@ pipeline {
}
}
post {
success { script { load('ci/github.groovy').notifyPR(true) } }
failure { script { load('ci/github.groovy').notifyPR(false) } }
success { script { github.notifyPR(true) } }
failure { script { github.notifyPR(false) } }
}
}
+6 -5
View File
@@ -1,3 +1,5 @@
library 'status-react-jenkins@master'
pipeline {
agent { label params.AGENT_LABEL }
@@ -25,11 +27,6 @@ pipeline {
}
stages {
stage('Prep') {
steps { script {
nix = load('ci/nix.groovy')
} }
}
stage('Setup') {
steps { script {
nix.shell('nix-env -i openssh', pure: false)
@@ -46,6 +43,7 @@ pipeline {
platforms.each { os ->
nix.build(
attr: "targets.status-go.${os}.buildInputs",
sandbox: false,
link: false
)
}
@@ -57,6 +55,7 @@ pipeline {
* (e.g. maven and node repos) */
nix.build(
attr: 'targets.mobile.android.jsbundle',
sandbox: false,
pure: false,
link: false
)
@@ -67,6 +66,7 @@ pipeline {
/* build/fetch things required to build jsbundle and android */
nix.build(
attr: 'targets.mobile.android.buildInputs',
sandbox: false,
pure: false,
link: false
)
@@ -77,6 +77,7 @@ pipeline {
/* build/fetch things required to instantiate shell.nix for TARGET=all */
nix.build(
attr: 'shells.default.buildInputs',
sandbox: false,
link: false
)
} }
+19 -11
View File
@@ -1,3 +1,5 @@
library 'status-react-jenkins@master'
pipeline {
agent { label 'linux' }
@@ -45,14 +47,11 @@ pipeline {
stage('Prep') {
steps {
script {
/* Necessary to load methods */
desktop = load 'ci/desktop.groovy'
cmn = load 'ci/common.groovy'
btype = cmn.utils.getBuildType()
btype = utils.getBuildType()
print "Running ${btype} build!"
cmn.ci.abortPreviousRunningBuilds()
jenkins.abortPreviousRunningBuilds()
/* Cleanup and Prep */
cmn.prep(btype)
commonPrep(btype)
}
}
}
@@ -61,12 +60,21 @@ pipeline {
stage('Checks') { stages {
stage('Lint') {
steps {
script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') }
script {
/* We want the build result to be uploaded */
catchError(
message: 'Linting check failed!',
buildResult: 'FAILURE',
stageResult: 'FAILURE'
) {
nix.shell('lein cljfmt check', attr: 'shells.lein')
}
}
}
}
stage('Tests') {
steps {
script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') }
script { nix.shell('lein test-cljs', attr: 'shells.lein') }
}
}
} }
@@ -98,7 +106,7 @@ pipeline {
}
stage('Upload') {
steps {
script { env.PKG_URL = cmn.uploadArtifact(app) }
script { env.PKG_URL = s3.uploadArtifact(app) }
}
}
}
@@ -111,7 +119,7 @@ pipeline {
}
}
post {
success { script { load('ci/github.groovy').notifyPR(true) } }
failure { script { load('ci/github.groovy').notifyPR(false) } }
success { script { github.notifyPR(true) } }
failure { script { github.notifyPR(false) } }
}
}
+16
View File
@@ -0,0 +1,16 @@
# Description
This folder contains files defininf [Jenkins pipelines](https://jenkins.io/doc/book/pipeline/) that run on https://ci.status.im/.
# Libraries
All `Jenkinsfile`s contain the following line:
```groovy
library 'status-react-jenkins@master'
```
Which loads the used methods - like `nix.shell()` - from a separate private repo:
https://github.com/status-im/status-react-jenkins
This is done to improve security of our CI setup.
-172
View File
@@ -1,172 +0,0 @@
nix = load 'ci/nix.groovy'
utils = load 'ci/utils.groovy'
def bundle() {
/* we use the method because parameter build type does not take e2e into account */
def btype = utils.getBuildType()
/* Disable Gradle Daemon https://stackoverflow.com/questions/38710327/jenkins-builds-fail-using-the-gradle-daemon */
def gradleOpt = "-PbuildUrl='${currentBuild.absoluteUrl}' --console plain "
/* we don't need x86 for any builds except e2e */
env.ANDROID_ABI_INCLUDE="armeabi-v7a;arm64-v8a"
env.ANDROID_ABI_SPLIT="false"
/* some builds tyes require different architectures */
switch (btype) {
case 'e2e':
env.ANDROID_ABI_INCLUDE="x86" /* e2e builds are used with simulators */
break
case 'release':
env.ANDROID_ABI_SPLIT="true"
gradleOpt += "-PreleaseVersion='${utils.getVersion()}'"
break
}
/* credentials necessary to open the keystore and sign the APK */
withCredentials([
string(
credentialsId: 'android-keystore-pass',
variable: 'STATUS_RELEASE_STORE_PASSWORD'
),
usernamePassword(
credentialsId: 'android-keystore-key-pass',
usernameVariable: 'STATUS_RELEASE_KEY_ALIAS',
passwordVariable: 'STATUS_RELEASE_KEY_PASSWORD'
)
]) {
/* Nix target which produces the final APKs */
nix.build(
attr: 'targets.mobile.android.release',
conf: [
'status-im.ci': '1',
'status-im.build-type': btype,
'status-im.status-react.gradle-opts': gradleOpt,
'status-im.status-react.build-number': utils.readBuildNumber(),
],
safeEnv: [
'STATUS_RELEASE_KEY_ALIAS',
'STATUS_RELEASE_STORE_PASSWORD',
'STATUS_RELEASE_KEY_PASSWORD',
],
keep: [
'ANDROID_ABI_SPLIT',
'ANDROID_ABI_INCLUDE',
'STATUS_RELEASE_STORE_FILE',
],
sbox: [
env.STATUS_RELEASE_STORE_FILE,
],
link: false
)
}
/* necessary for Fastlane */
def apks = renameAPKs()
/* for use with Fastlane */
env.APK_PATHS = apks.join(";")
return apks
}
def extractArchFromAPK(name) {
def pattern = /app-(.+)-[^-]+.apk/
/* extract architecture from filename */
def matches = (name =~ pattern)
if (matches.size() > 0) {
return matches[0][1]
}
if (utils.isE2EBuild()) {
return 'x86'
}
/* non-release builds make universal APKs */
return 'universal'
}
/**
* We need more informative filenames for all builds.
* For more details on the format see utils.pkgFilename().
**/
def renameAPKs() {
/* find all APK files */
def apkGlob = 'result/*.apk'
def found = findFiles(glob: apkGlob)
if (found.size() == 0) {
throw "APKs not found via glob: ${apkGlob}"
}
def renamed = []
/* rename each for upload & archiving */
for (apk in found) {
def arch = extractArchFromAPK(apk)
def pkg = utils.pkgFilename(env.BUILD_TYPE, 'apk', arch)
def newApk = "result/${pkg}"
renamed += newApk
sh "cp ${apk.path} ${newApk}"
}
return renamed
}
def uploadToPlayStore(type = 'nightly') {
withCredentials([
string(credentialsId: "SUPPLY_JSON_KEY_DATA", variable: 'GOOGLE_PLAY_JSON_KEY'),
]) {
nix.shell(
"fastlane android ${type}",
keep: ['FASTLANE_DISABLE_COLORS', 'APK_PATHS', 'GOOGLE_PLAY_JSON_KEY'],
attr: 'shells.fastlane',
pure: false
)
}
}
def uploadToSauceLabs() {
def changeId = utils.changeId()
if (changeId != null) {
env.SAUCE_LABS_NAME = "${changeId}.apk"
} else {
def pkg = utils.pkgFilename(env.BUILD_TYPE, 'apk', 'x86')
env.SAUCE_LABS_NAME = "${pkg}"
}
withCredentials([
usernamePassword(
credentialsId: 'sauce-labs-api',
usernameVariable: 'SAUCE_USERNAME',
passwordVariable: 'SAUCE_ACCESS_KEY'
),
]) {
nix.shell(
'fastlane android saucelabs',
keep: [
'FASTLANE_DISABLE_COLORS', 'APK_PATHS',
'SAUCE_ACCESS_KEY', 'SAUCE_USERNAME', 'SAUCE_LABS_NAME'
],
attr: 'shells.fastlane',
pure: false
)
}
return env.SAUCE_LABS_NAME
}
def uploadToDiawi() {
withCredentials([
string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'),
]) {
nix.shell(
'fastlane android upload_diawi',
keep: ['FASTLANE_DISABLE_COLORS', 'APK_PATHS', 'DIAWI_TOKEN'],
attr: 'shells.fastlane',
pure: false
)
}
diawiUrl = readFile "${env.WORKSPACE}/fastlane/diawi.out"
return diawiUrl
}
def coverage() {
withCredentials([
string(credentialsId: 'coveralls-status-react-token', variable: 'COVERALLS_REPO_TOKEN'),
]) {
nix.shell(
'make coverage',
keep: ['COVERALLS_REPO_TOKEN', 'COVERALLS_SERVICE_NAME', 'COVERALLS_SERVICE_JOB_ID']
)
}
}
return this
-100
View File
@@ -1,100 +0,0 @@
import groovy.json.JsonBuilder
/* Libraries -----------------------------------------------------------------*/
ci = load 'ci/jenkins.groovy'
nix = load 'ci/nix.groovy'
utils = load 'ci/utils.groovy'
/* Small Helpers -------------------------------------------------------------*/
def pkgUrl(build) {
return utils.getEnv(build, 'PKG_URL')
}
def updateBucketJSON(urls, fileName) {
/* latest.json has slightly different key names */
def content = [
DIAWI: urls.Diawi,
APK: urls.Apk, IOS: urls.iOS,
APP: urls.App, MAC: urls.Mac,
WIN: urls.Win, SHA: urls.SHA
]
def filePath = "${pwd()}/pkg/${fileName}"
/* it might not exist */
sh 'mkdir -p pkg'
def contentJson = new JsonBuilder(content).toPrettyString()
println "${fileName}:\n${contentJson}"
new File(filePath).write(contentJson)
return uploadArtifact(filePath)
}
def prep(type = 'nightly') {
/* build/downloads all nix deps in advance */
nix.prepEnv()
/* rebase unless this is a release build */
utils.doGitRebase()
/* ensure that we start from a known state */
sh 'make clean'
/* Disable git hooks in CI, it's not useful, takes time and creates weird errors at times
(e.g. bin/sh: 2: /etc/ssl/certs/ca-certificates.crt: Permission denied) */
sh 'make disable-githooks'
/* pick right .env and update from params */
utils.updateEnv(type)
if (['android', 'ios'].contains(env.TARGET)) {
/* Run at start to void mismatched numbers */
utils.genBuildNumber()
}
nix.shell('watchman watch-del-all', attr: 'shells.watchman')
if (env.TARGET == 'ios') {
/* install ruby dependencies */
nix.shell(
'bundle install --gemfile=fastlane/Gemfile --quiet',
attr: 'shells.fastlane')
}
if (['macos', 'linux', 'windows'].contains(env.TARGET)) {
/* node deps, pods, and status-go download */
nix.shell('scripts/prepare-for-desktop-platform.sh', pure: false)
}
/* run script in the nix shell so that node_modules gets instantiated before attempting the copies */
nix.shell('scripts/copy-translations.sh chmod', attr: "shells.${env.TARGET}")
}
def uploadArtifact(path) {
/* defaults for upload */
def domain = 'ams3.digitaloceanspaces.com'
def bucket = 'status-im'
/* There's so many PR builds we need a separate bucket */
if (utils.isPRBuild()) {
bucket = 'status-im-prs'
}
/* WARNING: s3cmd can't guess APK MIME content-type */
def customOpts = ''
if (path.endsWith('apk')) {
customOpts += "--mime-type='application/vnd.android.package-archive'"
}
/* We also need credentials for the upload */
withCredentials([usernamePassword(
credentialsId: 'digital-ocean-access-keys',
usernameVariable: 'DO_ACCESS_KEY',
passwordVariable: 'DO_SECRET_KEY'
)]) {
sh("""
s3cmd ${customOpts} \\
--acl-public \\
--host="${domain}" \\
--host-bucket="%(bucket)s.${domain}" \\
--access_key=${DO_ACCESS_KEY} \\
--secret_key=${DO_SECRET_KEY} \\
put ${path} s3://${bucket}/
""")
}
return "https://${bucket}.${domain}/${utils.getFilename(path)}"
}
return this
-109
View File
@@ -1,109 +0,0 @@
nix = load 'ci/nix.groovy'
utils = load 'ci/utils.groovy'
packageFolder = './StatusImPackage'
def buildJSBundle() {
nix.shell(
'''
make jsbundle-desktop && \
./scripts/build-desktop.sh buildJSBundle
''',
keep: ['VERBOSE_LEVEL']
)
}
def uploadArtifact(filename) {
def domain = 'ams3.digitaloceanspaces.com'
def bucket = 'status-im-desktop'
withCredentials([usernamePassword(
credentialsId: 'digital-ocean-access-keys',
usernameVariable: 'DO_ACCESS_KEY',
passwordVariable: 'DO_SECRET_KEY'
)]) {
sh """
s3cmd \\
--acl-public \\
--host='${domain}' \\
--host-bucket='%(bucket)s.${domain}' \\
--access_key=${DO_ACCESS_KEY} \\
--secret_key=${DO_SECRET_KEY} \\
put ${filename} s3://${bucket}/
"""
}
def url = "https://${bucket}.${domain}/${filename}"
return url
}
/* MAIN --------------------------------------------------*/
def compile() {
/* disable logs for desktop builds when releasing */
if (params.BUILD_TYPE == 'release') {
env.STATUS_NO_LOGGING = 1
}
/* since QT is in a custom path we need to add it to PATH */
if (env.QT_PATH) {
env.PATH = "${env.QT_PATH}:${env.PATH}"
}
nix.shell(
'./scripts/build-desktop.sh compile',
keep: ['VERBOSE_LEVEL']
)
}
def bundleWindows(type = 'nightly') {
def pkg
nix.shell(
'./scripts/build-desktop.sh bundle',
keep: ['VERBOSE_LEVEL']
)
dir(packageFolder) {
pkg = utils.pkgFilename(type, 'exe')
sh "mv ../Status-x86_64-setup.exe ${pkg}"
}
return "${packageFolder}/${pkg}".drop(2)
}
def bundleLinux(type = 'nightly') {
def pkg
nix.shell(
'./scripts/build-desktop.sh bundle',
keep: ['VERBOSE_LEVEL']
)
dir(packageFolder) {
pkg = utils.pkgFilename(type, 'AppImage')
sh "mv ../Status-x86_64.AppImage ${pkg}"
}
return "${packageFolder}/${pkg}".drop(2)
}
def bundleMacOS(type = 'nightly') {
def pkg = utils.pkgFilename(type, 'dmg')
nix.shell(
'./scripts/build-desktop.sh bundle',
keep: ['VERBOSE_LEVEL']
)
dir(packageFolder) {
withCredentials([
string(credentialsId: 'desktop-gpg-outer-pass', variable: 'GPG_PASS_OUTER'),
string(credentialsId: 'desktop-gpg-inner-pass', variable: 'GPG_PASS_INNER'),
string(credentialsId: 'desktop-keychain-pass', variable: 'KEYCHAIN_PASS')
]) {
nix.shell(
"""
../scripts/sign-macos-pkg.sh Status.app ../deployment/macos/macos-developer-id.keychain-db.gpg && \
../node_modules/appdmg/bin/appdmg.js ../deployment/macos/status-dmg.json ${pkg} && \
../scripts/sign-macos-pkg.sh ${pkg} ../deployment/macos/macos-developer-id.keychain-db.gpg
""",
pure: false,
keep: ['GPG_PASS_OUTER', 'GPG_PASS_INNER', 'KEYCHAIN_PASS']
)
}
}
return "${packageFolder}/${pkg}".drop(2)
}
return this
-62
View File
@@ -1,62 +0,0 @@
import groovy.json.JsonBuilder
utils = load 'ci/utils.groovy'
/**
* Methods for interacting with ghcmgr API.
* For more details see:
* https://github.com/status-im/github-comment-manager
**/
def buildObj(success) {
def pkg_url = env.PKG_URL
/* a bare ipa file is not installable on iOS */
if (env.TARGET == 'ios' && env.DIAWI_URL != "") {
pkg_url = env.DIAWI_URL
}
/* assemble build object valid for ghcmgr */
return [
id: env.BUILD_DISPLAY_NAME,
commit: GIT_COMMIT.take(8),
success: success != null ? success : true,
platform: env.TARGET + (utils.isE2EBuild() ? '-e2e' : ''),
duration: utils.buildDuration(),
url: currentBuild.absoluteUrl,
pkg_url: pkg_url,
]
}
def postBuild(success) {
/**
* This is our own service for avoiding comment spam.
* https://github.com/status-im/github-comment-manager
**/
def ghcmgrurl = 'https://ghcmgr.status.im'
def body = buildObj(success)
def json = new JsonBuilder(body).toPrettyString()
def stdout = null
withCredentials([usernamePassword(
credentialsId: 'ghcmgr-auth',
usernameVariable: 'GHCMGR_USER',
passwordVariable: 'GHCMGR_PASS'
)]) {
stdout = sh(
returnStdout: true,
script: """
curl --silent \
-XPOST --data '${json}' \
-u '${GHCMGR_USER}:${GHCMGR_PASS}' \
-w '\nHTTP_CODE:%{http_code}' \
-H "content-type: application/json" \
'${ghcmgrurl}/builds/status-react/${utils.changeId()}'
"""
)
}
/* We're not using --fail because it suppresses server response */
if (!stdout.contains('HTTP_CODE:201')) {
println("STDOUT:\n${stdout}")
error("Notifying GHCMGR failed")
}
}
return this
-205
View File
@@ -1,205 +0,0 @@
import groovy.json.JsonBuilder
/* I'm using utils from ghcmgr to avoid another load */
ghcmgr = load 'ci/ghcmgr.groovy'
/**
* Methods for interacting with GitHub API and related tools.
**/
/* Comments -------------------------------------------------------*/
def notify(message) {
def githubIssuesUrl = 'https://api.github.com/repos/status-im/status-react/issues'
def changeId = ghcmgr.utils.changeId()
if (changeId == null) { return }
def msgObj = [body: message]
def msgJson = new JsonBuilder(msgObj).toPrettyString()
withCredentials([usernamePassword(
credentialsId: 'status-im-auto',
usernameVariable: 'GH_USER',
passwordVariable: 'GH_PASS'
)]) {
sh """
curl --silent \
-u '${GH_USER}:${GH_PASS}' \
--data '${msgJson}' \
-H "Content-Type: application/json" \
"${githubIssuesUrl}/${changeId}/comments"
""".trim()
}
}
def notifyFull(urls) {
def msg = "#### :white_check_mark: "
msg += "[${env.JOB_NAME}${currentBuild.displayName}](${currentBuild.absoluteUrl}) "
msg += "CI BUILD SUCCESSFUL in ${ghcmgr.utils.buildDuration()} (${GIT_COMMIT.take(8)})\n"
msg += '| | | | | |\n'
msg += '|-|-|-|-|-|\n'
msg += "| [Android](${urls.Apk}) ([e2e](${urls.Apke2e})) "
msg += "| [iOS](${urls.iOS}) ([e2e](${urls.iOSe2e})) |"
if (urls.Mac != null) {
msg += " [MacOS](${urls.Mac}) | [AppImage](${urls.App}) | [Windows](${urls.Win}) |"
} else {
msg += " ~~MacOS~~ | ~~AppImage~~ | ~~Windows~~~ |"
}
notify(msg)
}
def notifyPRFailure() {
def d = ":small_orange_diamond:"
def msg = "#### :x: "
msg += "[${env.JOB_NAME}${currentBuild.displayName}](${currentBuild.absoluteUrl}) ${d} "
msg += "${ghcmgr.utils.buildDuration()} ${d} ${GIT_COMMIT.take(8)} ${d} "
msg += "[:page_facing_up: build log](${currentBuild.absoluteUrl}/consoleText)"
//msg += "Failed in stage: ${env.STAGE_NAME}\n"
//msg += "```${currentBuild.rawBuild.getLog(5)}```"
notify(msg)
}
def notifyPRSuccess() {
def d = ":small_blue_diamond:"
def msg = "#### :heavy_check_mark: "
def type = ghcmgr.utils.isE2EBuild() ? ' e2e' : ''
msg += "[${env.JOB_NAME}${currentBuild.displayName}](${currentBuild.absoluteUrl}) ${d} "
msg += "${ghcmgr.utils.buildDuration()} ${d} ${GIT_COMMIT.take(8)} ${d} "
msg += "[:package: ${env.TARGET}${type} package](${env.PKG_URL})"
notify(msg)
}
/* Releases -------------------------------------------------------*/
def getPrevRelease() {
return sh(returnStdout: true,
script: "git for-each-ref --format '%(refname)' --sort=committerdate refs/remotes/origin/release"
).trim().split('\\r?\\n').last()
}
def getDiffUrl(prev, current) {
prev = prev.replaceAll(/.*origin\//, '')
return "https://github.com/status-im/status-react/compare/${prev}...${current}"
}
def getReleaseChanges() {
def prevRelease = getPrevRelease()
def curRelease = ghcmgr.utils.branchName()
def changes = ''
try {
changes = sh(returnStdout: true,
script: """
git log \
--cherry-pick \
--right-only \
--no-merges \
--format='%h %s' \
${prevRelease}..HEAD
"""
).trim()
} catch (Exception ex) {
println 'ERROR: Failed to retrieve changes.'
println ex.message
return ':warning: __Please fill me in!__'
}
/* remove single quotes to not confuse formatting */
changes = changes.replace('\'', '')
return changes + '\nDiff:' + getDiffUrl(prevRelease, curRelease)
}
def releaseExists(Map args) {
def output = sh(
returnStdout: true,
script: """
github-release info --json \
-u '${args.user}' \
-r '${args.repo}' \
| jq '.Releases[].tag_name'
"""
)
return output.contains(args.version)
}
def releaseDelete(Map args) {
if (!releaseExists(args)) {
return
}
sh """
github-release delete \
-u '${args.user}' \
-r '${args.repo}' \
-t '${args.version}' \
"""
}
def releaseUpload(Map args) {
args.files.each {
sh """
github-release upload \
-u '${args.user}' \
-r '${args.repo}' \
-t '${args.version}' \
-n ${it} \
-f ${it}
"""
}
}
def releasePublish(Map args) {
sh """
github-release release \
-u '${args.user}' \
-r '${args.repo}' \
-n '${args.version}' \
-t '${args.version}' \
-c '${args.branch}' \
-d '${args.desc}' \
${args.draft ? '--draft' : ''}
"""
}
def publishRelease(Map args) {
def config = [
draft: true,
user: 'status-im',
repo: 'status-react',
files: args.files,
version: args.version,
branch: ghcmgr.utils.branchName(),
desc: getReleaseChanges(),
]
/* we release only for mobile right now */
withCredentials([usernamePassword(
credentialsId: 'status-im-auto',
usernameVariable: 'GITHUB_USER',
passwordVariable: 'GITHUB_TOKEN'
)]) {
releaseDelete(config) /* so we can re-release it */
releasePublish(config)
releaseUpload(config)
}
}
def publishReleaseMobile(path='pkg') {
def found = findFiles(glob: "${path}/*")
if (found.size() == 0) {
sh "ls ${path}"
error("No file to release in ${path}")
}
publishRelease(
version: ghcmgr.utils.getVersion(),
files: found.collect { it.path },
)
}
def notifyPR(success) {
if (ghcmgr.utils.changeId() == null) { return }
try {
ghcmgr.postBuild(success)
} catch (ex) { /* fallback to posting directly to GitHub */
println "Failed to use GHCMGR: ${ex}"
switch (success) {
case true: notifyPRSuccess(); break
}
}
}
return this
-102
View File
@@ -1,102 +0,0 @@
nix = load('ci/nix.groovy')
utils = load('ci/utils.groovy')
def plutil(name, value) {
return """
plutil -replace ${name} -string ${value} ios/StatusIm/Info.plist;
"""
}
def bundle() {
def btype = utils.getBuildType()
def target
switch (btype) {
case 'release': target = 'release'; break;
case 'testflight': target = 'release'; break;
case 'e2e': target = 'e2e'; break;
default: target = 'nightly';
}
/* configure build metadata */
nix.shell(plutil('CFBundleShortVersionString', utils.getVersion()), attr: 'shells.ios')
nix.shell(plutil('CFBundleVersion', utils.genBuildNumber()), attr: 'shells.ios')
nix.shell(plutil('CFBundleBuildUrl', currentBuild.absoluteUrl), attr: 'shells.ios')
/* the dir might not exist */
sh 'mkdir -p status-e2e'
/* build the actual app */
withCredentials([
string(credentialsId: "slave-pass-${env.NODE_NAME}", variable: 'KEYCHAIN_PASSWORD'),
string(credentialsId: 'fastlane-match-password', variable: 'MATCH_PASSWORD'),
usernamePassword(
credentialsId: 'fastlane-match-apple-id',
usernameVariable: 'FASTLANE_APPLE_ID',
passwordVariable: 'FASTLANE_PASSWORD'
),
]) {
nix.shell(
"bundle exec --gemfile=fastlane/Gemfile fastlane ios ${target}",
keep: [
'FASTLANE_DISABLE_COLORS',
'FASTLANE_PASSWORD', 'KEYCHAIN_PASSWORD',
'MATCH_PASSWORD', 'FASTLANE_APPLE_ID',
],
attr: 'shells.ios'
)
}
/* rename built file for uploads and archivization */
def pkg = ''
if (btype == 'release') {
pkg = utils.pkgFilename('release', 'ipa')
sh "cp status_appstore/StatusIm.ipa ${pkg}"
} else if (btype == 'e2e') {
pkg = utils.pkgFilename('e2e', 'app.zip')
sh "cp status-e2e/StatusIm.app.zip ${pkg}"
} else if (btype != 'testflight') {
pkg = utils.pkgFilename(btype, 'ipa')
sh "cp status-adhoc/StatusIm.ipa ${pkg}"
}
/* necessary for Diawi upload */
env.DIAWI_IPA = pkg
return pkg
}
def uploadToDiawi() {
withCredentials([
string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'),
]) {
/* This can silently fail with 'File is not processed.' */
nix.shell(
'bundle exec --verbose --gemfile=fastlane/Gemfile fastlane ios upload_diawi',
keep: ['FASTLANE_DISABLE_COLORS', 'DIAWI_TOKEN'],
attr: 'shells.fastlane'
)
}
diawiUrl = readFile "${env.WORKSPACE}/fastlane/diawi.out"
/* Save the URL in the build description */
currentBuild.description = "<a href=\"${diawiUrl}\">Diawi Link</a>"
return diawiUrl
}
def uploadToSauceLabs() {
def changeId = utils.getParentRunEnv('CHANGE_ID')
if (changeId != null) {
env.SAUCE_LABS_NAME = "${changeId}.app.zip"
} else {
env.SAUCE_LABS_NAME = "im.status.ethereum-e2e-${utils.gitCommit()}.app.zip"
}
withCredentials([
usernamePassword(
credentialsId: 'sauce-labs-api',
usernameVariable: 'SAUCE_USERNAME',
passwordVariable: 'SAUCE_ACCESS_KEY'
),
]) {
nix.shell(
'bundle exec --gemfile=fastlane/Gemfile fastlane ios saucelabs',
keep: ['FASTLANE_DISABLE_COLORS', 'SAUCE_ACCESS_KEY', 'SAUCE_USERNAME'],
attr: 'shells.fastlane'
)
}
return env.SAUCE_LABS_NAME
}
return this
-92
View File
@@ -1,92 +0,0 @@
import jenkins.model.CauseOfInterruption.UserInterruption
import hudson.model.Result
import hudson.model.Run
utils = load 'ci/utils.groovy'
@NonCPS
def abortPreviousRunningBuilds() {
/* Aborting makes sense only for PR builds, since devs start so many of them */
if (!env.JOB_NAME.contains('status-react/prs')) {
println ">> Not aborting any previous jobs. Not a PR build."
return
}
Run previousBuild = currentBuild.rawBuild.getPreviousBuildInProgress()
while (previousBuild != null) {
if (previousBuild.isInProgress()) {
def executor = previousBuild.getExecutor()
if (executor != null) {
println ">> Aborting older build #${previousBuild.number}"
executor.interrupt(Result.ABORTED, new UserInterruption(
"newer build #${currentBuild.number}"
))
}
}
previousBuild = previousBuild.getPreviousBuildInProgress()
}
}
def strParam(key, value) {
/* just a helper for making string params */
return [
name: key,
value: value,
$class: 'StringParameterValue',
]
}
def Build(name = null) {
/**
* Generate parameters to pass from current params
* This allows utils.updateEnv() to work in sub-jobs
**/
parameters = params.keySet().collectEntries { key ->
[(key): strParam(key, params.get(key))]
}
/* default to current build type */
parameters['BUILD_TYPE'] = strParam('BUILD_TYPE', utils.getBuildType())
/* need to drop origin/ to match definitions of child jobs */
parameters['BRANCH'] = strParam('BRANCH', utils.branchName())
/* necessary for updating GitHub PRs */
parameters['CHANGE_ID'] = strParam('CHANGE_ID', env.CHANGE_ID)
/* always pass the BRANCH and BUILD_TYPE params with current branch */
def b = build(
job: name,
/* this allows us to analize the job even after failure */
propagate: false,
parameters: parameters.values()
)
/* BlueOcean seems to not show child-build links */
println "Build: ${b.getAbsoluteUrl()} (${b.result})"
if (b.result != 'SUCCESS') {
error("Build Failed")
}
return b
}
def copyArts(build) {
/**
* The build argument is of class RunWrapper.
* https://javadoc.jenkins.io/plugin/workflow-support/org/jenkinsci/plugins/workflow/support/steps/build/RunWrapper.html
**/
copyArtifacts(
projectName: build.fullProjectName,
target: 'pkg',
flatten: true,
selector: specific("${build.number}")
)
}
def setBuildDesc(Map links) {
def desc = 'Links: \n'
links.each { type, url ->
if (url != null) {
desc += "<a href=\"${url}\">${type}</a> \n"
}
}
currentBuild.description = desc
}
return this
-166
View File
@@ -1,166 +0,0 @@
/**
* Arguments:
* - pure - Use --pure mode with Nix for more deterministic behaviour
* - keep - List of env variables to keep even in pure mode
* - args - Map of arguments to provide to --argstr
**/
def shell(Map opts = [:], String cmd) {
def defaults = [
pure: true,
args: ['target': env.TARGET ? env.TARGET : 'default'],
keep: ['LOCALE_ARCHIVE_2_27'],
]
/* merge defaults with received opts */
opts = defaults + opts
/* previous merge overwrites the array */
opts.keep = (opts.keep + defaults.keep).unique()
/* not all targets can use a pure build */
if (env.TARGET in ['windows', 'ios']) {
opts.pure = false
}
sh("""
set +x
. ~/.nix-profile/etc/profile.d/nix.sh
set -x
nix-shell --run \'${cmd}\' ${_getNixCommandArgs(opts, true)}
""")
}
/**
* Arguments:
* - pure - Use --pure mode with Nix for more deterministic behaviour
* - link - Bu default build creates a `result` directory, you can turn that off
* - keep - List of env variables to pass through to Nix build
* - conf - Map of config values to provide to --arg config
* - args - Map of arguments to provide to --argstr
* - attr - Name of attribute to use with --attr flag
* - sbox - List of host file paths to pass to the Nix expression
* - safeEnv - Name of env variables to pass securely through to Nix build (they won't get captured in Nix derivation file)
**/
def build(Map opts = [:]) {
def defaults = [
pure: true,
link: true,
args: ['target': env.TARGET],
keep: [],
conf: [:],
attr: null,
sbox: [],
safeEnv: [],
]
/* merge defaults with received opts */
opts = defaults + opts
/* Previous merge overwrites the array */
opts.args = defaults.args + opts.args
opts.keep = (opts.keep + defaults.keep).unique()
def nixPath = sh(
returnStdout: true,
script: """
set +x
. ~/.nix-profile/etc/profile.d/nix.sh
set -x
nix-build ${_getNixCommandArgs(opts, false)}
"""
).trim()
/* if not linking, copy results, but only if there's just one path */
if (!opts.link && nixPath && !nixPath.contains('\n')) {
copyResults(nixPath)
}
return nixPath
}
private def copyResults(path) {
def resultsPath = "${env.WORKSPACE}/result"
sh "rm -fr ${resultsPath}"
sh "mkdir -p ${resultsPath}"
sh "cp -fr ${path}/* ${resultsPath}/"
sh "chmod -R 755 ${resultsPath}"
}
private makeNixBuildEnvFile(Map opts = [:]) {
File envFile = File.createTempFile("nix-env", ".tmp")
if (!opts.safeEnv.isEmpty()) {
// Export the environment variables we want to keep into a temporary script we can pass to Nix and source it from the build script
def exportCommandList = opts.safeEnv.collect { envVarName -> """
echo \"export ${envVarName}=\\\"\$(printenv ${envVarName})\\\"\" >> ${envFile.absolutePath}
""" }
def exportCommands = exportCommandList.join("")
sh """
${exportCommands}
chmod u+x ${envFile.absolutePath}
"""
opts.args = opts.args + [ 'secrets-file': envFile.absolutePath ]
opts.sbox = opts.sbox + envFile.absolutePath
}
return envFile
}
private def _getNixCommandArgs(Map opts = [:], boolean isShell) {
def keepFlags = []
def entryPoint = "\'${env.WORKSPACE}/shell.nix\'"
if (!isShell || opts.attr != null) {
entryPoint = "\'${env.WORKSPACE}/default.nix\'"
}
def extraSandboxPathsFlag = ''
if (isShell) {
keepFlags = opts.keep.collect { var -> "--keep ${var} " }
} else {
def envVarsList = opts.keep.collect { var -> "${var}=\"${env[var]}\";" }
keepFlags = ["--arg env \'{${envVarsList.join("")}}\'"]
/* Export the environment variables we want to keep into
* a Nix attribute set we can pass to Nix and source it from the build script */
def envFile = makeNixBuildEnvFile(opts)
envFile.deleteOnExit()
}
def configFlag = ''
def argsFlags = opts.args.collect { key,val -> "--argstr ${key} \'${val}\'" }
def attrFlag = ''
if (opts.attr != null) {
attrFlag = "--attr '${opts.attr}'"
}
if (opts.conf != null && opts.conf != [:]) {
def configFlags = opts.conf.collect { key,val -> "${key}=\"${val}\";" }
configFlag = "--arg config \'{${configFlags.join('')}}\'"
}
if (opts.sbox != null && !opts.sbox.isEmpty()) {
extraSandboxPathsFlag = "--option extra-sandbox-paths \"${opts.sbox.join(' ')}\""
}
return [
opts.pure ? "--pure" : "",
opts.link ? "" : "--no-out-link",
configFlag,
keepFlags.join(" "),
argsFlags.join(" "),
extraSandboxPathsFlag,
attrFlag,
entryPoint,
].join(" ")
}
def prepEnv() {
if (env.TARGET in ['linux', 'windows', 'android']) {
def glibcLocales = sh(
returnStdout: true,
script: """
. ~/.nix-profile/etc/profile.d/nix.sh && \\
nix-build --no-out-link '<nixpkgs>' -A glibcLocales
"""
).trim()
/**
* This is a hack to fix missing locale errors.
* See:
* - https://github.com/NixOS/nixpkgs/issues/38991
* - https://qiita.com/kimagure/items/4449ceb0bda5c10ca50f
**/
env.LOCALE_ARCHIVE_2_27 = "${glibcLocales}/lib/locale/locale-archive"
}
}
return this
+4
View File
@@ -40,6 +40,10 @@ pipeline {
usernameVariable: 'SAUCE_USERNAME',
passwordVariable: 'SAUCE_ACCESS_KEY'
),
string(
credentialsId: 'etherscan-api-key',
variable: 'ETHERSCAN_API_KEY'
),
]) {
dir('test/appium/tests') {
sh """
+8 -3
View File
@@ -61,9 +61,10 @@ pipeline {
}
withCredentials([
string(
credentialsId: 'GIT_HUB_TOKEN',
variable: 'GIT_HUB_TOKEN'
usernamePassword(
credentialsId: 'status-im-auto-token',
usernameVariable: 'GIT_HUB_USER', /* ignored */
passwordVariable: 'GIT_HUB_TOKEN'
),
usernamePassword(
credentialsId: 'test-rail-api',
@@ -75,6 +76,10 @@ pipeline {
usernameVariable: 'SAUCE_USERNAME',
passwordVariable: 'SAUCE_ACCESS_KEY'
),
string(
credentialsId: 'etherscan-api-key',
variable: 'ETHERSCAN_API_KEY'
),
]) {
dir('test/appium/tests') {
sh """
-151
View File
@@ -1,151 +0,0 @@
def getVersion() {
def path = "${env.WORKSPACE}/VERSION"
return readFile(path).trim()
}
def branchName() {
return env.GIT_BRANCH.replaceAll(/.*origin\//, '')
}
def parentOrCurrentBuild() {
def c = currentBuild.rawBuild.getCause(hudson.model.Cause$UpstreamCause)
if (c == null) { return currentBuild }
return c.getUpstreamRun()
}
def timestamp() {
/* we use parent if available to make timestmaps consistent */
def now = new Date(parentOrCurrentBuild().timeInMillis)
return now.format('yyMMdd-HHmmss', TimeZone.getTimeZone('UTC'))
}
def gitCommit() {
return GIT_COMMIT.take(6)
}
def pkgFilename(type, ext, arch=null) {
/* the grep removes the null arch */
return [
"StatusIm", timestamp(), gitCommit(), type, arch,
].grep().join('-') + ".${ext}"
}
def doGitRebase() {
if (!isPRBuild()) {
println 'Skipping rebase due for non-PR build...'
return
}
def rebaseBranch = 'develop'
if (env.CHANGE_TARGET) { /* This is available for PR builds */
rebaseBranch = env.CHANGE_TARGET
}
sh 'git status'
sh "git fetch --force origin ${rebaseBranch}:${rebaseBranch}"
try {
sh "git rebase ${rebaseBranch}"
} catch (e) {
sh 'git rebase --abort'
throw e
}
}
def genBuildNumber() {
def number = sh(
returnStdout: true,
script: "${env.WORKSPACE}/scripts/version/gen_build_no.sh"
).trim()
println "Build Number: ${number}"
return number
}
def readBuildNumber() {
def number = sh(
returnStdout: true,
script: "${env.WORKSPACE}/scripts/version/build_no.sh"
).trim().toInteger()
return number
}
def getDirPath(path) {
return path.tokenize('/')[0..-2].join('/')
}
def getFilename(path) {
return path.tokenize('/')[-1]
}
def getEnv(build, envvar) {
return build.getBuildVariables().get(envvar)
}
def buildDuration() {
def duration = currentBuild.durationString
return '~' + duration.take(duration.lastIndexOf(' and counting'))
}
def pkgFind(glob) {
def fullGlob = "pkg/*${glob}"
def found = findFiles(glob: fullGlob)
if (found.size() == 0) {
sh 'ls -l pkg/'
error("File not found via glob: ${fullGlob} ${found.size()}")
}
return found[0].path
}
def isPRBuild() {
return env.JOB_NAME.startsWith('status-react/prs')
}
def isE2EBuild() {
return env.JOB_NAME.contains('e2e')
}
def getBuildType() {
def jobName = env.JOB_NAME
if (isE2EBuild()) {
return 'e2e'
}
if (isPRBuild()) {
return 'pr'
}
if (jobName.startsWith('status-react/nightly')) {
return 'nightly'
}
if (jobName.startsWith('status-react/release')) {
return 'release'
}
return params.BUILD_TYPE
}
def getParentRunEnv(name) {
def c = currentBuild.rawBuild.getCause(hudson.model.Cause$UpstreamCause)
if (c == null) { return null }
return c.getUpstreamRun().getEnvironment()[name]
}
def changeId() {
/* CHANGE_ID can be provided via the build parameters or from parent */
def changeId = env.CHANGE_ID
changeId = params.CHANGE_ID ? params.CHANGE_ID : changeId
changeId = getParentRunEnv('CHANGE_ID') ? getParentRunEnv('CHANGE_ID') : changeId
if (!changeId) {
println('This build is not related to a PR, CHANGE_ID missing.')
println('GitHub notification impossible, skipping...')
return null
}
return changeId
}
def updateEnv(type) {
def envFile = "${env.WORKSPACE}/.env.jenkins"
/* select .env based on type of build */
if (['nightly', 'release', 'e2e'].contains(type)) {
envFile = "${env.WORKSPACE}/.env.${type}"
}
sh "ln -sf ${envFile} .env"
/* show contents for debugging purposes */
sh "cat ${envFile}"
}
return this
+12 -6
View File
@@ -18,7 +18,7 @@
"react-native-image-resizer"
"react-native-image-crop-picker"
"react-native-svg"
"react-native-webview-bridge"
"react-native-webview"
"react-native-touch-id"
"web3-utils"
"chance"
@@ -34,14 +34,21 @@
"react-native/Libraries/vendor/emitter/EventEmitter"
"react-native-background-timer"
"react-native-fetch-polyfill"
"react-navigation"
"react-native-navigation-twopane"
"@react-navigation/native"
"@react-navigation/stack"
"@react-navigation/bottom-tabs"
;; "react-native-navigation-twopane"
"hi-base32"
"functional-red-black-tree"
"react-native-mail"
"react-native-shake"
"@react-native-community/netinfo"
"react-native-safe-area-context"]
"react-native-gesture-handler"
"react-native-reanimated"
"react-native-redash"
"react-native-haptic-feedback"
"react-native-safe-area-context"
"react-native-dark-mode"]
;; Desktop modules
:desktop-modules ["buffer"
"bignumber.js"
@@ -74,9 +81,8 @@
"react-native-desktop-notification"
"react-native-desktop-gesture-handler"
"web3-utils"
"react-navigation"
"functional-red-black-tree"
"react-native-navigation-twopane"
;; "react-native-navigation-twopane"
"hi-base32"]
;; Resoures
@@ -1,35 +1,47 @@
(ns status-im.react-native.resources)
(ns status-im.react-native.resources
(:require [status-im.ui.components.colors :as colors]))
(def ui
{:empty-chats-header (js/require "./resources/images/ui/empty-chats-header.png")
:welcome (js/require "./resources/images/ui/welcome.jpg")
:intro1 (js/require "./resources/images/ui/intro1.jpg")
:intro2 (js/require "./resources/images/ui/intro2.jpg")
:intro3 (js/require "./resources/images/ui/intro3.jpg")
:sample-key (js/require "./resources/images/ui/sample-key.jpg")
:lock (js/require "./resources/images/ui/lock.png")
:tribute-to-talk (js/require "./resources/images/ui/tribute-to-talk.png")
:hardwallet-card (js/require "./resources/images/ui/hardwallet-card.png")
:keycard-lock (js/require "./resources/images/ui/keycard-lock.png")
:keycard (js/require "./resources/images/ui/keycard.png")
:keycard-logo (js/require "./resources/images/ui/keycard-logo.png")
:keycard-logo-blue (js/require "./resources/images/ui/keycard-logo-blue.png")
:keycard-logo-gray (js/require "./resources/images/ui/keycard-logo-gray.png")
:keycard-key (js/require "./resources/images/ui/keycard-key.png")
:keycard-empty (js/require "./resources/images/ui/keycard-empty.png")
:keycard-phone (js/require "./resources/images/ui/keycard-phone.png")
:keycard-connection (js/require "./resources/images/ui/keycard-connection.png")
:keycard-nfc-on (js/require "./resources/images/ui/keycard-nfc-on.png")
:keycard-wrong (js/require "./resources/images/ui/keycard-wrong.png")
:not-keycard (js/require "./resources/images/ui/not-keycard.png")
:status-logo (js/require "./resources/images/ui/status-logo.png")
:hold-card-animation (js/require "./resources/images/ui/hold-card-animation.gif")
:warning-sign (js/require "./resources/images/ui/warning-sign.png")
:phone-nfc-on (js/require "./resources/images/ui/phone-nfc-on.png")
:phone-nfc-off (js/require "./resources/images/ui/phone-nfc-off.png")
:dapp-store (js/require "./resources/images/ui/dapp-store.png")
:ens-header (js/require "./resources/images/ui/ens-header.png")
:new-chat-header (js/require "./resources/images/ui/new-chat-header.png")})
{:empty-chats-header (js/require "./resources/images/ui/empty-chats-header.png")
:welcome (js/require "./resources/images/ui/welcome.jpg")
:welcome-dark (js/require "./resources/images/ui/welcome-dark.jpg")
:chat (js/require "./resources/images/ui/chat.jpg")
:wallet (js/require "./resources/images/ui/wallet.jpg")
:browser (js/require "./resources/images/ui/browser.jpg")
:chat-dark (js/require "./resources/images/ui/chat-dark.jpg")
:wallet-dark (js/require "./resources/images/ui/wallet-dark.jpg")
:browser-dark (js/require "./resources/images/ui/browser-dark.jpg")
:keys (js/require "./resources/images/ui/keys.jpg")
:keys-dark (js/require "./resources/images/ui/keys-dark.jpg")
:lock (js/require "./resources/images/ui/lock.png")
:tribute-to-talk (js/require "./resources/images/ui/tribute-to-talk.png")
:hardwallet-card (js/require "./resources/images/ui/hardwallet-card.png")
:keycard-lock (js/require "./resources/images/ui/keycard-lock.png")
:keycard (js/require "./resources/images/ui/keycard.png")
:keycard-logo (js/require "./resources/images/ui/keycard-logo.png")
:keycard-logo-blue (js/require "./resources/images/ui/keycard-logo-blue.png")
:keycard-logo-gray (js/require "./resources/images/ui/keycard-logo-gray.png")
:keycard-key (js/require "./resources/images/ui/keycard-key.png")
:keycard-empty (js/require "./resources/images/ui/keycard-empty.png")
:keycard-phone (js/require "./resources/images/ui/keycard-phone.png")
:keycard-connection (js/require "./resources/images/ui/keycard-connection.png")
:keycard-wrong (js/require "./resources/images/ui/keycard-wrong.png")
:not-keycard (js/require "./resources/images/ui/not-keycard.png")
:status-logo (js/require "./resources/images/ui/status-logo.png")
:warning-sign (js/require "./resources/images/ui/warning-sign.png")
:phone-nfc-on (js/require "./resources/images/ui/phone-nfc-on.png")
:phone-nfc-off (js/require "./resources/images/ui/phone-nfc-off.png")
:dapp-store (js/require "./resources/images/ui/dapp-store.png")
:ens-header (js/require "./resources/images/ui/ens-header.png")
:ens-header-dark (js/require "./resources/images/ui/ens-header-dark.png")
:new-chat-header (js/require "./resources/images/ui/new-chat-header.png")
:onboarding-phone (js/require "./resources/images/ui/onboarding-phone.png")
:theme-dark (js/require "./resources/images/ui/theme-dark.png")
:theme-light (js/require "./resources/images/ui/theme-light.png")
:theme-system (js/require "./resources/images/ui/theme-system.png")})
(defn get-theme-image [k]
(get ui (when (colors/dark?) (keyword (str (name k) "-dark"))) (get ui k)))
(def loaded-images (atom {}))
@@ -70,6 +70,11 @@
(defn activity-indicator [props]
[activity-indicator-class props])
(defn small-loading-indicator [color]
[activity-indicator {:color (if color color :colors/gray)
:ios {:size :small}
:android {:size :16}}])
(def modal (get-class "Modal"))
(def pan-responder (.-PanResponder js-dependencies/react-native))
@@ -171,7 +176,8 @@
[text {:style style} (i18n/label key)])
(defn icon
([n] (icon n styles/icon-default))
([n] (icon n {:width 24
:height 24}))
([n style]
[image {:source {:uri (keyword (str "icon_" (name n)))}
:resizeMode "contain"
@@ -246,10 +252,9 @@
;; KeyboardAvoidingView
(defn keyboard-avoiding-view [props & children]
(let [view-element (if platform/ios?
[keyboard-avoiding-view-class (merge {:behavior :padding} props)]
[view props])]
(vec (concat view-element children))))
(into [keyboard-avoiding-view-class
(merge (when platform/ios? {:behavior :padding}) props)]
children))
(defn scroll-view [props & children]
(vec (conj children props scroll-view-class)))
@@ -271,52 +276,10 @@
[activity-indicator {:animating true}]])
comp)))
(defn navigation-wrapper
"Wraps component so that it will be shown only when current-screen is one of views"
[{:keys [component views current-view hide?]
:or {hide? false}}]
(let [current-view? (if (set? views)
(views current-view)
(= views current-view))
style (if current-view?
{:flex 1
:zIndex 0}
{:opacity 0
:flex 0
:zIndex -1})
component' (if (fn? component) [component] component)]
(when (or (not hide?) (and hide? current-view?))
(if hide?
component'
[view style (if (fn? component) [component] component)]))))
(defn with-empty-preview [comp]
[with-activity-indicator
{:preview [view {}]}
comp])
(def safe-area-provider (adapt-class (object/get js-dependencies/safe-area-context "SafeAreaProvider")))
(def safe-area-consumer (adapt-class (object/get js-dependencies/safe-area-context "SafeAreaConsumer")))
(defn create-main-screen-view [current-view]
(fn [props & children]
(apply
vector
(adapt-class (object/get js-dependencies/safe-area-context "SafeAreaView"))
(cond-> props
(= current-view :qr-scanner)
(assoc :background-color :black))
children)))
(def safe-area-view (adapt-class (object/get js-dependencies/safe-area-context "SafeAreaView")))
(defn main-screen-modal-view [current-view & components]
[(create-main-screen-view current-view)
styles/flex
[(if (= current-view :chat-modal)
view
keyboard-avoiding-view)
(merge {:flex 1 :flex-direction :column}
(when platform/android?
{:background-color :white}))
(apply vector view styles/flex components)]])
(def touchable-without-feedback-gesture (adapt-class (object/get js-dependencies/react-native-gesture-handler "TouchableWithoutFeedback")))
+2 -2
View File
@@ -8,12 +8,12 @@
:sha "b0d3b0f016f217c6a397a54e5eba9486471fb172"
:deps/manifest :deps}
com.andrewmcveigh/cljs-time {:mvn/version "0.5.2"}
binaryage/oops {:mvn/version "0.7.0"}
status-im/timbre {:mvn/version "4.10.0-2-status"}
com.taoensso/encore {:mvn/version "2.94.0"}
hickory {:mvn/version "0.7.1"}
cljs-bean {:mvn/version "1.3.0"}
mvxcvi/alphabase {:mvn/version "1.0.0"}
rasom/cljs-react-navigation {:mvn/version "0.1.4"}}
mvxcvi/alphabase {:mvn/version "1.0.0"}}
:aliases
{:dev {:extra-deps
+1 -1
View File
@@ -9,7 +9,7 @@
;; translations
(def translations-by-locale
(->> (i18n/translations [:en :es_419 :fa :ko :ms :pl :ru :zh :zh_Hans_CN])
(->> (i18n/translations [:ar :en :es :es_419 :fil :fr :it :ko :ru :in :id :tr :zh :zh_Hant :zh_TW])
(map (fn [[k t]]
(let [k' (-> (name k)
(string/replace "_" "-")
-6
View File
@@ -1,6 +0,0 @@
(ns env.config)
(def figwheel-urls {:android "ws://localhost:3449/figwheel-ws",
:ios "ws://192.168.0.9:3449/figwheel-ws",
:desktop "ws://localhost:3449/figwheel-ws"}
)
+6 -1
View File
@@ -218,6 +218,7 @@ var TopLevel = {
"injectJavaScript" : function () {},
"installApplet" : function () {},
"installAppletAndInitCard" : function () {},
"installCashApplet" : function () {},
"Int8Array" : function () {},
"integer" : function () {},
"interpolate" : function () {},
@@ -489,8 +490,10 @@ var TopLevel = {
"showActionSheetWithOptions" : function () {},
"showPicker" : function () {},
"sign" : function () {},
"signWithPath" : function () {},
"signGroupMembership" : function () {},
"signMessage" : function () {},
"signPinless" : function () {},
"signTypedData" : function () {},
"slice" : function () {},
"SplashScreen" : function () {},
@@ -551,6 +554,7 @@ var TopLevel = {
"Uri" : function () {},
"url" : function () {},
"Value" : function () {},
"ValueXY": function() {},
"value" : function () {},
"verify" : function () {},
"verifyPin" : function () {},
@@ -558,10 +562,10 @@ var TopLevel = {
"version" : function () {},
"vibrate" : function () {},
"View" : function () {},
"viewableItems": function() {},
"FlatList" : function () {},
"warn" : function () {},
"WebView" : function () {},
"WebViewBridgeModule" : function () {},
"width" : function () {},
"window" : function () {},
"writeCopyTo" : function () {},
@@ -618,5 +622,6 @@ var TopLevel = {
"multiAccountLoadAccount" : function () {},
"multiAccountStoreAccount" : function () {},
"multiAccountImportMnemonic" : function () {},
"multiAccountImportPrivateKey" : function () {},
"validateMnemonic" : function () {}
}
+2 -2
View File
@@ -222,9 +222,9 @@ platform :ios do
lane :clean do
clean_testflight_testers(
username: ENV['FASTLANE_APPLE_ID'],
days_of_inactivity: 30,
oldest_build_allowed: 2_019_032_709
days_of_inactivity: 30
)
# In the future we can try using 'oldest_build_allowed'
end
desc '`fastlane ios upload-diawi` - upload .ipa to diawi'
@@ -19,4 +19,4 @@ Wir wünschen uns eine Welt, in der die Menschen mehr Kontrolle über den Wert h
<b>Machen Sie mit</b>
Als Open-Source-Projekt sind das Downloaden und Testen von Status die beste Möglichkeit, an der Entwicklung beteiligt zu sein. Mithilfe des neuen Vertreters des Ethereum-Paradigmas wollen wir den Übergang zu einem offeneren Internet- und Finanzsystem erleichtern. Mit den hochgesteckten Zielen, unser kollektives Menschenrecht auf Privatsphäre zu bewahren, das Zensur-Risiko zu entschärfen und wirtschaftlichen Handel auf transparente, offene Art und Weise zu fördern, bildet Status eine Gemeinschaft, in der jeder willkommen ist, der beitreten und seinen Beitrag leisten möchte. Wir würden uns sehr freuen, von Ihnen zu hören. Besuchen Sie uns auf https://get.status.im/chat/public/status
Als Open-Source-Projekt sind das Downloaden und Testen von Status die beste Möglichkeit, an der Entwicklung beteiligt zu sein. Mithilfe des neuen Vertreters des Ethereum-Paradigmas wollen wir den Übergang zu einem offeneren Internet- und Finanzsystem erleichtern. Mit den hochgesteckten Zielen, unser kollektives Menschenrecht auf Privatsphäre zu bewahren, das Zensur-Risiko zu entschärfen und wirtschaftlichen Handel auf transparente, offene Art und Weise zu fördern, bildet Status eine Gemeinschaft, in der jeder willkommen ist, der beitreten und seinen Beitrag leisten möchte. Wir würden uns sehr freuen, von Ihnen zu hören. Besuchen Sie uns auf https://join.status.im/chat/public/status
@@ -19,4 +19,4 @@ We want to see a world in which people have more control over the value they cre
<b>Get Involved</b>
As an open source project, the single best way to get involved with development is to download and test Status. Our mission is to facilitate the transition to a more open internet and financial system through the new paradigm Ethereum represent. With the high level goals of preserving our collective right as humans to privacy, mitigating the risk of censorship, and promoting economic trade in a transparent, open manner, Status is building a community where anyone is welcome to join and contribute to the cause. Wed love to hear from you. Join us at: https://get.status.im/chat/public/status
As an open source project, the single best way to get involved with development is to download and test Status. Our mission is to facilitate the transition to a more open internet and financial system through the new paradigm Ethereum represent. With the high level goals of preserving our collective right as humans to privacy, mitigating the risk of censorship, and promoting economic trade in a transparent, open manner, Status is building a community where anyone is welcome to join and contribute to the cause. Wed love to hear from you. Join us at: https://join.status.im/chat/public/status
@@ -29,4 +29,4 @@
به عنوان یک پروژه‌ی کدباز، بهترین راه مشارکت در توسعه‌ی اپلیکیشن این است که آن را دانلود و تست کنید. هدف ما تسهیل عبور به یک اینترنت و سیستم مالی بازتر به وسیله‌ی پارادایمی که اتریوم فراهم می‌کند است. با هدف‌های سطح بالای حفظ حق عمومی انسانی برای حریم خصوصی، کم کردن ریسک سانسور، و گسترش تبادل اقتصادی به شیوه‌ی باز و شفاف، استاتوس در حال ساخت جامعه‌ای است که در آن همه به ورود و مشارکت دعوت می‌شوند.
https://get.status.im/chat/public/status
https://join.status.im/chat/public/status
@@ -19,4 +19,4 @@ Nous voulons voir un monde dans lequel les gens ont plus de contrôle sur la val
<b>Impliquez-vous</b>
En tant que projet open source, la meilleure façon de participer au développement est de télécharger et de tester Status. Notre mission est de faciliter la transition vers un Internet et un système financier plus ouverts à travers le nouveau paradigme que représente Ethereum. Avec les objectifs de haut niveau de la préservation de notre droit collectif en tant qu'êtres humains à la vie privée, atténuant le risque de censure et encourageant le commerce économique de manière transparente et ouverte, Status construit une communauté que tout le monde est invité à rejoindre et où chacun peut contribuer à la cause. Nous aimerions recevoir de vos nouvelles. Rejoignez-nous sur : https://get.status.im/chat/public/status
En tant que projet open source, la meilleure façon de participer au développement est de télécharger et de tester Status. Notre mission est de faciliter la transition vers un Internet et un système financier plus ouverts à travers le nouveau paradigme que représente Ethereum. Avec les objectifs de haut niveau de la préservation de notre droit collectif en tant qu'êtres humains à la vie privée, atténuant le risque de censure et encourageant le commerce économique de manière transparente et ouverte, Status construit une communauté que tout le monde est invité à rejoindre et où chacun peut contribuer à la cause. Nous aimerions recevoir de vos nouvelles. Rejoignez-nous sur : https://join.status.im/chat/public/status
@@ -19,4 +19,4 @@
<b>参加しよう</b>
オープンソースプロジェクトの開発に関わる最良の方法は、Statusをダウンロードしてテストをすることです。当社は、イーサリアムがもたらす新たな可能性をもとに、よりオープンなインターネット世界と金融システムへの移行を推し進めています。個人情報の保護、検閲リスクの軽減、より透明性のあるオープンな方法に基づく取引の推進など高次元の目標の下、Statusでは誰でも参加でき、目的に沿った活動がとれるコミュニティの構築を進めています。皆様のご意見をぜひお聞かせください。ご連絡はこちら: https://get.status.im/chat/public/status
オープンソースプロジェクトの開発に関わる最良の方法は、Statusをダウンロードしてテストをすることです。当社は、イーサリアムがもたらす新たな可能性をもとに、よりオープンなインターネット世界と金融システムへの移行を推し進めています。個人情報の保護、検閲リスクの軽減、より透明性のあるオープンな方法に基づく取引の推進など高次元の目標の下、Statusでは誰でも参加でき、目的に沿った活動がとれるコミュニティの構築を進めています。皆様のご意見をぜひお聞かせください。ご連絡はこちら: https://join.status.im/chat/public/status
@@ -20,4 +20,4 @@
<b>참여하기</b>
어플리케이션을 다운로드 받아 테스트하며, 스테이터스 오픈소스 프로젝트에 참여하실 수 있습니다. 우리의 비전은 이더리움이 제시하는 새로운 인터넷 패러다임을 통해 인터넷과 금융 시스템이 조금 더 개방적으로 변모할 수 있도록 하는 것입니다. 스테이터스의 궁극적 목표는 사람들의 소중한 프라이버시를 지키고 검열로부터 보호하며, 더욱 투명하고 개방된 방식의 거래를 촉진하는 것입니다. 이를 위해 스테이터스는 누구든지 참여해 혁신적인 변화를 이끌어가는 커뮤니티를 구축하고 있습니다. 여러분의 연락을 기다리고 있습니다. https://get.status.im/chat/public/status 에 참여하세요!
어플리케이션을 다운로드 받아 테스트하며, 스테이터스 오픈소스 프로젝트에 참여하실 수 있습니다. 우리의 비전은 이더리움이 제시하는 새로운 인터넷 패러다임을 통해 인터넷과 금융 시스템이 조금 더 개방적으로 변모할 수 있도록 하는 것입니다. 스테이터스의 궁극적 목표는 사람들의 소중한 프라이버시를 지키고 검열로부터 보호하며, 더욱 투명하고 개방된 방식의 거래를 촉진하는 것입니다. 이를 위해 스테이터스는 누구든지 참여해 혁신적인 변화를 이끌어가는 커뮤니티를 구축하고 있습니다. 여러분의 연락을 기다리고 있습니다. https://join.status.im/chat/public/status 에 참여하세요!
@@ -19,4 +19,4 @@ Quer conhecer um mundo no qual as pessoas têm mais controle sobre o valor que c
<b>Envolva-se</b>
Como um projeto de código aberto, a melhor maneira de se envolver com o desenvolvimento é baixar e testar o Status. Nossa missão é facilitar a transição para uma internet e um sistema financeiro mais abertos, por meio do novo paradigma que o Ethereum representa. Com os objetivos de alto nível de preservar nossos direitos coletivos como seres humanos à privacidade, mitigar o risco de censura e promover comercialização economicamente viável de maneira aberta e transparente o Status está construindo uma comunidade na qual todos são bem-vindos para se juntarem e contribuírem com a causa. Adoraríamos falar com você. Junte-se a nós em: https://get.status.im/chat/public/status
Como um projeto de código aberto, a melhor maneira de se envolver com o desenvolvimento é baixar e testar o Status. Nossa missão é facilitar a transição para uma internet e um sistema financeiro mais abertos, por meio do novo paradigma que o Ethereum representa. Com os objetivos de alto nível de preservar nossos direitos coletivos como seres humanos à privacidade, mitigar o risco de censura e promover comercialização economicamente viável de maneira aberta e transparente o Status está construindo uma comunidade na qual todos são bem-vindos para se juntarem e contribuírem com a causa. Adoraríamos falar com você. Junte-se a nós em: https://join.status.im/chat/public/status
@@ -19,4 +19,4 @@ Queres conhecer um mundo no qual as pessoas têm mais controle sobre o valor que
<b>Envolve-te</b>
Sendo um projeto Open Source, a melhor maneira de se envolver com o desenvolvimento é fazer download e testar o cliente Status. A nossa missão é facilitar a transição para uma Internet e um sistema financeiro mais abertos, através do novo paradigma que o Ethereum representa. Partindo de uma a filosofia de preservar nossos direitos coletivos como seres humanos à privacidade, mitigar o risco de censura e promover comercialização economicamente viável de maneira aberta e transparente, a Status está a construir uma comunidade na qual todos são bem-vindos para se juntarem e contribuírem para a causa. Adoraríamos falar contigo. Junta-te a nós em: https://get.status.im/chat/public/status
Sendo um projeto Open Source, a melhor maneira de se envolver com o desenvolvimento é fazer download e testar o cliente Status. A nossa missão é facilitar a transição para uma Internet e um sistema financeiro mais abertos, através do novo paradigma que o Ethereum representa. Partindo de uma a filosofia de preservar nossos direitos coletivos como seres humanos à privacidade, mitigar o risco de censura e promover comercialização economicamente viável de maneira aberta e transparente, a Status está a construir uma comunidade na qual todos são bem-vindos para se juntarem e contribuírem para a causa. Adoraríamos falar contigo. Junta-te a nós em: https://join.status.im/chat/public/status
@@ -19,4 +19,4 @@ Status - программа с открытым исходным кодом на
<b>Присоединяйтесь к нам</b>
Самый лучший способ принять участие в разработке нашей платформы — это загрузить и протестировать Status. Наша миссия состоит в том, чтобы облегчить переход к более открытому интернету и финансовой системе на основе новой парадигмы, которую представляет Ethereum. Ставя перед собой высокую цель сохранения права людей на частную жизнь, снижения риска цензуры, а также содействия экономической торговле в прозрачной, открытой манере, Status строит сообщество, где любой желающий может присоединиться и внести свой вклад в общее дело. Мы хотели бы услышать ваш голос. Присоединяйтесь к нам: https://get.status.im/chat/public/status
Самый лучший способ принять участие в разработке нашей платформы — это загрузить и протестировать Status. Наша миссия состоит в том, чтобы облегчить переход к более открытому интернету и финансовой системе на основе новой парадигмы, которую представляет Ethereum. Ставя перед собой высокую цель сохранения права людей на частную жизнь, снижения риска цензуры, а также содействия экономической торговле в прозрачной, открытой манере, Status строит сообщество, где любой желающий может присоединиться и внести свой вклад в общее дело. Мы хотели бы услышать ваш голос. Присоединяйтесь к нам: https://join.status.im/chat/public/status
@@ -19,4 +19,4 @@ Status 是一个开源的、基于以太坊的应用程序,能够让您聊天
<b>参与其中</b>
作为一个开源项目,最好的参与开发的途径就是下载并测试Status。我们的使命是通过以太坊所代表的新范式,实现向更加开放的网络和金融系统的转变。我们的最高目标就是将隐私作为人类的集体权利,降低审查的风险,并以一种透明的、开放的态度来推进经济贸易。Status 正在建设的社区欢迎任何人加入并为此事业做出贡献。我们非常愿意得到你们的反馈。请通过https://get.status.im/chat/public/status 加入我们。
作为一个开源项目,最好的参与开发的途径就是下载并测试Status。我们的使命是通过以太坊所代表的新范式,实现向更加开放的网络和金融系统的转变。我们的最高目标就是将隐私作为人类的集体权利,降低审查的风险,并以一种透明的、开放的态度来推进经济贸易。Status 正在建设的社区欢迎任何人加入并为此事业做出贡献。我们非常愿意得到你们的反馈。请通过https://join.status.im/chat/public/status 加入我们。
@@ -20,7 +20,6 @@
:DeviceEventEmitter #js {:addListener (fn [])}
:Dimensions #js {:get (fn [])}})
(def vector-icons (fn [] #js {:default #js {}}))
(def webview-bridge (fn [] #js {:default #js {}}))
(def webview (fn [] #js {:WebView #js {}}))
(def touchid (fn [] #js {}))
(def svg (fn [] #js {:default #js {}}))
@@ -14,7 +14,6 @@
:keycard-empty "images/ui/keycard-empty.png"
:keycard-phone "images/ui/keycard-phone.png"
:keycard-connection "images/ui/keycard-connection.png"
:keycard-nfc-on "images/ui/keycard-nfc-on.png"
:keycard-wrong "images/ui/keycard-wrong.png"
:not-keycard "images/ui/not-keycard.png"
:status-logo "images/ui/status-logo.png"
@@ -324,8 +324,6 @@
(views/letsubs []
(let [main-screen-view (create-main-screen-view current-view)]
[main-screen-view styles/flex
[(if (= current-view :chat-modal)
view
keyboard-avoiding-view)
[keyboard-avoiding-view
{:flex 1 :flex-direction :column}
(apply vector view styles/flex components)]])))
+1
View File
@@ -45,6 +45,7 @@ target 'StatusIm' do
pod 'SQLCipher', '~>3.0'
pod 'SSZipArchive'
target 'StatusImTests' do
inherit! :search_paths
# Pods for testing
+33 -15
View File
@@ -199,15 +199,13 @@ PODS:
- React
- react-native-netinfo (4.4.0):
- React
- react-native-safe-area-context (0.6.0):
- react-native-safe-area-context (0.7.3):
- React
- react-native-shake (3.4.0):
- React
- react-native-splash-screen (3.2.0):
- React
- react-native-webview (6.11.1):
- React
- react-native-webview-bridge (0.33.17):
- react-native-webview (8.0.7):
- React
- React-RCTActionSheet (0.61.5):
- React-Core/RCTActionSheetHeaders (= 0.61.5)
@@ -244,9 +242,13 @@ PODS:
- React-cxxreact (= 0.61.5)
- React-jsi (= 0.61.5)
- ReactCommon/jscallinvoker (= 0.61.5)
- ReactNativeDarkMode (0.2.2):
- React
- RNCMaskedView (0.1.6):
- React
- RNFS (2.14.1):
- React
- RNGestureHandler (1.5.2):
- RNGestureHandler (1.6.0):
- React
- RNImageCropPicker (0.25.3):
- QBImagePickerController
@@ -257,7 +259,11 @@ PODS:
- React
- RNLanguages (3.0.2):
- React
- RNScreens (1.0.0-alpha.23):
- RNReactNativeHapticFeedback (1.9.0):
- React
- RNReanimated (1.7.0):
- React
- RNScreens (2.3.0):
- React
- RNSVG (9.11.1):
- React
@@ -298,7 +304,6 @@ DEPENDENCIES:
- react-native-shake (from `../node_modules/react-native-shake`)
- react-native-splash-screen (from `../node_modules/react-native-splash-screen`)
- react-native-webview (from `../node_modules/react-native-webview`)
- react-native-webview-bridge (from `../node_modules/react-native-webview-bridge`)
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
- React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
@@ -310,11 +315,15 @@ DEPENDENCIES:
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
- ReactCommon/jscallinvoker (from `../node_modules/react-native/ReactCommon`)
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
- ReactNativeDarkMode (from `../node_modules/react-native-dark-mode`)
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
- RNFS (from `../node_modules/react-native-fs`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
- RNImageCropPicker (from `../node_modules/react-native-image-crop-picker`)
- RNKeychain (from `../node_modules/react-native-keychain`)
- RNLanguages (from `../node_modules/react-native-languages`)
- RNReactNativeHapticFeedback (from `../node_modules/react-native-haptic-feedback`)
- RNReanimated (from `../node_modules/react-native-reanimated`)
- RNScreens (from `../node_modules/react-native-screens`)
- RNSVG (from `../node_modules/react-native-svg`)
- SQLCipher (~> 3.0)
@@ -377,8 +386,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-splash-screen"
react-native-webview:
:path: "../node_modules/react-native-webview"
react-native-webview-bridge:
:path: "../node_modules/react-native-webview-bridge"
React-RCTActionSheet:
:path: "../node_modules/react-native/Libraries/ActionSheetIOS"
React-RCTAnimation:
@@ -399,6 +406,10 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/Libraries/Vibration"
ReactCommon:
:path: "../node_modules/react-native/ReactCommon"
ReactNativeDarkMode:
:path: "../node_modules/react-native-dark-mode"
RNCMaskedView:
:path: "../node_modules/@react-native-community/masked-view"
RNFS:
:path: "../node_modules/react-native-fs"
RNGestureHandler:
@@ -409,6 +420,10 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-keychain"
RNLanguages:
:path: "../node_modules/react-native-languages"
RNReactNativeHapticFeedback:
:path: "../node_modules/react-native-haptic-feedback"
RNReanimated:
:path: "../node_modules/react-native-reanimated"
RNScreens:
:path: "../node_modules/react-native-screens"
RNSVG:
@@ -440,11 +455,10 @@ SPEC CHECKSUMS:
react-native-image-resizer: 4516052af6ae0248caf4ccf356caecefe60072d7
react-native-mail: 7e37dfbe93ff0d4c7df346b738854dbed533e86f
react-native-netinfo: 6bb847e64f45a2d69c6173741111cfd95c669301
react-native-safe-area-context: d288138da2c800caa111f9352e9333f186a06ead
react-native-safe-area-context: e200d4433aba6b7e60b52da5f37af11f7a0b0392
react-native-shake: de052eaa3eadc4a326b8ddd7ac80c06e8d84528c
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-webview: 0658813bcc4b6c22f3cbb035a2227aa896a8cbc0
react-native-webview-bridge: 3023f6b0e84cdf8e4a96511d2b04e73b038f95f0
react-native-webview: f51a7a42278b01b07464a65c586aa0086c1e741e
React-RCTActionSheet: 600b4d10e3aea0913b5a92256d2719c0cdd26d76
React-RCTAnimation: 791a87558389c80908ed06cc5dfc5e7920dfa360
React-RCTBlob: d89293cc0236d9cb0933d85e430b0bbe81ad1d72
@@ -455,12 +469,16 @@ SPEC CHECKSUMS:
React-RCTText: 9ccc88273e9a3aacff5094d2175a605efa854dbe
React-RCTVibration: a49a1f42bf8f5acf1c3e297097517c6b3af377ad
ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd
ReactNativeDarkMode: 0178ffca3b10f6a7c9f49d6f9810232b328fa949
RNCMaskedView: a88953beefbd347a29072d9eba90e42945fe291e
RNFS: a8fbe7060fa49157d819466404794ad9c58e58cf
RNGestureHandler: 946a7691e41df61e2c4b1884deab41a4cdc3afff
RNGestureHandler: dde546180bf24af0b5f737c8ad04b6f3fa51609a
RNImageCropPicker: bfb3ea9c8622f290532e2fe63f369e0d5a52f597
RNKeychain: 216f37338fcb9e5c3a2530f1e3295f737a690cb1
RNLanguages: 962e562af0d34ab1958d89bcfdb64fafc37c513e
RNScreens: f28b48b8345f2f5f39ed6195518291515032a788
RNReactNativeHapticFeedback: 2566b468cc8d0e7bb2f84b23adc0f4614594d071
RNReanimated: 031fe8d9ea93c2bd689a40f05320ef9d96f74d7f
RNScreens: 03bf608b92ac0acf323f47d8f5b63a8f829340c8
RNSVG: be27aa7c58819f97399388ae53d7fa0572f32c7f
RSKImageCropper: a446db0e8444a036b34f3c43db01b2373baa4b2a
SQLCipher: f9fcf29b2e59ced7defc2a2bdd0ebe79b40d4990
@@ -468,6 +486,6 @@ SPEC CHECKSUMS:
TouchID: ba4c656d849cceabc2e4eef722dea5e55959ecf4
Yoga: f2a7cd4280bfe2cca5a7aed98ba0eb3d1310f18b
PODFILE CHECKSUM: 0483a7693bfa7c6ef9f214cdc7f614f67dec7448
PODFILE CHECKSUM: 37924c57abbfcd77aec07d65c45ecba137cdf289
COCOAPODS: 1.8.4
+4
View File
@@ -647,6 +647,7 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-splash-screen/ios",
"$(SRCROOT)/../node_modules/react-native-config/ios/**",
"$(SRCROOT)/../node_modules/react-native-webview/ios",
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS",
);
INFOPLIST_FILE = StatusIm/Info.plist;
@@ -696,6 +697,7 @@
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native-camera/ios",
"$(SRCROOT)/../node_modules/react-native-webview/ios",
"$(SRCROOT)/../node_modules/react-native-fs/**",
"$(SRCROOT)/../node_modules/react-native-languages/RNLanguages",
"$(SRCROOT)/../modules/react-native-status/ios/RCTStatus/**",
@@ -782,6 +784,7 @@
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native-camera/ios",
"$(SRCROOT)/../node_modules/react-native-webview/ios",
"$(SRCROOT)/../node_modules/react-native-fs/**",
"$(SRCROOT)/../node_modules/react-native-languages/RNLanguages",
"$(SRCROOT)/../modules/react-native-status/ios/RCTStatus/**",
@@ -845,6 +848,7 @@
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native-camera/ios",
"$(SRCROOT)/../node_modules/react-native-webview/ios",
"$(SRCROOT)/../node_modules/react-native-fs/**",
"$(SRCROOT)/../node_modules/react-native-languages/RNLanguages",
"$(SRCROOT)/../modules/react-native-status/ios/RCTStatus/**",
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "appearance.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "appearance@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "appearance@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "arrow_down.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "arrow_down@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "arrow_down@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "keycard_logo_big.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "keycard_logo_big@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "keycard_logo_big@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

+23
View File
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "nfc.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "nfc-1.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "nfc-2.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Some files were not shown because too many files have changed in this diff Show More