Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21ebd4d930 | ||
|
|
40c36c30e6 | ||
|
|
e85bc539d3 | ||
|
|
c26d298573 | ||
|
|
cdde36ca28 | ||
|
|
3c3ef20769 | ||
|
|
2150f6db48 | ||
|
|
10101a23e6 | ||
|
|
f75fff9dd8 | ||
|
|
9aa31ddf02 | ||
|
|
9a61b30c50 | ||
|
|
f1652ee2c4 | ||
|
|
e1d2b9b1c1 | ||
|
|
e60c20bc10 | ||
|
|
1391c48e39 | ||
|
|
2343d9be1e | ||
|
|
7b85bfbd53 | ||
|
|
27bfbea6bd | ||
|
|
caaff74efe | ||
|
|
6ce58db7b9 | ||
|
|
fe788c3c26 | ||
|
|
1faa2e8f88 | ||
|
|
2b7430e008 | ||
|
|
62c8e73409 | ||
|
|
e0e9ab9adb | ||
|
|
b618f73063 | ||
|
|
8a88aac34d | ||
|
|
32ccca0912 | ||
|
|
2be78041e2 | ||
|
|
d941029661 | ||
|
|
f7c930964c | ||
|
|
0c25b77e54 | ||
|
|
d0deb94bf3 | ||
|
|
3a444f40f3 | ||
|
|
7537c6b033 | ||
|
|
e67f6c1cd3 | ||
|
|
1d7eb49c57 | ||
|
|
f6dfc64567 | ||
|
|
f08ac94596 | ||
|
|
52a8f8fc22 | ||
|
|
6859fb8f8e |
@@ -6,13 +6,13 @@ SECURE ETHEREUM WALLET
|
||||
The Status crypto wallet allows you to securely send, store, and exchange Ethereum assets such as ETH, SNT, stable coins such as DAI, as well as collectibles. Confidently take control of your cryptocurrency and digital assets with our multichain Ethereum wallet app, supporting mainnet, Arbitrum, and Optimism. The Status blockchain wallet currently only supports ETH, ERC-20, ERC-721, and ERC-1155 assets; it does not support Bitcoin.
|
||||
|
||||
PRIVATE MESSENGER
|
||||
Send private 1:1 and private group chats without anyone snooping on your communications. Status is a messenger app that eliminates centralised message relays for greater privacy and secure messaging. All messages are encrypted with end-to-end encryption. Additionally, no message exposes who the author or the intended recipient is, so nobody, not even Status, knows who is talking to who or what was said.
|
||||
Send private 1:1 and private group chats without anyone snooping on your communications. Status is a messenger app that eliminates centralized message relays for greater privacy and secure messaging. All messages are encrypted with end-to-end encryption. Additionally, no message exposes who the author or the intended recipient is, so nobody, not even Status, knows who is talking to who or what was said.
|
||||
|
||||
EARN WITH DEFI
|
||||
Put your crypto to work with the latest decentralised finance apps and decentralised exchanges (DEX) such as Maker, Aave, Uniswap, Synthetix, PoolTogether, Zerion, Kyber, and more.
|
||||
Put your crypto to work with the latest decentralized finance apps and decentralized exchanges (DEX) such as Maker, Aave, Uniswap, Synthetix, PoolTogether, Zerion, Kyber, and more.
|
||||
|
||||
CONNECT WITH YOUR COMMUNITY
|
||||
Explore, connect, and chat with your favourite communities and friends. Whether it is a small group of friends, an artist collective, crypto traders, or the next big organization - text and communicate with Status communities.
|
||||
Explore, connect, and chat with your favorite communities and friends. Whether it is a small group of friends, an artist collective, crypto traders, or the next big organization - text and communicate with Status communities.
|
||||
|
||||
PRIVATE ACCOUNT CREATION
|
||||
Stay private with pseudo-anonymous account creation. When creating your free account, you will NEVER have to enter a phone number, email address, or bank account. Your wallet private keys are locally generated and securely stored to ensure only you have access to your funds and financial transactions.
|
||||
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 272 KiB After Width: | Height: | Size: 272 KiB |
|
Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 263 KiB |
|
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 396 KiB |
|
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 202 KiB |
|
Before Width: | Height: | Size: 425 KiB After Width: | Height: | Size: 425 KiB |
@@ -57,10 +57,11 @@ abstract_target 'Status' do
|
||||
pod 'react-native-config', :path => '../node_modules/react-native-config'
|
||||
|
||||
pod 'SSZipArchive', '2.4.3'
|
||||
|
||||
# to fix [!] CocoaPods could not find compatible versions for pod "CryptoSwift"
|
||||
pod 'CryptoSwift', git: "https://github.com/krzyzanowskim/CryptoSwift", tag: '1.8.0'
|
||||
pod "react-native-status-keycard", path: "../node_modules/react-native-status-keycard"
|
||||
pod "react-native-status", path: "../modules/react-native-status"
|
||||
pod "Keycard", git: "https://github.com/status-im/Keycard.swift.git"
|
||||
pod "Keycard", git: "https://github.com/status-im/Keycard.swift.git", tag: '3.1.1'
|
||||
pod 'secp256k1', git: "https://github.com/status-im/secp256k1.swift.git", submodules: true
|
||||
|
||||
target 'StatusIm' do
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
PODS:
|
||||
- BigInt (5.2.0)
|
||||
- boost (1.83.0)
|
||||
- CryptoSwift (1.5.1)
|
||||
- CryptoSwift (1.8.0)
|
||||
- DoubleConversion (1.1.6)
|
||||
- FBLazyVector (0.73.5)
|
||||
- FBReactNativeSpec (0.73.5):
|
||||
@@ -16,20 +17,24 @@ PODS:
|
||||
- hermes-engine/Pre-built (= 0.73.5)
|
||||
- hermes-engine/Pre-built (0.73.5)
|
||||
- HMSegmentedControl (1.5.6)
|
||||
- Keycard (3.0.6):
|
||||
- Keycard (3.1.0):
|
||||
- BigInt
|
||||
- CryptoSwift
|
||||
- secp256k1
|
||||
- SSZipArchive
|
||||
- libevent (2.1.12)
|
||||
- libwebp (1.2.4):
|
||||
- libwebp/demux (= 1.2.4)
|
||||
- libwebp/mux (= 1.2.4)
|
||||
- libwebp/webp (= 1.2.4)
|
||||
- libwebp/demux (1.2.4):
|
||||
- libwebp (1.3.2):
|
||||
- libwebp/demux (= 1.3.2)
|
||||
- libwebp/mux (= 1.3.2)
|
||||
- libwebp/sharpyuv (= 1.3.2)
|
||||
- libwebp/webp (= 1.3.2)
|
||||
- libwebp/demux (1.3.2):
|
||||
- libwebp/webp
|
||||
- libwebp/mux (1.2.4):
|
||||
- libwebp/mux (1.3.2):
|
||||
- libwebp/demux
|
||||
- libwebp/webp (1.2.4)
|
||||
- libwebp/sharpyuv (1.3.2)
|
||||
- libwebp/webp (1.3.2):
|
||||
- libwebp/sharpyuv
|
||||
- RCT-Folly (2022.05.16.00):
|
||||
- boost
|
||||
- DoubleConversion
|
||||
@@ -943,7 +948,7 @@ PODS:
|
||||
- React
|
||||
- react-native-status (1.0.0):
|
||||
- React
|
||||
- react-native-status-keycard (2.5.39):
|
||||
- react-native-status-keycard (2.6.2):
|
||||
- Keycard
|
||||
- React
|
||||
- react-native-webview (13.6.3):
|
||||
@@ -1187,17 +1192,18 @@ PODS:
|
||||
- secp256k1 (0.1.6)
|
||||
- SocketRocket (0.6.1)
|
||||
- SSZipArchive (2.4.3)
|
||||
- TOCropViewController (2.6.1)
|
||||
- TOCropViewController (2.7.4)
|
||||
- Yoga (1.14.0)
|
||||
|
||||
DEPENDENCIES:
|
||||
- boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
|
||||
- CryptoSwift (from `https://github.com/krzyzanowskim/CryptoSwift`, tag `1.8.0`)
|
||||
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
||||
- FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
|
||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||
- hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
|
||||
- Keycard (from `https://github.com/status-im/Keycard.swift.git`)
|
||||
- Keycard (from `https://github.com/status-im/Keycard.swift.git`, tag `3.1.1`)
|
||||
- libevent (~> 2.1.12)
|
||||
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
||||
- RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
||||
@@ -1285,7 +1291,7 @@ DEPENDENCIES:
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- CryptoSwift
|
||||
- BigInt
|
||||
- fmt
|
||||
- HMSegmentedControl
|
||||
- libevent
|
||||
@@ -1299,6 +1305,9 @@ SPEC REPOS:
|
||||
EXTERNAL SOURCES:
|
||||
boost:
|
||||
:podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
|
||||
CryptoSwift:
|
||||
:git: https://github.com/krzyzanowskim/CryptoSwift
|
||||
:tag: 1.8.0
|
||||
DoubleConversion:
|
||||
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
||||
FBLazyVector:
|
||||
@@ -1312,6 +1321,7 @@ EXTERNAL SOURCES:
|
||||
:tag: hermes-2024-02-20-RNv0.73.5-18f99ace4213052c5e7cdbcd39ee9766cd5df7e4
|
||||
Keycard:
|
||||
:git: https://github.com/status-im/Keycard.swift.git
|
||||
:tag: 3.1.1
|
||||
RCT-Folly:
|
||||
:podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
|
||||
RCTRequired:
|
||||
@@ -1475,17 +1485,21 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native/ReactCommon/yoga"
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
CryptoSwift:
|
||||
:git: https://github.com/krzyzanowskim/CryptoSwift
|
||||
:tag: 1.8.0
|
||||
Keycard:
|
||||
:commit: 17381678bb981c3c553bb7202a26e642cecb1817
|
||||
:git: https://github.com/status-im/Keycard.swift.git
|
||||
:tag: 3.1.1
|
||||
secp256k1:
|
||||
:commit: 46a1fa30d9b8babeae85ff519050f42394ab5fcc
|
||||
:commit: 4ab977cc2b2d7319be858bcb30a5d189bb149884
|
||||
:git: https://github.com/status-im/secp256k1.swift.git
|
||||
:submodules: true
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
BigInt: f668a80089607f521586bbe29513d708491ef2f7
|
||||
boost: d3f49c53809116a5d38da093a8aa78bf551aed09
|
||||
CryptoSwift: c4f2debceb38bf44c80659afe009f71e23e4a082
|
||||
CryptoSwift: 52aaf3fce7337552863b1d952e408085f0e65030
|
||||
DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953
|
||||
FBLazyVector: 56e0e498dbb513b96c40bac6284729ba4e62672d
|
||||
FBReactNativeSpec: 146c741a3f40361f6bc13a4ba284678cbedb5881
|
||||
@@ -1493,9 +1507,9 @@ SPEC CHECKSUMS:
|
||||
glog: c0eca6ffed0a6fde1965ef26dcc7bf528f052af4
|
||||
hermes-engine: 1d1835b2cc54c381909d94d1b3c8e0a2f1a94a0e
|
||||
HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352
|
||||
Keycard: ac6df4d91525c3c82635ac24d4ddd9a80aca5fc8
|
||||
Keycard: 3bd24405b9a875b3b3cf1ab1be69b5c30c5f28bc
|
||||
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
|
||||
libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
|
||||
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
|
||||
RCT-Folly: 7169b2b1c44399c76a47b5deaaba715eeeb476c0
|
||||
RCTRequired: 2544c0f1081a5fa12e108bb8cb40e5f4581ccd87
|
||||
RCTTypeSafety: 50efabe2b115c11ed03fbf3fd79e2f163ddb5d7c
|
||||
@@ -1534,7 +1548,7 @@ SPEC CHECKSUMS:
|
||||
react-native-shake: de052eaa3eadc4a326b8ddd7ac80c06e8d84528c
|
||||
react-native-slider: 12bd76d3d568c9c5500825db54123d44b48e4ad4
|
||||
react-native-status: 21f75d492fd311dc111303da38a7a2b23a8a8466
|
||||
react-native-status-keycard: f1c1227b2d5984c10fb44db68e4bfd2937f31e98
|
||||
react-native-status-keycard: 76a5c826352ee1d70de854b3e8b12670946bc1c8
|
||||
react-native-webview: 88293a0f23eca8465c0433c023ec632930e644d0
|
||||
React-nativeconfig: 1166714a4f7ea57a0df5c2cb44fbc70f98d580f9
|
||||
React-NativeModulesApple: 726664e9829eb5eed8170241000e46ead269a05f
|
||||
@@ -1579,9 +1593,9 @@ SPEC CHECKSUMS:
|
||||
secp256k1: f61d67e6fdcb85fd727acf1bf35ace6036db540c
|
||||
SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
|
||||
SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef
|
||||
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
|
||||
TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654
|
||||
Yoga: a716eea57d0d3430219c0a5a233e1e93ee931eb7
|
||||
|
||||
PODFILE CHECKSUM: 5dd4a5279260d370bcdf016158c825ceb404ee06
|
||||
PODFILE CHECKSUM: 56d9f695324306d6db368d1172d211dfab55b7cb
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
NSString *_statusGoEndpoint;
|
||||
NSString *_signalEndpoint;
|
||||
NSString *_rootDataDir;
|
||||
NSTimer *_pingTimer;
|
||||
}
|
||||
|
||||
RCT_EXPORT_MODULE();
|
||||
@@ -77,6 +78,8 @@ RCT_EXPORT_MODULE();
|
||||
|
||||
[self.webSocket resume];
|
||||
[self receiveMessage];
|
||||
|
||||
[self startPingTimer];
|
||||
}
|
||||
|
||||
- (void)receiveMessage {
|
||||
@@ -109,6 +112,7 @@ RCT_EXPORT_MODULE();
|
||||
}
|
||||
|
||||
- (void)disconnectWebSocket {
|
||||
[self stopPingTimer];
|
||||
if (self.webSocket) {
|
||||
[self.webSocket cancel];
|
||||
self.webSocket = nil;
|
||||
@@ -119,6 +123,7 @@ RCT_EXPORT_MODULE();
|
||||
body:(NSString *)body
|
||||
callback:(void (^)(NSString *response, NSError *error))callback {
|
||||
NSString *fullUrlString = [NSString stringWithFormat:@"%@%@", self.statusGoEndpoint, endpoint];
|
||||
NSLog(@"StatusGo server is enabled, executing request, endpoint: %@, body: %@", fullUrlString, body);
|
||||
NSURL *url = [NSURL URLWithString:fullUrlString];
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
|
||||
request.HTTPMethod = @"POST";
|
||||
@@ -225,7 +230,6 @@ RCT_EXPORT_METHOD(configStatusBackendServer:(BOOL)serverEnabled
|
||||
if (client.serverEnabled) {
|
||||
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
|
||||
__block NSString *resultString = @"";
|
||||
|
||||
[client request:endpoint body:body callback:^(NSString *response, NSError *error) {
|
||||
if (error) {
|
||||
NSLog(@"request to %@ failed: %@", endpoint, error);
|
||||
@@ -243,4 +247,33 @@ RCT_EXPORT_METHOD(configStatusBackendServer:(BOOL)serverEnabled
|
||||
}
|
||||
}
|
||||
|
||||
- (void)startPingTimer {
|
||||
[self stopPingTimer];
|
||||
_pingTimer = [NSTimer scheduledTimerWithTimeInterval:30.0
|
||||
target:self
|
||||
selector:@selector(sendPing)
|
||||
userInfo:nil
|
||||
repeats:YES];
|
||||
}
|
||||
|
||||
- (void)stopPingTimer {
|
||||
if (_pingTimer) {
|
||||
[_pingTimer invalidate];
|
||||
_pingTimer = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)sendPing {
|
||||
if (self.webSocket) {
|
||||
[self.webSocket sendPingWithPongReceiveHandler:^(NSError * _Nullable error) {
|
||||
if (error) {
|
||||
NSLog(@"WebSocket ping failed: %@", error);
|
||||
// Reconnect on ping failure
|
||||
[self disconnectWebSocket];
|
||||
[self connectWebSocket];
|
||||
}
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -8789,31 +8789,31 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/status-im/status-keycard-java/android/3.1.1",
|
||||
"path": "com/github/status-im/status-keycard-java/android/3.1.2",
|
||||
"repo": "https://jitpack.io",
|
||||
"files": {
|
||||
"android-3.1.1.pom": {
|
||||
"sha1": "ac7e6699628e329dfc028345f32bc41c5d6c2f33",
|
||||
"sha256": "sha256-EvrtvGGyvB3Fxp72KXYl46pIsxgf8vDMXk9IZjkuEIs="
|
||||
"android-3.1.2.pom": {
|
||||
"sha1": "9afce579939bad3c2b6d15787a0c861f6dbd9afa",
|
||||
"sha256": "sha256-hNYvQQKfHNmbGQw5P0sssZAI11wfRhLir46QdukK0bs="
|
||||
},
|
||||
"android-3.1.1.jar": {
|
||||
"sha1": "26118061c0996fff357ae30cc360e5928c8dd455",
|
||||
"sha256": "sha256-4IjMQ6ZLAlsk4JC9sumOsRhdOF1F0L3Jl8dbEDOBoJY="
|
||||
"android-3.1.2.jar": {
|
||||
"sha1": "46fe72fb8fca5935c73e0df5c10ccdd5c64fca8e",
|
||||
"sha256": "sha256-QNpDWQ1TWvCWg3YdL4UWSEiafpoHavXSY3VWCN45rtE="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/status-im/status-keycard-java/lib/3.1.1",
|
||||
"path": "com/github/status-im/status-keycard-java/lib/3.1.2",
|
||||
"repo": "https://jitpack.io",
|
||||
"files": {
|
||||
"lib-3.1.1.pom": {
|
||||
"sha1": "63c7bbd55ddbf88d1b89941f78158aa07fb46873",
|
||||
"sha256": "sha256-ERsZGvECIQGlNusSk+13760//JU6SaONxOW9b3AHFvQ="
|
||||
"lib-3.1.2.pom": {
|
||||
"sha1": "0c0d8ef7318ba054457dea1e6624e0284aec91ca",
|
||||
"sha256": "sha256-Vs9p287YNgMD76/egyeHTqlIsENjwbZsspQbzs8QkeY="
|
||||
},
|
||||
"lib-3.1.1.jar": {
|
||||
"sha1": "07f0374f17160c8731350316226ffe0de50f6f31",
|
||||
"sha256": "sha256-oaolZh+Ad/Dq6byP3SU8z19gUjPdV8wM0Ryobj1Y260="
|
||||
"lib-3.1.2.jar": {
|
||||
"sha1": "5df9eef589a72c5a3143f59b0f547092aeb0c309",
|
||||
"sha256": "sha256-M0P6r96RkgaIjC912Z/VxJgHmfm/ftl7rqYOto8A0Ic="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -9082,16 +9082,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "commons-io/commons-io/2.17.0",
|
||||
"path": "commons-io/commons-io/2.18.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"commons-io-2.17.0.pom": {
|
||||
"sha1": "af3aa19bcc67a14e5d0dad042e7d985f733cdff4",
|
||||
"sha256": "sha256-SEqTn/9TELjLXGuQKcLc8VXT+TuLjWKF8/VrsroJ/Ek="
|
||||
"commons-io-2.18.0.pom": {
|
||||
"sha1": "cbd7a6fd54081f8e3d2a90c3cb74a91a31662a86",
|
||||
"sha256": "sha256-Y9lpQetE35yQ0q2yrYw/aZwuBl5wcEXF2vcT/KUrz8o="
|
||||
},
|
||||
"commons-io-2.17.0.jar": {
|
||||
"sha1": "ddcc8433eb019fb48fe25207c0278143f3e1d7e2",
|
||||
"sha256": "sha256-SqTKSPPf0wt4Igt4gdjLk+rECT7JQ2G2vvqUh5mKVQs="
|
||||
"commons-io-2.18.0.jar": {
|
||||
"sha1": "44084ef756763795b31c578403dd028ff4a22950",
|
||||
"sha256": "sha256-88oPjWPEDiOlbVQQHGDV7e4Ta0LYS/uFvHljCTEJz4s="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -10987,20 +10987,20 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/fasterxml/jackson/core/jackson-annotations/2.18.0",
|
||||
"path": "com/fasterxml/jackson/core/jackson-annotations/2.18.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"jackson-annotations-2.18.0.pom": {
|
||||
"sha1": "15e211c936f255998ba87e8a80c14989f9895f08",
|
||||
"sha256": "sha256-pqA47zy3L8FXW5w4ZdpK2arX0COo1J3K0DeRBlVx6Bw="
|
||||
"jackson-annotations-2.18.2.pom": {
|
||||
"sha1": "40ab24a80879d82a46bd3653a43da88917e929c0",
|
||||
"sha256": "sha256-CyvWlOqJJn7qSBJqilskplI0xkM4dULSRGnRlb+6HPg="
|
||||
},
|
||||
"jackson-annotations-2.18.0.jar": {
|
||||
"sha1": "9bddcc56af9d90f902ef5dba7348102cd12b04e2",
|
||||
"sha256": "sha256-oJNn0u61Joc6v3N/91TFCF+CBzo4LucsO74VQSIXZx8="
|
||||
"jackson-annotations-2.18.2.jar": {
|
||||
"sha1": "985d77751ebc7fce5db115a986bc9aa82f973f4a",
|
||||
"sha256": "sha256-WBvWEADvdkiUP3gcoFaJ5W0D9gUnSDZajis6m10/oy8="
|
||||
},
|
||||
"jackson-annotations-2.18.0.module": {
|
||||
"sha1": "c84262b96118cbb3bc27bf127735b93b18728a6c",
|
||||
"sha256": "sha256-DwmMCDBXb8nHVdQ9fzFuinV8k4ErNXdRJbNo/rzWA10="
|
||||
"jackson-annotations-2.18.2.module": {
|
||||
"sha1": "9bd316d8447c1738d7bbfcc373693627c38eaea4",
|
||||
"sha256": "sha256-4Ruvm1NubflNqmNaEBPsPgabhmuOES3cKqBEahVQUNw="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -11021,20 +11021,20 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/fasterxml/jackson/core/jackson-core/2.18.0",
|
||||
"path": "com/fasterxml/jackson/core/jackson-core/2.18.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"jackson-core-2.18.0.pom": {
|
||||
"sha1": "1d9d4da19eb2b14ba2975c254b6bfdd8ac4894fd",
|
||||
"sha256": "sha256-2u9SqBcSdESKRuwovBCgBQldduysz4Fbp6Y6AaiGf2c="
|
||||
"jackson-core-2.18.2.pom": {
|
||||
"sha1": "9a77a48adfca5182e9f8b3ee20ee2b186477b089",
|
||||
"sha256": "sha256-4GWwA50h9N/ORr1DEEx9dtWFa9cy4qqGDMWkonDtct4="
|
||||
},
|
||||
"jackson-core-2.18.0.jar": {
|
||||
"sha1": "65e8ead7de5d8f7a53e296c363bea3182f21f925",
|
||||
"sha256": "sha256-IVu9fI/WW+UEy5L/OqHEt5D8exTMpy9FRqrEFDwQG7U="
|
||||
"jackson-core-2.18.2.jar": {
|
||||
"sha1": "fb64ccac5c27dca8819418eb4e443a9f496d9ee7",
|
||||
"sha256": "sha256-2AVK58DRwtL1XSjkYCbr5YkogfP6tfQ5IzGEOBw7Sh8="
|
||||
},
|
||||
"jackson-core-2.18.0.module": {
|
||||
"sha1": "b7e0781f9c8f54d94d5e28bad1816c7a8c3a6799",
|
||||
"sha256": "sha256-xSmBTu77fwRPz2UL+lJ+60totpYGfLZMGmmUcvs1ZYc="
|
||||
"jackson-core-2.18.2.module": {
|
||||
"sha1": "6a97d687f4996c423f97dc56f7e63860581f0f05",
|
||||
"sha256": "sha256-ynjGBDZ2f8w2zhRrd05PUKnLn2MtExcsRLrojgwDz6I="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -11055,20 +11055,20 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/fasterxml/jackson/core/jackson-databind/2.18.0",
|
||||
"path": "com/fasterxml/jackson/core/jackson-databind/2.18.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"jackson-databind-2.18.0.pom": {
|
||||
"sha1": "3e52a2c42c3824afc2e696dad92f94dd6c1067fb",
|
||||
"sha256": "sha256-+Mn0Od1EsdAkLWbmlB2pfFe6hONANu7peqHDr/vxugQ="
|
||||
"jackson-databind-2.18.2.pom": {
|
||||
"sha1": "65295373e682120eba7894bb6632d6f8d17d5d6c",
|
||||
"sha256": "sha256-STo9tkR7eo7Ls3JCNMbOZ31y20sE9roAjw6+rqe+Wp0="
|
||||
},
|
||||
"jackson-databind-2.18.0.jar": {
|
||||
"sha1": "8dba1f789a75fc30b59303574fe2b269afa4d3bc",
|
||||
"sha256": "sha256-K/GSe38yJGg+0BV6HsOw7edRedo+WX14xXLVbtAPnzw="
|
||||
"jackson-databind-2.18.2.jar": {
|
||||
"sha1": "deef8697b92141fb6caf7aa86966cff4eec9b04f",
|
||||
"sha256": "sha256-SzZOaFDciRcvzx1N0muP9UiO2kT/RlfiLdJlID3Vqzw="
|
||||
},
|
||||
"jackson-databind-2.18.0.module": {
|
||||
"sha1": "49c271f0ef5bb935ca797921904e7ebe138925e3",
|
||||
"sha256": "sha256-LEnsfnQwbUh/lVkbqJiQRhnDKi4/0bWG+z5jIskaTmI="
|
||||
"jackson-databind-2.18.2.module": {
|
||||
"sha1": "8bc88e1ebdc91d61f75e1dabb3cdeaca74ad0032",
|
||||
"sha256": "sha256-jH2sL3J4GNiEeoKqTqxrAXTXnPBN+Q3iJGBy5t005wA="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -11100,12 +11100,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/fasterxml/jackson/jackson-base/2.18.0",
|
||||
"path": "com/fasterxml/jackson/jackson-base/2.18.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"jackson-base-2.18.0.pom": {
|
||||
"sha1": "d445ae58e3b3a15aa50a3e3707eaf46463b121e6",
|
||||
"sha256": "sha256-EFZMv/uFf5BlqhG1hJqMMIw1NfD1PG9Muytvt7NQf5c="
|
||||
"jackson-base-2.18.2.pom": {
|
||||
"sha1": "08e5c4c7f519a42a74dac257c922a7adbb4dda1b",
|
||||
"sha256": "sha256-71dLcvW0iUgET2g3a4dMiK4JoCncjgX2Shwwvftt4Uo="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -11122,12 +11122,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/fasterxml/jackson/jackson-bom/2.18.0",
|
||||
"path": "com/fasterxml/jackson/jackson-bom/2.18.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"jackson-bom-2.18.0.pom": {
|
||||
"sha1": "02fecc45cb9609006d979cb8f06f8a571957a0b8",
|
||||
"sha256": "sha256-ut3oZMpztsoE3p9+5J5knhpeivj4x8FoLHRr5eI0xYc="
|
||||
"jackson-bom-2.18.2.pom": {
|
||||
"sha1": "b269a504e4c7d10af05db454c367fb03d6c434b6",
|
||||
"sha256": "sha256-UkfNwwFyXT9n9+8EkDconVr3CdaXK89LFwluRUjSlWs="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -11144,12 +11144,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/fasterxml/jackson/jackson-parent/2.18",
|
||||
"path": "com/fasterxml/jackson/jackson-parent/2.18.1",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"jackson-parent-2.18.pom": {
|
||||
"sha1": "3696eb746d84dafc7933ec26f13f4fb407530ab0",
|
||||
"sha256": "sha256-Vp3ADWi05t993oVimeHANT+kC9rxI+DfVj7L7kFlhtk="
|
||||
"jackson-parent-2.18.1.pom": {
|
||||
"sha1": "fcd5c9c72aeebb63d13eb4330842fdb8ae4f9a1c",
|
||||
"sha256": "sha256-0IIvrBoCJoRLitRFySDEmk9hkWnQmxAQp9/u0ZkQmYw="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -11166,12 +11166,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/fasterxml/jackson/module/jackson-modules-base/2.18.0",
|
||||
"path": "com/fasterxml/jackson/module/jackson-modules-base/2.18.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"jackson-modules-base-2.18.0.pom": {
|
||||
"sha1": "6c3a68a52acce7482ba68999bd9b06a076b4c0ce",
|
||||
"sha256": "sha256-vtjbLqeIGzWwOA9V+67R1Wv+P9o6AmB0Ww9dXqzteyk="
|
||||
"jackson-modules-base-2.18.2.pom": {
|
||||
"sha1": "a38a7c307ae9250be61ea90b86dab2b3b504f847",
|
||||
"sha256": "sha256-wVCoPSPNizMiqqSYmEh0J5vi3I1f4qN5B9P1arYOJpw="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -11192,20 +11192,20 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.18.0",
|
||||
"path": "com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.18.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"jackson-module-jaxb-annotations-2.18.0.pom": {
|
||||
"sha1": "40eb69b3a20fb98faf66bee669b60e0fbda324ad",
|
||||
"sha256": "sha256-rOb/zJ9+f89Atu3uRVB6FQJdI5N6PbBSxDNSeVdJQ9c="
|
||||
"jackson-module-jaxb-annotations-2.18.2.pom": {
|
||||
"sha1": "36b8fbaf3577061bb92ecf23d6aa9d802558fdb4",
|
||||
"sha256": "sha256-T2FGzIFi5nDA1ERI8q1Iqf9WSeQHFmhM+gSua2Bm+fA="
|
||||
},
|
||||
"jackson-module-jaxb-annotations-2.18.0.jar": {
|
||||
"sha1": "62cc7b7517b752360fef4796e396363a2396d29c",
|
||||
"sha256": "sha256-WStXNngYHG2Te1dJnDqGrON3knBrVoRFc3FcC7muw30="
|
||||
"jackson-module-jaxb-annotations-2.18.2.jar": {
|
||||
"sha1": "048c96032e5a428739e28ff04973717c032df598",
|
||||
"sha256": "sha256-ZFyk3imYBHPxmubAjXws4OP9JzJE0xVbXao7yC+hPUE="
|
||||
},
|
||||
"jackson-module-jaxb-annotations-2.18.0.module": {
|
||||
"sha1": "7adb3648b6e45a0ce0afd75efca142268ca592a1",
|
||||
"sha256": "sha256-66HSqRlv9sC7h9CrfZ6Ta5i2y7eZH8DUShi2gtBDmns="
|
||||
"jackson-module-jaxb-annotations-2.18.2.module": {
|
||||
"sha1": "2c300d407906f321a9e3d3ecc01cc56696ffc660",
|
||||
"sha256": "sha256-wRlrUgwa7RJ88R3ka0l9gbxPNVquWqvIFwcwfX6x30U="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -12215,16 +12215,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/google/errorprone/error_prone_annotations/2.35.1",
|
||||
"path": "com/google/errorprone/error_prone_annotations/2.36.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"error_prone_annotations-2.35.1.pom": {
|
||||
"sha1": "7b4b876b40f04941ede1e324f2af6261ad514a7b",
|
||||
"sha256": "sha256-un1clTzvrQU6AlOiJ46g1u+aiW4ZKgMnzHiO9EJBeBc="
|
||||
"error_prone_annotations-2.36.0.pom": {
|
||||
"sha1": "daf188a28315b31852ebd550f78f6b764972ee1f",
|
||||
"sha256": "sha256-15z9N8hfdta3VMdQHuHchEe3smQsI4LXeCUhZr0zHpw="
|
||||
},
|
||||
"error_prone_annotations-2.35.1.jar": {
|
||||
"sha1": "c36f9e12192226278c2b163bf61990b131e59903",
|
||||
"sha256": "sha256-A7Y/7jjjqG/aMRr1oDV+ZO6kSQmqtSUe0XgRknBQj/U="
|
||||
"error_prone_annotations-2.36.0.jar": {
|
||||
"sha1": "227d4d4957ccc3dc5761bd897e3a0ee587e750a7",
|
||||
"sha256": "sha256-d0QOJwsLyaJJkDxaB2w2pyLEiGyk9CZ18pA6HFPtYaU="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -12362,12 +12362,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/google/errorprone/error_prone_parent/2.35.1",
|
||||
"path": "com/google/errorprone/error_prone_parent/2.36.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"error_prone_parent-2.35.1.pom": {
|
||||
"sha1": "ec496cb2eecb573bac52f53e75e677d21b7d79dd",
|
||||
"sha256": "sha256-vclIzC9eZtiTxFLrVEXgU1TS8PrejWxkUxDYJgEWu0k="
|
||||
"error_prone_parent-2.36.0.pom": {
|
||||
"sha1": "f280159378f00e9f428f10887e22f84ebb2c7e9f",
|
||||
"sha256": "sha256-Okz8imvtYetI6Wl5b8MeoNJwtj5nBZmUamGIOttwlNw="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -12953,12 +12953,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/google/protobuf/protobuf-bom/4.29.0-RC2",
|
||||
"path": "com/google/protobuf/protobuf-bom/4.29.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"protobuf-bom-4.29.0-RC2.pom": {
|
||||
"sha1": "9a1d56ef3dcd903fe6188028b41a08cd95b7aed6",
|
||||
"sha256": "sha256-+fpeoeIYK8Z1Ug+VW8oKTMXIqjvw0QlYTlSXaC7Z268="
|
||||
"protobuf-bom-4.29.0.pom": {
|
||||
"sha1": "5542df7ac3708da8bf30756f4ee6d804d04b8c9b",
|
||||
"sha256": "sha256-3L/Apl6DmDAE0HFOmL8NIGBwEUVbYhk5cowAkmvIyZk="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -13204,16 +13204,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/google/protobuf/protobuf-java/4.29.0-RC2",
|
||||
"path": "com/google/protobuf/protobuf-java/4.29.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"protobuf-java-4.29.0-RC2.pom": {
|
||||
"sha1": "6a3b8220cf0191d1cac58f518e8fe089105a6215",
|
||||
"sha256": "sha256-laBUKUQ7qipRaJ2LniTI0JIqMOTbBMbK2MPX5F6+G9A="
|
||||
"protobuf-java-4.29.0.pom": {
|
||||
"sha1": "27c4abe9c47f4aed31cf7acff86853a05f7e85f0",
|
||||
"sha256": "sha256-7cHftEVG5yel+sU/CQUGv6aN2DB65vEHbv+tVy+S16Q="
|
||||
},
|
||||
"protobuf-java-4.29.0-RC2.jar": {
|
||||
"sha1": "2c26bef798eaf3604cae2487cc7f98fbc30b34b2",
|
||||
"sha256": "sha256-7UEwvtFLpLMrQFVkcnZC1J3sqc14fsugWtO2/2377YQ="
|
||||
"protobuf-java-4.29.0.jar": {
|
||||
"sha1": "ffea90ab158435d68de76951857ef5f8b0f98365",
|
||||
"sha256": "sha256-FpAYUevl6J/oiqrTwmhmNzaVvC4wYnu4kyhH4vX8LnY="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -13333,12 +13333,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/google/protobuf/protobuf-parent/4.29.0-RC2",
|
||||
"path": "com/google/protobuf/protobuf-parent/4.29.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"protobuf-parent-4.29.0-RC2.pom": {
|
||||
"sha1": "87f14265eeeddd4c78ccaed313fe4125e7681442",
|
||||
"sha256": "sha256-awus769PZSQsjKRKvb1PZe3Z0XoiZ1PetQE3m7dICzU="
|
||||
"protobuf-parent-4.29.0.pom": {
|
||||
"sha1": "c35e0844930aea715cc8f4335fee49223b1fe35c",
|
||||
"sha256": "sha256-jU6O2nh45revZuPCtvWHE839P7bNsHGS3My2HN0uSTA="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -15259,16 +15259,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "io/netty/netty-tcnative-classes/2.0.66.Final",
|
||||
"path": "io/netty/netty-tcnative-classes/2.0.69.Final",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"netty-tcnative-classes-2.0.66.Final.pom": {
|
||||
"sha1": "75dca372aa373fac57023721582360f84c79e44c",
|
||||
"sha256": "sha256-SULNAuKRbB+094zKiEHw9yGbuQ+CirdImokCfC76kes="
|
||||
"netty-tcnative-classes-2.0.69.Final.pom": {
|
||||
"sha1": "ee65d639d3c5312a4b6369f0d59504ad0c8dfe0b",
|
||||
"sha256": "sha256-WdoPlJ4r7on1cR6z4Mb9jPeRTmtwwAfza56waIJDAVw="
|
||||
},
|
||||
"netty-tcnative-classes-2.0.66.Final.jar": {
|
||||
"sha1": "9588bd2f891157538a78d86c945aa34bf9308dda",
|
||||
"sha256": "sha256-ZpqBGhk9wefJ74bLVHpKuS8PNMzo+bhCuQKb9c+gfMU="
|
||||
"netty-tcnative-classes-2.0.69.Final.jar": {
|
||||
"sha1": "0f018f36b688bafabe4573af230a8b59cf3c0713",
|
||||
"sha256": "sha256-C7woSMsJnrP29Ow2UBs2AOGChFfNpB1TMGh/YB7gS+8="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -15285,12 +15285,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "io/netty/netty-tcnative-parent/2.0.66.Final",
|
||||
"path": "io/netty/netty-tcnative-parent/2.0.69.Final",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"netty-tcnative-parent-2.0.66.Final.pom": {
|
||||
"sha1": "91784588e56a54734c698f08118b4f3b94a58ec1",
|
||||
"sha256": "sha256-KwF/s8He6rXR6uvsE0ZZt96ueMFNXr/D1JwLMITqc2U="
|
||||
"netty-tcnative-parent-2.0.69.Final.pom": {
|
||||
"sha1": "ba3c1cc69d48f0196ee84ecd3c5157c52a987931",
|
||||
"sha256": "sha256-KVMCcZZjdhDIlPMr2nBQk82HaDFcnxpXOVGnXxeGmvw="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -15804,17 +15804,6 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "net/bytebuddy/byte-buddy-parent/1.14.18",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"byte-buddy-parent-1.14.18.pom": {
|
||||
"sha1": "6b0b1f08e2d2d8166176c80fd22ee3198a26a3cf",
|
||||
"sha256": "sha256-dpxdCxEV5z9oRSu6qjVrrZtzfV/ge4PUyeSDl1uB/jw="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "net/bytebuddy/byte-buddy-parent/1.15.4",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -15826,6 +15815,17 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "net/bytebuddy/byte-buddy-parent/1.15.10",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"byte-buddy-parent-1.15.10.pom": {
|
||||
"sha1": "6f8c0f39f52c09fbf4df945ff563f5fd81130724",
|
||||
"sha256": "sha256-ZX1HwTcRTN8u0plv73gJYTgX3v9k2L4TI/QJiaO6BG4="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "net/bytebuddy/byte-buddy/1.11.13",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -15856,21 +15856,6 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "net/bytebuddy/byte-buddy/1.14.18",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"byte-buddy-1.14.18.pom": {
|
||||
"sha1": "5f889814c247762909c7007bdf5ef72f2e7cea7a",
|
||||
"sha256": "sha256-IvsZB4/nBkirYFSSZscUaZaEciaqbm9+iP7MCBRySTk="
|
||||
},
|
||||
"byte-buddy-1.14.18.jar": {
|
||||
"sha1": "0081e9b9a20944626e6757b5950676af901c2485",
|
||||
"sha256": "sha256-UhF68WlqU6p3wTE1MHStolzL3y31EfKvM/rWcE+pUQQ="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "net/bytebuddy/byte-buddy/1.15.4",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -15886,6 +15871,21 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "net/bytebuddy/byte-buddy/1.15.10",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"byte-buddy-1.15.10.pom": {
|
||||
"sha1": "c968dc18f092176badbc9bd389ce53cbb6f13aa5",
|
||||
"sha256": "sha256-BCz/E2+5FPl2I7oremhdmEuGnb+1tFIdx8kiejJZznA="
|
||||
},
|
||||
"byte-buddy-1.15.10.jar": {
|
||||
"sha1": "635c873fadd853c084f84fdc3cbd58c5dd8537f9",
|
||||
"sha256": "sha256-2DkNIGhaQaK9ymQPlYlCzZG8vyHEJHBJS99XUtmgexQ="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "net/java/dev/jna/jna-platform/5.6.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -16726,12 +16726,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/apache/commons/commons-parent/74",
|
||||
"path": "org/apache/commons/commons-parent/78",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"commons-parent-74.pom": {
|
||||
"sha1": "704abf062c1f6e03f8bcf6929b4777b9af5048a5",
|
||||
"sha256": "sha256-gOthsMh/3YJqBpMTsotnLaPxiFgy2kR7Uebophl+fss="
|
||||
"commons-parent-78.pom": {
|
||||
"sha1": "c59670d5fff6efd8b31013cb579732c75a250b4c",
|
||||
"sha256": "sha256-Ai0gLmVe3QTyoQ7L5FPZKXeSTTg4Ckyow1nxgXqAMg4="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -17471,20 +17471,20 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/checkerframework/checker-qual/3.48.1",
|
||||
"path": "org/checkerframework/checker-qual/3.48.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"checker-qual-3.48.1.pom": {
|
||||
"sha1": "b6dca63179b1aedebea4b5eb877342e3f6ff8916",
|
||||
"sha256": "sha256-4vslCCqCrdKE9gwb/yXZMBzX6bJhOIEs3tGEXutCJ8k="
|
||||
"checker-qual-3.48.2.pom": {
|
||||
"sha1": "95acb8356a028eeb22171b7330f7bb78cf0f9506",
|
||||
"sha256": "sha256-Sk+LlzEYgyx4SrUIpzAJ2tAt5Nq/0dFJLWa45MC6HRE="
|
||||
},
|
||||
"checker-qual-3.48.1.jar": {
|
||||
"sha1": "7d8cf1c00aec0042df92f8d71d7f15baaf9773f4",
|
||||
"sha256": "sha256-Iejf6BA+El2WoyllPKgeh6xDAybb2/KZzqPcGuPwOaI="
|
||||
"checker-qual-3.48.2.jar": {
|
||||
"sha1": "2a4797df796b23026b8215545b0d2936bacc52af",
|
||||
"sha256": "sha256-ryPyDJlbL+3jWx66gRd6mmaUTsZ7jk3uGapMwLcQxrU="
|
||||
},
|
||||
"checker-qual-3.48.1.module": {
|
||||
"sha1": "f1e778df44d6ca615e580cf2bf3c0ad7ad898d6e",
|
||||
"sha256": "sha256-2By/MdXdg8qGleCloaRz6TS5mq3GpN2UnvT1ll8lYAM="
|
||||
"checker-qual-3.48.2.module": {
|
||||
"sha1": "cdf30d8d4b97e12fc85e65e1bd55210a1a084b10",
|
||||
"sha256": "sha256-D2RjlMmz5KL1aitsZ6C0NAkqxrq3pJvC/wGtjKf08NU="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -17820,27 +17820,27 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/easymock/easymock-parent/5.4.0",
|
||||
"path": "org/easymock/easymock-parent/5.5.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"easymock-parent-5.4.0.pom": {
|
||||
"sha1": "ac49fe5a7d9cfec46d7386f713c5cd5c5afed89f",
|
||||
"sha256": "sha256-sKGUgoX4OZNIqWxgWTXYJVCnVKTDNfw0SfogL74qAnI="
|
||||
"easymock-parent-5.5.0.pom": {
|
||||
"sha1": "a30937cb15aa72370d3841ca217dd04cd24d506c",
|
||||
"sha256": "sha256-e7FiABT3ApRLbKcywPIh6jLHwyfQ9fM6zuGf/gtAJ6A="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/easymock/easymock/5.4.0",
|
||||
"path": "org/easymock/easymock/5.5.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"easymock-5.4.0.pom": {
|
||||
"sha1": "d566a45d12ee304ab0fba3877ebd93ef64469ea8",
|
||||
"sha256": "sha256-v/kNdi/BrWVB5jCrgeBzJPVflbd5BhE6NKpnqn2HPhk="
|
||||
"easymock-5.5.0.pom": {
|
||||
"sha1": "a711c875746fa00d8c929824b0f99ed7f103ac75",
|
||||
"sha256": "sha256-0TuotyX47NbHANkl9v78MwXLkIGtzLN97cUxr9HzfQY="
|
||||
},
|
||||
"easymock-5.4.0.jar": {
|
||||
"sha1": "eb56bad81c203765f4a5c74aed28142fb0d79354",
|
||||
"sha256": "sha256-SDUEf+QbVDSRB8EaGEuhIvo8P8cIQHU0ZfdCtJ5+A6M="
|
||||
"easymock-5.5.0.jar": {
|
||||
"sha1": "b07e2bcbc7b6bcae190a18b9ced742b6fd9ceec3",
|
||||
"sha256": "sha256-vwW1axAr6Rx80LutFoTVgJrCzNA4DmhPlEW/3hRBj38="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -19901,16 +19901,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-reflect/2.1.0-Beta2",
|
||||
"path": "org/jetbrains/kotlin/kotlin-reflect/2.1.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"kotlin-reflect-2.1.0-Beta2.pom": {
|
||||
"sha1": "3e7baa22fcb4cc619f4bd40486276a93f3f2a0c3",
|
||||
"sha256": "sha256-Mh8VtvMp1G9QUK5EgUhLQ0nCEefVB7U0spO9fTwzNkg="
|
||||
"kotlin-reflect-2.1.0.pom": {
|
||||
"sha1": "6c72cb76dbf12249eec091d5a7d6ea27a27fcc87",
|
||||
"sha256": "sha256-nNhLPU9xfJYjXkujtydolcz/1V3kEcfOCz97q1Yu/kI="
|
||||
},
|
||||
"kotlin-reflect-2.1.0-Beta2.jar": {
|
||||
"sha1": "d776709bc948b0d4d1f06d0da76c3754d80d6f50",
|
||||
"sha256": "sha256-gBuxZsoD8bj+VXCQtpxdW3CeUiyFTSnSWyTW0JLqjRo="
|
||||
"kotlin-reflect-2.1.0.jar": {
|
||||
"sha1": "dc3753b59b67d79b7d2f546d51e22a0ec1f082d8",
|
||||
"sha256": "sha256-tfYI7fqYqM+iNyzBLRitqXS+HFbBCT7/BswGH0/AiLI="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -21579,24 +21579,24 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib/2.1.0-Beta2",
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib/2.1.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"kotlin-stdlib-2.1.0-Beta2.pom": {
|
||||
"sha1": "9bf48efa052a62e8f741b1da18105848536e0b98",
|
||||
"sha256": "sha256-yK+DAGdGa23mj4Gpm5qTnpn65U2VBdfG8eXQKG9Ckuw="
|
||||
"kotlin-stdlib-2.1.0.pom": {
|
||||
"sha1": "b7c581edbfc43221bf7a18ea76cc482111bba949",
|
||||
"sha256": "sha256-E05IwXeWwcECfsvmyfHHXHkvU1mHq4nh4d2kP4w2b14="
|
||||
},
|
||||
"kotlin-stdlib-2.1.0-Beta2-all.jar": {
|
||||
"kotlin-stdlib-2.1.0-all.jar": {
|
||||
"sha1": "37a691f3c171dc54afc64aedcd63da3440df12d3",
|
||||
"sha256": "sha256-p0EvZtcbzSchw5gweXL7tflAn5RWQ+7gXRCAsomjOcs="
|
||||
},
|
||||
"kotlin-stdlib-2.1.0-Beta2.jar": {
|
||||
"sha1": "9b6eab04a97dfca8f091764bc5bc89604afc7b01",
|
||||
"sha256": "sha256-a+9Pxnj5YEdA0GUcZbg0Rw2GM8nxKfMZzNWstMvztLs="
|
||||
"kotlin-stdlib-2.1.0.jar": {
|
||||
"sha1": "85f8b81009cda5890e54ba67d64b5e599c645020",
|
||||
"sha256": "sha256-1vkbew8wbMopn+x0+3w05IdNb17FuSWgtN4hkB4RnD8="
|
||||
},
|
||||
"kotlin-stdlib-2.1.0-Beta2.module": {
|
||||
"sha1": "fc5281ea91c36234d3aa0de8e0c70e0f8892a677",
|
||||
"sha256": "sha256-3yeZ0iUo792hyfKjSIBL692eYtrGQGxNURFP++ylC2w="
|
||||
"kotlin-stdlib-2.1.0.module": {
|
||||
"sha1": "10243b69a055e7a0aac5eff98c9509f34b4b5d1e",
|
||||
"sha256": "sha256-3PvI6L8yzWen763ZHTEVK86YcJEdbsUIePT9tuA+cOI="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -22698,21 +22698,6 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/ow2/asm/asm/9.7",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"asm-9.7.pom": {
|
||||
"sha1": "e2568079bd69f0fdf35fe2d9e7cd9b16db8eff94",
|
||||
"sha256": "sha256-3gARXx2E86Cy7jpLb2GS0Gb4bRhdZ7nRUi8sgP6sXwA="
|
||||
},
|
||||
"asm-9.7.jar": {
|
||||
"sha1": "073d7b3086e14beb604ced229c302feff6449723",
|
||||
"sha256": "sha256-rfRtXjSUC98Ujs3Sap7o7qlElqcgNP9xQQZrPupcTp0="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/ow2/ow2/1.3",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
|
||||
@@ -559,8 +559,8 @@ com.github.bumptech.glide:glide:4.12.0
|
||||
com.github.bumptech.glide:okhttp3-integration:4.12.0
|
||||
com.github.clans:fab:1.6.4
|
||||
com.github.gundy:semver4j:0.16.4
|
||||
com.github.status-im.status-keycard-java:android:3.1.1
|
||||
com.github.status-im.status-keycard-java:lib:3.1.1
|
||||
com.github.status-im.status-keycard-java:android:3.1.2
|
||||
com.github.status-im.status-keycard-java:lib:3.1.2
|
||||
com.github.status-im:function:0.0.1
|
||||
com.github.wix-playground:ahbottomnavigation:3.3.0
|
||||
com.github.wix-playground:reflow-animator:1.0.6
|
||||
|
||||
@@ -545,8 +545,8 @@ https://dl.google.com/dl/android/maven2/com/google/testing/platform/launcher/0.0
|
||||
https://dl.google.com/dl/android/maven2/com/google/test/platform/core-proto/0.0.2-dev/core-proto-0.0.2-dev.pom
|
||||
https://jitpack.io/com/github/Dimezis/BlurView/version-2.0.4/BlurView-version-2.0.4.pom
|
||||
https://jitpack.io/com/github/status-im/function/0.0.1/function-0.0.1.pom
|
||||
https://jitpack.io/com/github/status-im/status-keycard-java/android/3.1.1/android-3.1.1.pom
|
||||
https://jitpack.io/com/github/status-im/status-keycard-java/lib/3.1.1/lib-3.1.1.pom
|
||||
https://jitpack.io/com/github/status-im/status-keycard-java/android/3.1.2/android-3.1.2.pom
|
||||
https://jitpack.io/com/github/status-im/status-keycard-java/lib/3.1.2/lib-3.1.2.pom
|
||||
https://jitpack.io/com/github/wix-playground/ahbottomnavigation/3.3.0/ahbottomnavigation-3.3.0.pom
|
||||
https://jitpack.io/com/github/wix-playground/reflow-animator/1.0.6/reflow-animator-1.0.6.pom
|
||||
https://jitpack.io/com/github/yalantis/ucrop/2.2.6-native/ucrop-2.2.6-native.pom
|
||||
@@ -564,7 +564,7 @@ https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.10/commons-co
|
||||
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.pom
|
||||
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.17.1/commons-codec-1.17.1.pom
|
||||
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.pom
|
||||
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.17.0/commons-io-2.17.0.pom
|
||||
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.18.0/commons-io-2.18.0.pom
|
||||
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.pom
|
||||
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.pom
|
||||
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.3.4/commons-logging-1.3.4.pom
|
||||
@@ -667,22 +667,22 @@ https://repo.maven.apache.org/maven2/com/facebook/soloader/soloader/0.10.1/soloa
|
||||
https://repo.maven.apache.org/maven2/com/facebook/soloader/soloader/0.10.5/soloader-0.10.5.pom
|
||||
https://repo.maven.apache.org/maven2/com/facebook/yoga/proguard-annotations/1.19.0/proguard-annotations-1.19.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.11.1/jackson-annotations-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.18.0/jackson-annotations-2.18.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.18.2/jackson-annotations-2.18.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.1/jackson-core-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-core/2.18.0/jackson-core-2.18.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-core/2.18.2/jackson-core-2.18.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.11.1/jackson-databind-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.18.0/jackson-databind-2.18.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.18.2/jackson-databind-2.18.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/2.11.1/jackson-dataformat-xml-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-base/2.11.1/jackson-base-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-base/2.18.0/jackson-base-2.18.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-base/2.18.2/jackson-base-2.18.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-bom/2.11.1/jackson-bom-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-bom/2.18.0/jackson-bom-2.18.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-bom/2.18.2/jackson-bom-2.18.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-parent/2.11/jackson-parent-2.11.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-parent/2.18/jackson-parent-2.18.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-parent/2.18.1/jackson-parent-2.18.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/module/jackson-modules-base/2.11.1/jackson-modules-base-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/module/jackson-modules-base/2.18.0/jackson-modules-base-2.18.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/module/jackson-modules-base/2.18.2/jackson-modules-base-2.18.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.11.1/jackson-module-jaxb-annotations-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.18.0/jackson-module-jaxb-annotations-2.18.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.18.2/jackson-module-jaxb-annotations-2.18.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/jackson/module/jackson-module-kotlin/2.11.1/jackson-module-kotlin-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/oss-parent/38/oss-parent-38.pom
|
||||
https://repo.maven.apache.org/maven2/com/fasterxml/oss-parent/61/oss-parent-61.pom
|
||||
@@ -751,7 +751,7 @@ https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotatio
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.10.0/error_prone_annotations-2.10.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.27.0/error_prone_annotations-2.27.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.35.1/error_prone_annotations-2.35.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.0.18/error_prone_parent-2.0.18.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.2.0/error_prone_parent-2.2.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.3.1/error_prone_parent-2.3.1.pom
|
||||
@@ -764,7 +764,7 @@ https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.10.0/error_prone_parent-2.10.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.11.0/error_prone_parent-2.11.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.27.0/error_prone_parent-2.27.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.35.1/error_prone_parent-2.35.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.36.0/error_prone_parent-2.36.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/flatbuffers/flatbuffers-java/1.12.0/flatbuffers-java-1.12.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/google/1/google-1.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.pom
|
||||
@@ -809,7 +809,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.13.0/pro
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.17.2/protobuf-bom-3.17.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.19.2/protobuf-bom-3.19.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.19.3/protobuf-bom-3.19.3.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.29.0-RC2/protobuf-bom-4.29.0-RC2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.29.0/protobuf-bom-4.29.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-javalite/3.17.2/protobuf-javalite-3.17.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-javalite/3.19.2/protobuf-javalite-3.19.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util/3.4.0/protobuf-java-util-3.4.0.pom
|
||||
@@ -826,7 +826,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.13.0/pr
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.17.2/protobuf-java-3.17.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.19.2/protobuf-java-3.19.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.19.3/protobuf-java-3.19.3.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.29.0-RC2/protobuf-java-4.29.0-RC2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.29.0/protobuf-java-4.29.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-lite/3.0.1/protobuf-lite-3.0.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.0.0/protobuf-parent-3.0.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.4.0/protobuf-parent-3.4.0.pom
|
||||
@@ -837,7 +837,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.13.0/
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.17.2/protobuf-parent-3.17.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.19.2/protobuf-parent-3.19.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.19.3/protobuf-parent-3.19.3.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.29.0-RC2/protobuf-parent-4.29.0-RC2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.29.0/protobuf-parent-4.29.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/truth/truth-parent/1.4.4/truth-parent-1.4.4.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/truth/truth/1.4.4/truth-1.4.4.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/zxing/core/3.4.1/core-3.4.1.pom
|
||||
@@ -971,9 +971,9 @@ https://repo.maven.apache.org/maven2/io/netty/netty-resolver/4.1.52.Final/netty-
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-resolver/5.0.0.Alpha2/netty-resolver-5.0.0.Alpha2.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.66.Final/netty-tcnative-classes-2.0.66.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.69.Final/netty-tcnative-classes-2.0.69.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.46.Final/netty-tcnative-parent-2.0.46.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.66.Final/netty-tcnative-parent-2.0.66.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.69.Final/netty-tcnative-parent-2.0.69.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.34.Final/netty-transport-4.1.34.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.52.Final/netty-transport-4.1.52.Final.pom
|
||||
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.pom
|
||||
@@ -1009,12 +1009,12 @@ https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.11.19/byte
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.15.4/byte-buddy-agent-1.15.4.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.11.13/byte-buddy-parent-1.11.13.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.11.19/byte-buddy-parent-1.11.19.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.14.18/byte-buddy-parent-1.14.18.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.15.4/byte-buddy-parent-1.15.4.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.15.10/byte-buddy-parent-1.15.10.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.11.13/byte-buddy-1.11.13.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.11.19/byte-buddy-1.11.19.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.14.18/byte-buddy-1.14.18.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.15.4/byte-buddy-1.15.4.pom
|
||||
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.15.10/byte-buddy-1.15.10.pom
|
||||
https://repo.maven.apache.org/maven2/net/java/dev/jna/jna-platform/5.6.0/jna-platform-5.6.0.pom
|
||||
https://repo.maven.apache.org/maven2/net/java/dev/jna/jna/5.6.0/jna-5.6.0.pom
|
||||
https://repo.maven.apache.org/maven2/net/java/jvnet-parent/1/jvnet-parent-1.pom
|
||||
@@ -1080,7 +1080,7 @@ https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/48/common
|
||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/52/commons-parent-52.pom
|
||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/71/commons-parent-71.pom
|
||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/72/commons-parent-72.pom
|
||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/74/commons-parent-74.pom
|
||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/78/commons-parent-78.pom
|
||||
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/httpclient-4.2.6.pom
|
||||
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.5.2/httpclient-4.5.2.pom
|
||||
@@ -1135,7 +1135,7 @@ https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/2.8.1/che
|
||||
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/2.11.1/checker-qual-2.11.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.5.0/checker-qual-3.5.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.48.1/checker-qual-3.48.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.48.2/checker-qual-3.48.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/codehaus/codehaus-parent/4/codehaus-parent-4.pom
|
||||
https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-xml/3.0.9/groovy-xml-3.0.9.pom
|
||||
https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-xml/3.0.10/groovy-xml-3.0.10.pom
|
||||
@@ -1158,8 +1158,8 @@ https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/84/mojo-paren
|
||||
https://repo.maven.apache.org/maven2/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/easymock/easymockclassextension/3.2/easymockclassextension-3.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/easymock/easymock-parent/3.2/easymock-parent-3.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/easymock/easymock-parent/5.4.0/easymock-parent-5.4.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/easymock/easymock/5.4.0/easymock-5.4.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/easymock/easymock-parent/5.5.0/easymock-parent-5.5.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/easymock/easymock/5.5.0/easymock-5.5.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/eclipse/angus/angus-activation-project/2.0.2/angus-activation-project-2.0.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/eclipse/angus/angus-activation/2.0.2/angus-activation-2.0.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/eclipse/ee4j/project/1.0.2/project-1.0.2.pom
|
||||
@@ -1285,7 +1285,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.6.10/
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.6.20/kotlin-reflect-1.6.20.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.7.10/kotlin-reflect-1.7.10.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.8.20-RC2/kotlin-reflect-1.8.20-RC2.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/2.1.0-Beta2/kotlin-reflect-2.1.0-Beta2.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/2.1.0/kotlin-reflect-2.1.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.6.20/kotlin-scripting-common-1.6.20.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.8.0/kotlin-scripting-common-1.8.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.9.0/kotlin-scripting-common-1.9.0.pom
|
||||
@@ -1395,7 +1395,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/k
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.0/kotlin-stdlib-1.9.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.22/kotlin-stdlib-1.9.22.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.25/kotlin-stdlib-1.9.25.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.1.0-Beta2/kotlin-stdlib-2.1.0-Beta2.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.1.0/kotlin-stdlib-2.1.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.8.0/kotlin-tooling-core-1.8.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.9.0/kotlin-tooling-core-1.9.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-metadata/1.6.20/kotlin-tooling-metadata-1.6.20.pom
|
||||
@@ -1471,7 +1471,6 @@ https://repo.maven.apache.org/maven2/org/ow2/asm/asm/8.0.1/asm-8.0.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.1/asm-9.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.2/asm-9.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.7.1/asm-9.7.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.7/asm-9.7.pom
|
||||
https://repo.maven.apache.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
|
||||
https://repo.maven.apache.org/maven2/org/ow2/ow2/1.5.1/ow2-1.5.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/ow2/ow2/1.5/ow2-1.5.pom
|
||||
|
||||
@@ -51,7 +51,7 @@ in {
|
||||
yarn = super.yarn.override { nodejs = super.nodejs_20; };
|
||||
openjdk = super.openjdk17_headless;
|
||||
xcodeWrapper = callPackage ./pkgs/xcodeenv/compose-xcodewrapper.nix { } {
|
||||
versions = ["15.1" "15.2" "15.3" "15.4"];
|
||||
versions = ["15.1" "15.2" "15.3" "15.4" "16.0" "16.1"];
|
||||
};
|
||||
go = super.go_1_21;
|
||||
clang = super.clang_15;
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
"react-native-shake": "^3.3.1",
|
||||
"react-native-share": "10.0.2",
|
||||
"react-native-static-safe-area-insets": "^2.2.0",
|
||||
"react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#refs/tags/v2.5.39",
|
||||
"react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#refs/tags/v2.6.3",
|
||||
"react-native-svg": "13.10.0",
|
||||
"react-native-webview": "13.6.3",
|
||||
"react-syntax-highlighter": "^15.5.0"
|
||||
|
||||
|
After Width: | Height: | Size: 6.8 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 345 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 227 KiB |
|
After Width: | Height: | Size: 434 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 282 KiB |
@@ -1,8 +1,8 @@
|
||||
import { useDerivedValue, withTiming, Easing } from 'react-native-reanimated';
|
||||
|
||||
const slideAnimationDuration = 300;
|
||||
const totalPages = 4;
|
||||
const pageSize = 100 / totalPages;
|
||||
const totalPages = 3;
|
||||
const pageSize = 25;
|
||||
|
||||
const easeOut = {
|
||||
duration: slideAnimationDuration,
|
||||
@@ -13,7 +13,7 @@ const easeOut = {
|
||||
export function dynamicProgressBarWidth(staticProgressBarWidth, progress) {
|
||||
return useDerivedValue(function () {
|
||||
'worklet';
|
||||
return (staticProgressBarWidth * (progress.value || 0)) / 100;
|
||||
return (staticProgressBarWidth * (progress.value || 0)) / 75;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -26,6 +26,6 @@ export function carouselLeftPosition(windowWidth, progress, isDragging, dragAmou
|
||||
const baseOffset = (Math.floor(progressValue / pageSize) % totalPages) * windowWidth;
|
||||
const adjustedOffset = baseOffset === 0 && dragAmountValue > 0 ? baseOffset : -baseOffset + dragAmountValue;
|
||||
|
||||
return isDragging.value ? withTiming(adjustedOffset, easeOut) : withTiming(-baseOffset, easeOut);
|
||||
return isDragging.value ? adjustedOffset : withTiming(-baseOffset, easeOut);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
(ns quo.components.cards.wallet-card.component-spec
|
||||
(:require
|
||||
[quo.components.cards.wallet-card.view :as wallet-card]
|
||||
[quo.foundations.resources :as resources]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(def ^:private base-props
|
||||
{:image (resources/get-image :keycard-logo)
|
||||
:title "Buy"
|
||||
:subtitle "Start investing now"})
|
||||
|
||||
(h/describe "cards: wallet card"
|
||||
(h/test "Test default render"
|
||||
(let [event (h/mock-fn)]
|
||||
(h/render-with-theme-provider [wallet-card/view
|
||||
(assoc base-props
|
||||
:on-press
|
||||
event)])
|
||||
(h/is-truthy (h/get-by-label-text :wallet-card))
|
||||
(h/is-truthy (h/get-by-text "Buy"))
|
||||
(h/is-truthy (h/get-by-text "Start investing now"))
|
||||
(h/is-truthy (h/get-by-label-text :image))
|
||||
(h/fire-event :press (h/get-by-label-text :wallet-card))
|
||||
(h/was-called event)))
|
||||
|
||||
(h/test "Test render with dismissible prop"
|
||||
(let [event (h/mock-fn)]
|
||||
(h/render-with-theme-provider [wallet-card/view
|
||||
(assoc base-props
|
||||
:dismissible? true
|
||||
:on-press-close event)])
|
||||
(h/is-truthy (h/get-by-label-text :close-icon))
|
||||
(h/fire-event :press (h/get-by-label-text :icon-container))
|
||||
(h/was-called event))))
|
||||
@@ -0,0 +1,15 @@
|
||||
(ns quo.components.cards.wallet-card.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:image :schema.common/image-source]
|
||||
[:title :string]
|
||||
[:subtitle :string]
|
||||
[:dismissible? {:optional true} :boolean]
|
||||
[:on-press {:optional true} fn?]
|
||||
[:on-press-close {:optional true} fn?]
|
||||
[:container-style {:optional true} :map]]]]
|
||||
:any])
|
||||
@@ -0,0 +1,31 @@
|
||||
(ns quo.components.cards.wallet-card.style
|
||||
(:require [quo.foundations.colors :as colors]
|
||||
[quo.foundations.shadows :as shadows]))
|
||||
|
||||
(defn root-container
|
||||
[theme container-style]
|
||||
(merge (shadows/get 2 theme)
|
||||
{:border-radius 16
|
||||
:padding-vertical 10
|
||||
:padding-horizontal 12
|
||||
:width 161
|
||||
:background-color (colors/theme-colors colors/white colors/neutral-90 theme)}
|
||||
container-style))
|
||||
|
||||
(def top-container
|
||||
{:flex-direction :row
|
||||
:height 32
|
||||
:justify-content :space-between
|
||||
:margin-bottom 8})
|
||||
|
||||
(def image
|
||||
{:height 32
|
||||
:width 32})
|
||||
|
||||
(defn title
|
||||
[theme]
|
||||
{:color (colors/theme-colors colors/neutral-100 colors/white theme)})
|
||||
|
||||
(defn subtitle
|
||||
[theme]
|
||||
{:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)})
|
||||
@@ -0,0 +1,44 @@
|
||||
(ns quo.components.cards.wallet-card.view
|
||||
(:require [quo.components.cards.wallet-card.schema :as component-schema]
|
||||
[quo.components.cards.wallet-card.style :as style]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.fast-image :as fast-image]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [image title subtitle dismissible? on-press on-press-close container-style]}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[rn/view {:style (style/root-container theme container-style)}
|
||||
[rn/pressable
|
||||
{:on-press on-press
|
||||
:accessibility-label :wallet-card}
|
||||
[rn/view {:style style/top-container}
|
||||
[fast-image/fast-image
|
||||
{:style style/image
|
||||
:source image
|
||||
:accessibility-label :image}]
|
||||
(when dismissible?
|
||||
[rn/pressable
|
||||
{:on-press on-press-close
|
||||
:accessibility-label :icon-container
|
||||
:hit-slop {:top 5 :bottom 5 :left 5 :right 5}}
|
||||
[icon/icon :i/close
|
||||
{:size 12
|
||||
:accessibility-label :close-icon}]])]
|
||||
[text/text
|
||||
{:style (style/title theme)
|
||||
:size :paragraph-1
|
||||
:weight :semi-bold
|
||||
:number-of-lines 1}
|
||||
title]
|
||||
[text/text
|
||||
{:style (style/subtitle theme)
|
||||
:size :paragraph-2
|
||||
:weight :regular
|
||||
:number-of-lines 1}
|
||||
subtitle]]]))
|
||||
|
||||
(def view (schema/instrument #'view-internal component-schema/?schema))
|
||||
@@ -1,7 +1,6 @@
|
||||
(ns quo.components.utilities.token.view
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[quo.components.markdown.text :as quo]
|
||||
[quo.components.utilities.token.loader :as token-loader]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]
|
||||
@@ -33,22 +32,7 @@
|
||||
:height size-number)))
|
||||
|
||||
(def ^:private b64-png-image-prefix "data:image/png;base64,")
|
||||
|
||||
(defn temp-empty-symbol
|
||||
[token size style]
|
||||
[rn/view
|
||||
{:style (token-style (merge {:justify-content :center
|
||||
:align-items :center
|
||||
:border-radius 20
|
||||
:border-width 1
|
||||
:border-color :grey}
|
||||
style)
|
||||
size)}
|
||||
[quo/text {:style {:color :grey}}
|
||||
(some-> token
|
||||
name
|
||||
first
|
||||
string/capitalize)]])
|
||||
(def ^:const default-token-image (js/require "../resources/images/tokens/default-token.png"))
|
||||
|
||||
(defn- normalize-b64-string
|
||||
[b64-image]
|
||||
@@ -69,13 +53,12 @@
|
||||
"
|
||||
[{:keys [token size style image-source]
|
||||
:or {size 32}}]
|
||||
(let [img-src (if (string? image-source)
|
||||
(normalize-b64-string image-source)
|
||||
image-source)]
|
||||
(if-let [existing-source (or img-src (token-loader/get-token-image token))]
|
||||
[rn/image
|
||||
{:style (token-style style size)
|
||||
:source existing-source}]
|
||||
[temp-empty-symbol token size style])))
|
||||
(let [img-src (if (string? image-source)
|
||||
(normalize-b64-string image-source)
|
||||
image-source)
|
||||
token-image (or img-src (token-loader/get-token-image token) default-token-image)]
|
||||
[rn/image
|
||||
{:style (token-style style size)
|
||||
:source token-image}]))
|
||||
|
||||
(def view (schema/instrument #'view-internal ?schema))
|
||||
|
||||
@@ -121,33 +121,38 @@
|
||||
[linear-gradient/linear-gradient
|
||||
{:start {:x 0 :y 0}
|
||||
:end {:x 1 :y 0}
|
||||
:colors [(colors/theme-colors colors/white colors/neutral-100 theme)
|
||||
(colors/theme-colors colors/white-opa-10 colors/neutral-100-opa-10 theme)]
|
||||
:colors [(colors/theme-colors colors/white colors/neutral-95 theme)
|
||||
(colors/theme-colors colors/white-opa-10 colors/neutral-95-opa-10 theme)]
|
||||
:style style/gradient-start}])
|
||||
(when (and overflow? disabled?)
|
||||
[linear-gradient/linear-gradient
|
||||
{:start {:x 0 :y 0}
|
||||
:end {:x 1 :y 0}
|
||||
:colors [(colors/theme-colors colors/white-opa-10 colors/neutral-100-opa-10 theme)
|
||||
(colors/theme-colors colors/white colors/neutral-100 theme)]
|
||||
:colors [(colors/theme-colors colors/white-opa-10 colors/neutral-95-opa-10 theme)
|
||||
(colors/theme-colors colors/white colors/neutral-95 theme)]
|
||||
:style style/gradient-end}])
|
||||
[rn/text-input
|
||||
(cond-> {:ref set-input-ref
|
||||
:style (style/input disabled? error? theme)
|
||||
:placeholder-text-color (colors/theme-colors colors/neutral-40
|
||||
colors/neutral-50
|
||||
theme)
|
||||
:keyboard-type :numeric
|
||||
:editable (not input-disabled?)
|
||||
:auto-focus auto-focus?
|
||||
:on-focus on-input-focus
|
||||
:on-change-text on-change-text
|
||||
:on-layout on-layout-text-input
|
||||
:on-selection-change on-selection-change
|
||||
:show-soft-input-on-focus show-keyboard?
|
||||
:default-value default-value
|
||||
:placeholder "0"}
|
||||
controlled-input? (assoc :value value))]]
|
||||
(if-not input-disabled?
|
||||
[rn/text-input
|
||||
(cond-> {:ref set-input-ref
|
||||
:style (style/input disabled? error? theme)
|
||||
:placeholder-text-color (colors/theme-colors colors/neutral-40
|
||||
colors/neutral-50
|
||||
theme)
|
||||
:keyboard-type :numeric
|
||||
:editable (not input-disabled?)
|
||||
:auto-focus auto-focus?
|
||||
:on-focus on-input-focus
|
||||
:on-change-text on-change-text
|
||||
:on-layout on-layout-text-input
|
||||
:on-selection-change on-selection-change
|
||||
:show-soft-input-on-focus show-keyboard?
|
||||
:default-value default-value
|
||||
:placeholder "0"}
|
||||
controlled-input? (assoc :value value))]
|
||||
[rn/text
|
||||
{:style (style/input disabled? error? theme)
|
||||
:on-layout on-layout-text-input}
|
||||
(or value "0")])]
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:weight :semi-bold
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:transaction {:optional true} [:maybe [:enum :receive :send :swap :bridge :buy :destroy :mint]]]
|
||||
[:transaction {:optional true}
|
||||
[:maybe [:enum :receive :send :swap :bridge :buy :destroy :mint :approval]]]
|
||||
[:status {:optional true} [:maybe [:enum :pending :confirmed :finalised :failed]]]
|
||||
[:counter {:optional true} [:maybe :int]]
|
||||
[:timestamp {:optional true} [:maybe :string]]
|
||||
|
||||
@@ -41,7 +41,8 @@
|
||||
colors/white-opa-10)})
|
||||
|
||||
(def timestamp-container
|
||||
{:margin-left 4})
|
||||
{:margin-left 4
|
||||
:flex 1})
|
||||
|
||||
(defn timestamp
|
||||
[theme blur?]
|
||||
|
||||
@@ -12,22 +12,24 @@
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(def transaction-translation
|
||||
{:receive [i18n/label :t/receive]
|
||||
:send [i18n/label :t/send]
|
||||
:swap [i18n/label :t/swap]
|
||||
:bridge [i18n/label :t/bridge]
|
||||
:buy [i18n/label :t/buy]
|
||||
:destroy [i18n/label :t/destroy]
|
||||
:mint [i18n/label :t/mint]})
|
||||
{:receive [i18n/label :t/receive]
|
||||
:send [i18n/label :t/send]
|
||||
:swap [i18n/label :t/swap]
|
||||
:bridge [i18n/label :t/bridge]
|
||||
:buy [i18n/label :t/buy]
|
||||
:destroy [i18n/label :t/destroy]
|
||||
:mint [i18n/label :t/mint]
|
||||
:approval [i18n/label :t/set-spending-cap]})
|
||||
|
||||
(def transaction-icon
|
||||
{:receive :i/receive
|
||||
:send :i/send
|
||||
:swap :i/transaction
|
||||
:bridge :i/bridge
|
||||
:buy :i/buy
|
||||
:destroy :i/destroy
|
||||
:mint :i/mint})
|
||||
{:receive :i/receive
|
||||
:send :i/send
|
||||
:swap :i/transaction
|
||||
:bridge :i/bridge
|
||||
:buy :i/buy
|
||||
:destroy :i/destroy
|
||||
:mint :i/mint
|
||||
:approval :i/token-sales})
|
||||
|
||||
(def status-icon
|
||||
{:pending :i/pending-state
|
||||
@@ -39,7 +41,8 @@
|
||||
[{:keys [transaction
|
||||
timestamp
|
||||
counter
|
||||
blur?]
|
||||
blur?
|
||||
on-press-options]
|
||||
:or {transaction :receive
|
||||
counter 1}}
|
||||
theme]
|
||||
@@ -64,7 +67,13 @@
|
||||
:size :label
|
||||
:style (style/timestamp theme blur?)
|
||||
:accessibility-label :transaction-timestamp}
|
||||
timestamp]]])
|
||||
timestamp]]
|
||||
(when on-press-options
|
||||
[rn/pressable
|
||||
{:on-press on-press-options
|
||||
:hit-slop {:top 10 :bottom 10 :left 10 :right 10}}
|
||||
[icon/icon :i/options
|
||||
{:size 20}]])])
|
||||
|
||||
(defn transaction-icon-view
|
||||
[{:keys [blur? transaction status]
|
||||
@@ -120,8 +129,8 @@
|
||||
:accessibility-label :wallet-activity
|
||||
:disabled (= state :disabled)
|
||||
:on-press on-press
|
||||
:on-press-in on-press-in
|
||||
:on-press-out on-press-out}
|
||||
:on-press-in (when on-press on-press-in)
|
||||
:on-press-out (when on-press on-press-out)}
|
||||
[rn/view {:style style/container}
|
||||
[transaction-icon-view props theme]
|
||||
[rn/view {:style {:flex 1}}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
quo.components.calendar.calendar-day.view
|
||||
quo.components.calendar.calendar-year.view
|
||||
quo.components.calendar.calendar.view
|
||||
quo.components.cards.wallet-card.view
|
||||
quo.components.code.snippet-preview.view
|
||||
quo.components.code.snippet.view
|
||||
quo.components.colors.color-picker.view
|
||||
@@ -241,6 +242,7 @@
|
||||
;;;; Cards
|
||||
(def small-option-card quo.components.onboarding.small-option-card.view/small-option-card)
|
||||
(def keycard quo.components.keycard.view/keycard)
|
||||
(def wallet-card quo.components.cards.wallet-card.view/view)
|
||||
|
||||
;;;; Colors
|
||||
(def color-picker quo.components.colors.color-picker.view/view)
|
||||
|
||||
@@ -91,6 +91,7 @@
|
||||
|
||||
;;95 with transparency
|
||||
(def neutral-95-opa-0 (alpha neutral-95 0))
|
||||
(def neutral-95-opa-10 (alpha neutral-95 0.1))
|
||||
(def neutral-95-opa-60 (alpha neutral-95 0.6))
|
||||
(def neutral-95-opa-70 (alpha neutral-95 0.7))
|
||||
(def neutral-95-opa-80 (alpha neutral-95 0.8))
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
gestureHandlerRootHOC
|
||||
FlatList
|
||||
ScrollView)]
|
||||
[react-native.core :as rn]
|
||||
[react-native.flat-list :as rn-flat-list]
|
||||
[reagent.core :as reagent]))
|
||||
|
||||
@@ -112,17 +113,21 @@
|
||||
render-fn]
|
||||
:or {sticky-section-headers-enabled true}
|
||||
:as props}]
|
||||
(let [data (flatten-sections sections)]
|
||||
(let [data (flatten-sections sections)
|
||||
render-item (rn/use-callback
|
||||
(fn [p1 p2 p3 p4]
|
||||
[:<>
|
||||
(if (:header? p1)
|
||||
[render-section-header-fn p1 p2 p3 p4]
|
||||
[render-fn p1 p2 p3 p4])
|
||||
(when (and render-section-footer-fn
|
||||
(is-last-item-in-section data p2))
|
||||
[render-section-footer-fn p1 p2 p3 p4])])
|
||||
[render-fn render-section-header-fn render-section-footer-fn])]
|
||||
[flat-list
|
||||
(merge props
|
||||
{:data data
|
||||
:render-fn (fn [p1 p2 p3 p4]
|
||||
[:<>
|
||||
(if (:header? p1)
|
||||
[render-section-header-fn p1 p2 p3 p4]
|
||||
[render-fn p1 p2 p3 p4])
|
||||
(when (and render-section-footer-fn
|
||||
(is-last-item-in-section data p2))
|
||||
[render-section-footer-fn p1 p2 p3 p4])])
|
||||
:sticky-header-indices (when sticky-section-headers-enabled
|
||||
(find-sticky-indices data))})]))
|
||||
{:data data
|
||||
:render-fn render-item
|
||||
:sticky-header-indices
|
||||
(when sticky-section-headers-enabled
|
||||
(find-sticky-indices data))})]))
|
||||
|
||||
@@ -47,7 +47,8 @@
|
||||
animating? (reagent/atom true)
|
||||
set-animating-true #(reset! animating? true)
|
||||
set-animating-false (fn [ms]
|
||||
(js/setTimeout #(reset! animating? false) ms))]
|
||||
(js/setTimeout #(reset! animating? false) ms))
|
||||
on-scroll-update #(on-scroll % curr-scroll)]
|
||||
(fn [{:keys [content skip-background?]}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
{:keys [top] :as insets} (safe-area/get-insets)
|
||||
@@ -94,5 +95,5 @@
|
||||
:close close
|
||||
:scroll-enabled? scroll-enabled?
|
||||
:current-scroll curr-scroll
|
||||
:on-scroll #(on-scroll % curr-scroll)
|
||||
:on-scroll on-scroll-update
|
||||
:sheet-animating? animating?}]]]]))))
|
||||
|
||||
@@ -150,15 +150,19 @@
|
||||
|
||||
(defn- fiat->crypto
|
||||
[value conversion-rate]
|
||||
(-> value
|
||||
(money/fiat->crypto conversion-rate)
|
||||
(wallet-utils/cut-crypto-decimals-to-fit-usd-cents conversion-rate)))
|
||||
(if-not (string/blank? value)
|
||||
(-> value
|
||||
(money/fiat->crypto conversion-rate)
|
||||
(wallet-utils/cut-crypto-decimals-to-fit-usd-cents conversion-rate))
|
||||
""))
|
||||
|
||||
(defn- crypto->fiat
|
||||
[value conversion-rate]
|
||||
(-> value
|
||||
(money/crypto->fiat conversion-rate)
|
||||
(wallet-utils/cut-fiat-balance-to-two-decimals)))
|
||||
(if-not (string/blank? value)
|
||||
(-> value
|
||||
(money/crypto->fiat conversion-rate)
|
||||
(wallet-utils/cut-fiat-balance-to-two-decimals))
|
||||
""))
|
||||
|
||||
(defn ->crypto
|
||||
[state conversion-rate]
|
||||
|
||||
@@ -61,14 +61,17 @@
|
||||
(defn view
|
||||
[{:keys [header footer customization-color footer-container-padding header-container-style
|
||||
content-container-style gradient-cover? keyboard-should-persist-taps shell-overlay?
|
||||
blur-options content-avoid-keyboard? automatically-adjust-keyboard-insets]
|
||||
blur-options content-avoid-keyboard? automatically-adjust-keyboard-insets
|
||||
;; Note: Provide `initial-header-height` to avoid a jump due to the on-layout 1-frame
|
||||
;; delay. Revisit this on RN 0.76 since the on-layout delay has been fixed.
|
||||
initial-header-height]
|
||||
:or {footer-container-padding (safe-area/get-top)}}
|
||||
& children]
|
||||
(reagent/with-let [scroll-view-ref (atom nil)
|
||||
set-scroll-ref #(reset! scroll-view-ref %)
|
||||
window-height (:height (rn/get-window))
|
||||
footer-container-height (reagent/atom 0)
|
||||
header-height (reagent/atom 0)
|
||||
header-height (reagent/atom nil)
|
||||
content-container-height (reagent/atom 0)
|
||||
content-scroll-y (reagent/atom 0)
|
||||
keyboard-height (reagent/atom 0)
|
||||
@@ -112,7 +115,7 @@
|
||||
{:style
|
||||
(if content-avoid-keyboard?
|
||||
(style/content-keyboard-avoiding-view
|
||||
{:top @header-height
|
||||
{:top (or @header-height initial-header-height)
|
||||
:bottom (if keyboard-shown?
|
||||
@footer-container-height
|
||||
(+ bottom-safe-area @footer-container-height))})
|
||||
|
||||
@@ -159,10 +159,10 @@
|
||||
:add-divider? needs-divider?}))
|
||||
|
||||
(defn clear-history-entry
|
||||
[chat-id needs-divider?]
|
||||
[chat needs-divider?]
|
||||
(entry {:icon :i/delete
|
||||
:label (i18n/label :t/clear-history)
|
||||
:on-press #(clear-history-action chat-id)
|
||||
:on-press #(clear-history-action chat)
|
||||
:danger? true
|
||||
:sub-label nil
|
||||
:accessibility-label :clear-history
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
(def ui
|
||||
{:add-new-contact (js/require "../resources/images/ui2/add-contact.png")
|
||||
:biometrics (js/require "../resources/images/ui2/biometrics.png")
|
||||
:chat-privately-with-friends (js/require "../resources/images/ui2/chat-privately-with-friends.png")
|
||||
:desktop-how-to-pair-sign-in (js/require "../resources/images/ui2/desktop-how-to-pair-sign-in.png")
|
||||
:desktop-how-to-pair-logged-in (js/require
|
||||
"../resources/images/ui2/desktop-how-to-pair-logged-in.png")
|
||||
@@ -19,7 +20,6 @@
|
||||
:use-keycard (js/require "../resources/images/ui2/keycard.png")
|
||||
:use-recovery-phrase (js/require "../resources/images/ui2/recovery-phrase.png")
|
||||
:check-your-keycard (js/require "../resources/images/ui2/check-your-keycard.png")
|
||||
:onboarding-illustration (js/require "../resources/images/ui2/onboarding_illustration.png")
|
||||
:qr-code (js/require "../resources/images/ui2/qr-code.png")
|
||||
:keycard-logo (js/require "../resources/images/ui2/keycard-logo.png")
|
||||
:keycard-watermark (js/require "../resources/images/ui2/keycard-watermark.png")
|
||||
@@ -35,9 +35,13 @@
|
||||
:notifications (js/require "../resources/images/ui2/notifications.png")
|
||||
:nfc-prompt (js/require "../resources/images/ui2/nfc-prompt.png")
|
||||
:nfc-success (js/require "../resources/images/ui2/nfc-success.png")
|
||||
:own-buy-and-swap-your-crypto (js/require "../resources/images/ui2/own-buy-and-swap-your-crypto.png")
|
||||
:preparing-status (js/require "../resources/images/ui2/preparing-status.png")
|
||||
:store-your-assets-on-keycard (js/require "../resources/images/ui2/store-your-assets-on-keycard.png")
|
||||
:syncing-devices (js/require "../resources/images/ui2/syncing_devices.png")
|
||||
:syncing-wrong (js/require "../resources/images/ui2/syncing_wrong.png")})
|
||||
:syncing-wrong (js/require "../resources/images/ui2/syncing_wrong.png")
|
||||
:buy (js/require "../resources/images/ui2/buy.png")
|
||||
:receive (js/require "../resources/images/ui2/receive.png")})
|
||||
|
||||
(def ui-themed
|
||||
{:angry-man
|
||||
|
||||
@@ -15,18 +15,18 @@
|
||||
auth-method (rf/sub [:auth-method])
|
||||
biometric-auth? (= auth-method constants/auth-method-biometric)
|
||||
on-complete (rn/use-callback
|
||||
(fn [reset]
|
||||
(rf/dispatch [:standard-auth/authorize
|
||||
{:on-close (fn [success?]
|
||||
(js/setTimeout #(reset success?) 200))
|
||||
:auth-button-icon-left auth-button-icon-left
|
||||
:theme theme
|
||||
:blur? blur?
|
||||
:keycard-supported? keycard-supported?
|
||||
:biometric-auth? biometric-auth?
|
||||
:on-auth-success on-auth-success
|
||||
:on-auth-fail on-auth-fail
|
||||
:auth-button-label auth-button-label}]))
|
||||
(fn [reset-slider-fn]
|
||||
(js/setTimeout #(reset-slider-fn false) 500)
|
||||
(rf/dispatch
|
||||
[:standard-auth/authorize
|
||||
{:auth-button-icon-left auth-button-icon-left
|
||||
:theme theme
|
||||
:blur? blur?
|
||||
:keycard-supported? keycard-supported?
|
||||
:biometric-auth? biometric-auth?
|
||||
:on-auth-success on-auth-success
|
||||
:on-auth-fail on-auth-fail
|
||||
:auth-button-label auth-button-label}]))
|
||||
(vec (conj dependencies on-auth-success on-auth-fail)))
|
||||
biometric-type (rf/sub [:biometrics/supported-type])]
|
||||
[quo/slide-button
|
||||
|
||||
@@ -28,9 +28,10 @@
|
||||
:long-enough?
|
||||
:short-enough?)))))
|
||||
|
||||
(def password-tip? (set constants/password-tips))
|
||||
|
||||
(defn strength
|
||||
[validations]
|
||||
(->> (select-keys validations constants/password-tips)
|
||||
(vals)
|
||||
(filter true?)
|
||||
count))
|
||||
(->> validations
|
||||
(filter #(and (password-tip? (key %)) (val %)))
|
||||
(count)))
|
||||
|
||||
@@ -35,6 +35,12 @@
|
||||
(def sepolia-chain-explorer-link "https://sepolia.etherscan.io/address/")
|
||||
(def optimism-sepolia-chain-explorer-link "https://sepolia-optimistic.etherscan.io/address/")
|
||||
(def arbitrum-sepolia-chain-explorer-link "https://sepolia.arbiscan.io/address/")
|
||||
(def mainnet-tx-details-base-link "https://etherscan.io/tx")
|
||||
(def optimism-mainnet-tx-details-base-link "https://optimistic.etherscan.io/tx")
|
||||
(def arbitrum-mainnet-tx-details-base-link "https://arbiscan.io/tx")
|
||||
(def mainnet-sepolia-tx-details-base-link "https://sepolia.etherscan.io/tx")
|
||||
(def optimism-sepolia-tx-details-base-link "https://sepolia-optimistic.etherscan.io/tx")
|
||||
(def arbitrum-sepolia-tx-details-base-link "https://sepolia.arbiscan.io/tx")
|
||||
(def opensea-link "https://opensea.io")
|
||||
(def opensea-tesnet-link "https://testnets.opensea.io")
|
||||
|
||||
|
||||
@@ -639,3 +639,5 @@
|
||||
:more-than-five-minutes 4})
|
||||
|
||||
(def ^:const wallet-connect-transaction-refresh-interval-ms 10000)
|
||||
|
||||
(def ^:const native-token-symbol "ETH")
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
[re-frame.interceptor :as interceptor]
|
||||
status-im.contexts.centralized-metrics.effects
|
||||
[status-im.contexts.centralized-metrics.tracking :as tracking]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn push-event?
|
||||
@@ -16,7 +15,6 @@
|
||||
[context]
|
||||
(when (push-event? (interceptor/get-coeffect context :db))
|
||||
(when-let [event (tracking/metrics-event (interceptor/get-coeffect context :event))]
|
||||
(log/debug "tracking event" event)
|
||||
(if (or (seq? event) (vector? event))
|
||||
(doseq [e event]
|
||||
(native-module/add-centralized-metric e))
|
||||
|
||||
@@ -6,12 +6,15 @@
|
||||
[status-im.navigation.screens :as screens]))
|
||||
|
||||
(defn key-value-event
|
||||
[event-name event-value]
|
||||
{:metric
|
||||
{:eventName event-name
|
||||
:platform platform/os
|
||||
:appVersion build/app-short-version
|
||||
:eventValue event-value}})
|
||||
([event-name]
|
||||
(key-value-event event-name nil))
|
||||
([event-name event-value]
|
||||
(cond-> {:metric
|
||||
{:eventName event-name
|
||||
:platform platform/os
|
||||
:appVersion build/app-short-version}}
|
||||
event-value
|
||||
(assoc-in [:metric :eventValue] event-value))))
|
||||
|
||||
(defn user-journey-event
|
||||
[action]
|
||||
@@ -41,11 +44,16 @@
|
||||
|
||||
(defn track-view-id-event
|
||||
[view-id]
|
||||
(if-let [screen (get screens/screens-by-name view-id)]
|
||||
(when (get-in screen [:metrics :track?])
|
||||
(screen-event screen {}))
|
||||
(when (contains? view-ids-to-track view-id)
|
||||
(navigation-event (name view-id)))))
|
||||
(let [screen (get screens/screens-by-name view-id)]
|
||||
(cond-> []
|
||||
(get-in screen [:metrics :track?])
|
||||
(conj (screen-event screen {}))
|
||||
|
||||
(contains? view-ids-to-track view-id)
|
||||
(conj (navigation-event (name view-id)))
|
||||
|
||||
(= :screen/onboarding.syncing-results view-id)
|
||||
(conj (key-value-event "onboarding-completed")))))
|
||||
|
||||
(defn navigated-to-collectibles-tab-event
|
||||
[location]
|
||||
@@ -60,6 +68,13 @@
|
||||
:centralized-metrics/toggle-centralized-metrics
|
||||
(key-value-event "events.metrics-enabled" {:enabled rf-event-parameter})
|
||||
|
||||
:profile.login/non-critical-initialization
|
||||
(key-value-event "user-logged-in")
|
||||
|
||||
(:profile.create/create-and-login
|
||||
:profile.recover/recover-and-login)
|
||||
(key-value-event "onboarding-completed")
|
||||
|
||||
:set-view-id
|
||||
(track-view-id-event rf-event-parameter)
|
||||
|
||||
|
||||
@@ -42,19 +42,19 @@
|
||||
|
||||
(deftest track-view-id-event-test
|
||||
(testing "returns correct navigation event for view-id"
|
||||
(is (= {:metric
|
||||
{:eventName "navigation"
|
||||
:platform platform-os
|
||||
:appVersion app-version
|
||||
:eventValue {:viewId "communities-stack"}}}
|
||||
(is (= [{:metric
|
||||
{:eventName "navigation"
|
||||
:platform platform-os
|
||||
:appVersion app-version
|
||||
:eventValue {:viewId "communities-stack"}}}]
|
||||
(tracking/track-view-id-event :communities-stack)))
|
||||
(is (= {:metric
|
||||
{:eventName "navigation"
|
||||
:platform platform-os
|
||||
:appVersion app-version
|
||||
:eventValue {:viewId "onboarding.create-profile-info"}}}
|
||||
(tracking/track-view-id-event :screen/onboarding.create-profile)))
|
||||
(is (nil? (tracking/track-view-id-event :unknown-stack)))))
|
||||
(is (= [{:metric
|
||||
{:eventName "navigation"
|
||||
:platform platform-os
|
||||
:appVersion app-version
|
||||
:eventValue {:viewId "onboarding.create-profile-password"}}}]
|
||||
(tracking/track-view-id-event :screen/onboarding.create-profile-password)))
|
||||
(is (= [] (tracking/track-view-id-event :unknown-stack)))))
|
||||
|
||||
(deftest tracked-event-test
|
||||
(testing "returns correct event for given inputs"
|
||||
@@ -70,16 +70,16 @@
|
||||
:appVersion app-version
|
||||
:eventValue {:enabled true}}}
|
||||
(tracking/metrics-event [:centralized-metrics/toggle-centralized-metrics true])))
|
||||
(is (= {:metric
|
||||
{:eventName "navigation"
|
||||
:platform platform-os
|
||||
:appVersion app-version
|
||||
:eventValue {:viewId "wallet-stack"}}}
|
||||
(is (= [{:metric
|
||||
{:eventName "navigation"
|
||||
:platform platform-os
|
||||
:appVersion app-version
|
||||
:eventValue {:viewId "wallet-stack"}}}]
|
||||
(tracking/metrics-event [:set-view-id :wallet-stack])))
|
||||
(is (nil? (tracking/metrics-event [:unknown-event])))
|
||||
(is (= {:metric
|
||||
{:eventName "navigation"
|
||||
:platform platform-os
|
||||
:appVersion app-version
|
||||
:eventValue {:viewId "onboarding.intro"}}}
|
||||
(is (= [{:metric
|
||||
{:eventName "navigation"
|
||||
:platform platform-os
|
||||
:appVersion app-version
|
||||
:eventValue {:viewId "onboarding.intro"}}}]
|
||||
(tracking/metrics-event [:set-view-id :screen/onboarding.intro])))))
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
(re-frame/dispatch [:select-contact public-key])))))
|
||||
|
||||
(defn contact-item-render
|
||||
[{:keys [public-key] :as item} set-has-error]
|
||||
[{:keys [public-key] :as item} _ _ {:keys [set-has-error]}]
|
||||
(let [user-selected? (rf/sub [:is-contact-selected? public-key])
|
||||
on-toggle (fn []
|
||||
(-> public-key
|
||||
@@ -86,7 +86,7 @@
|
||||
item]))
|
||||
|
||||
(defn view
|
||||
[{:keys [scroll-enabled? on-scroll close]}]
|
||||
[{:keys [on-scroll close]}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
contacts (rf/sub [:contacts/sorted-and-grouped-by-first-letter])
|
||||
selected-contacts-count (rf/sub [:selected-contacts-count])
|
||||
@@ -94,9 +94,6 @@
|
||||
customization-color (rf/sub [:profile/customization-color])
|
||||
one-contact-selected? (= selected-contacts-count 1)
|
||||
[has-error? set-has-error] (rn/use-state false)
|
||||
render-fn (rn/use-callback (fn [item]
|
||||
(contact-item-render item set-has-error))
|
||||
[set-has-error])
|
||||
contacts-selected? (pos? selected-contacts-count)
|
||||
{:keys [primary-name public-key]} (when one-contact-selected?
|
||||
(rf/sub [:contacts/contact-by-identity
|
||||
@@ -136,8 +133,8 @@
|
||||
:render-section-header-fn contact-list/contacts-section-header
|
||||
:render-section-footer-fn contact-list/contacts-section-footer
|
||||
:content-container-style {:padding-bottom 70}
|
||||
:render-fn render-fn
|
||||
:scroll-enabled @scroll-enabled?
|
||||
:render-fn contact-item-render
|
||||
:render-data {:set-has-error set-has-error}
|
||||
:on-scroll on-scroll}])
|
||||
(when contacts-selected?
|
||||
[rn/view
|
||||
|
||||
@@ -130,4 +130,12 @@
|
||||
:role-permissions? true}
|
||||
:profile/test-networks-enabled? false})
|
||||
(h/render [options/community-options-bottom-sheet {:id "test"}])
|
||||
(h/is-truthy (h/get-by-translation-text :t/unmute-community))))
|
||||
(h/is-truthy (h/get-by-translation-text :t/unmute-community)))
|
||||
|
||||
(h/test "opened community"
|
||||
(h/setup-subs {:communities/my-pending-request-to-join nil
|
||||
:communities/community {:joined false
|
||||
:spectated true}
|
||||
:profile/test-networks-enabled? false})
|
||||
(h/render [options/community-options-bottom-sheet {:id "test"}])
|
||||
(h/is-truthy (h/get-by-translation-text :t/close-community))))
|
||||
|
||||
@@ -124,6 +124,14 @@
|
||||
:on-press #(rf/dispatch [:show-bottom-sheet
|
||||
{:content (fn [] [leave-menu/leave-sheet id color])}])})
|
||||
|
||||
(defn close-community
|
||||
[id]
|
||||
{:icon :i/close-circle
|
||||
:label (i18n/label :t/close-community)
|
||||
:accessibility-label :close-community
|
||||
:danger? true
|
||||
:on-press #(rf/dispatch [:communities/leave id])})
|
||||
|
||||
(defn cancel-request-to-join
|
||||
[id request-id]
|
||||
{:icon :i/block
|
||||
@@ -135,7 +143,7 @@
|
||||
request-id])}])})
|
||||
|
||||
(defn not-joined-options
|
||||
[id token-gated? intro-message test-networks-enabled?]
|
||||
[{:keys [id join-pending? spectated? token-gated? intro-message test-networks-enabled?]}]
|
||||
(let [common [(show-qr id) (share-community id)]
|
||||
specific (cond
|
||||
(and token-gated? (not test-networks-enabled?))
|
||||
@@ -146,19 +154,22 @@
|
||||
|
||||
(not token-gated?)
|
||||
[(view-members id) (view-rules id intro-message) (invite-contacts id)])]
|
||||
[(concat specific common)]))
|
||||
[(concat specific
|
||||
common
|
||||
(when (and spectated? (not join-pending?))
|
||||
[(assoc (close-community id) :add-divider? true)]))]))
|
||||
|
||||
(defn join-request-sent-options
|
||||
[id token-gated? request-id intro-message test-networks-enabled?]
|
||||
[(conj (first (not-joined-options id token-gated? intro-message test-networks-enabled?))
|
||||
[{:keys [id request-id] :as config}]
|
||||
[(conj (first (not-joined-options config))
|
||||
(assoc (cancel-request-to-join id request-id) :add-divider? true))])
|
||||
|
||||
(defn banned-options
|
||||
[id token-gated? intro-message test-networks-enabled?]
|
||||
(not-joined-options id token-gated? intro-message test-networks-enabled?))
|
||||
[config]
|
||||
(not-joined-options config))
|
||||
|
||||
(defn joined-options
|
||||
[id token-gated? muted? muted-till color intro-message]
|
||||
[{:keys [id token-gated? muted? muted-till color intro-message]}]
|
||||
[[(view-members id)
|
||||
(view-rules id intro-message)
|
||||
(when token-gated? (view-token-gating id))
|
||||
@@ -173,7 +184,7 @@
|
||||
[(assoc (leave-community id color) :add-divider? true)]])
|
||||
|
||||
(defn owner-options
|
||||
[id token-gated? muted? muted-till intro-message]
|
||||
[{:keys [id token-gated? muted? muted-till intro-message]}]
|
||||
[[(view-members id)
|
||||
(view-rules id intro-message)
|
||||
(when token-gated? (view-token-gating id))
|
||||
@@ -186,22 +197,29 @@
|
||||
|
||||
(defn get-context-drawers
|
||||
[{:keys [id]}]
|
||||
(let [{:keys [role-permissions? admin joined
|
||||
muted banList muted-till color
|
||||
intro-message]} (rf/sub [:communities/community id])
|
||||
request-id (rf/sub [:communities/my-pending-request-to-join id])
|
||||
test-networks? (rf/sub [:profile/test-networks-enabled?])]
|
||||
(let [{:keys
|
||||
[id admin joined
|
||||
banList color muted muted-till
|
||||
spectated role-permissions?
|
||||
intro-message]} (rf/sub [:communities/community id])
|
||||
request-id (rf/sub [:communities/my-pending-request-to-join id])
|
||||
test-networks? (rf/sub [:profile/test-networks-enabled?])
|
||||
config {:id id
|
||||
:color color
|
||||
:muted-till muted-till
|
||||
:muted? muted
|
||||
:spectated? spectated
|
||||
:token-gated? role-permissions?
|
||||
:intro-message intro-message
|
||||
:test-networks? test-networks?
|
||||
:join-pending? (boolean request-id)
|
||||
:request-id request-id}]
|
||||
(cond
|
||||
admin
|
||||
(owner-options id role-permissions? muted muted-till intro-message)
|
||||
joined
|
||||
(joined-options id role-permissions? muted muted-till color intro-message)
|
||||
request-id
|
||||
(join-request-sent-options id role-permissions? request-id intro-message test-networks?)
|
||||
banList
|
||||
(banned-options id role-permissions? intro-message test-networks?)
|
||||
:else
|
||||
(not-joined-options id role-permissions? intro-message test-networks?))))
|
||||
admin (owner-options config)
|
||||
joined (joined-options config)
|
||||
request-id (join-request-sent-options config)
|
||||
banList (banned-options config)
|
||||
:else (not-joined-options config))))
|
||||
|
||||
(defn community-options-bottom-sheet
|
||||
[id]
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
(ns status-im.contexts.keycard.nfc.sheets.events
|
||||
(:require [re-frame.core :as rf]
|
||||
[react-native.platform :as platform]
|
||||
[taoensso.timbre :as log]))
|
||||
[react-native.platform :as platform]))
|
||||
|
||||
(rf/reg-event-fx :keycard/show-connection-sheet
|
||||
(fn [{:keys [db]} [{:keys [on-cancel-event-vector]} :as args]]
|
||||
@@ -9,20 +8,16 @@
|
||||
{:db (assoc-in db
|
||||
[:keycard :connection-sheet-opts]
|
||||
{:on-close #(rf/dispatch on-cancel-event-vector)})
|
||||
:fx [[:dismiss-keyboard true]
|
||||
:fx [[:effects.keycard.ios/start-nfc nil]
|
||||
[:dismiss-keyboard true]
|
||||
[:show-nfc-sheet nil]]}
|
||||
{:effects.keycard.ios/start-nfc
|
||||
{:on-success
|
||||
(fn []
|
||||
(log/debug "nfc started successfully. next: show-connection-sheet")
|
||||
(rf/dispatch [:keycard.ios/on-start-nfc-success args]))
|
||||
:on-failure
|
||||
(fn []
|
||||
(log/debug "nfc failed star starting. not calling show-connection-sheet"))}})))
|
||||
{:on-success #(rf/dispatch [:keycard.ios/on-start-nfc-success args])}})))
|
||||
|
||||
(rf/reg-event-fx :keycard/hide-connection-sheet
|
||||
(fn [{:keys [db]}]
|
||||
(if platform/android?
|
||||
{:db (assoc-in db [:keycard :connection-sheet-opts] nil)
|
||||
:fx [[:hide-nfc-sheet nil]]}
|
||||
:fx [[:effects.keycard.ios/stop-nfc nil]
|
||||
[:hide-nfc-sheet nil]]}
|
||||
{:effects.keycard.ios/stop-nfc nil})))
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
(or
|
||||
(= error "Tag was lost.")
|
||||
(= error "NFCError:100")
|
||||
(= error "NFCError:102")
|
||||
(= error "Malformed card response")
|
||||
(re-matches #".*NFCError:100.*" error)))
|
||||
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
:flex 1
|
||||
:overflow :hidden})
|
||||
|
||||
(defn background-image-container
|
||||
[width]
|
||||
{:flex 1
|
||||
:flex-direction :row
|
||||
:width width})
|
||||
|
||||
(def background-blur-overlay
|
||||
{:position :absolute
|
||||
:left 0
|
||||
|
||||
@@ -14,20 +14,23 @@
|
||||
(def header-text
|
||||
[{:text (i18n/label :t/own-your-crypto)
|
||||
:sub-text (i18n/label :t/use-the-multichain-wallet)}
|
||||
{:text (i18n/label :t/store-your-asets-on-keycard)
|
||||
:sub-text (i18n/label :t/be-safe-with-secure-cold-wallet)}
|
||||
{:text (i18n/label :t/chat-with-friends)
|
||||
:sub-text (i18n/label :t/with-full-encryption)}
|
||||
{:text (i18n/label :t/discover-web3)
|
||||
:sub-text (i18n/label :t/explore-the-decentralized-web)}])
|
||||
{:text (i18n/label :t/store-your-asets-on-keycard)
|
||||
:sub-text (i18n/label :t/be-safe-with-secure-cold-wallet)}])
|
||||
|
||||
(defn background-image
|
||||
[image-view-width]
|
||||
[rn/image
|
||||
{:resize-mode :stretch
|
||||
:style {:flex 1
|
||||
:width image-view-width}
|
||||
:source (resources/get-image :onboarding-illustration)}])
|
||||
[window-width]
|
||||
[rn/view {:style (style/background-image-container (* window-width 3))}
|
||||
[rn/image
|
||||
{:source (resources/get-image :own-buy-and-swap-your-crypto)
|
||||
:style {:align-self :center :width window-width}}]
|
||||
[rn/image
|
||||
{:source (resources/get-image :chat-privately-with-friends)
|
||||
:style {:align-self :center :width window-width}}]
|
||||
[rn/image
|
||||
{:source (resources/get-image :store-your-assets-on-keycard)
|
||||
:style {:align-self :center :width window-width}}]])
|
||||
|
||||
(defonce progress (atom nil))
|
||||
(defonce paused? (atom nil))
|
||||
@@ -61,7 +64,7 @@
|
||||
:drag-amount drag-amount
|
||||
:header-background true
|
||||
:gesture :swipeable
|
||||
:background [background-image (* 4 window-width)]}]
|
||||
:background [background-image window-width]}]
|
||||
(when dark-overlay?
|
||||
[quo/blur
|
||||
{:style style/background-blur-overlay
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
(def ^:const progress-bar-animation-delay 300)
|
||||
(def ^:const progress-bar-animation-duration 4000)
|
||||
(def ^:const initial-division-quotient 5)
|
||||
(def ^:const initial-division-quotient 4)
|
||||
(def ^:const progress-threshold 25)
|
||||
(def ^:const drag-limit 100)
|
||||
(def ^:const drag-limit 75)
|
||||
|
||||
(defn slide-animation
|
||||
[progress-percentage & [duration]]
|
||||
@@ -50,7 +50,6 @@
|
||||
(animate-progress-value (animation-value q 1))
|
||||
(animate-progress-value (animation-value q 2))
|
||||
(animate-progress-value (animation-value q 3))
|
||||
(animate-progress-value (animation-value q 4))
|
||||
(animate-progress-value (calculate-remainder next-progress drag-limit)))
|
||||
-1)
|
||||
paused?))))
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
|
||||
(defn content-view
|
||||
[{:keys [window-width status-bar-height index header-text header-background]} content]
|
||||
(let [content-width (* 4 window-width)]
|
||||
(let [content-width (* 3 window-width)]
|
||||
[rn/view {:style {:flex 1}}
|
||||
[rn/view {:style (style/header-container status-bar-height content-width index header-background)}
|
||||
(for [index (range 4)]
|
||||
(for [index (range 3)]
|
||||
^{:key index}
|
||||
[header-text-view index window-width header-text])]
|
||||
(when content content)]))
|
||||
@@ -37,7 +37,6 @@
|
||||
{:style (style/progress-bar progress-bar-width)}
|
||||
[rn/view {:style (style/progress-bar-item static? false)}]
|
||||
[rn/view {:style (style/progress-bar-item static? false)}]
|
||||
[rn/view {:style (style/progress-bar-item static? false)}]
|
||||
[rn/view {:style (style/progress-bar-item static? true)}]])
|
||||
|
||||
(defn f-dynamic-progress-bar
|
||||
@@ -65,7 +64,7 @@
|
||||
nil)]
|
||||
[rn/view {:style {:flex 1}}
|
||||
[gesture/gesture-detector {:gesture identified-gesture}
|
||||
[container-view {:style (style/carousel-container carousel-left animate? (* 4 window-width))}
|
||||
[container-view {:style (style/carousel-container carousel-left animate? (* 3 window-width))}
|
||||
(for [index (range 1)]
|
||||
^{:key index}
|
||||
[content-view
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
(ns status-im.contexts.onboarding.create-password.style
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]))
|
||||
[quo.foundations.colors :as colors]
|
||||
[react-native.platform :as platform]))
|
||||
|
||||
(def heading {:margin-bottom 20})
|
||||
(def heading-subtitle {:color colors/white})
|
||||
@@ -21,6 +22,18 @@
|
||||
:padding-top 12
|
||||
:padding-horizontal 20})
|
||||
|
||||
(def disclaimer-container {:padding-horizontal 20})
|
||||
(def footer-container {:padding-bottom 12})
|
||||
(def footer-button-container {:margin-top 20 :padding-horizontal 20})
|
||||
|
||||
(def blur-options
|
||||
{:blur-amount 34
|
||||
:blur-radius 20
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent
|
||||
:background-color (if platform/android?
|
||||
colors/neutral-100
|
||||
colors/neutral-80-opa-1-blur)
|
||||
:padding-vertical 0
|
||||
:padding-horizontal 0})
|
||||
|
||||
(def page-nav-height 56)
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
(ns status-im.contexts.onboarding.create-password.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[quo.foundations.colors :as colors]
|
||||
[react-native.core :as rn]
|
||||
[react-native.platform :as platform]
|
||||
[react-native.safe-area :as safe-area]
|
||||
[status-im.common.floating-button-page.view :as floating-button]
|
||||
[status-im.common.password-with-hint.view :as password-with-hint]
|
||||
@@ -29,22 +27,37 @@
|
||||
(i18n/label :t/password-creation-subtitle)]])
|
||||
|
||||
(defn password-inputs
|
||||
[{:keys [passwords-match? on-change-password on-change-repeat-password on-input-focus
|
||||
password-long-enough? password-short-enough? empty-password? show-password-validation?
|
||||
on-blur-repeat-password]}]
|
||||
(let [hint-1-status (if password-long-enough? :success :default)
|
||||
hint-2-status (if passwords-match? :success :error)
|
||||
hint-2-text (if passwords-match?
|
||||
(i18n/label :t/password-creation-match)
|
||||
(i18n/label :t/password-creation-dont-match))
|
||||
error? (and show-password-validation?
|
||||
(not passwords-match?)
|
||||
(not empty-password?))]
|
||||
[{:keys [set-password set-repeat-password same-password-length? same-passwords?
|
||||
password-long-enough? password-short-enough? non-empty-password?]}]
|
||||
(let [[show-validation?
|
||||
set-show-validation?] (rn/use-state false)
|
||||
on-change-password (rn/use-callback
|
||||
(fn [new-value]
|
||||
(set-password new-value)
|
||||
(when same-password-length?
|
||||
(set-show-validation? true)))
|
||||
[same-password-length?])
|
||||
on-change-repeat-password (rn/use-callback
|
||||
(fn [new-value]
|
||||
(set-repeat-password new-value)
|
||||
(when same-password-length?
|
||||
(set-show-validation? true)))
|
||||
[same-password-length?])
|
||||
on-blur-repeat-password (rn/use-callback
|
||||
#(set-show-validation? non-empty-password?)
|
||||
[non-empty-password?])
|
||||
hint-1-status (if password-long-enough? :success :default)
|
||||
hint-2-status (if same-passwords? :success :error)
|
||||
hint-2-text (if same-passwords?
|
||||
(i18n/label :t/password-creation-match)
|
||||
(i18n/label :t/password-creation-dont-match))
|
||||
error? (and show-validation?
|
||||
(not same-passwords?)
|
||||
non-empty-password?)]
|
||||
[:<>
|
||||
[password-with-hint/view
|
||||
{:hint (if (not password-short-enough?)
|
||||
{:text (i18n/label
|
||||
:t/password-creation-max-length-hint)
|
||||
{:text (i18n/label :t/password-creation-max-length-hint)
|
||||
:status :error
|
||||
:shown? true}
|
||||
{:text (i18n/label :t/password-creation-hint)
|
||||
@@ -52,55 +65,50 @@
|
||||
:shown? true})
|
||||
:placeholder (i18n/label :t/password-creation-placeholder-1)
|
||||
:on-change-text on-change-password
|
||||
:on-focus on-input-focus
|
||||
:auto-focus true}]
|
||||
[rn/view {:style style/space-between-inputs}]
|
||||
[password-with-hint/view
|
||||
{:hint {:text hint-2-text
|
||||
:status hint-2-status
|
||||
:shown? (and (not empty-password?)
|
||||
show-password-validation?)}
|
||||
:shown? (and non-empty-password? show-validation?)}
|
||||
:error? error?
|
||||
:placeholder (i18n/label :t/password-creation-placeholder-2)
|
||||
:on-change-text on-change-repeat-password
|
||||
:on-focus on-input-focus
|
||||
:on-blur on-blur-repeat-password}]]))
|
||||
|
||||
(defn help
|
||||
[{{:keys [lower-case? upper-case? numbers? symbols?]} :validations
|
||||
password-strength :password-strength}]
|
||||
[rn/view
|
||||
[quo/strength-divider {:type (constants/strength-status password-strength :info)}
|
||||
(i18n/label :t/password-creation-tips-title)]
|
||||
[rn/view {:style style/password-tips}
|
||||
[quo/tips {:completed? lower-case?}
|
||||
(i18n/label :t/password-creation-tips-1)]
|
||||
[quo/tips {:completed? upper-case?}
|
||||
(i18n/label :t/password-creation-tips-2)]
|
||||
[quo/tips {:completed? numbers?}
|
||||
(i18n/label :t/password-creation-tips-3)]
|
||||
[quo/tips {:completed? symbols?}
|
||||
(i18n/label :t/password-creation-tips-4)]]])
|
||||
[{:keys [lower-case? upper-case? numbers? symbols?] :as validations}]
|
||||
(let [password-strength (constants/strength-status (password/strength validations) :info)]
|
||||
[rn/view
|
||||
[quo/strength-divider {:type password-strength}
|
||||
(i18n/label :t/password-creation-tips-title)]
|
||||
[rn/view {:style style/password-tips}
|
||||
[quo/tips {:completed? lower-case?}
|
||||
(i18n/label :t/password-creation-tips-1)]
|
||||
[quo/tips {:completed? upper-case?}
|
||||
(i18n/label :t/password-creation-tips-2)]
|
||||
[quo/tips {:completed? numbers?}
|
||||
(i18n/label :t/password-creation-tips-3)]
|
||||
[quo/tips {:completed? symbols?}
|
||||
(i18n/label :t/password-creation-tips-4)]]]))
|
||||
|
||||
(defn- use-password-checks
|
||||
[password]
|
||||
(rn/use-memo
|
||||
(fn []
|
||||
(let [{:keys [long-enough? short-enough?]
|
||||
:as validations} (password/validate password)]
|
||||
{:password-long-enough? long-enough?
|
||||
:password-short-enough? short-enough?
|
||||
:password-validations validations
|
||||
:password-strength (password/strength validations)
|
||||
:empty-password? (empty? password)}))
|
||||
(-> password
|
||||
(password/validate)
|
||||
(assoc :non-empty? (seq password))))
|
||||
[password]))
|
||||
|
||||
(defn- use-repeat-password-checks
|
||||
[password repeat-password]
|
||||
(rn/use-memo
|
||||
(fn []
|
||||
{:same-password-length? (and (seq password) (= (count password) (count repeat-password)))
|
||||
:same-passwords? (and (seq password) (= password repeat-password))})
|
||||
{:same-password-length? (and (seq password)
|
||||
(= (count password) (count repeat-password)))
|
||||
:same-passwords? (and (seq password)
|
||||
(= password repeat-password))})
|
||||
[password repeat-password]))
|
||||
|
||||
(defn create-password-doc
|
||||
@@ -119,102 +127,70 @@
|
||||
{:content create-password-doc
|
||||
:shell? true}]))
|
||||
|
||||
(defn- navigate-back
|
||||
[]
|
||||
(rf/dispatch [:navigate-back]))
|
||||
(defn- navigate-back [] (rf/dispatch [:navigate-back]))
|
||||
|
||||
(defn- page-nav
|
||||
[]
|
||||
(let [{:keys [top]} (safe-area/get-insets)]
|
||||
[quo/page-nav
|
||||
{:margin-top top
|
||||
:background :blur
|
||||
:icon-name :i/arrow-left
|
||||
:on-press navigate-back
|
||||
:right-side [{:icon-name :i/info
|
||||
:on-press on-press-info}]}]))
|
||||
[top]
|
||||
[quo/page-nav
|
||||
{:margin-top top
|
||||
:background :blur
|
||||
:icon-name :i/arrow-left
|
||||
:on-press navigate-back
|
||||
:right-side [{:icon-name :i/info
|
||||
:on-press on-press-info}]}])
|
||||
|
||||
(defn- help-and-confirm-button
|
||||
[{:keys [password-validations same-passwords? on-submit]}]
|
||||
(let [{customization-color :color} (rf/sub [:onboarding/profile])
|
||||
all-requirements-met? (and (:non-empty? password-validations)
|
||||
(:long-enough? password-validations)
|
||||
(:short-enough? password-validations)
|
||||
same-passwords?)]
|
||||
[rn/view {:style style/footer-container}
|
||||
[help password-validations]
|
||||
[quo/button
|
||||
{:container-style style/footer-button-container
|
||||
:disabled? (not all-requirements-met?)
|
||||
:customization-color customization-color
|
||||
:on-press on-submit}
|
||||
(i18n/label :t/password-creation-confirm)]]))
|
||||
|
||||
(defn- on-confirm-password
|
||||
[password]
|
||||
(rf/dispatch [:onboarding/password-set (security/mask-data password)]))
|
||||
|
||||
(defn create-password
|
||||
[]
|
||||
(let [[password set-password] (rn/use-state "")
|
||||
[repeat-password set-repeat-password] (rn/use-state "")
|
||||
[accepts-disclaimer? set-accepts-disclaimer?] (rn/use-state false)
|
||||
[focused-input set-focused-input] (rn/use-state nil)
|
||||
[show-password-validation?
|
||||
set-show-password-validation?] (rn/use-state false)
|
||||
{user-color :color} (rf/sub [:onboarding/profile])
|
||||
|
||||
|
||||
{:keys [password-long-enough?
|
||||
password-short-enough?
|
||||
password-validations password-strength
|
||||
empty-password?]} (use-password-checks password)
|
||||
|
||||
{:keys [same-password-length? same-passwords?]} (use-repeat-password-checks password
|
||||
repeat-password)
|
||||
|
||||
meet-requirements? (and (not empty-password?)
|
||||
password-long-enough?
|
||||
password-short-enough?
|
||||
same-passwords?
|
||||
accepts-disclaimer?)]
|
||||
|
||||
(let [[password set-password] (rn/use-state "")
|
||||
[repeat-password
|
||||
set-repeat-password] (rn/use-state "")
|
||||
{:keys [long-enough? short-enough? non-empty?]
|
||||
:as password-validations} (use-password-checks password)
|
||||
{:keys [same-password-length?
|
||||
same-passwords?]} (use-repeat-password-checks password repeat-password)
|
||||
on-submit (rn/use-callback
|
||||
#(on-confirm-password password)
|
||||
[password])
|
||||
top (safe-area/get-top)]
|
||||
[floating-button/view
|
||||
{:header [page-nav]
|
||||
:keyboard-should-persist-taps :handled
|
||||
:content-avoid-keyboard? true
|
||||
{:header [page-nav top]
|
||||
:initial-header-height (+ style/page-nav-height top)
|
||||
:keyboard-should-persist-taps :handled
|
||||
:content-avoid-keyboard? true
|
||||
:automatically-adjust-keyboard-insets true
|
||||
:blur-options
|
||||
{:blur-amount 34
|
||||
:blur-radius 20
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent
|
||||
:background-color (if platform/android? colors/neutral-100 colors/neutral-80-opa-1-blur)
|
||||
:padding-vertical 0
|
||||
:padding-horizontal 0}
|
||||
:footer-container-padding 0
|
||||
:footer
|
||||
[rn/view
|
||||
{:style style/footer-container}
|
||||
(when same-passwords?
|
||||
[rn/view {:style style/disclaimer-container}
|
||||
[quo/disclaimer
|
||||
{:blur? true
|
||||
:on-change (partial set-accepts-disclaimer? not)
|
||||
:checked? accepts-disclaimer?
|
||||
:customization-color user-color}
|
||||
(i18n/label :t/password-creation-disclaimer)]])
|
||||
(when (and (= focused-input :password) (not same-passwords?))
|
||||
[help
|
||||
{:validations password-validations
|
||||
:password-strength password-strength}])
|
||||
[quo/button
|
||||
{:container-style style/footer-button-container
|
||||
:disabled? (not meet-requirements?)
|
||||
:customization-color user-color
|
||||
:on-press #(rf/dispatch
|
||||
[:onboarding/password-set
|
||||
(security/mask-data password)])}
|
||||
(i18n/label :t/password-creation-confirm)]]}
|
||||
|
||||
:blur-options style/blur-options
|
||||
:footer-container-padding 0
|
||||
:footer [help-and-confirm-button
|
||||
{:password-validations password-validations
|
||||
:same-passwords? same-passwords?
|
||||
:on-submit on-submit}]}
|
||||
[rn/view {:style style/form-container}
|
||||
[header]
|
||||
[password-inputs
|
||||
{:password-long-enough? password-long-enough?
|
||||
:password-short-enough? password-short-enough?
|
||||
:passwords-match? same-passwords?
|
||||
:empty-password? empty-password?
|
||||
:show-password-validation? show-password-validation?
|
||||
:on-input-focus #(set-focused-input :password)
|
||||
:on-change-password (fn [new-value]
|
||||
(set-password new-value)
|
||||
(when same-password-length?
|
||||
(set-show-password-validation? true)))
|
||||
|
||||
:on-change-repeat-password (fn [new-value]
|
||||
(set-repeat-password new-value)
|
||||
(when same-password-length?
|
||||
(set-show-password-validation? true)))
|
||||
:on-blur-repeat-password #(if empty-password?
|
||||
(set-show-password-validation? false)
|
||||
(set-show-password-validation? true))}]]]))
|
||||
{:password-long-enough? long-enough?
|
||||
:password-short-enough? short-enough?
|
||||
:non-empty-password? non-empty?
|
||||
:same-passwords? same-passwords?
|
||||
:same-password-length? same-password-length?
|
||||
:set-password set-password
|
||||
:set-repeat-password set-repeat-password}]]]))
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
(ns status-im.contexts.onboarding.create-profile.style
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]
|
||||
[react-native.platform :as platform]))
|
||||
|
||||
(def continue-button
|
||||
{:width "100%"
|
||||
:margin-left :auto
|
||||
:margin-top (if platform/android? :auto 0)
|
||||
:margin-right :auto})
|
||||
|
||||
(def button-container
|
||||
{:width "100%"
|
||||
:padding-left 20
|
||||
:padding-right 20
|
||||
:padding-top 12
|
||||
:align-self :flex-end
|
||||
:height 64})
|
||||
|
||||
(defn view-button-container
|
||||
[keyboard-shown?]
|
||||
(merge button-container
|
||||
(if platform/ios?
|
||||
{:margin-bottom (if keyboard-shown? 0 34)}
|
||||
{:margin-bottom (if keyboard-shown? 12 34)})))
|
||||
|
||||
(def blur-button-container
|
||||
(merge button-container
|
||||
(when platform/android? {:padding-bottom 12})))
|
||||
|
||||
(def page-container
|
||||
{:position :absolute
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0
|
||||
:z-index 100})
|
||||
|
||||
(def info-message
|
||||
{:margin-top 8})
|
||||
|
||||
(def title
|
||||
{:color colors/white
|
||||
:margin-top 12
|
||||
:margin-bottom 18})
|
||||
|
||||
(def color-title
|
||||
{:color colors/white-70-blur
|
||||
:margin-top 20
|
||||
:margin-bottom 16})
|
||||
|
||||
(def content-container
|
||||
{:padding-horizontal 20})
|
||||
|
||||
(def input-container
|
||||
{:align-items :flex-start})
|
||||
|
||||
(def profile-input-container
|
||||
{:flex-direction :row
|
||||
:justify-content :center})
|
||||
@@ -1,210 +0,0 @@
|
||||
(ns status-im.contexts.onboarding.create-profile.view
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[oops.core :as oops]
|
||||
[quo.core :as quo]
|
||||
[quo.foundations.colors :as colors]
|
||||
[react-native.core :as rn]
|
||||
[react-native.hooks :as hooks]
|
||||
[react-native.platform :as platform]
|
||||
[react-native.safe-area :as safe-area]
|
||||
[reagent.core :as reagent]
|
||||
[status-im.common.avatar-picture-picker.view :as profile-picture-picker]
|
||||
[status-im.common.validation.profile :as profile-validator]
|
||||
[status-im.constants :as c]
|
||||
[status-im.contexts.onboarding.create-profile.style :as style]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]
|
||||
[utils.responsiveness :as responsiveness]))
|
||||
|
||||
(def scroll-view-height (reagent/atom 0))
|
||||
(def content-container-height (reagent/atom 0))
|
||||
|
||||
(defn show-button-background
|
||||
[keyboard-height keyboard-shown content-scroll-y]
|
||||
(let [button-container-height 64
|
||||
keyboard-view-height (+ keyboard-height button-container-height)]
|
||||
(when keyboard-shown
|
||||
(cond
|
||||
platform/android?
|
||||
(< (- @scroll-view-height button-container-height) @content-container-height)
|
||||
|
||||
platform/ios?
|
||||
(< (- @scroll-view-height keyboard-view-height) (- @content-container-height content-scroll-y))
|
||||
|
||||
:else
|
||||
false))))
|
||||
|
||||
(defn button-container
|
||||
[show-keyboard? keyboard-shown show-background? keyboard-height children]
|
||||
(let [height (reagent/atom 0)]
|
||||
(reset! height (if show-keyboard? (if keyboard-shown keyboard-height 0) 0))
|
||||
[rn/view {:style {:margin-top :auto}}
|
||||
(cond
|
||||
(and (> @height 0) show-background?)
|
||||
[quo/blur
|
||||
(when keyboard-shown
|
||||
{:blur-amount 34
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent
|
||||
:background-color (if platform/android? colors/neutral-100 colors/neutral-80-opa-1-blur)
|
||||
:style style/blur-button-container})
|
||||
children]
|
||||
|
||||
(and (> @height 0) (not show-background?))
|
||||
[rn/view {:style (style/view-button-container true)}
|
||||
children]
|
||||
|
||||
(not show-keyboard?)
|
||||
[rn/view {:style (style/view-button-container false)}
|
||||
children])]))
|
||||
|
||||
(defn- page
|
||||
[{:keys [onboarding-profile-data navigation-bar-top]}]
|
||||
(reagent/with-let [show-keyboard? (reagent/atom false)
|
||||
content-scroll-y (reagent/atom 0)
|
||||
show-listener (oops/ocall rn/keyboard
|
||||
"addListener"
|
||||
(if platform/android?
|
||||
"keyboardDidShow"
|
||||
"keyboardWillShow")
|
||||
#(reset! show-keyboard? true))
|
||||
hide-listener (oops/ocall rn/keyboard
|
||||
"addListener"
|
||||
(if platform/android?
|
||||
"keyboardDidHide"
|
||||
"keyboardWillHide")
|
||||
#(reset! show-keyboard? false))
|
||||
{:keys [image-path display-name color]} onboarding-profile-data
|
||||
full-name (reagent/atom display-name)
|
||||
validation-msg (reagent/atom
|
||||
(profile-validator/validation-name
|
||||
@full-name))
|
||||
on-change-text (fn [s]
|
||||
(reset! validation-msg
|
||||
(profile-validator/validation-name
|
||||
s))
|
||||
(reset! full-name (string/trim s)))
|
||||
custom-color (reagent/atom (or color
|
||||
c/profile-default-color))
|
||||
profile-pic (reagent/atom image-path)
|
||||
on-change-profile-pic #(reset! profile-pic %)
|
||||
on-change #(reset! custom-color %)]
|
||||
(let [name-too-short? (profile-validator/name-too-short? @full-name)
|
||||
valid-name? (and (not @validation-msg) (not name-too-short?))
|
||||
info-message (if @validation-msg
|
||||
@validation-msg
|
||||
(i18n/label :t/minimum-characters
|
||||
{:min-chars
|
||||
profile-validator/min-length}))
|
||||
info-type (cond @validation-msg :error
|
||||
name-too-short? :default
|
||||
:else :success)
|
||||
{:keys [keyboard-shown keyboard-height]} (hooks/use-keyboard)
|
||||
show-background? (show-button-background keyboard-height
|
||||
keyboard-shown
|
||||
@content-scroll-y)
|
||||
{window-width :width} (rn/get-window)]
|
||||
[rn/view {:style style/page-container}
|
||||
[quo/page-nav
|
||||
{:margin-top navigation-bar-top
|
||||
:background :blur
|
||||
:icon-name :i/arrow-left
|
||||
:on-press #(rf/dispatch [:navigate-back])}]
|
||||
[rn/scroll-view
|
||||
{:on-layout (fn [event]
|
||||
(let [height (oops/oget event "nativeEvent.layout.height")]
|
||||
(reset! scroll-view-height height)
|
||||
(reset! content-scroll-y 0)))
|
||||
:on-scroll (fn [event]
|
||||
(let [y (oops/oget event "nativeEvent.contentOffset.y")]
|
||||
(reset! content-scroll-y y)))
|
||||
:scroll-event-throttle 64
|
||||
:content-container-style {:flexGrow 1}}
|
||||
[rn/view
|
||||
{:on-layout (fn [event]
|
||||
(let [height (oops/oget event "nativeEvent.layout.height")]
|
||||
(reset! content-container-height height)))}
|
||||
[rn/view
|
||||
{:style style/content-container}
|
||||
[quo/text
|
||||
{:size :heading-1
|
||||
:weight :semi-bold
|
||||
:style style/title} (i18n/label :t/create-profile)]
|
||||
[rn/view
|
||||
{:style style/input-container}
|
||||
[rn/view
|
||||
{:style style/profile-input-container}
|
||||
[quo/profile-input
|
||||
{:customization-color @custom-color
|
||||
:placeholder (i18n/label :t/your-name)
|
||||
:on-press (fn []
|
||||
(rf/dispatch [:dismiss-keyboard])
|
||||
(rf/dispatch
|
||||
[:show-bottom-sheet
|
||||
{:content (fn []
|
||||
[profile-picture-picker/view
|
||||
{:on-result on-change-profile-pic
|
||||
:has-picture? false}])
|
||||
:shell? true}]))
|
||||
:image-picker-props {:profile-picture @profile-pic
|
||||
:full-name (if (seq @full-name)
|
||||
@full-name
|
||||
(i18n/label :t/your-name))
|
||||
:customization-color @custom-color}
|
||||
:title-input-props {:default-value display-name
|
||||
:auto-focus true
|
||||
:max-length c/profile-name-max-length
|
||||
:on-change-text on-change-text}}]]
|
||||
|
||||
[quo/info-message
|
||||
{:status info-type
|
||||
:size :default
|
||||
:icon (if valid-name? :i/positive-state :i/info)
|
||||
:color (when (= :default info-type) colors/white-70-blur)
|
||||
:container-style style/info-message}
|
||||
info-message]
|
||||
[quo/text
|
||||
{:size :paragraph-2
|
||||
:weight :medium
|
||||
:style style/color-title}
|
||||
(i18n/label :t/accent-colour)]]]
|
||||
[quo/color-picker
|
||||
{:blur? true
|
||||
:default-selected :blue
|
||||
:on-change on-change
|
||||
:window-width window-width
|
||||
:container-style {:padding-left (responsiveness/iphone-11-Pro-20-pixel-from-width
|
||||
window-width)}}]]]
|
||||
|
||||
[rn/keyboard-avoiding-view
|
||||
{:style {:position :absolute
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0}
|
||||
:pointer-events :box-none}
|
||||
[button-container @show-keyboard? keyboard-shown show-background? keyboard-height
|
||||
[quo/button
|
||||
{:accessibility-label :submit-create-profile-button
|
||||
:type :primary
|
||||
:customization-color @custom-color
|
||||
:on-press (fn []
|
||||
(rf/dispatch [:onboarding/profile-data-set
|
||||
{:image-path @profile-pic
|
||||
:display-name @full-name
|
||||
:color @custom-color}]))
|
||||
:container-style style/continue-button
|
||||
:disabled? (or (not valid-name?) (not (seq @full-name)))}
|
||||
(i18n/label :t/continue)]]]])
|
||||
(finally
|
||||
(oops/ocall show-listener "remove")
|
||||
(oops/ocall hide-listener "remove"))))
|
||||
|
||||
(defn create-profile
|
||||
[]
|
||||
(let [{:keys [top]} (safe-area/get-insets)
|
||||
onboarding-profile-data (rf/sub [:onboarding/profile])]
|
||||
[page
|
||||
{:navigation-bar-top top
|
||||
:onboarding-profile-data onboarding-profile-data}]))
|
||||
@@ -1,10 +1,9 @@
|
||||
(ns status-im.contexts.onboarding.events
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]
|
||||
[re-frame.core :as re-frame]
|
||||
status-im.common.biometric.events
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.profile.create.events :as profile.create]
|
||||
[status-im.contexts.profile.recover.events :as profile.recover]
|
||||
[status-im.contexts.shell.constants :as shell.constants]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.i18n :as i18n]
|
||||
@@ -78,30 +77,28 @@
|
||||
(fn [_ [error]]
|
||||
{:dispatch [:biometric/show-message (ex-cause error)]}))
|
||||
|
||||
(rf/defn create-account-and-login
|
||||
{:events [:onboarding/create-account-and-login]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [{:keys [seed-phrase]
|
||||
:as profile} (:onboarding/profile db)
|
||||
syncing-account-recovered? (and (seq (:syncing/key-uid db))
|
||||
(= (:syncing/key-uid db)
|
||||
(get-in db [:onboarding/profile :key-uid])))]
|
||||
(rf/merge cofx
|
||||
{:fx [[:dispatch
|
||||
[:navigate-to-within-stack
|
||||
[:screen/onboarding.preparing-status
|
||||
(get db
|
||||
:onboarding/navigated-to-enter-seed-phrase-from-screen
|
||||
:screen/onboarding.new-to-status)]]]
|
||||
(when-not syncing-account-recovered?
|
||||
[:dispatch [:syncing/clear-syncing-installation-id]])]
|
||||
:db (-> db
|
||||
(dissoc :profile/login)
|
||||
(dissoc :auth-method)
|
||||
(assoc :onboarding/new-account? true))}
|
||||
(if seed-phrase
|
||||
(profile.recover/recover-profile-and-login profile)
|
||||
(profile.create/create-profile-and-login profile)))))
|
||||
(rf/reg-event-fx :onboarding/create-account-and-login
|
||||
(fn [{:keys [db]}]
|
||||
(let [{:keys [seed-phrase]
|
||||
:as profile} (:onboarding/profile db)
|
||||
syncing-account-recovered? (and (seq (:syncing/key-uid db))
|
||||
(= (:syncing/key-uid db)
|
||||
(get-in db [:onboarding/profile :key-uid])))]
|
||||
{:db (-> db
|
||||
(dissoc :profile/login)
|
||||
(dissoc :auth-method)
|
||||
(assoc :onboarding/new-account? true))
|
||||
:fx [[:dispatch
|
||||
[:navigate-to-within-stack
|
||||
[:screen/onboarding.preparing-status
|
||||
(get db
|
||||
:onboarding/navigated-to-enter-seed-phrase-from-screen
|
||||
:screen/onboarding.new-to-status)]]]
|
||||
(when-not syncing-account-recovered?
|
||||
[:dispatch [:syncing/clear-syncing-installation-id]])
|
||||
(if seed-phrase
|
||||
[:dispatch [:profile.recover/recover-and-login profile]]
|
||||
[:dispatch [:profile.create/create-and-login profile]])]})))
|
||||
|
||||
(rf/defn on-delete-profile-success
|
||||
{:events [:onboarding/on-delete-profile-success]}
|
||||
@@ -115,63 +112,57 @@
|
||||
(rf/reg-event-fx
|
||||
:onboarding/password-set
|
||||
(fn [{:keys [db]} [masked-password]]
|
||||
(let [biometric-supported-type (get-in db [:biometrics :supported-type])]
|
||||
(let [biometric-supported-type (get-in db [:biometrics :supported-type])
|
||||
from-screen (get db
|
||||
:onboarding/navigated-to-enter-seed-phrase-from-screen
|
||||
:screen/onboarding.new-to-status)]
|
||||
{:db (-> db
|
||||
(assoc-in [:onboarding/profile :password] masked-password)
|
||||
(assoc-in [:onboarding/profile :auth-method] constants/auth-method-password))
|
||||
:fx [[:dispatch
|
||||
(if biometric-supported-type
|
||||
[:navigate-to-within-stack
|
||||
[:screen/onboarding.enable-biometrics
|
||||
(get db
|
||||
:onboarding/navigated-to-enter-seed-phrase-from-screen
|
||||
:screen/onboarding.new-to-status)]]
|
||||
[:navigate-to-within-stack [:screen/onboarding.enable-biometrics from-screen]]
|
||||
[:onboarding/create-account-and-login])]]})))
|
||||
|
||||
(rf/defn navigate-to-enable-biometrics
|
||||
{:events [:onboarding/navigate-to-enable-biometrics]}
|
||||
[{:keys [db]}]
|
||||
(let [supported-type (get-in db [:biometrics :supported-type])]
|
||||
{:dispatch (if supported-type
|
||||
[:open-modal :screen/onboarding.enable-biometrics]
|
||||
[:open-modal :screen/onboarding.enable-notifications])}))
|
||||
(rf/reg-event-fx
|
||||
:onboarding/navigate-to-enable-biometrics
|
||||
(fn [{:keys [db]}]
|
||||
(let [supported-type (get-in db [:biometrics :supported-type])]
|
||||
{:dispatch (if supported-type
|
||||
[:open-modal :screen/onboarding.enable-biometrics]
|
||||
[:open-modal :screen/onboarding.enable-notifications])})))
|
||||
|
||||
(rf/defn seed-phrase-validated
|
||||
{:events [:onboarding/seed-phrase-validated]}
|
||||
[{:keys [db]} seed-phrase key-uid]
|
||||
(let [syncing-account-recovered? (and (seq (:syncing/key-uid db))
|
||||
(= (:syncing/key-uid db) key-uid))
|
||||
next-screen (if syncing-account-recovered?
|
||||
:screen/onboarding.create-profile-password
|
||||
:screen/onboarding.create-profile)]
|
||||
(if (contains? (:profile/profiles-overview db) key-uid)
|
||||
{:effects.utils/show-confirmation
|
||||
{:title (i18n/label :t/multiaccount-exists-title)
|
||||
:content (i18n/label :t/multiaccount-exists-content)
|
||||
:confirm-button-text (i18n/label :t/unlock)
|
||||
:on-accept (fn []
|
||||
(re-frame/dispatch [:pop-to-root :screen/profile.profiles])
|
||||
(re-frame/dispatch
|
||||
[:profile/profile-selected key-uid]))
|
||||
:on-cancel #(re-frame/dispatch [:pop-to-root :multiaccounts])}}
|
||||
{:db (-> db
|
||||
(assoc-in [:onboarding/profile :seed-phrase] seed-phrase)
|
||||
(assoc-in [:onboarding/profile :key-uid] key-uid)
|
||||
(assoc-in [:onboarding/profile :color] constants/profile-default-color))
|
||||
:fx [[:dispatch
|
||||
[:navigate-to-within-stack
|
||||
[next-screen
|
||||
(get db
|
||||
:onboarding/navigated-to-enter-seed-phrase-from-screen
|
||||
:screen/onboarding.new-to-status)]]]]})))
|
||||
(rf/reg-event-fx
|
||||
:onboarding/seed-phrase-validated
|
||||
(fn [{:keys [db]} [seed-phrase key-uid]]
|
||||
(let [next-screen :screen/onboarding.create-profile-password
|
||||
from-screen (get db
|
||||
:onboarding/navigated-to-enter-seed-phrase-from-screen
|
||||
:screen/onboarding.new-to-status)]
|
||||
(if (contains? (:profile/profiles-overview db) key-uid)
|
||||
{:fx [[:effects.utils/show-confirmation
|
||||
{:title (i18n/label :t/multiaccount-exists-title)
|
||||
:content (i18n/label :t/multiaccount-exists-content)
|
||||
:confirm-button-text (i18n/label :t/unlock)
|
||||
:on-accept (fn []
|
||||
(re-frame/dispatch [:pop-to-root :screen/profile.profiles])
|
||||
(re-frame/dispatch [:profile/profile-selected key-uid]))
|
||||
:on-cancel #(re-frame/dispatch [:pop-to-root :multiaccounts])}]]}
|
||||
{:db (-> db
|
||||
(assoc-in [:onboarding/profile :seed-phrase] seed-phrase)
|
||||
(assoc-in [:onboarding/profile :key-uid] key-uid)
|
||||
(assoc-in [:onboarding/profile :color] constants/profile-default-color))
|
||||
:fx [[:dispatch [:navigate-to-within-stack [next-screen from-screen]]]]}))))
|
||||
|
||||
(rf/defn navigate-to-create-profile
|
||||
{:events [:onboarding/navigate-to-create-profile]}
|
||||
[{:keys [db]}]
|
||||
;; Restart the flow
|
||||
{:db (dissoc db :onboarding/profile)
|
||||
:dispatch [:navigate-to-within-stack
|
||||
[:screen/onboarding.create-profile :screen/onboarding.new-to-status]]})
|
||||
(rf/reg-event-fx
|
||||
:onboarding/navigate-to-create-profile
|
||||
(fn [{:keys [db]}]
|
||||
{:db (-> db
|
||||
(assoc-in [:onboarding/profile :color] (rand-nth colors/account-colors))
|
||||
(update :onboarding/profile dissoc :image-path))
|
||||
:fx [[:dispatch
|
||||
[:navigate-to-within-stack
|
||||
[:screen/onboarding.create-profile-password :screen/onboarding.new-to-status]]]]}))
|
||||
|
||||
(rf/reg-event-fx :onboarding/navigate-to-sign-in-by-syncing
|
||||
(fn [{:keys [db]}]
|
||||
@@ -184,27 +175,43 @@
|
||||
(fn [{:keys [db]} [auth-method]]
|
||||
{:db (assoc db :auth-method auth-method)}))
|
||||
|
||||
(rf/defn onboarding-new-account-finalize-setup
|
||||
{:events [:onboarding/finalize-setup]}
|
||||
[{:keys [db]}]
|
||||
(let [masked-password (get-in db [:onboarding/profile :password])
|
||||
key-uid (get-in db [:profile/profile :key-uid])
|
||||
syncing? (get-in db [:onboarding/profile :syncing?])
|
||||
auth-method (get-in db [:onboarding/profile :auth-method])
|
||||
biometric-enabled? (= auth-method constants/auth-method-biometric)]
|
||||
(cond-> {:db (assoc db :onboarding/generated-keys? true)}
|
||||
biometric-enabled?
|
||||
(assoc :keychain/save-password-and-auth-method
|
||||
{:key-uid key-uid
|
||||
:masked-password (if syncing?
|
||||
masked-password
|
||||
(security/hash-masked-password masked-password))
|
||||
:on-success (fn []
|
||||
(rf/dispatch [:onboarding/set-auth-method auth-method])
|
||||
(when syncing?
|
||||
(rf/dispatch
|
||||
[:onboarding/navigate-to-enable-notifications-from-syncing])))
|
||||
:on-error #(log/error "failed to save biometrics"
|
||||
{:key-uid key-uid
|
||||
:error %})}))))
|
||||
(def ^:const temp-display-name
|
||||
"While creating a profile, we cannot use an empty string; this value works as a
|
||||
placeholder that will be updated later once the compressed key exists. See
|
||||
`status-im.contexts.profile.edit.name.events/get-default-display-name` for more details."
|
||||
"temporal username")
|
||||
|
||||
(rf/reg-event-fx
|
||||
:onboarding/use-temporary-display-name
|
||||
(fn [{:keys [db]} [temporary-display-name?]]
|
||||
{:db (assoc db
|
||||
:onboarding/profile
|
||||
{:temporary-display-name? temporary-display-name?
|
||||
:display-name (if temporary-display-name?
|
||||
temp-display-name
|
||||
"")})}))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:onboarding/finalize-setup
|
||||
(fn [{db :db}]
|
||||
(let [{:keys [password syncing? auth-method
|
||||
temporary-display-name?]} (:onboarding/profile db)
|
||||
{:keys [key-uid] :as profile} (:profile/profile db)
|
||||
biometric-enabled? (= auth-method constants/auth-method-biometric)]
|
||||
{:db (assoc db :onboarding/generated-keys? true)
|
||||
:fx [(when temporary-display-name?
|
||||
[:dispatch [:profile/set-default-profile-name profile]])
|
||||
(when biometric-enabled?
|
||||
[:keychain/save-password-and-auth-method
|
||||
{:key-uid key-uid
|
||||
:masked-password (if syncing?
|
||||
password
|
||||
(security/hash-masked-password password))
|
||||
:on-success (fn []
|
||||
(rf/dispatch [:onboarding/set-auth-method auth-method])
|
||||
(when syncing?
|
||||
(rf/dispatch
|
||||
[:onboarding/navigate-to-enable-notifications-from-syncing])))
|
||||
:on-error #(log/error "failed to save biometrics"
|
||||
{:key-uid key-uid
|
||||
:error %})}])]})))
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
[]
|
||||
(when-let [blur-show-fn @overlay/blur-show-fn-atom]
|
||||
(blur-show-fn))
|
||||
(rf/dispatch [:onboarding/use-temporary-display-name false])
|
||||
(rf/dispatch [:open-modal
|
||||
:screen/onboarding.share-usage
|
||||
{:next-screen :screen/onboarding.sync-or-recover-profile}]))
|
||||
@@ -60,6 +61,7 @@
|
||||
[]
|
||||
(when-let [blur-show-fn @overlay/blur-show-fn-atom]
|
||||
(blur-show-fn))
|
||||
(rf/dispatch [:onboarding/use-temporary-display-name true])
|
||||
(rf/dispatch [:open-modal :screen/onboarding.share-usage
|
||||
{:next-screen :screen/onboarding.new-to-status}]))
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
(ns status-im.contexts.preview.quo.cards.wallet-card
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[reagent.core :as reagent]
|
||||
[status-im.common.resources :as resources]
|
||||
[status-im.contexts.preview.quo.preview :as preview]))
|
||||
|
||||
(def descriptor
|
||||
[{:key :title
|
||||
:type :text}
|
||||
{:key :subtitle
|
||||
:type :text}
|
||||
{:key :dismissible?
|
||||
:type :boolean}])
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [state (reagent/atom {:image (resources/get-image :buy)
|
||||
:title "Buy"
|
||||
:subtitle "Start investing now"
|
||||
:on-press #(js/alert "Item pressed")
|
||||
:on-press-close #(js/alert "Close pressed")
|
||||
:dismissible? false})]
|
||||
(fn []
|
||||
[preview/preview-container
|
||||
{:state state
|
||||
:descriptor descriptor
|
||||
:component-container-style {:align-items :center}}
|
||||
[quo/wallet-card @state]])))
|
||||
@@ -34,6 +34,7 @@
|
||||
[status-im.contexts.preview.quo.calendar.calendar :as calendar]
|
||||
[status-im.contexts.preview.quo.calendar.calendar-day :as calendar-day]
|
||||
[status-im.contexts.preview.quo.calendar.calendar-year :as calendar-year]
|
||||
[status-im.contexts.preview.quo.cards.wallet-card :as wallet-card]
|
||||
[status-im.contexts.preview.quo.code.snippet :as code-snippet]
|
||||
[status-im.contexts.preview.quo.code.snippet-preview :as code-snippet-preview]
|
||||
[status-im.contexts.preview.quo.colors.color :as color]
|
||||
@@ -274,6 +275,8 @@
|
||||
:component calendar-day/view}
|
||||
{:name :calendar-year
|
||||
:component calendar-year/view}]
|
||||
:cards [{:name :wallet-card
|
||||
:component wallet-card/view}]
|
||||
:code [{:name :snippet
|
||||
:component code-snippet/view}
|
||||
{:name :snippet-preview
|
||||
|
||||
@@ -152,7 +152,8 @@
|
||||
{:key :bridge}
|
||||
{:key :buy}
|
||||
{:key :destroy}
|
||||
{:key :mint}]}
|
||||
{:key :mint}
|
||||
{:key :approval}]}
|
||||
{:key :status
|
||||
:type :select
|
||||
:options [{:key :pending}
|
||||
@@ -219,7 +220,8 @@
|
||||
:descriptor descriptor
|
||||
:blur? (:blur? @component-state)
|
||||
:show-blur-background? true}
|
||||
[rn/view {:style {:align-self :center}}
|
||||
[rn/view {:style {:flex 1}}
|
||||
[quo/wallet-activity
|
||||
(merge {:on-press #(js/alert "Dropdown pressed")}
|
||||
(merge {:on-press #(js/alert "Activity pressed")
|
||||
:on-press-options #(js/alert "Options pressed")}
|
||||
@component-state)]]])))
|
||||
|
||||
@@ -6,14 +6,13 @@
|
||||
[utils.re-frame :as rf]
|
||||
[utils.security.core :as security]))
|
||||
|
||||
(rf/defn create-profile-and-login
|
||||
{:events [:profile.create/create-and-login]}
|
||||
[{:keys [db]} {:keys [display-name password image-path color]}]
|
||||
(let [login-sha3-password (native-module/sha3 (security/safe-unmask-data password))]
|
||||
{:db (assoc-in db [:syncing :login-sha3-password] login-sha3-password)
|
||||
:effects.profile/create-and-login
|
||||
(assoc (profile.config/create)
|
||||
:displayName display-name
|
||||
:password login-sha3-password
|
||||
:imagePath (profile.config/strip-file-prefix image-path)
|
||||
:customizationColor color)}))
|
||||
(rf/reg-event-fx :profile.create/create-and-login
|
||||
(fn [{:keys [db]} [{:keys [display-name password image-path color]}]]
|
||||
(let [login-sha3-password (native-module/sha3 (security/safe-unmask-data password))]
|
||||
{:db (assoc-in db [:syncing :login-sha3-password] login-sha3-password)
|
||||
:fx [[:effects.profile/create-and-login
|
||||
(assoc (profile.config/create)
|
||||
:displayName display-name
|
||||
:password login-sha3-password
|
||||
:imagePath (profile.config/strip-file-prefix image-path)
|
||||
:customizationColor color)]]})))
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
(ns status-im.contexts.profile.edit.name.events
|
||||
(:require [utils.i18n :as i18n]
|
||||
(:require [clojure.string :as string]
|
||||
[status-im.constants :as constants]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(rf/reg-event-fx :profile/edit-profile-name-success
|
||||
@@ -20,3 +22,16 @@
|
||||
:on-success [:profile/edit-profile-name-success]}]]]})
|
||||
|
||||
(rf/reg-event-fx :profile/edit-name edit-profile-name)
|
||||
|
||||
(defn display-name-from-compressed-key
|
||||
[profile]
|
||||
(-> profile :compressed-key (string/split #"zQ3") second (subs 0 constants/profile-name-max-length)))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:profile/set-default-profile-name
|
||||
(fn [{db :db} [profile]]
|
||||
(let [default-display-name (display-name-from-compressed-key profile)]
|
||||
{:db (assoc-in db [:profile/profile :display-name] default-display-name)
|
||||
:fx [[:json-rpc/call
|
||||
[{:method "wakuext_setDisplayName"
|
||||
:params [default-display-name]}]]]})))
|
||||
|
||||
@@ -152,15 +152,12 @@
|
||||
|
||||
(rf/reg-event-fx
|
||||
:profile.login/login-node-signal
|
||||
(fn [{{:onboarding/keys [recovered-account? new-account?] :as db} :db}
|
||||
[{:keys [settings account ensUsernames error]}]]
|
||||
(fn [{db :db} [{:keys [settings account ensUsernames error]}]]
|
||||
(log/debug "[signals] node.login" "error" error)
|
||||
(if error
|
||||
{:db (update db :profile/login #(-> % (dissoc :processing) (assoc :error error)))}
|
||||
{:db (dissoc db :profile/login)
|
||||
:fx [(when (and new-account? (not recovered-account?))
|
||||
[:dispatch-later [{:ms 1000 :dispatch [:wallet-legacy/set-initial-blocks-range]}]])
|
||||
[:dispatch-later [{:ms 2000 :dispatch [:ens/update-usernames ensUsernames]}]]
|
||||
:fx [[:dispatch-later [{:ms 2000 :dispatch [:ens/update-usernames ensUsernames]}]]
|
||||
[:dispatch [:profile.login/login-existing-profile settings account]]]})))
|
||||
|
||||
(rf/reg-event-fx
|
||||
|
||||
@@ -14,8 +14,11 @@
|
||||
network/status network/expensive?
|
||||
centralized-metrics/user-confirmed?]
|
||||
network-type :network/network-type
|
||||
:as _db}]
|
||||
:as db}]
|
||||
(assoc db/app-db
|
||||
;; We must carry over the current `:selected-stack-id`, otherwise the
|
||||
;; app will start with `:view-id` as nil.
|
||||
:shell/selected-stack-id (:shell/selected-stack-id db)
|
||||
:profile/logging-out? true
|
||||
:centralized-metrics/user-confirmed? user-confirmed?
|
||||
:network/type network-type
|
||||
@@ -44,4 +47,3 @@
|
||||
[:dispatch-later
|
||||
{:ms 100
|
||||
:dispatch [:profile.logout/reset-state]}]]}))
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
[]
|
||||
(when @push-animation-fn-atom
|
||||
(@push-animation-fn-atom))
|
||||
(rf/dispatch [:onboarding/use-temporary-display-name true])
|
||||
(debounce/throttle-and-dispatch
|
||||
[:open-modal :screen/onboarding.new-to-status]
|
||||
1000))
|
||||
@@ -55,6 +56,7 @@
|
||||
[]
|
||||
(when @push-animation-fn-atom
|
||||
(@push-animation-fn-atom))
|
||||
(rf/dispatch [:onboarding/use-temporary-display-name false])
|
||||
(debounce/throttle-and-dispatch
|
||||
[:open-modal :screen/onboarding.sync-or-recover-profile]
|
||||
1000))
|
||||
|
||||
@@ -7,23 +7,22 @@
|
||||
[utils.re-frame :as rf]
|
||||
[utils.security.core :as security]))
|
||||
|
||||
(rf/defn recover-profile-and-login
|
||||
{:events [:profile.recover/recover-and-login]}
|
||||
[{:keys [db]} {:keys [display-name password image-path color seed-phrase]}]
|
||||
(let [login-sha3-password (native-module/sha3 (security/safe-unmask-data password))]
|
||||
{:db
|
||||
(-> db
|
||||
(assoc :onboarding/recovered-account? true)
|
||||
(assoc-in [:syncing :login-sha3-password] login-sha3-password))
|
||||
|
||||
:effects.profile/restore-and-login
|
||||
(assoc (profile.config/create)
|
||||
:displayName display-name
|
||||
:mnemonic (security/safe-unmask-data seed-phrase)
|
||||
:password login-sha3-password
|
||||
:imagePath (profile.config/strip-file-prefix image-path)
|
||||
:customizationColor (or color constants/profile-default-color)
|
||||
:fetchBackup true)}))
|
||||
(rf/reg-event-fx :profile.recover/recover-and-login
|
||||
(fn [{:keys [db]} [{:keys [display-name password image-path color seed-phrase]}]]
|
||||
(let [login-sha3-password (native-module/sha3 (security/safe-unmask-data password))]
|
||||
{:db
|
||||
(-> db
|
||||
(assoc :onboarding/recovered-account? true)
|
||||
(assoc-in [:syncing :login-sha3-password] login-sha3-password))
|
||||
:fx
|
||||
[[:effects.profile/restore-and-login
|
||||
(assoc (profile.config/create)
|
||||
:displayName display-name
|
||||
:mnemonic (security/safe-unmask-data seed-phrase)
|
||||
:password login-sha3-password
|
||||
:imagePath (profile.config/strip-file-prefix image-path)
|
||||
:customizationColor (or color constants/profile-default-color)
|
||||
:fetchBackup true)]]})))
|
||||
|
||||
(rf/reg-event-fx :profile.recover/validate-recovery-phrase
|
||||
(fn [_ [phrase {:keys [on-success on-error]}]]
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
(ns status-im.contexts.settings.keycard.style
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]))
|
||||
|
||||
(def registered-keycards-container
|
||||
{:gap 12
|
||||
:padding-horizontal 20})
|
||||
|
||||
(def keycard-row
|
||||
{:gap 12
|
||||
:padding 12
|
||||
:border-radius 16
|
||||
:flex-direction :row
|
||||
:background-color colors/white-opa-5})
|
||||
|
||||
(def keycard-owner
|
||||
{:gap 4
|
||||
:flex-direction :row
|
||||
:align-items :center})
|
||||
|
||||
(def keycard-owner-name
|
||||
{:color colors/white-opa-40})
|
||||
@@ -5,9 +5,45 @@
|
||||
[status-im.common.events-helper :as events-helper]
|
||||
[status-im.common.resources :as resources]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.settings.keycard.style :as style]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn registered-keycard
|
||||
[{:keys [profile-name profile-image customization-color]}]
|
||||
[rn/view {:style style/keycard-row}
|
||||
[quo/icon :i/keycard-card
|
||||
{:size 20
|
||||
:color colors/white-70-blur}]
|
||||
[rn/view
|
||||
[quo/text profile-name]
|
||||
[rn/view {:style style/keycard-owner}
|
||||
[quo/user-avatar
|
||||
{:full-name profile-name
|
||||
:profile-picture profile-image
|
||||
:customization-color customization-color
|
||||
:status-indicator false
|
||||
:ring? false
|
||||
:size :xxxs}]
|
||||
[quo/text
|
||||
{:size :paragraph-2
|
||||
:style style/keycard-owner-name}
|
||||
profile-name]]]])
|
||||
|
||||
(defn registered-keycards
|
||||
[]
|
||||
(let [keycards (rf/sub [:keycard/registered-keycards])]
|
||||
[:<>
|
||||
[quo/divider-label
|
||||
{:counter? false
|
||||
:tight? true
|
||||
:blur? true}
|
||||
(i18n/label :t/registered-keycards)]
|
||||
[rn/view {:style style/registered-keycards-container}
|
||||
(for [keycard keycards]
|
||||
^{:key (:keycard-uid keycard)}
|
||||
[registered-keycard keycard])]]))
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [keycard-profile? (rf/sub [:keycard/keycard-profile?])]
|
||||
@@ -20,7 +56,7 @@
|
||||
[quo/page-top
|
||||
{:title (i18n/label :t/keycard)}]
|
||||
(if keycard-profile?
|
||||
[:<>]
|
||||
[registered-keycards]
|
||||
[rn/view {:style {:padding-horizontal 28 :padding-top 20}}
|
||||
[quo/small-option-card
|
||||
{:variant :main
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
(def first-tab-id :assets)
|
||||
|
||||
;; NOTE: If the id of the tabs are changed, please check 'wallet/select-account-tab' event as
|
||||
;; a activity event depends on it
|
||||
(def tabs-data
|
||||
[{:id :assets :label (i18n/label :t/assets) :accessibility-label :assets-tab}
|
||||
{:id :collectibles :label (i18n/label :t/collectibles) :accessibility-label :collectibles-tab}
|
||||
@@ -30,8 +32,6 @@
|
||||
(hot-reload/use-safe-unmount (fn []
|
||||
(rf/dispatch [:wallet/close-account-page])
|
||||
(rf/dispatch [:wallet/clean-current-viewing-account])))
|
||||
(rn/use-mount
|
||||
#(rf/dispatch [:wallet/fetch-activities-for-current-account]))
|
||||
[rn/view {:style {:flex 1}}
|
||||
[account-switcher/view
|
||||
{:type :wallet-networks
|
||||
|
||||
@@ -15,11 +15,26 @@
|
||||
(let [parsed-keypairs (data-store/rpc->keypairs keypairs)
|
||||
default-key-uid (->> parsed-keypairs
|
||||
(some #(when (= (:type %) :profile) %))
|
||||
:key-uid)]
|
||||
:key-uid)
|
||||
keycard? (get-in db [:profile/profile :keycard-pairing])
|
||||
keypair (first parsed-keypairs)
|
||||
keycard (when (and keycard? (= (count parsed-keypairs) 1) (empty? (:keycards keypair)))
|
||||
{:keycard-uid (get-in db [:profile/profile :keycard-instance-uid])
|
||||
:key-uid default-key-uid
|
||||
:keycard-name ""
|
||||
:accounts-addresses [(some #(when (:wallet %) (:address %))
|
||||
(:accounts keypair))]})]
|
||||
{:db (-> db
|
||||
(assoc-in [:wallet :keypairs] (utils.collection/index-by :key-uid parsed-keypairs))
|
||||
(assoc-in [:wallet :ui :create-account :selected-keypair-uid] default-key-uid))}))
|
||||
|
||||
(assoc-in [:wallet :keypairs]
|
||||
(cond-> (utils.collection/index-by :key-uid parsed-keypairs)
|
||||
keycard
|
||||
(assoc-in [default-key-uid :keycards] [keycard])))
|
||||
(assoc-in [:wallet :ui :create-account :selected-keypair-uid] default-key-uid))
|
||||
;; this is a temporary solution, should be done properly in statu-go instead
|
||||
:fx [(when keycard
|
||||
[:json-rpc/call
|
||||
[{:method "accounts_saveOrUpdateKeycard"
|
||||
:params [keycard true]}]])]}))
|
||||
(rf/reg-event-fx :wallet/get-keypairs-success get-keypairs-success)
|
||||
|
||||
(defn confirm-account-origin
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
(ns status-im.contexts.wallet.bridge.bridge-to.view
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[quo.core :as quo]
|
||||
[quo.foundations.resources :as quo.resources]
|
||||
[quo.theme]
|
||||
@@ -15,28 +14,34 @@
|
||||
|
||||
(defn- bridge-token-component
|
||||
[]
|
||||
(fn [{:keys [chain-id network-name]} {:keys [supported-networks] :as token}]
|
||||
(let [network (rf/sub [:wallet/network-details-by-chain-id chain-id])
|
||||
currency (rf/sub [:profile/currency])
|
||||
currency-symbol (rf/sub [:profile/currency-symbol])
|
||||
prices-per-token (rf/sub [:wallet/prices-per-token])
|
||||
balance (utils/calculate-total-token-balance token [chain-id])
|
||||
crypto-value (utils/get-standard-crypto-format token balance prices-per-token)
|
||||
fiat-value (utils/calculate-token-fiat-value
|
||||
{:currency currency
|
||||
:balance balance
|
||||
:token token
|
||||
:prices-per-token prices-per-token})
|
||||
fiat-formatted (utils/fiat-formatted-for-ui currency-symbol
|
||||
fiat-value)
|
||||
token-available-on-network? (network-utils/token-available-on-network? supported-networks
|
||||
chain-id)]
|
||||
(fn [{:keys [chain-id network-name]} {:keys [supported-networks] :as token} selected-network]
|
||||
(let [network (rf/sub [:wallet/network-details-by-chain-id chain-id])
|
||||
currency (rf/sub [:profile/currency])
|
||||
currency-symbol (rf/sub [:profile/currency-symbol])
|
||||
prices-per-token (rf/sub [:wallet/prices-per-token])
|
||||
{selected-network-chain-id :chain-id} selected-network
|
||||
balance (utils/calculate-total-token-balance token [chain-id])
|
||||
crypto-value (utils/get-standard-crypto-format token
|
||||
balance
|
||||
prices-per-token)
|
||||
fiat-value (utils/calculate-token-fiat-value
|
||||
{:currency currency
|
||||
:balance balance
|
||||
:token token
|
||||
:prices-per-token prices-per-token})
|
||||
fiat-formatted (utils/fiat-formatted-for-ui currency-symbol
|
||||
fiat-value)
|
||||
token-available-on-network? (network-utils/token-available-on-network?
|
||||
supported-networks
|
||||
chain-id)]
|
||||
[quo/network-list
|
||||
{:label (name network-name)
|
||||
:network-image (quo.resources/get-network (:network-name network))
|
||||
:token-value (str crypto-value " " (:symbol token))
|
||||
:fiat-value fiat-formatted
|
||||
:state (if token-available-on-network? :default :disabled)
|
||||
:state (if (and token-available-on-network? (not= chain-id selected-network-chain-id))
|
||||
:default
|
||||
:disabled)
|
||||
:on-press #(rf/dispatch [:wallet/select-bridge-network
|
||||
{:network-chain-id chain-id
|
||||
:stack-id :screen/wallet.bridge-to}])}])))
|
||||
@@ -46,6 +51,7 @@
|
||||
(let [network-details (rf/sub [:wallet/network-details])
|
||||
account (rf/sub [:wallet/current-viewing-account])
|
||||
token (rf/sub [:wallet/wallet-send-token])
|
||||
selected-network (rf/sub [:wallet/send-network])
|
||||
token-symbol (:symbol token)
|
||||
tokens (:tokens account)
|
||||
mainnet (first network-details)
|
||||
@@ -55,8 +61,7 @@
|
||||
(assoc account-token
|
||||
:networks (:networks token)
|
||||
:supported-networks (:supported-networks token)))
|
||||
bridge-to-title (i18n/label :t/bridge-to
|
||||
{:name (string/upper-case (str token-symbol))})]
|
||||
bridge-to-title (i18n/label :t/select-network-to-receive)]
|
||||
|
||||
(hot-reload/use-safe-unmount #(rf/dispatch [:wallet/clean-bridge-to-selection]))
|
||||
|
||||
@@ -68,11 +73,11 @@
|
||||
:switcher-type :select-account}]
|
||||
[quo/page-top {:title bridge-to-title}]
|
||||
[rn/view style/content-container
|
||||
[bridge-token-component (assoc mainnet :network-name :t/mainnet) account-token]]
|
||||
[bridge-token-component (assoc mainnet :network-name :t/mainnet) account-token selected-network]]
|
||||
|
||||
[quo/divider-label (i18n/label :t/layer-2)]
|
||||
[rn/flat-list
|
||||
{:data layer-2-networks
|
||||
:render-fn (fn [network]
|
||||
[bridge-token-component network account-token])
|
||||
[bridge-token-component network account-token selected-network])
|
||||
:content-container-style style/content-container}]]))
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
(ns status-im.contexts.wallet.bridge.flow-config)
|
||||
|
||||
(def steps
|
||||
[{:screen-id :screen/wallet.select-from
|
||||
:skip-step? (fn [db] (some? (get-in db [:wallet :current-viewing-account-address])))}
|
||||
{:screen-id :screen/wallet.bridge-select-asset
|
||||
[{:screen-id :screen/wallet.bridge-select-asset
|
||||
:skip-step? (fn [db] (some? (get-in db [:wallet :ui :send :token])))}
|
||||
{:screen-id :screen/wallet.bridge-to
|
||||
:skip-step? (fn [db] (some? (get-in db [:wallet :ui :send :bridge-to-chain-id])))}
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
(ns status-im.contexts.wallet.common.activity-tab.activity-types.view
|
||||
(:require [quo.core :as quo]
|
||||
[status-im.contexts.wallet.common.activity-tab.options.view :as activity-options]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
;; Common helpers
|
||||
(defn- open-options
|
||||
[transactions]
|
||||
(rf/dispatch
|
||||
[:show-bottom-sheet
|
||||
{:content #(activity-options/view (first transactions))}]))
|
||||
|
||||
(defn- common-activity-props
|
||||
[{:keys [tx-type relative-date status transactions]}]
|
||||
{:transaction tx-type
|
||||
:timestamp relative-date
|
||||
:status status
|
||||
:blur? false
|
||||
:on-press-options #(open-options transactions)})
|
||||
|
||||
(defn- network-tag
|
||||
[{:keys [network-name network-logo]}]
|
||||
{:type :network
|
||||
:network-name network-name
|
||||
:network-logo network-logo})
|
||||
|
||||
(defn- collectible-tag
|
||||
[{:keys [nft-url nft-name amount token-id]}]
|
||||
{:type :collectible
|
||||
:collectible nft-url
|
||||
:collectible-name (if (> amount 1)
|
||||
(str amount " " nft-name)
|
||||
nft-name)
|
||||
:collectible-number (when (not= token-id "0")
|
||||
token-id)})
|
||||
|
||||
(defn- token-tag
|
||||
[{:keys [token amount]}]
|
||||
{:type :token
|
||||
:token token
|
||||
:amount amount})
|
||||
|
||||
;; Activity type views
|
||||
(defn send-activity
|
||||
[{:keys [symbol-out amount-out token-id sender-tag recipient-tag network-name-out network-logo-out]
|
||||
:as activity-data}]
|
||||
(let [base-props (common-activity-props activity-data)
|
||||
first-tag (if token-id
|
||||
(collectible-tag activity-data)
|
||||
(token-tag {:token symbol-out :amount amount-out}))]
|
||||
[quo/wallet-activity
|
||||
(assoc base-props
|
||||
:first-tag first-tag
|
||||
:second-tag-prefix :t/from
|
||||
:second-tag sender-tag
|
||||
:third-tag-prefix :t/to
|
||||
:third-tag recipient-tag
|
||||
:fourth-tag-prefix :t/on
|
||||
:fourth-tag (network-tag {:network-name network-name-out
|
||||
:network-logo network-logo-out}))]))
|
||||
|
||||
(defn bridge-activity
|
||||
[{:keys [symbol-out amount-out network-name-out network-logo-out network-name-in network-logo-in
|
||||
sender-tag]
|
||||
:as activity-data}]
|
||||
[quo/wallet-activity
|
||||
(assoc (common-activity-props activity-data)
|
||||
:first-tag (token-tag {:token symbol-out :amount amount-out})
|
||||
:second-tag-prefix :t/from
|
||||
:second-tag (network-tag {:network-name network-name-out
|
||||
:network-logo network-logo-out})
|
||||
:third-tag-prefix :t/to
|
||||
:third-tag (network-tag {:network-name network-name-in
|
||||
:network-logo network-logo-in})
|
||||
:fourth-tag-prefix :t/in
|
||||
:fourth-tag sender-tag)])
|
||||
|
||||
(defn swap-activity
|
||||
[{:keys [symbol-out amount-out symbol-in amount-in sender-tag network-name-out network-logo-out]
|
||||
:as activity-data}]
|
||||
[quo/wallet-activity
|
||||
(assoc (common-activity-props activity-data)
|
||||
:first-tag (token-tag {:token symbol-out :amount amount-out})
|
||||
:second-tag-prefix :t/to
|
||||
:second-tag (token-tag {:token symbol-in :amount amount-in})
|
||||
:third-tag-prefix :t/in
|
||||
:third-tag sender-tag
|
||||
:fourth-tag-prefix :t/on
|
||||
:fourth-tag (network-tag {:network-name network-name-out
|
||||
:network-logo network-logo-out}))])
|
||||
|
||||
(defn approval-activity
|
||||
[{:keys [symbol-out amount-out sender-tag spender-tag network-name-out network-logo-out]
|
||||
:as activity-data}]
|
||||
[quo/wallet-activity
|
||||
(assoc (common-activity-props activity-data)
|
||||
:first-tag (token-tag {:token symbol-out :amount amount-out})
|
||||
:second-tag-prefix :t/in
|
||||
:second-tag sender-tag
|
||||
:third-tag-prefix :t/for
|
||||
:third-tag spender-tag
|
||||
:fourth-tag-prefix :t/on
|
||||
:fourth-tag (network-tag {:network-name network-name-out
|
||||
:network-logo network-logo-out}))])
|
||||
@@ -1,6 +1,5 @@
|
||||
(ns status-im.contexts.wallet.common.activity-tab.constants)
|
||||
|
||||
|
||||
(def ^:const wallet-activity-error-code-success 1)
|
||||
(def ^:const wallet-activity-error-code-task-canceled 2)
|
||||
(def ^:const wallet-activity-error-code-failed 3)
|
||||
@@ -12,6 +11,7 @@
|
||||
(def ^:const wallet-activity-type-bridge 4)
|
||||
(def ^:const wallet-activity-type-contract-deployment 5)
|
||||
(def ^:const wallet-activity-type-mint 6)
|
||||
(def ^:const wallet-activity-type-approval 7)
|
||||
|
||||
(def ^:const wallet-activity-status-failed 0)
|
||||
(def ^:const wallet-activity-status-pending 1)
|
||||
@@ -62,4 +62,3 @@
|
||||
wallet-activity-type-buy :t/via
|
||||
wallet-activity-type-swap :t/via
|
||||
wallet-activity-type-bridge :t/in})
|
||||
|
||||
|
||||
@@ -1,70 +1,126 @@
|
||||
(ns status-im.contexts.wallet.common.activity-tab.events
|
||||
(:require [camel-snake-kebab.extras :as cske]
|
||||
[utils.collection :as collection]
|
||||
[utils.ethereum.chain :as chain]
|
||||
[utils.re-frame :as rf]
|
||||
[utils.transforms :as transforms]))
|
||||
|
||||
(defonce ^:private request-id-atom (atom 0))
|
||||
(def ^:const limit-per-request 20)
|
||||
|
||||
(defn- get-unique-request-id
|
||||
(defn- nested-merge
|
||||
[& maps]
|
||||
(apply merge-with merge maps))
|
||||
|
||||
(defn- create-default-filters
|
||||
[]
|
||||
(swap! request-id-atom inc)
|
||||
@request-id-atom)
|
||||
{:period {:startTimestamp 0
|
||||
:endTimestamp 0}
|
||||
:types []
|
||||
:statuses []
|
||||
:counterpartyAddresses []
|
||||
:assets []
|
||||
:collectibles []
|
||||
:filterOutAssets false
|
||||
:filterOutCollectibles false})
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/store-session-id-for-activity-filter-session
|
||||
(fn [{:keys [db]} [request-id]]
|
||||
{:db (assoc-in db [:wallet :ui :activity-tab :request :request-id] request-id)}))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/fetch-activities-for-current-account
|
||||
(fn [{:keys [db]}]
|
||||
(let [address (-> db :wallet :current-viewing-account-address)
|
||||
chain-ids (chain/chain-ids db)
|
||||
request-id (get-unique-request-id)
|
||||
filters {:period {:startTimestamp 0
|
||||
:endTimestamp 0}
|
||||
:types []
|
||||
:statuses []
|
||||
:counterpartyAddresses []
|
||||
:assets []
|
||||
:collectibles []
|
||||
:filterOutAssets false
|
||||
:filterOutCollectibles false}
|
||||
offset 0
|
||||
limit 50
|
||||
request-params [request-id [address] chain-ids filters offset limit]]
|
||||
{:db (assoc-in db [:wallet :ui :activity-tab :request request-id] address)
|
||||
(let [address (get-in db [:wallet :current-viewing-account-address])
|
||||
chain-ids (chain/chain-ids db)
|
||||
params [[address] chain-ids (create-default-filters) limit-per-request]]
|
||||
{:db (-> db
|
||||
(update-in [:wallet :activities] dissoc address)
|
||||
(update-in [:wallet :ui :activity-tab :request] dissoc :request-id)
|
||||
(update-in [:wallet :ui :activity-tab :request]
|
||||
assoc
|
||||
:address address
|
||||
:loading? true
|
||||
:initial-request? true))
|
||||
:fx [[:json-rpc/call
|
||||
[{;; This method is deprecated and will be replaced by
|
||||
;; "wallet_startActivityFilterSession"
|
||||
;; https://github.com/status-im/status-mobile/issues/19864
|
||||
:method "wallet_filterActivityAsync"
|
||||
:params request-params
|
||||
:on-error [:wallet/log-rpc-error
|
||||
{:event :wallet/fetch-activities-for-current-account
|
||||
:params request-params}]}]]]})))
|
||||
[{:method "wallet_startActivityFilterSessionV2"
|
||||
:params params
|
||||
:on-success [:wallet/store-session-id-for-activity-filter-session]
|
||||
:on-error [:wallet/log-rpc-error
|
||||
{:event :wallet/fetch-activities-for-current-account
|
||||
:params params}]}]]]})))
|
||||
|
||||
(def ^:private activity-transaction-id (comp hash :transaction))
|
||||
(rf/reg-event-fx
|
||||
:wallet/stop-activity-filter-session
|
||||
(fn [{:keys [db]}]
|
||||
(when-let [session-id (get-in db [:wallet :ui :activity-tab :request :request-id])]
|
||||
{:db (update-in db [:wallet :ui :activity-tab] dissoc :request)
|
||||
:fx [[:json-rpc/call
|
||||
[{:method "wallet_stopActivityFilterSession"
|
||||
:params [session-id]
|
||||
:on-error [:wallet/log-rpc-error
|
||||
{:event :wallet/stop-activity-filter-session
|
||||
:params [session-id]}]}]]]})))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/get-more-for-activities-filter-session
|
||||
(fn [{:keys [db]}]
|
||||
(let [session-id (get-in db [:wallet :ui :activity-tab :request :request-id])
|
||||
has-more? (get-in db [:wallet :ui :activity-tab :request :has-more?])
|
||||
params [session-id limit-per-request]]
|
||||
(when (and session-id has-more?)
|
||||
{:fx [[:json-rpc/call
|
||||
[{:method "wallet_getMoreForActivityFilterSession"
|
||||
:params params
|
||||
:on-error [:wallet/log-rpc-error
|
||||
{:event :wallet/get-more-for-activities-filter-session
|
||||
:params params}]}]]]}))))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/reset-activities-filter-session
|
||||
(fn [{:keys [db]}]
|
||||
(when-let [session-id (get-in db [:wallet :ui :activity-tab :request :request-id])]
|
||||
{:db (assoc-in db [:wallet :ui :activity-tab :request :initial-request?] true)
|
||||
:fx [[:json-rpc/call
|
||||
[{:method "wallet_resetActivityFilterSession"
|
||||
:params [session-id limit-per-request]
|
||||
:on-error [:wallet/log-rpc-error
|
||||
{:event :wallet/reset-activities-filter-session
|
||||
:params [session-id limit-per-request]}]}]]]})))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/activity-filtering-for-current-account-done
|
||||
(fn [{:keys [db]} [{:keys [message requestId]}]]
|
||||
(let [address (get-in db [:wallet :ui :activity-tab :request requestId])
|
||||
activities (->> message
|
||||
(transforms/json->clj)
|
||||
(:activities)
|
||||
(cske/transform-keys transforms/->kebab-case-keyword))
|
||||
activities-indexed (zipmap (map activity-transaction-id activities)
|
||||
activities)]
|
||||
{:db (assoc-in db [:wallet :activities address] activities-indexed)})))
|
||||
|
||||
(def ^:private nested-merge (partial merge-with merge))
|
||||
(fn [{:keys [db]} [{:keys [message]}]]
|
||||
(let [{:keys [address initial-request?]} (get-in db [:wallet :ui :activity-tab :request])
|
||||
{:keys [activities offset hasMore]} (transforms/json->clj message)
|
||||
new-activities (->> activities
|
||||
(cske/transform-keys transforms/->kebab-case-keyword)
|
||||
(collection/index-by :key))
|
||||
existing-activities (get-in db [:wallet :activities address])
|
||||
updated-activities (if initial-request?
|
||||
new-activities
|
||||
(nested-merge existing-activities new-activities))]
|
||||
{:db (-> db
|
||||
(assoc-in [:wallet :activities address] updated-activities)
|
||||
(assoc-in [:wallet :ui :activity-tab :request :offset] offset)
|
||||
(assoc-in [:wallet :ui :activity-tab :request :has-more?] hasMore)
|
||||
(assoc-in [:wallet :ui :activity-tab :request :loading?] false)
|
||||
(assoc-in [:wallet :ui :activity-tab :request :initial-request?] false))})))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/activities-filtering-entries-updated
|
||||
(fn [{:keys [db]} [{:keys [message requestId]}]]
|
||||
(let [address (get-in db [:wallet :ui :activity-tab :request requestId])
|
||||
activities (->> message
|
||||
(transforms/json->clj)
|
||||
(cske/transform-keys transforms/->kebab-case-keyword))
|
||||
activities-indexed (zipmap (map activity-transaction-id activities)
|
||||
activities)]
|
||||
{:db (-> db
|
||||
(update-in [:wallet :ui :activity-tab :request] dissoc requestId)
|
||||
(update-in [:wallet :activities address] nested-merge activities-indexed))})))
|
||||
(when (= requestId (get-in db [:wallet :ui :activity-tab :request :request-id]))
|
||||
(let [address (get-in db [:wallet :ui :activity-tab :request :address])
|
||||
updated-activities (->> message
|
||||
transforms/json->clj
|
||||
(cske/transform-keys transforms/->kebab-case-keyword)
|
||||
(collection/index-by :key))]
|
||||
{:db (update-in db [:wallet :activities address] nested-merge updated-activities)}))))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/activities-session-updated
|
||||
(fn [_ [{:keys [message]}]]
|
||||
(let [{:keys [hasNewOnTop]} (transforms/json->clj message)]
|
||||
(when hasNewOnTop
|
||||
{:fx [[:dispatch [:wallet/reset-activities-filter-session]]]}))))
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
(ns status-im.contexts.wallet.common.activity-tab.options.view
|
||||
(:require [quo.core :as quo]
|
||||
[react-native.clipboard :as clipboard]
|
||||
[react-native.core :as rn]
|
||||
[status-im.contexts.wallet.common.utils.external-links :as external-links]
|
||||
[status-im.contexts.wallet.common.utils.networks :as network-utils]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn view
|
||||
[{:keys [chain-id]
|
||||
tx-hash :hash}]
|
||||
(let [{:keys [view-on-block-explorer-label
|
||||
link-to-block-explorer-label]} (network-utils/get-network-details chain-id)
|
||||
tx-details-link-on-block-explorer (external-links/get-link-to-tx-details chain-id tx-hash)
|
||||
open-tx-on-block-explorer (rn/use-callback
|
||||
#(rf/dispatch [:browser.ui/open-url
|
||||
tx-details-link-on-block-explorer])
|
||||
[tx-details-link-on-block-explorer])
|
||||
copy-tx-hash-to-clipboard (rn/use-callback
|
||||
(fn []
|
||||
(clipboard/set-string tx-hash)
|
||||
(rf/dispatch
|
||||
[:toasts/upsert
|
||||
{:type :positive
|
||||
:text
|
||||
(i18n/label
|
||||
:t/transaction-hash-copied-to-clipboard)}]))
|
||||
[tx-hash])
|
||||
share-link-to-block-explorer (rn/use-callback
|
||||
#(rf/dispatch [:open-share
|
||||
{:options
|
||||
{:message
|
||||
tx-details-link-on-block-explorer}}])
|
||||
[tx-details-link-on-block-explorer])]
|
||||
[quo/action-drawer
|
||||
[[{:icon :i/link
|
||||
:accessibility-label :view-on-block-explorer
|
||||
:on-press open-tx-on-block-explorer
|
||||
:label (i18n/label view-on-block-explorer-label)
|
||||
:right-icon :i/external}]
|
||||
[{:icon :i/copy
|
||||
:accessibility-label :copy-transaction-hash
|
||||
:label (i18n/label :t/copy-transaction-hash)
|
||||
:on-press copy-tx-hash-to-clipboard}]
|
||||
[{:icon :i/share
|
||||
:accessibility-label :share-link-to-block-explorer
|
||||
:label (i18n/label link-to-block-explorer-label)
|
||||
:on-press share-link-to-block-explorer}]]]))
|
||||
@@ -1,157 +1,49 @@
|
||||
(ns status-im.contexts.wallet.common.activity-tab.view
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[quo.core :as quo]
|
||||
[quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[status-im.common.resources :as resources]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.shell.constants :as shell.constants]
|
||||
[status-im.contexts.wallet.common.activity-tab.activity-types.view :as activity-type]
|
||||
[status-im.contexts.wallet.common.empty-tab.view :as empty-tab]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn send-and-receive-activity
|
||||
[{:keys [transaction relative-date status sender recipient token amount network-name
|
||||
network-logo token-id nft-url nft-name]}]
|
||||
(if token-id
|
||||
[quo/wallet-activity
|
||||
{:transaction transaction
|
||||
:timestamp relative-date
|
||||
:status status
|
||||
:counter 1
|
||||
:first-tag {:size 24
|
||||
:type :collectible
|
||||
:collectible nft-url
|
||||
:collectible-name (if (> amount 1)
|
||||
(str amount " " nft-name)
|
||||
nft-name)
|
||||
:collectible-number (when (not= token-id "0")
|
||||
token-id)}
|
||||
:second-tag-prefix :t/from
|
||||
:second-tag {:type :address :address sender}
|
||||
:third-tag-prefix :t/to
|
||||
:third-tag {:type :address :address recipient}
|
||||
:fourth-tag-prefix :t/via
|
||||
:fourth-tag {:size 24
|
||||
:type :network
|
||||
:network-name network-name
|
||||
:network-logo network-logo}
|
||||
:blur? false}]
|
||||
[quo/wallet-activity
|
||||
{:transaction transaction
|
||||
:timestamp relative-date
|
||||
:status status
|
||||
:counter 1
|
||||
:first-tag {:size 24
|
||||
:type :token
|
||||
:token token
|
||||
:amount amount}
|
||||
:second-tag-prefix :t/from
|
||||
:second-tag {:type :address :address sender}
|
||||
:third-tag-prefix :t/to
|
||||
:third-tag {:type :address :address recipient}
|
||||
:fourth-tag-prefix :t/via
|
||||
:fourth-tag {:size 24
|
||||
:type :network
|
||||
:network-name network-name
|
||||
:network-logo network-logo}
|
||||
:blur? false}]))
|
||||
|
||||
;; WIP to add the mint activity.
|
||||
;(defn mint-activity
|
||||
; [{:keys [transaction relative-date status recipient network-name
|
||||
; network-logo nft-name nft-url token-id]}]
|
||||
; [quo/wallet-activity
|
||||
; {:transaction transaction
|
||||
; :timestamp relative-date
|
||||
; :status status
|
||||
; :counter 1
|
||||
; :first-tag {:size 24
|
||||
; :type :collectible
|
||||
; :collectible nft-url
|
||||
; :collectible-name nft-name
|
||||
; :collectible-number token-id}
|
||||
; :second-tag-prefix :t/at
|
||||
; :second-tag {:type :address :address recipient}
|
||||
; :third-tag-prefix :t/to
|
||||
; :third-tag {:type :address :address recipient}
|
||||
; :fourth-tag-prefix :t/via
|
||||
; :fourth-tag {:size 24
|
||||
; :type :network
|
||||
; :network-name network-name
|
||||
; :network-logo network-logo}
|
||||
; :blur? false}])
|
||||
|
||||
(defn- section-header
|
||||
[{:keys [title]}]
|
||||
[quo/divider-date title])
|
||||
|
||||
(defn activity-item
|
||||
[{:keys [transaction] :as activity}]
|
||||
(case transaction
|
||||
(:send :receive) [send-and-receive-activity activity]
|
||||
;; WIP to add the mint activity.
|
||||
;; :mint [mint-activity activity]
|
||||
(defn- activity-item
|
||||
[{:keys [tx-type] :as activity}]
|
||||
(case tx-type
|
||||
:send [activity-type/send-activity activity]
|
||||
:bridge [activity-type/bridge-activity activity]
|
||||
:swap [activity-type/swap-activity activity]
|
||||
:approval [activity-type/approval-activity activity]
|
||||
nil))
|
||||
|
||||
(defn- pressable-text
|
||||
[{:keys [on-press text]}]
|
||||
[rn/text
|
||||
{:style {:text-decoration-line :underline}
|
||||
:on-press on-press}
|
||||
text])
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
address (rf/sub [:wallet/current-viewing-account-address])
|
||||
activity-list (rf/sub [:wallet/activities-for-current-viewing-account])
|
||||
open-eth-chain-explorer (rn/use-callback
|
||||
#(rf/dispatch [:wallet/navigate-to-chain-explorer
|
||||
{:address address
|
||||
:network constants/mainnet-network-name}])
|
||||
[address])
|
||||
open-oeth-chain-explorer (rn/use-callback
|
||||
#(rf/dispatch [:wallet/navigate-to-chain-explorer
|
||||
{:address address
|
||||
:network constants/optimism-network-name}])
|
||||
[address])
|
||||
open-arb-chain-explorer (rn/use-callback
|
||||
#(rf/dispatch [:wallet/navigate-to-chain-explorer
|
||||
{:address address
|
||||
:network constants/arbitrum-network-name}])
|
||||
[address])]
|
||||
[:<>
|
||||
[quo/information-box
|
||||
{:type :informative
|
||||
:icon :i/info
|
||||
:closable? false
|
||||
:style {:margin-horizontal 20 :margin-vertical 8}}
|
||||
[:<>
|
||||
(str (i18n/label :t/wallet-activity-beta-message) " ")
|
||||
[pressable-text
|
||||
{:on-press open-eth-chain-explorer
|
||||
:text (i18n/label :t/etherscan)}]
|
||||
", "
|
||||
[pressable-text
|
||||
{:on-press open-oeth-chain-explorer
|
||||
:text (i18n/label :t/op-explorer)}]
|
||||
(str ", " (string/lower-case (i18n/label :t/or)) " ")
|
||||
[pressable-text
|
||||
{:on-press open-arb-chain-explorer
|
||||
:text (i18n/label :t/arbiscan)}]
|
||||
"."]]
|
||||
(if (empty? activity-list)
|
||||
[empty-tab/view
|
||||
{:title (i18n/label :t/no-activity)
|
||||
:description (i18n/label :t/empty-tab-description)
|
||||
:image (resources/get-themed-image :no-activity theme)}]
|
||||
[rn/section-list
|
||||
{:sections activity-list
|
||||
:sticky-section-headers-enabled false
|
||||
:style {:flex 1
|
||||
(let [theme (quo.theme/use-theme)
|
||||
loading? (rf/sub [:wallet/activity-tab-loading?])
|
||||
activity-list (rf/sub [:wallet/activities-for-current-viewing-account])
|
||||
on-end-reached (rn/use-callback
|
||||
#(rf/dispatch
|
||||
[:wallet/get-more-for-activities-filter-session]))]
|
||||
(if (and (and (some? loading?) (false? loading?)) (empty? activity-list))
|
||||
[empty-tab/view
|
||||
{:title (i18n/label :t/no-activity)
|
||||
:description (i18n/label :t/empty-tab-description)
|
||||
:image (resources/get-themed-image :no-activity theme)}]
|
||||
[rn/section-list
|
||||
{:sections activity-list
|
||||
:sticky-section-headers-enabled false
|
||||
:style {:flex 1
|
||||
:padding-horizontal 8}
|
||||
:content-container-style {:padding-bottom shell.constants/floating-shell-button-height}
|
||||
:render-fn activity-item
|
||||
:render-section-header-fn section-header}])]))
|
||||
:content-container-style {:padding-bottom shell.constants/floating-shell-button-height}
|
||||
:shows-vertical-scroll-indicator false
|
||||
:render-fn activity-item
|
||||
:render-section-header-fn section-header
|
||||
:on-end-reached on-end-reached
|
||||
:on-end-reached-threshold 2}])))
|
||||
|
||||
@@ -82,13 +82,13 @@
|
||||
token-owners (rf/sub [:wallet/operable-addresses-with-token-symbol token-symbol])
|
||||
testnet-mode? (rf/sub [:profile/test-networks-enabled?])
|
||||
account-owns-token? (rf/sub [:wallet/current-account-owns-token token-symbol])
|
||||
network-details (rf/sub [:wallet/network-details])
|
||||
receive-token-symbol (if (= token-symbol "SNT") "ETH" "SNT")
|
||||
token-owned? (if selected-account account-owns-token? (seq token-owners))
|
||||
asset-to-receive (rf/sub [:wallet/token-by-symbol receive-token-symbol])
|
||||
params (cond-> {:start-flow? true
|
||||
:owners token-owners
|
||||
:testnet-mode? testnet-mode?
|
||||
:asset-to-receive asset-to-receive}
|
||||
params (cond-> {:start-flow? true
|
||||
:owners token-owners
|
||||
:testnet-mode? testnet-mode?}
|
||||
selected-account
|
||||
(assoc :token token-data
|
||||
:stack-id :screen/wallet.accounts
|
||||
@@ -108,9 +108,13 @@
|
||||
(action-send params entry-point))
|
||||
(action-receive selected-account)
|
||||
(when token-owned?
|
||||
(action-swap params))
|
||||
(action-swap (assoc params
|
||||
:asset-to-receive
|
||||
asset-to-receive)))
|
||||
(when token-owned?
|
||||
(action-bridge (assoc params
|
||||
:network-details
|
||||
network-details
|
||||
:bridge-disabled?
|
||||
(send-utils/bridge-disabled? token-symbol))))]))]]))
|
||||
|
||||
|
||||
@@ -178,20 +178,6 @@
|
||||
(let [price (get-market-value currency token prices-per-token)]
|
||||
(money/crypto->fiat balance price)))
|
||||
|
||||
(defn formatted-token-fiat-value
|
||||
"Converts a token balance into its equivalent fiat value, formatted with a currency symbol.
|
||||
If the fiat value is below $0.01, it returns a <$0.01 string"
|
||||
[{:keys [currency currency-symbol balance token prices-per-token]}]
|
||||
(let [price (or (get-market-value currency token prices-per-token) 0)
|
||||
price-zero? (zero? price)
|
||||
balance (or balance 0)
|
||||
balance-positive? (pos? balance)
|
||||
fiat-value (money/crypto->fiat balance price)
|
||||
fiat-value-zero? (money/equal-to fiat-value (money/bignumber 0))]
|
||||
(if (and fiat-value-zero? (not price-zero?) balance-positive?)
|
||||
(number/small-number-threshold 2 currency-symbol)
|
||||
(str currency-symbol fiat-value))))
|
||||
|
||||
(defn sanitized-token-amount-to-display
|
||||
"Formats a token amount to a specified number of decimals.
|
||||
Returns a threshold value if the formatted amount is less than the minimum value represented by the decimals."
|
||||
@@ -279,6 +265,20 @@
|
||||
money/absolute-value
|
||||
(money/to-fixed 2)))
|
||||
|
||||
(defn formatted-token-fiat-value
|
||||
"Converts a token balance into its equivalent fiat value, formatted with a currency symbol.
|
||||
If the fiat value is below $0.01, it returns a <$0.01 string"
|
||||
[{:keys [currency currency-symbol balance token prices-per-token]}]
|
||||
(let [price (or (get-market-value currency token prices-per-token) 0)
|
||||
price-zero? (zero? price)
|
||||
balance (or balance 0)
|
||||
balance-positive? (pos? balance)
|
||||
fiat-value (money/crypto->fiat balance price)
|
||||
fiat-value-zero? (money/equal-to fiat-value (money/bignumber 0))]
|
||||
(if (and fiat-value-zero? (not price-zero?) balance-positive?)
|
||||
(number/small-number-threshold 2 currency-symbol)
|
||||
(fiat-formatted-for-ui currency-symbol fiat-value))))
|
||||
|
||||
(defn calculate-token-value
|
||||
"This function returns token values in the props of token-value (quo) component"
|
||||
[{:keys [token color currency currency-symbol prices-per-token market-values-per-token]}]
|
||||
|
||||
@@ -24,3 +24,30 @@
|
||||
config/optimism-sepolia-chain-explorer-link
|
||||
|
||||
:else config/mainnet-chain-explorer-link))
|
||||
|
||||
(defn get-base-url-for-tx-details-by-chain-id
|
||||
[chain-id]
|
||||
(condp = chain-id
|
||||
constants/ethereum-mainnet-chain-id
|
||||
config/mainnet-tx-details-base-link
|
||||
|
||||
constants/arbitrum-mainnet-chain-id
|
||||
config/arbitrum-mainnet-tx-details-base-link
|
||||
|
||||
constants/optimism-mainnet-chain-id
|
||||
config/optimism-mainnet-tx-details-base-link
|
||||
|
||||
constants/ethereum-sepolia-chain-id
|
||||
config/mainnet-sepolia-tx-details-base-link
|
||||
|
||||
constants/arbitrum-sepolia-chain-id
|
||||
config/arbitrum-sepolia-tx-details-base-link
|
||||
|
||||
constants/optimism-sepolia-chain-id
|
||||
config/optimism-sepolia-tx-details-base-link
|
||||
|
||||
config/mainnet-tx-details-base-link))
|
||||
|
||||
(defn get-link-to-tx-details
|
||||
[chain-id tx-hash]
|
||||
(str (get-base-url-for-tx-details-by-chain-id chain-id) "/" tx-hash))
|
||||
|
||||
@@ -139,25 +139,31 @@
|
||||
[(butlast $) (last $)]))
|
||||
|
||||
(def mainnet-network-details
|
||||
{:source (resources/get-network constants/mainnet-network-name)
|
||||
:short-name constants/mainnet-short-name
|
||||
:full-name constants/mainnet-full-name
|
||||
:network-name constants/mainnet-network-name
|
||||
:abbreviated-name constants/mainnet-abbreviated-name})
|
||||
{:source (resources/get-network constants/mainnet-network-name)
|
||||
:short-name constants/mainnet-short-name
|
||||
:full-name constants/mainnet-full-name
|
||||
:network-name constants/mainnet-network-name
|
||||
:abbreviated-name constants/mainnet-abbreviated-name
|
||||
:view-on-block-explorer-label :t/view-on-eth
|
||||
:link-to-block-explorer-label :t/share-link-to-eth})
|
||||
|
||||
(def arbitrum-network-details
|
||||
{:source (resources/get-network constants/arbitrum-network-name)
|
||||
:short-name constants/arbitrum-short-name
|
||||
:full-name constants/arbitrum-full-name
|
||||
:network-name constants/arbitrum-network-name
|
||||
:abbreviated-name constants/arbitrum-abbreviated-name})
|
||||
{:source (resources/get-network constants/arbitrum-network-name)
|
||||
:short-name constants/arbitrum-short-name
|
||||
:full-name constants/arbitrum-full-name
|
||||
:network-name constants/arbitrum-network-name
|
||||
:abbreviated-name constants/arbitrum-abbreviated-name
|
||||
:view-on-block-explorer-label :t/view-on-arb
|
||||
:link-to-block-explorer-label :t/share-link-to-arb})
|
||||
|
||||
(def optimism-network-details
|
||||
{:source (resources/get-network constants/optimism-network-name)
|
||||
:short-name constants/optimism-short-name
|
||||
:full-name constants/optimism-full-name
|
||||
:network-name constants/optimism-network-name
|
||||
:abbreviated-name constants/optimism-abbreviated-name})
|
||||
{:source (resources/get-network constants/optimism-network-name)
|
||||
:short-name constants/optimism-short-name
|
||||
:full-name constants/optimism-full-name
|
||||
:network-name constants/optimism-network-name
|
||||
:abbreviated-name constants/optimism-abbreviated-name
|
||||
:view-on-block-explorer-label :t/view-on-oeth
|
||||
:link-to-block-explorer-label :t/share-link-to-oeth})
|
||||
|
||||
(defn get-network-details
|
||||
[chain-id]
|
||||
|
||||
@@ -185,16 +185,16 @@
|
||||
:balance 0.5
|
||||
:token {:symbol "ETH"}
|
||||
:prices-per-token {:ETH {:usd 2000}}}]
|
||||
(is (= (utils/formatted-token-fiat-value default-params) "$1000"))
|
||||
(is (= (utils/formatted-token-fiat-value (assoc default-params :balance 0)) "$0"))
|
||||
(is (= (utils/formatted-token-fiat-value default-params) "$1000.00"))
|
||||
(is (= (utils/formatted-token-fiat-value (assoc default-params :balance 0)) "$0.00"))
|
||||
(is (= (utils/formatted-token-fiat-value (assoc default-params :balance 0.000001)) "<$0.01"))
|
||||
(is (= (utils/formatted-token-fiat-value (assoc default-params :balance nil)) "$0"))
|
||||
(is (= (utils/formatted-token-fiat-value (assoc default-params :balance nil)) "$0.00"))
|
||||
(is (= (utils/formatted-token-fiat-value
|
||||
(assoc default-params :balance 1 :prices-per-token {:ETH {:usd nil}}))
|
||||
"$0"))
|
||||
"$0.00"))
|
||||
(is (= (utils/formatted-token-fiat-value
|
||||
(assoc default-params :balance 1 :prices-per-token {:ETH {:usd 0}}))
|
||||
"$0")))))
|
||||
"$0.00")))))
|
||||
|
||||
(deftest sanitized-token-amount-to-display-test
|
||||
(testing "sanitized-token-amount-to-display function"
|
||||
|
||||
@@ -1,23 +1,11 @@
|
||||
(ns status-im.contexts.wallet.common.wizard.events
|
||||
(:require [status-im.contexts.wallet.bridge.flow-config :as wallet-bridge-flow]
|
||||
[status-im.contexts.wallet.send.flow-config :as wallet-send-flow]
|
||||
(:require [status-im.contexts.wallet.common.wizard.utils :as wizard-utils]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn- wizard-find-next-screen
|
||||
[db flow-id current-screen]
|
||||
(let [flow-config (case flow-id
|
||||
:wallet-send-flow wallet-send-flow/steps
|
||||
:wallet-bridge-flow wallet-bridge-flow/steps
|
||||
nil)]
|
||||
(first (filter (fn [{:keys [skip-step? screen-id]}]
|
||||
(and (not= screen-id current-screen)
|
||||
(not (and (fn? skip-step?) (skip-step? db)))))
|
||||
flow-config))))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/wizard-navigate-forward
|
||||
(fn [{:keys [db]} [{:keys [current-screen flow-id start-flow?]}]]
|
||||
(let [next-screen (wizard-find-next-screen db flow-id current-screen)]
|
||||
(let [next-screen (wizard-utils/wizard-find-next-screen db flow-id current-screen)]
|
||||
{:fx [[:dispatch
|
||||
(if start-flow?
|
||||
[:open-modal (:screen-id next-screen)]
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
(ns status-im.contexts.wallet.common.wizard.utils
|
||||
(:require [status-im.contexts.wallet.bridge.flow-config :as wallet-bridge-flow]
|
||||
[status-im.contexts.wallet.send.flow-config :as wallet-send-flow]))
|
||||
|
||||
(defn wizard-find-next-screen
|
||||
[db flow-id current-screen]
|
||||
(let [flow-config (case flow-id
|
||||
:wallet-send-flow wallet-send-flow/steps
|
||||
:wallet-bridge-flow wallet-bridge-flow/steps
|
||||
nil)]
|
||||
(first (filter (fn [{:keys [skip-step? screen-id]}]
|
||||
(and (not= screen-id current-screen)
|
||||
(not (and (fn? skip-step?) (skip-step? db)))))
|
||||
flow-config))))
|
||||
@@ -233,9 +233,12 @@
|
||||
|
||||
(defn new->old-route-path
|
||||
[new-path]
|
||||
(let [bonder-fees (-> new-path :tx-bonder-fees money/bignumber)
|
||||
token-fees (-> new-path :tx-token-fees money/bignumber)]
|
||||
{:from (:from-chain new-path)
|
||||
(let [to-bignumber (fn [k] (-> new-path k money/bignumber))]
|
||||
{:approval-fee (to-bignumber :approval-fee)
|
||||
:approval-l-1-fee (to-bignumber :approval-l-1-fee)
|
||||
:bonder-fees (to-bignumber :tx-bonder-fees)
|
||||
:token-fees (to-bignumber :tx-token-fees)
|
||||
:from (:from-chain new-path)
|
||||
:amount-in-locked (:amount-in-locked new-path)
|
||||
:amount-in (:amount-in new-path)
|
||||
:max-amount-in (:max-amount-in new-path)
|
||||
@@ -273,15 +276,9 @@
|
||||
:approval-contract-address (:approval-contract-address new-path)
|
||||
:approval-required (:approval-required new-path)
|
||||
:estimated-time (:estimated-time new-path)
|
||||
:approval-gas-fees (* (money/wei->ether (get-in new-path
|
||||
[:suggested-levels-for-max-fees-per-gas
|
||||
:medium]))
|
||||
(:approval-gas-amount new-path))
|
||||
:to (:to-chain new-path)
|
||||
:bonder-fees bonder-fees
|
||||
:approval-amount-required (:approval-amount-required new-path)
|
||||
;; :cost () ;; tbd not used on desktop
|
||||
:token-fees token-fees
|
||||
:gas-amount (:tx-gas-amount new-path)}))
|
||||
|
||||
(defn tokens-never-loaded?
|
||||
|
||||