mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-05-28 00:34:56 +00:00
Merge pull request #1999 from cake-tech/cyjan-fix-tests
fix tests not working in latest main
This commit is contained in:
commit
1f60c4e4a3
81 changed files with 1252 additions and 714 deletions
.github/workflows
cw_monero
cw_wownero
cw_zano
integration_test
components
robots
dashboard_menu_widget_robot.dartwallet_group_description_page_robot.dartwallet_keys_robot.dartwelcome_page_robot.dart
test_suites
lib
buy/moonpay
entities
src
screens
backup
contact
dashboard
exchange/widgets
nodes/widgets
send/widgets
settings
display_settings_page.dartmanage_nodes_page.dartother_settings_page.dartsecurity_backup_page.dart
widgets
support
wallet_keys
wallet_list
widgets
themes
view_model
res/values
strings_ar.arbstrings_bg.arbstrings_cs.arbstrings_de.arbstrings_en.arbstrings_es.arbstrings_fr.arbstrings_ha.arbstrings_hi.arbstrings_hr.arbstrings_hy.arbstrings_id.arbstrings_it.arbstrings_ja.arbstrings_ko.arbstrings_my.arbstrings_nl.arbstrings_pl.arbstrings_pt.arbstrings_ru.arbstrings_th.arbstrings_tl.arbstrings_tr.arbstrings_uk.arbstrings_ur.arbstrings_vi.arbstrings_yo.arbstrings_zh.arb
scripts
1
.github/workflows/pr_test_build_android.yml
vendored
1
.github/workflows/pr_test_build_android.yml
vendored
|
@ -158,6 +158,7 @@ jobs:
|
|||
echo "const tronTestWalletSeeds = '${{ secrets.TRON_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
|
||||
echo "const nanoTestWalletSeeds = '${{ secrets.NANO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
|
||||
echo "const wowneroTestWalletSeeds = '${{ secrets.WOWNERO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
|
||||
echo "const zanoTestWalletSeeds = '${{ secrets.ZANO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
|
||||
echo "const moneroTestWalletReceiveAddress = '${{ secrets.MONERO_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
|
||||
echo "const bitcoinTestWalletReceiveAddress = '${{ secrets.BITCOIN_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
|
||||
echo "const ethereumTestWalletReceiveAddress = '${{ secrets.ETHEREUM_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
|
||||
|
|
23
.github/workflows/pr_test_build_linux.yml
vendored
23
.github/workflows/pr_test_build_linux.yml
vendored
|
@ -154,6 +154,7 @@ jobs:
|
|||
echo "const tronTestWalletSeeds = '${{ secrets.TRON_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
|
||||
echo "const nanoTestWalletSeeds = '${{ secrets.NANO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
|
||||
echo "const wowneroTestWalletSeeds = '${{ secrets.WOWNERO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
|
||||
echo "const zanoTestWalletSeeds = '${{ secrets.ZANO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
|
||||
echo "const moneroTestWalletReceiveAddress = '${{ secrets.MONERO_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
|
||||
echo "const bitcoinTestWalletReceiveAddress = '${{ secrets.BITCOIN_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
|
||||
echo "const ethereumTestWalletReceiveAddress = '${{ secrets.ETHEREUM_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
|
||||
|
@ -240,7 +241,7 @@ jobs:
|
|||
name: cakewallet_linux
|
||||
|
||||
- name: Prepare virtual desktop
|
||||
if: ${{ contains(env.message, 'run tests') }}
|
||||
if: ${{ !contains(env.message, 'skip tests') }}
|
||||
run: |
|
||||
nohup Xvfb :99 -screen 0 720x1280x16 &
|
||||
echo DISPLAY=:99 | sudo tee -a $GITHUB_ENV
|
||||
|
@ -256,28 +257,28 @@ jobs:
|
|||
# isn't much in those wallets anyway, we still wouldn't like to leak it to anyone who is able to access github.
|
||||
|
||||
- name: Test [confirm_seeds_flow_test]
|
||||
if: ${{ contains(env.message, 'run tests') }}
|
||||
if: ${{ !contains(env.message, 'skip tests') }}
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
xmessage -timeout 30 "confirm_seeds_flow_test" &
|
||||
rm -rf ~/.local/share/com.example.cake_wallet/ ~/Documents/cake_wallet/ ~/cake_wallet
|
||||
exec timeout --signal=SIGKILL 900 flutter drive --driver=test_driver/integration_test.dart --target=integration_test/test_suites/confirm_seeds_flow_test.dart
|
||||
- name: Test [create_wallet_flow_test]
|
||||
if: ${{ contains(env.message, 'run tests') }}
|
||||
if: ${{ !contains(env.message, 'skip tests') }}
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
xmessage -timeout 30 "create_wallet_flow_test" &
|
||||
rm -rf ~/.local/share/com.example.cake_wallet/ ~/Documents/cake_wallet/ ~/cake_wallet
|
||||
exec timeout --signal=SIGKILL 900 flutter drive --driver=test_driver/integration_test.dart --target=integration_test/test_suites/create_wallet_flow_test.dart
|
||||
- name: Test [exchange_flow_test]
|
||||
if: ${{ contains(env.message, 'run tests') }}
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
xmessage -timeout 30 "exchange_flow_test" &
|
||||
rm -rf ~/.local/share/com.example.cake_wallet/ ~/Documents/cake_wallet/ ~/cake_wallet
|
||||
exec timeout --signal=SIGKILL 900 flutter drive --driver=test_driver/integration_test.dart --target=integration_test/test_suites/exchange_flow_test.dart
|
||||
# - name: Test [exchange_flow_test]
|
||||
# if: ${{ !contains(env.message, 'skip tests') }}
|
||||
# timeout-minutes: 20
|
||||
# run: |
|
||||
# xmessage -timeout 30 "exchange_flow_test" &
|
||||
# rm -rf ~/.local/share/com.example.cake_wallet/ ~/Documents/cake_wallet/ ~/cake_wallet
|
||||
# exec timeout --signal=SIGKILL 900 flutter drive --driver=test_driver/integration_test.dart --target=integration_test/test_suites/exchange_flow_test.dart
|
||||
- name: Test [restore_wallet_through_seeds_flow_test]
|
||||
if: ${{ contains(env.message, 'run tests') }}
|
||||
if: ${{ !contains(env.message, 'skip tests') }}
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
xmessage -timeout 30 "restore_wallet_through_seeds_flow_test" &
|
||||
|
|
|
@ -100,7 +100,7 @@ void restoreWalletFromSeedSync(
|
|||
required String passphrase,
|
||||
required String seed,
|
||||
int nettype = 0,
|
||||
int restoreHeight = 0}) async {
|
||||
int restoreHeight = 0}) {
|
||||
txhistory = null;
|
||||
final newWptr = monero.WalletManager_recoveryWallet(
|
||||
wmPtr,
|
||||
|
@ -404,7 +404,7 @@ void _restoreFromSeed(Map<String, dynamic> args) {
|
|||
final seed = args['seed'] as String;
|
||||
final restoreHeight = args['restoreHeight'] as int;
|
||||
|
||||
restoreWalletFromSeedSync(
|
||||
return restoreWalletFromSeedSync(
|
||||
path: path, password: password, passphrase: passphrase, seed: seed, restoreHeight: restoreHeight);
|
||||
}
|
||||
|
||||
|
@ -472,13 +472,13 @@ Future<void> createWallet(
|
|||
'nettype': nettype
|
||||
});
|
||||
|
||||
Future<void> restoreFromSeed(
|
||||
void restoreFromSeed(
|
||||
{required String path,
|
||||
required String password,
|
||||
required String passphrase,
|
||||
required String seed,
|
||||
int nettype = 0,
|
||||
int restoreHeight = 0}) async =>
|
||||
int restoreHeight = 0}) =>
|
||||
_restoreFromSeed({
|
||||
'path': path,
|
||||
'password': password,
|
||||
|
|
|
@ -292,14 +292,21 @@ class MoneroWalletService extends WalletService<
|
|||
Future<MoneroWallet> restoreFromSeed(
|
||||
MoneroRestoreWalletFromSeedCredentials credentials,
|
||||
{bool? isTestnet}) async {
|
||||
// Restore from Polyseed
|
||||
if (Polyseed.isValidSeed(credentials.mnemonic)) {
|
||||
return restoreFromPolyseed(credentials);
|
||||
if (credentials.mnemonic.split(" ").length == 16) {
|
||||
// Restore from Polyseed
|
||||
try {
|
||||
if (Polyseed.isValidSeed(credentials.mnemonic)) {
|
||||
return restoreFromPolyseed(credentials);
|
||||
}
|
||||
} catch (e) {
|
||||
printV("Polyseed restore failed: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
final path = await pathForWallet(name: credentials.name, type: getType());
|
||||
await monero_wallet_manager.restoreFromSeed(
|
||||
monero_wallet_manager.restoreFromSeed(
|
||||
path: path,
|
||||
password: credentials.password!,
|
||||
passphrase: credentials.passphrase,
|
||||
|
|
|
@ -511,8 +511,8 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
path: "impls/monero.dart"
|
||||
ref: "127c54599c612d7d3d226e4c016d5812e7a0966d"
|
||||
resolved-ref: "127c54599c612d7d3d226e4c016d5812e7a0966d"
|
||||
ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58"
|
||||
resolved-ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58"
|
||||
url: "https://github.com/mrcyjanek/monero_c"
|
||||
source: git
|
||||
version: "0.0.0"
|
||||
|
|
|
@ -25,7 +25,7 @@ dependencies:
|
|||
monero:
|
||||
git:
|
||||
url: https://github.com/mrcyjanek/monero_c
|
||||
ref: 127c54599c612d7d3d226e4c016d5812e7a0966d
|
||||
ref: 9d9b1f2f2373fc9a99c6556a93eea63fe343cf58
|
||||
path: impls/monero.dart
|
||||
mutex: ^3.1.0
|
||||
ledger_flutter_plus: ^1.4.1
|
||||
|
|
|
@ -471,8 +471,8 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
path: "impls/monero.dart"
|
||||
ref: "127c54599c612d7d3d226e4c016d5812e7a0966d"
|
||||
resolved-ref: "127c54599c612d7d3d226e4c016d5812e7a0966d"
|
||||
ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58"
|
||||
resolved-ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58"
|
||||
url: "https://github.com/mrcyjanek/monero_c"
|
||||
source: git
|
||||
version: "0.0.0"
|
||||
|
|
|
@ -25,7 +25,7 @@ dependencies:
|
|||
monero:
|
||||
git:
|
||||
url: https://github.com/mrcyjanek/monero_c
|
||||
ref: 127c54599c612d7d3d226e4c016d5812e7a0966d # monero_c hash
|
||||
ref: 9d9b1f2f2373fc9a99c6556a93eea63fe343cf58 # monero_c hash
|
||||
path: impls/monero.dart
|
||||
mutex: ^3.1.0
|
||||
|
||||
|
|
|
@ -476,8 +476,8 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
path: "impls/monero.dart"
|
||||
ref: "127c54599c612d7d3d226e4c016d5812e7a0966d"
|
||||
resolved-ref: "127c54599c612d7d3d226e4c016d5812e7a0966d"
|
||||
ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58"
|
||||
resolved-ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58"
|
||||
url: "https://github.com/mrcyjanek/monero_c"
|
||||
source: git
|
||||
version: "0.0.0"
|
||||
|
|
|
@ -26,7 +26,7 @@ dependencies:
|
|||
monero:
|
||||
git:
|
||||
url: https://github.com/mrcyjanek/monero_c
|
||||
ref: 127c54599c612d7d3d226e4c016d5812e7a0966d # monero_c hash
|
||||
ref: 9d9b1f2f2373fc9a99c6556a93eea63fe343cf58 # monero_c hash
|
||||
path: impls/monero.dart
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
|
@ -116,7 +116,6 @@ class CommonTestFlows {
|
|||
//* ========== Handles switching to wallet list or menu from dashboard ===============
|
||||
Future<void> switchToWalletMenuFromDashboardPage() async {
|
||||
_tester.printToConsole('Switching to Wallet Menu');
|
||||
await _dashboardPageRobot.openDrawerMenu();
|
||||
|
||||
await _dashboardPageRobot.dashboardMenuWidgetRobot.navigateToWalletMenu();
|
||||
}
|
||||
|
@ -211,6 +210,8 @@ class CommonTestFlows {
|
|||
await _welcomePageRobot.navigateToCreateNewWalletPage();
|
||||
|
||||
await _selectWalletTypeForWallet(walletTypeToCreate);
|
||||
|
||||
await _welcomePageRobot.tapNewSingleSeed();
|
||||
}
|
||||
|
||||
Future<void> _welcomeToRestoreFromSeedsOrKeysPath(
|
||||
|
@ -351,8 +352,12 @@ class CommonTestFlows {
|
|||
return secrets.nanoTestWalletSeeds;
|
||||
case WalletType.wownero:
|
||||
return secrets.wowneroTestWalletSeeds;
|
||||
default:
|
||||
return '';
|
||||
case WalletType.zano:
|
||||
return secrets.zanoTestWalletSeeds;
|
||||
case WalletType.none:
|
||||
case WalletType.haven:
|
||||
case WalletType.banano:
|
||||
throw Exception("Unable to get seeds for ${walletType}");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ class DashboardMenuWidgetRobot {
|
|||
}
|
||||
|
||||
Future<void> navigateToWalletMenu() async {
|
||||
await commonTestCases.tapItemByKey('dashboard_page_menu_widget_wallet_menu_button_key');
|
||||
await commonTestCases.tapItemByKey('dashboard_page_Wallets_action_button_key');
|
||||
await commonTestCases.defaultSleepTime();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/src/screens/new_wallet/wallet_group_description_page.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import '../components/common_test_cases.dart';
|
||||
|
@ -20,9 +21,11 @@ class WalletGroupDescriptionPageRobot {
|
|||
}
|
||||
|
||||
Future<void> navigateToCreateNewSeedPage() async {
|
||||
await commonTestCases.tapItemByKey(
|
||||
'wallet_group_description_page_create_new_seed_button_key',
|
||||
);
|
||||
if (await(find.byKey(ValueKey('wallet_group_description_page_create_new_seed_button_key'))).hasFound) {
|
||||
await commonTestCases.tapItemByKey(
|
||||
'wallet_group_description_page_create_new_seed_button_key',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> navigateToChooseWalletGroup() async {
|
||||
|
|
|
@ -71,7 +71,10 @@ class WalletKeysAndSeedPageRobot {
|
|||
if (walletType == WalletType.bitcoin ||
|
||||
walletType == WalletType.litecoin ||
|
||||
walletType == WalletType.bitcoinCash) {
|
||||
commonTestCases.hasText(appStore.wallet!.seed!);
|
||||
final seedWords = appStore.wallet!.seed!.split(" ");
|
||||
for (var seedWord in seedWords) {
|
||||
commonTestCases.hasTextAtLestOnce(seedWord);
|
||||
}
|
||||
tester.printToConsole('$walletName wallet has seeds properly displayed');
|
||||
}
|
||||
|
||||
|
@ -79,10 +82,14 @@ class WalletKeysAndSeedPageRobot {
|
|||
walletType == WalletType.solana ||
|
||||
walletType == WalletType.tron) {
|
||||
if (hasSeed) {
|
||||
commonTestCases.hasText(appStore.wallet!.seed!);
|
||||
final seedWords = appStore.wallet!.seed!.split(" ");
|
||||
for (var seedWord in seedWords) {
|
||||
commonTestCases.hasTextAtLestOnce(seedWord);
|
||||
}
|
||||
tester.printToConsole('$walletName wallet has seeds properly displayed');
|
||||
}
|
||||
if (hasPrivateKey) {
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_keys');
|
||||
commonTestCases.hasText(appStore.wallet!.privateKey!);
|
||||
tester.printToConsole('$walletName wallet has private key properly displayed');
|
||||
}
|
||||
|
@ -90,14 +97,19 @@ class WalletKeysAndSeedPageRobot {
|
|||
|
||||
if (walletType == WalletType.nano || walletType == WalletType.banano) {
|
||||
if (hasSeed) {
|
||||
commonTestCases.hasText(appStore.wallet!.seed!);
|
||||
final seedWords = appStore.wallet!.seed!.split(" ");
|
||||
for (var seedWord in seedWords) {
|
||||
commonTestCases.hasTextAtLestOnce(seedWord);
|
||||
}
|
||||
tester.printToConsole('$walletName wallet has seeds properly displayed');
|
||||
}
|
||||
if (hasHexSeed) {
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_keys');
|
||||
commonTestCases.hasText(appStore.wallet!.hexSeed!);
|
||||
tester.printToConsole('$walletName wallet has hexSeed properly displayed');
|
||||
}
|
||||
if (hasPrivateKey) {
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_keys');
|
||||
commonTestCases.hasText(appStore.wallet!.privateKey!);
|
||||
tester.printToConsole('$walletName wallet has private key properly displayed');
|
||||
}
|
||||
|
@ -130,35 +142,39 @@ class WalletKeysAndSeedPageRobot {
|
|||
final hasSeedLegacy = Polyseed.isValidSeed(seed);
|
||||
|
||||
if (hasPublicSpendKey) {
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_keys');
|
||||
commonTestCases.hasText(keys.publicSpendKey);
|
||||
tester.printToConsole('$walletName wallet has public spend key properly displayed');
|
||||
}
|
||||
if (hasPrivateSpendKey) {
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_keys');
|
||||
commonTestCases.hasText(keys.privateSpendKey);
|
||||
tester.printToConsole('$walletName wallet has private spend key properly displayed');
|
||||
}
|
||||
if (hasPublicViewKey) {
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_keys');
|
||||
commonTestCases.hasText(keys.publicViewKey);
|
||||
tester.printToConsole('$walletName wallet has public view key properly displayed');
|
||||
}
|
||||
if (hasPrivateViewKey) {
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_keys');
|
||||
commonTestCases.hasText(keys.privateViewKey);
|
||||
tester.printToConsole('$walletName wallet has private view key properly displayed');
|
||||
}
|
||||
if (hasSeeds) {
|
||||
await commonTestCases.dragUntilVisible(
|
||||
'${walletName}_wallet_seed_item_key',
|
||||
'wallet_keys_page_credentials_list_view_key',
|
||||
);
|
||||
commonTestCases.hasText(seed);
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_seed');
|
||||
final seedWords = seed.split(" ");
|
||||
for (var seedWord in seedWords) {
|
||||
commonTestCases.hasTextAtLestOnce(seedWord);
|
||||
}
|
||||
tester.printToConsole('$walletName wallet has seeds properly displayed');
|
||||
}
|
||||
if (hasSeedLegacy) {
|
||||
await commonTestCases.dragUntilVisible(
|
||||
'${walletName}_wallet_seed_legacy_item_key',
|
||||
'wallet_keys_page_credentials_list_view_key',
|
||||
);
|
||||
commonTestCases.hasText(legacySeed);
|
||||
await commonTestCases.tapItemByKey('wallet_keys_page_seed_legacy');
|
||||
final seedWords = legacySeed.split(" ");
|
||||
for (var seedWord in seedWords) {
|
||||
commonTestCases.hasTextAtLestOnce(seedWord);
|
||||
}
|
||||
tester.printToConsole('$walletName wallet has legacy seeds properly displayed');
|
||||
}
|
||||
}
|
||||
|
@ -167,5 +183,6 @@ class WalletKeysAndSeedPageRobot {
|
|||
tester.printToConsole('Going back to dashboard from credentials page');
|
||||
await commonTestCases.goBack();
|
||||
await commonTestCases.goBack();
|
||||
await commonTestCases.goBack();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,6 +29,11 @@ class WelcomePageRobot {
|
|||
await commonTestCases.defaultSleepTime();
|
||||
}
|
||||
|
||||
Future<void> tapNewSingleSeed() async {
|
||||
await commonTestCases.tapItemByKey('wallet_group_description_page_create_new_seed_button_key');
|
||||
await commonTestCases.defaultSleepTime();
|
||||
}
|
||||
|
||||
Future<void> navigateToRestoreWalletPage() async {
|
||||
await commonTestCases.tapItemByKey('welcome_page_restore_wallet_button_key');
|
||||
await commonTestCases.defaultSleepTime();
|
||||
|
|
|
@ -42,12 +42,20 @@ void main() {
|
|||
if (walletType == WalletType.solana) {
|
||||
continue;
|
||||
}
|
||||
final seed = commonTestFlows.getWalletSeedsByWalletType(walletType);
|
||||
if (seed.isEmpty) {
|
||||
printV("----------------------------");
|
||||
printV("- Skipped wallet: ${walletType}");
|
||||
printV("- Make sure to add seed to secrets");
|
||||
printV("----------------------------");
|
||||
continue;
|
||||
}
|
||||
|
||||
await commonTestFlows.switchToWalletMenuFromDashboardPage();
|
||||
|
||||
await commonTestFlows.restoreWalletFromWalletMenu(
|
||||
walletType,
|
||||
commonTestFlows.getWalletSeedsByWalletType(walletType),
|
||||
seed,
|
||||
);
|
||||
|
||||
await dashboardPageRobot.confirmWalletTypeIsDisplayedCorrectly(walletType);
|
||||
|
|
|
@ -82,6 +82,8 @@ class MoonPayProvider extends BuyProvider {
|
|||
return 'light';
|
||||
case ThemeType.dark:
|
||||
return 'dark';
|
||||
case ThemeType.oled:
|
||||
return 'dark';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,8 +10,9 @@ class FiatCurrency extends EnumerableItem<String> with Serializable<String> impl
|
|||
static List<FiatCurrency> get all => _all.values.toList();
|
||||
|
||||
static List<FiatCurrency> get currenciesAvailableToBuyWith =>
|
||||
[aud, bgn, brl, cad, chf, clp, cop, czk, dkk, egp, eur, gbp, gtq, hkd, hrk, huf, idr, ils, inr, isk, jpy, krw, mad, mxn, myr, ngn, nok, nzd, php, pkr, pln, ron, sek, sgd, thb, twd, usd, vnd, zar, tur];
|
||||
[amd, aud, bgn, brl, cad, chf, clp, cop, czk, dkk, egp, eur, gbp, gtq, hkd, hrk, huf, idr, ils, inr, isk, jpy, krw, mad, mxn, myr, ngn, nok, nzd, php, pkr, pln, ron, sek, sgd, thb, twd, usd, vnd, zar, tur,];
|
||||
|
||||
static const amd = FiatCurrency(symbol: 'AMD', countryCode: "arm", fullName: "Armenian Dram");
|
||||
static const ars = FiatCurrency(symbol: 'ARS', countryCode: "arg", fullName: "Argentine Peso");
|
||||
static const aud = FiatCurrency(symbol: 'AUD', countryCode: "aus", fullName: "Australian Dollar");
|
||||
static const bdt = FiatCurrency(symbol: 'BDT', countryCode: "bgd", fullName: "Bangladeshi Taka");
|
||||
|
@ -63,6 +64,7 @@ class FiatCurrency extends EnumerableItem<String> with Serializable<String> impl
|
|||
static const tur = FiatCurrency(symbol: 'TRY', countryCode: "tur", fullName: "Turkish Lira");
|
||||
|
||||
static final _all = {
|
||||
FiatCurrency.amd.raw: FiatCurrency.amd,
|
||||
FiatCurrency.ars.raw: FiatCurrency.ars,
|
||||
FiatCurrency.aud.raw: FiatCurrency.aud,
|
||||
FiatCurrency.bdt.raw: FiatCurrency.bdt,
|
||||
|
|
|
@ -23,7 +23,7 @@ class MainActions {
|
|||
static List<MainActions> all = [
|
||||
showWalletsAction,
|
||||
receiveAction,
|
||||
exchangeAction,
|
||||
swapAction,
|
||||
sendAction,
|
||||
tradeAction,
|
||||
];
|
||||
|
@ -44,13 +44,13 @@ class MainActions {
|
|||
},
|
||||
);
|
||||
|
||||
static MainActions exchangeAction = MainActions._(
|
||||
name: (context) => S.of(context).exchange,
|
||||
static MainActions swapAction = MainActions._(
|
||||
name: (context) => S.of(context).swap,
|
||||
image: 'assets/images/transfer.png',
|
||||
isEnabled: (viewModel) => viewModel.isEnabledExchangeAction,
|
||||
canShow: (viewModel) => viewModel.hasExchangeAction,
|
||||
isEnabled: (viewModel) => viewModel.isEnabledSwapAction,
|
||||
canShow: (viewModel) => viewModel.hasSwapAction,
|
||||
onTap: (BuildContext context, DashboardViewModel viewModel) async {
|
||||
if (viewModel.isEnabledExchangeAction) {
|
||||
if (viewModel.isEnabledSwapAction) {
|
||||
await Navigator.of(context).pushNamed(Routes.exchange);
|
||||
}
|
||||
},
|
||||
|
@ -66,7 +66,7 @@ class MainActions {
|
|||
|
||||
|
||||
static MainActions tradeAction = MainActions._(
|
||||
name: (context) => '${S.of(context).buy}/${S.of(context).sell}',
|
||||
name: (context) => S.of(context).exchange,
|
||||
image: 'assets/images/buy_sell.png',
|
||||
isEnabled: (viewModel) => viewModel.isEnabledTradeAction,
|
||||
canShow: (viewModel) => viewModel.hasTradeAction,
|
||||
|
|
|
@ -26,12 +26,6 @@ class BackupPage extends BasePage {
|
|||
@override
|
||||
String get title => S.current.backup;
|
||||
|
||||
@override
|
||||
Widget trailing(BuildContext context) => TrailButton(
|
||||
caption: S.of(context).change_password,
|
||||
onPressed: () => Navigator.of(context).pushNamed(Routes.editBackupPassword),
|
||||
textColor: Palette.blueCraiola);
|
||||
|
||||
@override
|
||||
Widget body(BuildContext context) {
|
||||
return Stack(
|
||||
|
@ -53,7 +47,9 @@ class BackupPage extends BasePage {
|
|||
builder: (_) => GestureDetector(
|
||||
onTap: () {
|
||||
ClipboardUtil.setSensitiveDataToClipboard(
|
||||
ClipboardData(text: backupViewModelBase.backupPassword));
|
||||
ClipboardData(
|
||||
text: backupViewModelBase
|
||||
.backupPassword));
|
||||
showBar<void>(
|
||||
context,
|
||||
S.of(context).transaction_details_copied(
|
||||
|
@ -74,15 +70,25 @@ class BackupPage extends BasePage {
|
|||
))
|
||||
]))),
|
||||
Positioned(
|
||||
child: Observer(
|
||||
builder: (_) => LoadingPrimaryButton(
|
||||
isLoading: backupViewModelBase.state is IsExecutingState,
|
||||
onPressed: () => onExportBackup(context),
|
||||
text: S.of(context).export_backup,
|
||||
color: Theme.of(context).primaryColor,
|
||||
child: Column(children: [
|
||||
PrimaryButton(
|
||||
onPressed: () =>
|
||||
Navigator.of(context).pushNamed(Routes.editBackupPassword),
|
||||
text: S.of(context).change_password,
|
||||
color: Theme.of(context).cardColor,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
Observer(
|
||||
builder: (_) => LoadingPrimaryButton(
|
||||
isLoading: backupViewModelBase.state is IsExecutingState,
|
||||
onPressed: () => onExportBackup(context),
|
||||
text: S.of(context).export_backup,
|
||||
color: Theme.of(context).primaryColor,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
),
|
||||
]),
|
||||
bottom: 24,
|
||||
left: 24,
|
||||
right: 24,
|
||||
|
@ -130,7 +136,8 @@ class BackupPage extends BasePage {
|
|||
rightButtonText: S.of(context).save_to_downloads,
|
||||
leftButtonText: S.of(context).share,
|
||||
actionRightButton: () async {
|
||||
await backupViewModelBase.saveToDownload(backup.name, backup.content);
|
||||
await backupViewModelBase.saveToDownload(
|
||||
backup.name, backup.content);
|
||||
Navigator.of(dialogContext).pop();
|
||||
},
|
||||
actionLeftButton: () async {
|
||||
|
@ -142,13 +149,15 @@ class BackupPage extends BasePage {
|
|||
|
||||
Future<void> share(BackupExportFile backup, BuildContext context) async {
|
||||
final path = await backupViewModelBase.saveBackupFileLocally(backup);
|
||||
await ShareUtil.shareFile(filePath: path, fileName: backup.name, context: context);
|
||||
await ShareUtil.shareFile(
|
||||
filePath: path, fileName: backup.name, context: context);
|
||||
await backupViewModelBase.removeBackupFileLocally(backup);
|
||||
}
|
||||
|
||||
Future<void> _saveFile(BackupExportFile backup) async {
|
||||
String? outputFile = await FilePicker.platform
|
||||
.saveFile(dialogTitle: 'Save Your File to desired location', fileName: backup.name);
|
||||
String? outputFile = await FilePicker.platform.saveFile(
|
||||
dialogTitle: 'Save Your File to desired location',
|
||||
fileName: backup.name);
|
||||
|
||||
try {
|
||||
File returnedFile = File(outputFile!);
|
||||
|
|
|
@ -110,10 +110,12 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 24),
|
||||
padding: const EdgeInsets.only(),
|
||||
child: Column(
|
||||
children: [
|
||||
Align(
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24, right: 24, bottom: 8),
|
||||
child: Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: TabBar(
|
||||
controller: _tabController,
|
||||
|
@ -135,7 +137,7 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
|
|||
indicatorColor: Theme.of(context).appBarTheme.titleTextStyle!.color,
|
||||
indicatorPadding: EdgeInsets.zero,
|
||||
labelPadding: EdgeInsets.only(right: 24),
|
||||
tabAlignment: TabAlignment.center,
|
||||
tabAlignment: TabAlignment.start,
|
||||
dividerColor: Colors.transparent,
|
||||
padding: EdgeInsets.zero,
|
||||
tabs: [
|
||||
|
@ -144,6 +146,7 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
|
|||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: TabBarView(
|
||||
controller: _tabController,
|
||||
|
@ -173,7 +176,7 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
|
|||
itemCount: groupedContacts.length * 2,
|
||||
itemBuilder: (context, index) {
|
||||
if (index.isOdd) {
|
||||
return StandardListSeparator();
|
||||
return StandardListSeparator(height: 0);
|
||||
} else {
|
||||
final groupIndex = index ~/ 2;
|
||||
final groupName = groupedContacts.keys.elementAt(groupIndex);
|
||||
|
@ -188,7 +191,9 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
|
|||
orElse: () => groupContacts[0],
|
||||
);
|
||||
|
||||
return ExpansionTile(
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 16, right: 16, top: 4, bottom: 4),
|
||||
child: ExpansionTile(
|
||||
title: Text(
|
||||
groupName,
|
||||
style: TextStyle(
|
||||
|
@ -198,11 +203,16 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
|
|||
),
|
||||
),
|
||||
leading: _buildCurrencyIcon(activeContact),
|
||||
tilePadding: EdgeInsets.zero,
|
||||
tilePadding: const EdgeInsets.only(left: 16, right: 16),
|
||||
childrenPadding: const EdgeInsets.only(left: 16),
|
||||
expandedCrossAxisAlignment: CrossAxisAlignment.start,
|
||||
expandedAlignment: Alignment.topLeft,
|
||||
backgroundColor: Theme.of(context).cardColor,
|
||||
collapsedBackgroundColor: Theme.of(context).cardColor,
|
||||
collapsedShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
||||
children: groupContacts.map((contact) => generateRaw(context, contact)).toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -234,7 +244,12 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
|
|||
},
|
||||
behavior: HitTestBehavior.opaque,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.only(top: 16, bottom: 16, right: 24),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||
color: Theme.of(context).cardColor,
|
||||
),
|
||||
margin: const EdgeInsets.only(top: 4, bottom: 4, left: 16, right: 16),
|
||||
padding: const EdgeInsets.only(top: 16, bottom: 16, right: 16, left: 16),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
|
@ -375,7 +390,12 @@ class _ContactListBodyState extends State<ContactListBody> {
|
|||
children: [
|
||||
Container(
|
||||
key: Key('${contact.name}'),
|
||||
padding: const EdgeInsets.only(top: 16, bottom: 16, right: 24),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(8)),
|
||||
color: Theme.of(context).cardColor,
|
||||
),
|
||||
margin: const EdgeInsets.only(top: 4, bottom: 4, left: 16, right: 16),
|
||||
padding: const EdgeInsets.only(top: 16, bottom: 16, right: 16, left: 16),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
|
@ -396,7 +416,6 @@ class _ContactListBodyState extends State<ContactListBody> {
|
|||
],
|
||||
),
|
||||
),
|
||||
StandardListSeparator()
|
||||
],
|
||||
);
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ import 'dart:async';
|
|||
import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
|
||||
import 'package:cake_wallet/entities/preferences_key.dart';
|
||||
import 'package:cake_wallet/di.dart';
|
||||
import 'package:cake_wallet/entities/main_actions.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/pages/cake_features_page.dart';
|
||||
import 'package:cake_wallet/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart';
|
||||
|
@ -10,7 +9,6 @@ import 'package:cake_wallet/src/widgets/gradient_background.dart';
|
|||
import 'package:cake_wallet/src/widgets/haven_wallet_removal_popup.dart';
|
||||
import 'package:cake_wallet/src/widgets/services_updates_widget.dart';
|
||||
import 'package:cake_wallet/src/widgets/vulnerable_seeds_popup.dart';
|
||||
import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
|
||||
import 'package:cake_wallet/utils/device_info.dart';
|
||||
import 'package:cake_wallet/utils/version_comparator.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/cake_features_view_model.dart';
|
||||
|
@ -23,8 +21,8 @@ import 'package:flutter/material.dart';
|
|||
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/widgets/menu_widget.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/widgets/action_button.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/pages/balance/balance_page.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/pages/navigation_dock.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/pages/transactions_page.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
|
||||
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart';
|
||||
|
@ -35,7 +33,6 @@ import 'package:smooth_page_indicator/smooth_page_indicator.dart';
|
|||
import 'package:cake_wallet/main.dart';
|
||||
import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart';
|
||||
import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
|
||||
|
||||
class DashboardPage extends StatefulWidget {
|
||||
DashboardPage({
|
||||
|
@ -140,7 +137,8 @@ class _DashboardPageView extends BasePage {
|
|||
bool get resizeToAvoidBottomInset => false;
|
||||
|
||||
@override
|
||||
Widget get endDrawer => MenuWidget(dashboardViewModel, ValueKey('dashboard_page_drawer_menu_widget_key'));
|
||||
Widget get endDrawer =>
|
||||
MenuWidget(dashboardViewModel, ValueKey('dashboard_page_drawer_menu_widget_key'));
|
||||
|
||||
@override
|
||||
Widget leading(BuildContext context) {
|
||||
|
@ -176,10 +174,6 @@ class _DashboardPageView extends BasePage {
|
|||
width: 40,
|
||||
child: TextButton(
|
||||
key: ValueKey('dashboard_page_wallet_menu_button_key'),
|
||||
// FIX-ME: Style
|
||||
//highlightColor: Colors.transparent,
|
||||
//splashColor: Colors.transparent,
|
||||
//padding: EdgeInsets.all(0),
|
||||
onPressed: () => onOpenEndDrawer(),
|
||||
child: Semantics(label: S.of(context).wallet_menu, child: menuButton),
|
||||
),
|
||||
|
@ -219,14 +213,15 @@ class _DashboardPageView extends BasePage {
|
|||
_setEffects(context);
|
||||
|
||||
return SafeArea(
|
||||
minimum: EdgeInsets.only(bottom: 24),
|
||||
minimum: EdgeInsets.only(bottom: 0),
|
||||
child: BottomSheetListener(
|
||||
bottomSheetService: bottomSheetService,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Observer(
|
||||
child: Container(
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: <Widget>[
|
||||
//new Expanded(
|
||||
Observer(
|
||||
builder: (context) {
|
||||
return PageView.builder(
|
||||
key: ValueKey('dashboard_page_view_key'),
|
||||
|
@ -236,101 +231,44 @@ class _DashboardPageView extends BasePage {
|
|||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(bottom: 24, top: 10),
|
||||
child: Observer(
|
||||
builder: (context) {
|
||||
return Semantics(
|
||||
button: false,
|
||||
label: 'Page Indicator',
|
||||
hint: 'Swipe to change page',
|
||||
excludeSemantics: true,
|
||||
child: SmoothPageIndicator(
|
||||
controller: controller,
|
||||
count: pages.length,
|
||||
effect: ColorTransitionEffect(
|
||||
spacing: 6.0,
|
||||
radius: 6.0,
|
||||
dotWidth: 6.0,
|
||||
dotHeight: 6.0,
|
||||
dotColor: Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.indicatorDotTheme
|
||||
.indicatorColor,
|
||||
activeDotColor: Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.indicatorDotTheme
|
||||
.activeIndicatorColor,
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Observer(
|
||||
builder: (_) {
|
||||
return ClipRect(
|
||||
child: Container(
|
||||
margin: const EdgeInsets.only(left: 16, right: 16),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(50.0),
|
||||
border: Border.all(
|
||||
color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
|
||||
width: 1,
|
||||
//),
|
||||
Positioned(
|
||||
child: Container(
|
||||
alignment: Alignment.bottomCenter,
|
||||
margin: EdgeInsets.only(bottom: 110),
|
||||
child: Observer(
|
||||
builder: (context) {
|
||||
return Semantics(
|
||||
button: false,
|
||||
label: 'Page Indicator',
|
||||
hint: 'Swipe to change page',
|
||||
excludeSemantics: true,
|
||||
child: SmoothPageIndicator(
|
||||
controller: controller,
|
||||
count: pages.length,
|
||||
effect: ColorTransitionEffect(
|
||||
spacing: 6.0,
|
||||
radius: 6.0,
|
||||
dotWidth: 6.0,
|
||||
dotHeight: 6.0,
|
||||
dotColor: Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.indicatorDotTheme
|
||||
.indicatorColor,
|
||||
activeDotColor: Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.indicatorDotTheme
|
||||
.activeIndicatorColor,
|
||||
),
|
||||
),
|
||||
color: Theme.of(context)
|
||||
.extension<SyncIndicatorTheme>()!
|
||||
.syncedBackgroundColor,
|
||||
),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: MainActions.all
|
||||
.where((element) => element.canShow?.call(dashboardViewModel) ?? true)
|
||||
.map(
|
||||
(action) => Expanded(
|
||||
child: Semantics(
|
||||
button: true,
|
||||
enabled: (action.isEnabled?.call(dashboardViewModel) ?? true),
|
||||
child: ActionButton(
|
||||
key: ValueKey(
|
||||
'dashboard_page_${action.name(context)}_action_button_key'),
|
||||
image: Image.asset(
|
||||
action.image,
|
||||
height: 24,
|
||||
width: 24,
|
||||
color: action.isEnabled?.call(dashboardViewModel) ?? true
|
||||
? Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.mainActionsIconColor
|
||||
: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
),
|
||||
title: action.name(context),
|
||||
onClick: () async =>
|
||||
await action.onTap(context, dashboardViewModel),
|
||||
textColor: action.isEnabled?.call(dashboardViewModel) ?? true
|
||||
? null
|
||||
: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
NavigationDock(dashboardViewModel: dashboardViewModel)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -30,11 +30,11 @@ class DesktopDashboardActions extends StatelessWidget {
|
|||
await MainActions.showWalletsAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
DesktopActionButton(
|
||||
title: MainActions.exchangeAction.name(context),
|
||||
image: MainActions.exchangeAction.image,
|
||||
canShow: MainActions.exchangeAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.exchangeAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.exchangeAction.onTap(context, dashboardViewModel),
|
||||
title: MainActions.swapAction.name(context),
|
||||
image: MainActions.swapAction.image,
|
||||
canShow: MainActions.swapAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.swapAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.swapAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
|
|
|
@ -16,6 +16,7 @@ import 'package:cw_core/unspent_coin_type.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:cake_wallet/themes/theme_base.dart';
|
||||
|
||||
class BalanceRowWidget extends StatelessWidget {
|
||||
BalanceRowWidget({
|
||||
|
@ -65,6 +66,8 @@ class BalanceRowWidget extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool brightThemeType = false;
|
||||
if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) brightThemeType = true;
|
||||
return Column(
|
||||
children: [
|
||||
Container(
|
||||
|
@ -76,6 +79,15 @@ class BalanceRowWidget extends StatelessWidget {
|
|||
width: 1,
|
||||
),
|
||||
color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
|
||||
// boxShadow: [
|
||||
// BoxShadow(
|
||||
// color: Theme.of(context)
|
||||
// .extension<BalancePageTheme>()!
|
||||
// .cardBorderColor
|
||||
// .withAlpha(50),
|
||||
// spreadRadius: dashboardViewModel.getShadowSpread(),
|
||||
// blurRadius: dashboardViewModel.getShadowBlur())
|
||||
// ],
|
||||
),
|
||||
child: TextButton(
|
||||
onPressed: () => Fluttertoast.showToast(
|
||||
|
@ -310,7 +322,7 @@ class BalanceRowWidget extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
if (hasSecondAdditionalBalance || hasSecondAvailableBalance) ...[
|
||||
SizedBox(height: 10),
|
||||
SizedBox(height: 16),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(left: 16, right: 16),
|
||||
decoration: BoxDecoration(
|
||||
|
@ -320,6 +332,15 @@ class BalanceRowWidget extends StatelessWidget {
|
|||
width: 1,
|
||||
),
|
||||
color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.cardBorderColor
|
||||
.withAlpha(50),
|
||||
spreadRadius: dashboardViewModel.getShadowSpread(),
|
||||
blurRadius: dashboardViewModel.getShadowBlur())
|
||||
],
|
||||
),
|
||||
child: TextButton(
|
||||
onPressed: () => Fluttertoast.showToast(
|
||||
|
@ -643,6 +664,25 @@ class BalanceRowWidget extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
|
||||
// double getShadowSpread(){
|
||||
// double spread = 3;
|
||||
// if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) spread = 3;
|
||||
// else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.light) spread = 3;
|
||||
// else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.dark) spread = 1;
|
||||
// else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.oled) spread = 3;
|
||||
// return spread;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// double getShadowBlur(){
|
||||
// double blur = 7;
|
||||
// if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) blur = 7;
|
||||
// else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.light) blur = 7;
|
||||
// else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.dark) blur = 3;
|
||||
// else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.oled) blur = 7;
|
||||
// return blur;
|
||||
// }
|
||||
|
||||
void _showBalanceDescription(BuildContext context, String content) {
|
||||
showPopUp<void>(context: context, builder: (_) => InformationPage(information: content));
|
||||
}
|
||||
|
|
|
@ -39,7 +39,6 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
child: DashBoardRoundedCardWidget(
|
||||
title: "Invalid monero bindings",
|
||||
subTitle: dashboardViewModel.getMoneroError.toString(),
|
||||
onTap: () {},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
@ -54,7 +53,6 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
child: DashBoardRoundedCardWidget(
|
||||
title: "Invalid wownero bindings",
|
||||
subTitle: dashboardViewModel.getWowneroError.toString(),
|
||||
onTap: () {},
|
||||
));
|
||||
}
|
||||
return Container();
|
||||
|
@ -153,7 +151,7 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
return ListView.separated(
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
shrinkWrap: true,
|
||||
separatorBuilder: (_, __) => Container(padding: EdgeInsets.only(bottom: 8)),
|
||||
separatorBuilder: (_, __) => Container(padding: EdgeInsets.only(bottom: 16)),
|
||||
itemCount: dashboardViewModel.balanceViewModel.formattedBalances.length,
|
||||
itemBuilder: (__, index) {
|
||||
final balance =
|
||||
|
@ -206,14 +204,17 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
subTitle: "Here are the things that you should note:\n - " +
|
||||
dashboardViewModel.isMoneroWalletBrokenReasons.join("\n - ") +
|
||||
"\n\nPlease restart your wallet and if it doesn't help contact our support.",
|
||||
onTap: () {},
|
||||
))
|
||||
],
|
||||
if (dashboardViewModel.showSilentPaymentsCard) ...[
|
||||
SizedBox(height: 10),
|
||||
SizedBox(height: 16),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),
|
||||
child: DashBoardRoundedCardWidget(
|
||||
shadowBlur: dashboardViewModel.getShadowBlur(),
|
||||
shadowSpread: dashboardViewModel.getShadowSpread(),
|
||||
marginV: 0,
|
||||
marginH: 0,
|
||||
customBorder: 30,
|
||||
title: S.of(context).silent_payments,
|
||||
subTitle: S.of(context).enable_silent_payments_scanning,
|
||||
|
@ -276,10 +277,12 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
),
|
||||
],
|
||||
if (dashboardViewModel.showMwebCard) ...[
|
||||
SizedBox(height: 10),
|
||||
SizedBox(height: 16),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),
|
||||
child: DashBoardRoundedCardWidget(
|
||||
marginV: 0,
|
||||
marginH: 0,
|
||||
customBorder: 30,
|
||||
title: S.of(context).litecoin_mweb,
|
||||
subTitle: S.of(context).litecoin_mweb_description,
|
||||
|
@ -338,7 +341,6 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
),
|
||||
],
|
||||
),
|
||||
onTap: () => {},
|
||||
icon: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
|
@ -352,6 +354,7 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 150),
|
||||
],
|
||||
],
|
||||
);
|
||||
|
|
|
@ -22,15 +22,13 @@ class CakeFeaturesPage extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||||
return Container(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: 50),
|
||||
Text(
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 24, top: 16),
|
||||
child: Text(
|
||||
'Cake ${S.of(context).features}',
|
||||
style: TextStyle(
|
||||
fontSize: 24,
|
||||
|
@ -38,11 +36,14 @@ class CakeFeaturesPage extends StatelessWidget {
|
|||
color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: ListView(
|
||||
children: <Widget>[
|
||||
SizedBox(height: 20),
|
||||
SizedBox(height: 2),
|
||||
DashBoardRoundedCardWidget(
|
||||
shadowBlur: dashboardViewModel.getShadowBlur(),
|
||||
shadowSpread: dashboardViewModel.getShadowSpread(),
|
||||
onTap: () {
|
||||
if (Platform.isMacOS) {
|
||||
_launchUrl("buy.cakepay.com");
|
||||
|
@ -59,8 +60,9 @@ class CakeFeaturesPage extends StatelessWidget {
|
|||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
DashBoardRoundedCardWidget(
|
||||
shadowBlur: dashboardViewModel.getShadowBlur(),
|
||||
shadowSpread: dashboardViewModel.getShadowSpread(),
|
||||
onTap: () => _launchUrl("cake.nano-gpt.com"),
|
||||
title: "NanoGPT",
|
||||
subTitle: S.of(context).nanogpt_subtitle,
|
||||
|
@ -71,32 +73,13 @@ class CakeFeaturesPage extends StatelessWidget {
|
|||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
Observer(
|
||||
builder: (context) {
|
||||
if (!dashboardViewModel.hasSignMessages) {
|
||||
return const SizedBox();
|
||||
}
|
||||
return DashBoardRoundedCardWidget(
|
||||
onTap: () => Navigator.of(context).pushNamed(Routes.signPage),
|
||||
title: S.current.sign_verify_message,
|
||||
subTitle: S.current.sign_verify_message_sub,
|
||||
icon: Icon(
|
||||
Icons.speaker_notes_rounded,
|
||||
color:
|
||||
Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
|
||||
size: 75,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
SizedBox(height: 125),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
);
|
||||
}
|
||||
|
||||
void _launchUrl(String url) {
|
||||
|
|
229
lib/src/screens/dashboard/pages/navigation_dock.dart
Normal file
229
lib/src/screens/dashboard/pages/navigation_dock.dart
Normal file
|
@ -0,0 +1,229 @@
|
|||
import 'dart:ui';
|
||||
import 'package:cake_wallet/entities/main_actions.dart';
|
||||
import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/widgets/action_button.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
|
||||
import '../../../../themes/theme_base.dart';
|
||||
|
||||
class NavigationDock extends StatelessWidget {
|
||||
const NavigationDock({
|
||||
required this.dashboardViewModel,
|
||||
});
|
||||
|
||||
final DashboardViewModel dashboardViewModel;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright
|
||||
? Positioned(
|
||||
child: Observer(
|
||||
builder: (_) {
|
||||
return Container(
|
||||
alignment: Alignment.bottomCenter,
|
||||
height: 130,
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
colors: <Color>[
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor
|
||||
.withAlpha(10),
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor
|
||||
.withAlpha(75),
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor
|
||||
.withAlpha(150),
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor,
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor
|
||||
],
|
||||
),
|
||||
),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(sigmaX: 50, sigmaY: 50),
|
||||
child: Container(
|
||||
height: 75,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(50.0),
|
||||
border: Border.all(
|
||||
color:
|
||||
Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
|
||||
width: 1,
|
||||
),
|
||||
color: Theme.of(context)
|
||||
.extension<SyncIndicatorTheme>()!
|
||||
.syncedBackgroundColor,
|
||||
),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: MainActions.all
|
||||
.where((element) =>
|
||||
element.canShow?.call(dashboardViewModel) ?? true)
|
||||
.map(
|
||||
(action) => Expanded(
|
||||
child: Semantics(
|
||||
button: true,
|
||||
enabled:
|
||||
(action.isEnabled?.call(dashboardViewModel) ?? true),
|
||||
child: ActionButton(
|
||||
key: ValueKey(
|
||||
'dashboard_page_${action.name(context)}_action_button_key'),
|
||||
image: Image.asset(
|
||||
action.image,
|
||||
height: 24,
|
||||
width: 24,
|
||||
color:
|
||||
action.isEnabled?.call(dashboardViewModel) ?? true
|
||||
? Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.mainActionsIconColor
|
||||
: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
),
|
||||
title: action.name(context),
|
||||
onClick: () async =>
|
||||
await action.onTap(context, dashboardViewModel),
|
||||
textColor:
|
||||
action.isEnabled?.call(dashboardViewModel) ?? true
|
||||
? null
|
||||
: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
: Positioned(
|
||||
child: Observer(
|
||||
builder: (_) {
|
||||
return Container(
|
||||
alignment: Alignment.bottomCenter,
|
||||
height: 130,
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
colors: <Color>[
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor
|
||||
.withAlpha(10),
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor
|
||||
.withAlpha(75),
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor
|
||||
.withAlpha(150),
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor,
|
||||
Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.thirdGradientBackgroundColor
|
||||
],
|
||||
),
|
||||
),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
|
||||
child: Container(
|
||||
height: 75,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(50.0),
|
||||
border: Border.all(
|
||||
color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
|
||||
width: 1,
|
||||
),
|
||||
color: Theme.of(context)
|
||||
.extension<SyncIndicatorTheme>()!
|
||||
.syncedBackgroundColor,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.cardBorderColor
|
||||
.withAlpha(50),
|
||||
spreadRadius: dashboardViewModel.getShadowSpread(),
|
||||
blurRadius: dashboardViewModel.getShadowBlur())
|
||||
],
|
||||
),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: MainActions.all
|
||||
.where((element) => element.canShow?.call(dashboardViewModel) ?? true)
|
||||
.map(
|
||||
(action) => Expanded(
|
||||
child: Semantics(
|
||||
button: true,
|
||||
enabled: (action.isEnabled?.call(dashboardViewModel) ?? true),
|
||||
child: ActionButton(
|
||||
key: ValueKey(
|
||||
'dashboard_page_${action.name(context)}_action_button_key'),
|
||||
image: Image.asset(
|
||||
action.image,
|
||||
height: 24,
|
||||
width: 24,
|
||||
color: action.isEnabled?.call(dashboardViewModel) ?? true
|
||||
? Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.mainActionsIconColor
|
||||
: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
),
|
||||
title: action.name(context),
|
||||
onClick: () async =>
|
||||
await action.onTap(context, dashboardViewModel),
|
||||
textColor: action.isEnabled?.call(dashboardViewModel) ?? true
|
||||
? null
|
||||
: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -21,8 +21,8 @@ class ActionButton extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
return TextButton(
|
||||
onPressed: () {
|
||||
if (route?.isNotEmpty ?? false) {
|
||||
Navigator.of(context, rootNavigator: true).pushNamed(route!);
|
||||
} else {
|
||||
|
@ -31,11 +31,12 @@ class ActionButton extends StatelessWidget {
|
|||
},
|
||||
child: Container(
|
||||
color: Colors.transparent,
|
||||
padding: EdgeInsets.only(top: 14, bottom: 16, left: 10, right: 10),
|
||||
padding: EdgeInsets.only(top: 5, bottom: 5, left: 0, right: 0),
|
||||
alignment: alignment,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
//mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
|
@ -47,7 +48,7 @@ class ActionButton extends StatelessWidget {
|
|||
Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
fontSize: 10,
|
||||
fontSize: 9,
|
||||
color: textColor ??
|
||||
Theme.of(context).extension<DashboardPageTheme>()!.cardTextColor),
|
||||
textAlign: TextAlign.center,
|
||||
|
|
|
@ -143,6 +143,7 @@ class MenuWidgetState extends State<MenuWidget> {
|
|||
return Container(
|
||||
height: headerHeight,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(24)),
|
||||
gradient: LinearGradient(colors: [
|
||||
Theme.of(context).extension<CakeMenuTheme>()!.headerFirstGradientColor,
|
||||
Theme.of(context).extension<CakeMenuTheme>()!.headerSecondGradientColor,
|
||||
|
@ -209,7 +210,7 @@ class MenuWidgetState extends State<MenuWidget> {
|
|||
);
|
||||
},
|
||||
separatorBuilder: (_, index) => Container(
|
||||
height: 1,
|
||||
height: 0,
|
||||
color: Theme.of(context).extension<CakeMenuTheme>()!.dividerColor,
|
||||
),
|
||||
itemCount: itemCount + 1,
|
||||
|
|
|
@ -193,9 +193,11 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
|
|||
width: double.infinity,
|
||||
color: Colors.transparent,
|
||||
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
|
||||
SizedBox(height: 10),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
SizedBox(height: 40),
|
||||
Text(
|
||||
key: ValueKey('${_cardInstanceName}_title_key'),
|
||||
_title,
|
||||
|
@ -207,6 +209,7 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
|
|||
],
|
||||
),
|
||||
CurrencyAmountTextField(
|
||||
padding: EdgeInsets.zero,
|
||||
currencyPickerButtonKey: ValueKey('${_cardInstanceName}_currency_picker_button_key'),
|
||||
selectedCurrencyTextKey: ValueKey('${_cardInstanceName}_selected_currency_text_key'),
|
||||
selectedCurrencyTagTextKey:
|
||||
|
@ -273,7 +276,7 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
|
|||
? FocusTraversalOrder(
|
||||
order: NumericFocusOrder(2),
|
||||
child: Padding(
|
||||
padding: widget.addressRowPadding ?? EdgeInsets.only(top: 20),
|
||||
padding: widget.addressRowPadding ?? EdgeInsets.only(top: 12),
|
||||
child: AddressTextField(
|
||||
addressKey: ValueKey('${_cardInstanceName}_editable_address_textfield_key'),
|
||||
focusNode: widget.addressFocusNode,
|
||||
|
@ -313,7 +316,7 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
|
|||
)
|
||||
: Offstage()
|
||||
: Padding(
|
||||
padding: EdgeInsets.only(top: 10),
|
||||
padding: EdgeInsets.only(top: 0),
|
||||
child: Builder(
|
||||
builder: (context) => Stack(children: <Widget>[
|
||||
FocusTraversalOrder(
|
||||
|
|
|
@ -23,7 +23,7 @@ class MobileExchangeCardsSection extends StatelessWidget {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: EdgeInsets.only(bottom: isBuySellOption ? 8 : 32),
|
||||
padding: EdgeInsets.only(bottom: isBuySellOption ? 16 : 16),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomLeft: Radius.circular(24),
|
||||
|
@ -54,7 +54,7 @@ class MobileExchangeCardsSection extends StatelessWidget {
|
|||
end: Alignment.bottomRight,
|
||||
),
|
||||
),
|
||||
padding: EdgeInsets.fromLTRB(24, 90, 24, isBuySellOption ? 8 : 32),
|
||||
padding: EdgeInsets.fromLTRB(24, 90, 24, isBuySellOption ? 24 : 16),
|
||||
child: Column(
|
||||
children: [
|
||||
if (isBuySellOption) Column(
|
||||
|
@ -68,7 +68,7 @@ class MobileExchangeCardsSection extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 29, left: 24, right: 24),
|
||||
padding: EdgeInsets.only(top: 20, left: 24, right: 24),
|
||||
child: secondExchangeCard,
|
||||
)
|
||||
],
|
||||
|
|
|
@ -18,6 +18,37 @@ class NodeListRow extends StandardListRow {
|
|||
final Node node;
|
||||
final bool isPow;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final leading = buildLeading(context);
|
||||
final trailing = buildTrailing(context);
|
||||
return Container(
|
||||
height: 56,
|
||||
padding: EdgeInsets.only(left: 12, right: 12, top: 2, bottom: 2),
|
||||
margin: EdgeInsets.only(top: 2, bottom: 2),
|
||||
child: TextButton(
|
||||
onPressed: () => onTap?.call(context),
|
||||
style: ButtonStyle(
|
||||
backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor),
|
||||
shape: MaterialStateProperty.all(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
if (leading != null) leading,
|
||||
buildCenter(context, hasLeftOffset: leading != null),
|
||||
if (trailing != null) trailing,
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget buildLeading(BuildContext context) {
|
||||
return FutureBuilder(
|
||||
|
@ -56,6 +87,36 @@ class NodeHeaderListRow extends StandardListRow {
|
|||
NodeHeaderListRow({required String title, required void Function(BuildContext context) onTap})
|
||||
: super(title: title, onTap: onTap, isSelected: false);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final leading = buildLeading(context);
|
||||
final trailing = buildTrailing(context);
|
||||
return Container(
|
||||
height: 56,
|
||||
padding: EdgeInsets.only(left: 12, right: 12, top: 2, bottom: 2),
|
||||
child: TextButton(
|
||||
onPressed: () => onTap?.call(context),
|
||||
style: ButtonStyle(
|
||||
backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor),
|
||||
shape: MaterialStateProperty.all(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
if (leading != null) leading,
|
||||
buildCenter(context, hasLeftOffset: leading != null),
|
||||
if (trailing != null) trailing,
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget buildTrailing(BuildContext context) {
|
||||
return SizedBox(
|
||||
|
|
|
@ -142,7 +142,7 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
|
|||
child: Padding(
|
||||
padding: EdgeInsets.fromLTRB(
|
||||
24,
|
||||
responsiveLayoutUtil.shouldRenderMobileUI ? 100 : 55,
|
||||
responsiveLayoutUtil.shouldRenderMobileUI ? 110 : 55,
|
||||
24,
|
||||
responsiveLayoutUtil.shouldRenderMobileUI ? 32 : 0,
|
||||
),
|
||||
|
|
|
@ -27,12 +27,6 @@ class DisplaySettingsPage extends BasePage {
|
|||
padding: EdgeInsets.only(top: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
SettingsSwitcherCell(
|
||||
title: S.current.settings_display_balance,
|
||||
value: _displaySettingsViewModel.shouldDisplayBalance,
|
||||
onValueChange: (_, bool value) {
|
||||
_displaySettingsViewModel.setShouldDisplayBalance(value);
|
||||
}),
|
||||
SettingsSwitcherCell(
|
||||
title: S.current.show_market_place,
|
||||
value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard,
|
||||
|
@ -40,6 +34,13 @@ class DisplaySettingsPage extends BasePage {
|
|||
_displaySettingsViewModel.setShouldShowMarketPlaceInDashbaord(value);
|
||||
},
|
||||
),
|
||||
SettingsSwitcherCell(
|
||||
title: S.of(context).show_address_book_popup,
|
||||
value: _displaySettingsViewModel.showAddressBookPopup,
|
||||
onValueChange: (_, bool value) {
|
||||
_displaySettingsViewModel.setShowAddressBookPopup(value);
|
||||
},
|
||||
),
|
||||
//if (!isHaven) it does not work correctly
|
||||
if (!_displaySettingsViewModel.disabledFiatApiMode)
|
||||
SettingsPickerCell<FiatCurrency>(
|
||||
|
|
|
@ -34,7 +34,6 @@ class ManageNodesPage extends BasePage {
|
|||
onTap: (_) async => await Navigator.of(context).pushNamed(Routes.newNode),
|
||||
),
|
||||
),
|
||||
const StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
|
||||
SizedBox(height: 20),
|
||||
Observer(
|
||||
builder: (BuildContext context) {
|
||||
|
|
|
@ -63,13 +63,6 @@ class OtherSettingsPage extends BasePage {
|
|||
handler: (BuildContext context) =>
|
||||
Navigator.of(context).pushNamed(Routes.readDisclaimer),
|
||||
),
|
||||
SettingsSwitcherCell(
|
||||
title: S.of(context).show_address_book_popup,
|
||||
value: _otherSettingsViewModel.showAddressBookPopup,
|
||||
onValueChange: (_, bool value) {
|
||||
_otherSettingsViewModel.setShowAddressBookPopup(value);
|
||||
},
|
||||
),
|
||||
Spacer(),
|
||||
SettingsVersionCell(
|
||||
title: S.of(context).version(_otherSettingsViewModel.currentVersion)),
|
||||
|
|
|
@ -35,41 +35,6 @@ class SecurityBackupPage extends BasePage {
|
|||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
if (!_isHardwareWallet)
|
||||
SettingsCellWithArrow(
|
||||
key: ValueKey('security_backup_page_show_keys_button_key'),
|
||||
title: S.current.show_keys,
|
||||
handler: (_) => _authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.showKeys,
|
||||
conditionToDetermineIfToUse2FA:
|
||||
_securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
|
||||
),
|
||||
),
|
||||
if (!SettingsStoreBase.walletPasswordDirectInput)
|
||||
SettingsCellWithArrow(
|
||||
key: ValueKey('security_backup_page_create_backup_button_key'),
|
||||
title: S.current.create_backup,
|
||||
handler: (_) => _authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.backup,
|
||||
conditionToDetermineIfToUse2FA:
|
||||
_securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
|
||||
),
|
||||
),
|
||||
SettingsCellWithArrow(
|
||||
key: ValueKey('security_backup_page_change_pin_button_key'),
|
||||
title: S.current.settings_change_pin,
|
||||
handler: (_) => _authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.setupPin,
|
||||
arguments: (PinCodeState<PinCodeWidget> setupPinContext, String _) {
|
||||
setupPinContext.close();
|
||||
},
|
||||
conditionToDetermineIfToUse2FA:
|
||||
_securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
|
||||
),
|
||||
),
|
||||
if (DeviceInfo.instance.isMobile || Platform.isMacOS || Platform.isLinux)
|
||||
Observer(builder: (_) {
|
||||
return SettingsSwitcherCell(
|
||||
|
@ -110,6 +75,47 @@ class SecurityBackupPage extends BasePage {
|
|||
},
|
||||
);
|
||||
}),
|
||||
if (!_isHardwareWallet)
|
||||
SettingsCellWithArrow(
|
||||
key: ValueKey('security_backup_page_show_keys_button_key'),
|
||||
title: S.current.show_keys,
|
||||
handler: (_) => _authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.showKeys,
|
||||
conditionToDetermineIfToUse2FA:
|
||||
_securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
|
||||
),
|
||||
),
|
||||
if (!SettingsStoreBase.walletPasswordDirectInput)
|
||||
SettingsCellWithArrow(
|
||||
key: ValueKey('security_backup_page_create_backup_button_key'),
|
||||
title: S.current.create_backup,
|
||||
handler: (_) => _authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.backup,
|
||||
conditionToDetermineIfToUse2FA:
|
||||
_securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
|
||||
),
|
||||
),
|
||||
SettingsCellWithArrow(
|
||||
key: ValueKey('security_backup_page_change_pin_button_key'),
|
||||
title: S.current.settings_change_pin,
|
||||
handler: (_) => _authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.setupPin,
|
||||
arguments: (PinCodeState<PinCodeWidget> setupPinContext, String _) {
|
||||
setupPinContext.close();
|
||||
},
|
||||
conditionToDetermineIfToUse2FA:
|
||||
_securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
|
||||
),
|
||||
),
|
||||
SettingsCellWithArrow(
|
||||
key: ValueKey('security_backup_page_sign_and_verify'),
|
||||
title: S.current.sign_verify_title,
|
||||
handler: (_) => Navigator.of(context).pushNamed(Routes.signPage)
|
||||
//_securitySettingsViewModel.pinCodeRequiredDuration,
|
||||
),
|
||||
Observer(
|
||||
builder: (context) {
|
||||
return SettingsCellWithArrow(
|
||||
|
|
|
@ -12,7 +12,7 @@ class SettingsChoicesCell extends StatelessWidget {
|
|||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
color: Theme.of(context).colorScheme.background,
|
||||
padding: EdgeInsets.all(24),
|
||||
padding: EdgeInsets.only(left: 24, right: 24, top: 16, bottom: 16),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
@ -30,7 +30,7 @@ class SettingsChoicesCell extends StatelessWidget {
|
|||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
const SizedBox(height: 12),
|
||||
],
|
||||
Center(
|
||||
child: Container(
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:cake_wallet/src/widgets/standard_list.dart';
|
||||
import 'package:cake_wallet/src/widgets/standard_switch.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class SettingsSwitcherCell extends StandardListRow {
|
||||
SettingsSwitcherCell({
|
||||
|
@ -21,6 +22,37 @@ class SettingsSwitcherCell extends StandardListRow {
|
|||
Widget buildTrailing(BuildContext context) =>
|
||||
StandardSwitch(value: value, onTaped: () => onValueChange?.call(context, !value));
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final leading = buildLeading(context);
|
||||
final trailing = buildTrailing(context);
|
||||
return Container(
|
||||
height: 56,
|
||||
padding: EdgeInsets.only(left: 12, right: 12),
|
||||
child: TextButton(
|
||||
onPressed: () => onValueChange?.call(context, !value),
|
||||
style: ButtonStyle(
|
||||
//backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor),
|
||||
shape: MaterialStateProperty.all(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
if (leading != null) leading,
|
||||
buildCenter(context, hasLeftOffset: leading != null),
|
||||
if (trailing != null) trailing,
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
Widget? buildLeading(BuildContext context) => leading;
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ class SupportPage extends BasePage {
|
|||
child: Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 24),
|
||||
padding: EdgeInsets.only(top: 20),
|
||||
child: OptionTile(
|
||||
icon: Icon(
|
||||
Icons.support_agent,
|
||||
|
@ -61,7 +61,7 @@ class SupportPage extends BasePage {
|
|||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 24),
|
||||
padding: EdgeInsets.only(top: 20),
|
||||
child: OptionTile(
|
||||
icon: Icon(
|
||||
Icons.find_in_page,
|
||||
|
@ -74,7 +74,7 @@ class SupportPage extends BasePage {
|
|||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 24),
|
||||
padding: EdgeInsets.only(top: 20),
|
||||
child: OptionTile(
|
||||
icon: Icon(
|
||||
Icons.contact_support,
|
||||
|
|
|
@ -124,9 +124,9 @@ class _WalletKeysPageBodyState extends State<WalletKeysPageBody>
|
|||
dividerColor: Colors.transparent,
|
||||
padding: EdgeInsets.zero,
|
||||
tabs: [
|
||||
Tab(text: S.of(context).widgets_seed),
|
||||
if (showKeyTab) Tab(text: S.of(context).keys),
|
||||
if (showLegacySeedTab) Tab(text: S.of(context).legacy),
|
||||
Tab(text: S.of(context).widgets_seed, key: ValueKey('wallet_keys_page_seed')),
|
||||
if (showKeyTab) Tab(text: S.of(context).keys, key: ValueKey('wallet_keys_page_keys'),),
|
||||
if (showLegacySeedTab) Tab(text: S.of(context).legacy, key: ValueKey('wallet_keys_page_seed_legacy')),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -31,6 +31,8 @@ import 'package:cw_core/wallet_type.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
|
||||
import '../../../themes/extensions/dashboard_page_theme.dart';
|
||||
|
||||
class WalletListPage extends BasePage {
|
||||
WalletListPage({
|
||||
required this.walletListViewModel,
|
||||
|
@ -88,7 +90,8 @@ class WalletListPage extends BasePage {
|
|||
width: 36,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Theme.of(context).extension<FilterTheme>()!.buttonColor,
|
||||
color:
|
||||
Theme.of(context).extension<FilterTheme>()!.buttonColor,
|
||||
),
|
||||
child: filterIcon,
|
||||
),
|
||||
|
@ -145,259 +148,336 @@ class WalletListBodyState extends State<WalletListBody> {
|
|||
color: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor);
|
||||
|
||||
return Container(
|
||||
height: double.infinity,
|
||||
padding: EdgeInsets.only(top: 16),
|
||||
child: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (widget.walletListViewModel.multiWalletGroups.isNotEmpty) ...{
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24),
|
||||
child: Text(
|
||||
S.current.shared_seed_wallet_groups,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
|
||||
),
|
||||
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
fit: StackFit.expand,
|
||||
children: <Widget>[
|
||||
SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (widget
|
||||
.walletListViewModel.multiWalletGroups.isNotEmpty) ...{
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24),
|
||||
child: Text(
|
||||
S.current.shared_seed_wallet_groups,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context)
|
||||
.extension<CakeTextTheme>()!
|
||||
.titleColor,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
Container(
|
||||
child: Observer(
|
||||
builder: (_) => FilteredList(
|
||||
shrinkWrap: true,
|
||||
list: widget.walletListViewModel.multiWalletGroups,
|
||||
updateFunction: widget.walletListViewModel.reorderAccordingToWalletList,
|
||||
itemBuilder: (context, index) {
|
||||
final group = widget.walletListViewModel.multiWalletGroups[index];
|
||||
final groupName = group.groupName ??
|
||||
'${S.current.wallet_group} ${index + 1}';
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
Container(
|
||||
child: Observer(
|
||||
builder: (_) => FilteredList(
|
||||
shrinkWrap: true,
|
||||
list: widget.walletListViewModel.multiWalletGroups,
|
||||
updateFunction: widget
|
||||
.walletListViewModel.reorderAccordingToWalletList,
|
||||
itemBuilder: (context, index) {
|
||||
final group = widget
|
||||
.walletListViewModel.multiWalletGroups[index];
|
||||
final groupName = group.groupName ??
|
||||
'${S.current.wallet_group} ${index + 1}';
|
||||
|
||||
widget.walletListViewModel.updateTileState(
|
||||
index,
|
||||
widget.walletListViewModel.expansionTileStateTrack[index] ?? false,
|
||||
);
|
||||
widget.walletListViewModel.updateTileState(
|
||||
index,
|
||||
widget.walletListViewModel
|
||||
.expansionTileStateTrack[index] ??
|
||||
false,
|
||||
);
|
||||
|
||||
return GroupedWalletExpansionTile(
|
||||
onExpansionChanged: (value) {
|
||||
widget.walletListViewModel.updateTileState(index, value);
|
||||
setState(() {});
|
||||
return GroupedWalletExpansionTile(
|
||||
onExpansionChanged: (value) {
|
||||
widget.walletListViewModel
|
||||
.updateTileState(index, value);
|
||||
setState(() {});
|
||||
},
|
||||
shouldShowCurrentWalletPointer: true,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
margin: EdgeInsets.only(
|
||||
left: 20, right: 20, bottom: 12),
|
||||
title: groupName,
|
||||
tileKey: ValueKey(
|
||||
'group_wallets_expansion_tile_widget_$index'),
|
||||
leadingWidget: Icon(
|
||||
Icons.account_balance_wallet_outlined,
|
||||
size: 28,
|
||||
),
|
||||
trailingWidget: EditWalletButtonWidget(
|
||||
width: 74,
|
||||
isGroup: true,
|
||||
isExpanded: widget.walletListViewModel
|
||||
.expansionTileStateTrack[index]!,
|
||||
onTap: () {
|
||||
final wallet = widget.walletListViewModel
|
||||
.convertWalletInfoToWalletListItem(
|
||||
group.wallets.first);
|
||||
Navigator.of(context).pushNamed(
|
||||
Routes.walletEdit,
|
||||
arguments: WalletEditPageArguments(
|
||||
walletListViewModel:
|
||||
widget.walletListViewModel,
|
||||
editingWallet: wallet,
|
||||
isWalletGroup: true,
|
||||
groupName: groupName,
|
||||
parentAddress: group.parentAddress,
|
||||
),
|
||||
);
|
||||
},
|
||||
shouldShowCurrentWalletPointer: true,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
margin: EdgeInsets.only(left: 20, right: 20, bottom: 12),
|
||||
title: groupName,
|
||||
tileKey: ValueKey('group_wallets_expansion_tile_widget_$index'),
|
||||
leadingWidget: Icon(
|
||||
Icons.account_balance_wallet_outlined,
|
||||
size: 28,
|
||||
),
|
||||
trailingWidget: EditWalletButtonWidget(
|
||||
width: 74,
|
||||
isGroup: true,
|
||||
isExpanded: widget.walletListViewModel.expansionTileStateTrack[index]!,
|
||||
onTap: () {
|
||||
final wallet = widget.walletListViewModel
|
||||
.convertWalletInfoToWalletListItem(group.wallets.first);
|
||||
Navigator.of(context).pushNamed(
|
||||
Routes.walletEdit,
|
||||
arguments: WalletEditPageArguments(
|
||||
walletListViewModel: widget.walletListViewModel,
|
||||
editingWallet: wallet,
|
||||
isWalletGroup: true,
|
||||
groupName: groupName,
|
||||
parentAddress: group.parentAddress,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
childWallets: group.wallets.map((walletInfo) {
|
||||
return widget.walletListViewModel.convertWalletInfoToWalletListItem(walletInfo);
|
||||
}).toList(),
|
||||
isSelected: false,
|
||||
onChildItemTapped: (wallet) =>
|
||||
wallet.isCurrent ? null : _loadWallet(wallet),
|
||||
childTrailingWidget: (item) {
|
||||
return item.isCurrent
|
||||
? SizedBox.shrink()
|
||||
: Padding(
|
||||
padding: const EdgeInsets.only(right: 16),
|
||||
child: EditWalletButtonWidget(
|
||||
width: 44,
|
||||
onTap: () => Navigator.of(context).pushNamed(
|
||||
Routes.walletEdit,
|
||||
arguments: WalletEditPageArguments(
|
||||
walletListViewModel: widget.walletListViewModel,
|
||||
editingWallet: item,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 24),
|
||||
},
|
||||
if (widget.walletListViewModel.singleWalletsList.isNotEmpty) ...{
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24),
|
||||
child: Text(
|
||||
S.current.single_seed_wallets_group,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
Container(
|
||||
child: Observer(
|
||||
builder: (_) => FilteredList(
|
||||
shrinkWrap: true,
|
||||
list: widget.walletListViewModel.singleWalletsList,
|
||||
updateFunction: widget.walletListViewModel.reorderAccordingToWalletList,
|
||||
itemBuilder: (context, index) {
|
||||
final wallet = widget.walletListViewModel.singleWalletsList[index];
|
||||
final currentColor = wallet.isCurrent
|
||||
? Theme.of(context)
|
||||
.extension<WalletListTheme>()!
|
||||
.createNewWalletButtonBackgroundColor
|
||||
: Theme.of(context).colorScheme.background;
|
||||
|
||||
return GroupedWalletExpansionTile(
|
||||
tileKey: ValueKey('single_wallets_expansion_tile_widget_$index'),
|
||||
isCurrentlySelectedWallet: wallet.isCurrent,
|
||||
leadingWidget: SizedBox(
|
||||
width: wallet.isCurrent ? 56 : 40,
|
||||
child: Row(
|
||||
children: [
|
||||
wallet.isCurrent
|
||||
? Container(
|
||||
height: 35,
|
||||
width: 6,
|
||||
margin: EdgeInsets.only(right: 16),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
topRight: Radius.circular(16),
|
||||
bottomRight: Radius.circular(16),
|
||||
),
|
||||
color: currentColor,
|
||||
),
|
||||
)
|
||||
: SizedBox(width: 6),
|
||||
Image.asset(
|
||||
walletTypeToCryptoCurrency(wallet.type).iconPath!,
|
||||
width: 32,
|
||||
height: 32,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
title: wallet.name,
|
||||
isSelected: false,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
margin: EdgeInsets.only(left: 20, right: 20, bottom: 12),
|
||||
onTitleTapped: () => wallet.isCurrent ? null : _loadWallet(wallet),
|
||||
trailingWidget: wallet.isCurrent
|
||||
? null
|
||||
: EditWalletButtonWidget(
|
||||
width: 44,
|
||||
onTap: () {
|
||||
Navigator.of(context).pushNamed(
|
||||
),
|
||||
childWallets: group.wallets.map((walletInfo) {
|
||||
return widget.walletListViewModel
|
||||
.convertWalletInfoToWalletListItem(
|
||||
walletInfo);
|
||||
}).toList(),
|
||||
isSelected: false,
|
||||
onChildItemTapped: (wallet) =>
|
||||
wallet.isCurrent ? null : _loadWallet(wallet),
|
||||
childTrailingWidget: (item) {
|
||||
return item.isCurrent
|
||||
? SizedBox.shrink()
|
||||
: Padding(
|
||||
padding: const EdgeInsets.only(right: 16),
|
||||
child: EditWalletButtonWidget(
|
||||
width: 44,
|
||||
onTap: () =>
|
||||
Navigator.of(context).pushNamed(
|
||||
Routes.walletEdit,
|
||||
arguments: WalletEditPageArguments(
|
||||
walletListViewModel: widget.walletListViewModel,
|
||||
editingWallet: wallet,
|
||||
walletListViewModel:
|
||||
widget.walletListViewModel,
|
||||
editingWallet: item,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
},
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
PrimaryImageButton(
|
||||
key: ValueKey('wallet_list_page_restore_wallet_button_key'),
|
||||
onPressed: () {
|
||||
if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) {
|
||||
widget.authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.restoreOptions,
|
||||
arguments: false,
|
||||
conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets,
|
||||
);
|
||||
} else {
|
||||
Navigator.of(context).pushNamed(Routes.restoreOptions, arguments: false);
|
||||
}
|
||||
},
|
||||
image: restoreWalletImage,
|
||||
text: S.of(context).wallet_list_restore_wallet,
|
||||
color: Theme.of(context).cardColor,
|
||||
textColor: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor,
|
||||
),
|
||||
SizedBox(height: 10.0),
|
||||
PrimaryImageButton(
|
||||
key: ValueKey('wallet_list_page_create_new_wallet_button_key'),
|
||||
onPressed: () {
|
||||
//TODO(David): Find a way to optimize this
|
||||
if (isSingleCoin) {
|
||||
if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) {
|
||||
widget.authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.newWallet,
|
||||
arguments: NewWalletArguments(
|
||||
type: widget.walletListViewModel.currentWalletType,
|
||||
),
|
||||
conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets,
|
||||
);
|
||||
} else {
|
||||
Navigator.of(context).pushNamed(
|
||||
Routes.newWallet,
|
||||
arguments: NewWalletArguments(
|
||||
type: widget.walletListViewModel.currentWalletType,
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) {
|
||||
widget.authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.newWalletType,
|
||||
conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets,
|
||||
);
|
||||
} else {
|
||||
Navigator.of(context).pushNamed(Routes.newWalletType);
|
||||
}
|
||||
}
|
||||
},
|
||||
image: newWalletImage,
|
||||
text: S.of(context).wallet_list_create_new_wallet,
|
||||
color: Theme.of(context).primaryColor,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 24),
|
||||
},
|
||||
if (widget
|
||||
.walletListViewModel.singleWalletsList.isNotEmpty) ...{
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24),
|
||||
child: Text(
|
||||
S.current.single_seed_wallets_group,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context)
|
||||
.extension<CakeTextTheme>()!
|
||||
.titleColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
Container(
|
||||
child: Observer(
|
||||
builder: (_) => FilteredList(
|
||||
shrinkWrap: true,
|
||||
list: widget.walletListViewModel.singleWalletsList,
|
||||
updateFunction: widget
|
||||
.walletListViewModel.reorderAccordingToWalletList,
|
||||
itemBuilder: (context, index) {
|
||||
final wallet = widget
|
||||
.walletListViewModel.singleWalletsList[index];
|
||||
final currentColor = wallet.isCurrent
|
||||
? Theme.of(context)
|
||||
.extension<WalletListTheme>()!
|
||||
.createNewWalletButtonBackgroundColor
|
||||
: Theme.of(context).colorScheme.background;
|
||||
|
||||
return GroupedWalletExpansionTile(
|
||||
tileKey: ValueKey(
|
||||
'single_wallets_expansion_tile_widget_$index'),
|
||||
isCurrentlySelectedWallet: wallet.isCurrent,
|
||||
leadingWidget: SizedBox(
|
||||
width: wallet.isCurrent ? 56 : 40,
|
||||
child: Row(
|
||||
children: [
|
||||
wallet.isCurrent
|
||||
? Container(
|
||||
height: 35,
|
||||
width: 6,
|
||||
margin: EdgeInsets.only(right: 16),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
topRight: Radius.circular(16),
|
||||
bottomRight: Radius.circular(16),
|
||||
),
|
||||
color: currentColor,
|
||||
),
|
||||
)
|
||||
: SizedBox(width: 6),
|
||||
Image.asset(
|
||||
walletTypeToCryptoCurrency(wallet.type)
|
||||
.iconPath!,
|
||||
width: 32,
|
||||
height: 32,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
title: wallet.name,
|
||||
isSelected: false,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
margin: EdgeInsets.only(
|
||||
left: 20, right: 20, bottom: 12),
|
||||
onTitleTapped: () =>
|
||||
wallet.isCurrent ? null : _loadWallet(wallet),
|
||||
trailingWidget: wallet.isCurrent
|
||||
? null
|
||||
: EditWalletButtonWidget(
|
||||
width: 44,
|
||||
onTap: () {
|
||||
Navigator.of(context).pushNamed(
|
||||
Routes.walletEdit,
|
||||
arguments: WalletEditPageArguments(
|
||||
walletListViewModel:
|
||||
widget.walletListViewModel,
|
||||
editingWallet: wallet,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 150),
|
||||
},
|
||||
],
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
bottom: 0.0,
|
||||
child: Container(
|
||||
//padding: EdgeInsets.only(top: 100),
|
||||
alignment: Alignment.bottomCenter,
|
||||
height: 185,
|
||||
//width: 600,
|
||||
//padding: EdgeInsets.only(top: 50),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
colors: <Color>[
|
||||
Theme.of(context).colorScheme.background.withAlpha(10),
|
||||
Theme.of(context).colorScheme.background,
|
||||
Theme.of(context).colorScheme.background,
|
||||
Theme.of(context).colorScheme.background
|
||||
],
|
||||
),
|
||||
),
|
||||
child: Container(
|
||||
height: 120,
|
||||
width: MediaQuery.of(context).size.width,
|
||||
//alignment: Alignment.bottomCenter,
|
||||
margin: EdgeInsets.only(bottom: 24),
|
||||
padding: EdgeInsets.only(left: 16, right: 16),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
PrimaryImageButton(
|
||||
key: ValueKey(
|
||||
'wallet_list_page_restore_wallet_button_key'),
|
||||
onPressed: () {
|
||||
if (widget.walletListViewModel
|
||||
.shouldRequireTOTP2FAForCreatingNewWallets) {
|
||||
widget.authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.restoreOptions,
|
||||
arguments: false,
|
||||
conditionToDetermineIfToUse2FA: widget
|
||||
.walletListViewModel
|
||||
.shouldRequireTOTP2FAForCreatingNewWallets,
|
||||
);
|
||||
} else {
|
||||
Navigator.of(context).pushNamed(Routes.restoreOptions,
|
||||
arguments: false);
|
||||
}
|
||||
},
|
||||
image: restoreWalletImage,
|
||||
text: S.of(context).wallet_list_restore_wallet,
|
||||
color: Theme.of(context).cardColor,
|
||||
textColor: Theme.of(context)
|
||||
.extension<CakeTextTheme>()!
|
||||
.buttonTextColor,
|
||||
),
|
||||
SizedBox(height: 10.0),
|
||||
PrimaryImageButton(
|
||||
key: ValueKey(
|
||||
'wallet_list_page_create_new_wallet_button_key'),
|
||||
onPressed: () {
|
||||
//TODO(David): Find a way to optimize this
|
||||
if (isSingleCoin) {
|
||||
if (widget.walletListViewModel
|
||||
.shouldRequireTOTP2FAForCreatingNewWallets) {
|
||||
widget.authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.newWallet,
|
||||
arguments: NewWalletArguments(
|
||||
type: widget
|
||||
.walletListViewModel.currentWalletType,
|
||||
),
|
||||
conditionToDetermineIfToUse2FA: widget
|
||||
.walletListViewModel
|
||||
.shouldRequireTOTP2FAForCreatingNewWallets,
|
||||
);
|
||||
} else {
|
||||
Navigator.of(context).pushNamed(
|
||||
Routes.newWallet,
|
||||
arguments: NewWalletArguments(
|
||||
type: widget
|
||||
.walletListViewModel.currentWalletType,
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (widget.walletListViewModel
|
||||
.shouldRequireTOTP2FAForCreatingNewWallets) {
|
||||
widget.authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.newWalletType,
|
||||
conditionToDetermineIfToUse2FA: widget
|
||||
.walletListViewModel
|
||||
.shouldRequireTOTP2FAForCreatingNewWallets,
|
||||
);
|
||||
} else {
|
||||
Navigator.of(context)
|
||||
.pushNamed(Routes.newWalletType);
|
||||
}
|
||||
}
|
||||
},
|
||||
image: newWalletImage,
|
||||
text: S.of(context).wallet_list_create_new_wallet,
|
||||
color: Theme.of(context).primaryColor,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -405,7 +485,8 @@ class WalletListBodyState extends State<WalletListBody> {
|
|||
if (SettingsStoreBase.walletPasswordDirectInput) {
|
||||
Navigator.of(context).pushNamed(Routes.walletUnlockLoadable,
|
||||
arguments: WalletUnlockArguments(
|
||||
callback: (bool isAuthenticatedSuccessfully, AuthPageState auth) async {
|
||||
callback:
|
||||
(bool isAuthenticatedSuccessfully, AuthPageState auth) async {
|
||||
if (isAuthenticatedSuccessfully) {
|
||||
auth.close();
|
||||
setState(() {});
|
||||
|
|
|
@ -6,7 +6,7 @@ import 'package:flutter_svg/flutter_svg.dart';
|
|||
|
||||
class DashBoardRoundedCardWidget extends StatelessWidget {
|
||||
DashBoardRoundedCardWidget({
|
||||
required this.onTap,
|
||||
this.onTap,
|
||||
required this.title,
|
||||
required this.subTitle,
|
||||
this.hint,
|
||||
|
@ -15,10 +15,14 @@ class DashBoardRoundedCardWidget extends StatelessWidget {
|
|||
this.icon,
|
||||
this.onClose,
|
||||
this.customBorder,
|
||||
this.shadowSpread,
|
||||
this.shadowBlur,
|
||||
super.key,
|
||||
this.marginV,
|
||||
this.marginH,
|
||||
});
|
||||
|
||||
final VoidCallback onTap;
|
||||
final VoidCallback? onTap;
|
||||
final VoidCallback? onClose;
|
||||
final String title;
|
||||
final String subTitle;
|
||||
|
@ -27,26 +31,41 @@ class DashBoardRoundedCardWidget extends StatelessWidget {
|
|||
final Widget? icon;
|
||||
final Image? image;
|
||||
final double? customBorder;
|
||||
final double? marginV;
|
||||
final double? marginH;
|
||||
final double? shadowSpread;
|
||||
final double? shadowBlur;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
onTap: onTap,
|
||||
hoverColor: Colors.transparent,
|
||||
splashColor: Colors.transparent,
|
||||
highlightColor: Colors.transparent,
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
padding: EdgeInsets.all(20),
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
|
||||
borderRadius: BorderRadius.circular(customBorder ?? 20),
|
||||
border: Border.all(
|
||||
color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
|
||||
),
|
||||
return Stack(
|
||||
children: [
|
||||
Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: marginH ?? 20, vertical: marginV ?? 8),
|
||||
//padding: EdgeInsets.all(20),
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(customBorder ?? 20),
|
||||
border: Border.all(
|
||||
color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
|
||||
),
|
||||
// boxShadow: [
|
||||
// BoxShadow(
|
||||
// color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor
|
||||
// .withAlpha(50),
|
||||
// spreadRadius: shadowSpread ?? 3,
|
||||
// blurRadius: shadowBlur ?? 7,
|
||||
// )
|
||||
// ],
|
||||
),
|
||||
child: TextButton(
|
||||
onPressed: onTap,
|
||||
style: TextButton.styleFrom(
|
||||
backgroundColor:
|
||||
Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(customBorder ?? 20)),
|
||||
padding: EdgeInsets.all(24)),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
|
@ -59,8 +78,9 @@ class DashBoardRoundedCardWidget extends StatelessWidget {
|
|||
Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
color:
|
||||
Theme.of(context).extension<DashboardPageTheme>()!.cardTextColor,
|
||||
color: Theme.of(context)
|
||||
.extension<DashboardPageTheme>()!
|
||||
.cardTextColor,
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.w900,
|
||||
),
|
||||
|
@ -80,8 +100,7 @@ class DashBoardRoundedCardWidget extends StatelessWidget {
|
|||
],
|
||||
),
|
||||
),
|
||||
if (image != null) image!
|
||||
else if (svgPicture != null) svgPicture!,
|
||||
if (image != null) image! else if (svgPicture != null) svgPicture!,
|
||||
if (icon != null) icon!
|
||||
],
|
||||
),
|
||||
|
@ -92,18 +111,18 @@ class DashBoardRoundedCardWidget extends StatelessWidget {
|
|||
],
|
||||
),
|
||||
),
|
||||
if (onClose != null)
|
||||
Positioned(
|
||||
top: 10,
|
||||
right: 10,
|
||||
child: IconButton(
|
||||
icon: Icon(Icons.close),
|
||||
onPressed: onClose,
|
||||
color: Theme.of(context).extension<DashboardPageTheme>()!.cardTextColor,
|
||||
),
|
||||
),
|
||||
if (onClose != null)
|
||||
Positioned(
|
||||
top: 10,
|
||||
right: 10,
|
||||
child: IconButton(
|
||||
icon: Icon(Icons.close),
|
||||
onPressed: onClose,
|
||||
color: Theme.of(context).extension<DashboardPageTheme>()!.cardTextColor,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,16 +19,17 @@ class OptionTile extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: onPressed,
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
padding: EdgeInsets.all(24),
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
color: Theme.of(context).cardColor,
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
padding: EdgeInsets.only(left: 6, right: 6),
|
||||
alignment: Alignment.center,
|
||||
child: TextButton(
|
||||
style: TextButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).cardColor,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
||||
padding: EdgeInsets.all(24)
|
||||
),
|
||||
onPressed: onPressed,
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
@ -48,7 +49,9 @@ class OptionTile extends StatelessWidget {
|
|||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context).extension<OptionTileTheme>()!.titleColor,
|
||||
color: Theme.of(context)
|
||||
.extension<OptionTileTheme>()!
|
||||
.titleColor,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
|
@ -58,7 +61,9 @@ class OptionTile extends StatelessWidget {
|
|||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.normal,
|
||||
color: Theme.of(context).extension<OptionTileTheme>()!.descriptionColor,
|
||||
color: Theme.of(context)
|
||||
.extension<OptionTileTheme>()!
|
||||
.descriptionColor,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:cake_wallet/themes/extensions/menu_theme.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/option_tile_theme.dart';
|
||||
|
||||
class SettingActionButton extends StatelessWidget {
|
||||
final bool isLastTile;
|
||||
|
@ -29,56 +33,64 @@ class SettingActionButton extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final isLightMode = Theme.of(context).extension<OptionTileTheme>()?.useDarkImage ?? false;
|
||||
Color? color = isSelected
|
||||
? Theme.of(context).extension<CakeMenuTheme>()!.settingTitleColor
|
||||
: selectionActive
|
||||
? Palette.darkBlue
|
||||
: Theme.of(context).extension<CakeMenuTheme>()!.settingTitleColor;
|
||||
return InkWell(
|
||||
onTap: onTap,
|
||||
hoverColor: Colors.transparent,
|
||||
child: Container(
|
||||
height: tileHeight,
|
||||
padding: isLastTile
|
||||
? EdgeInsets.only(
|
||||
left: 24,
|
||||
right: 24,
|
||||
top: fromBottomEdge,
|
||||
)
|
||||
: EdgeInsets.only(left: 24, right: 24),
|
||||
alignment: isLastTile ? Alignment.topLeft : null,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Image.asset(
|
||||
image,
|
||||
height: 16,
|
||||
width: 16,
|
||||
color: Theme.of(context)
|
||||
.extension<CakeMenuTheme>()!
|
||||
.settingActionsIconColor,
|
||||
? Palette.darkBlue
|
||||
: Theme.of(context).extension<CakeMenuTheme>()!.settingTitleColor;
|
||||
return Container(
|
||||
//padding: EdgeInsets.only(top: 5, left: 15, bottom: 5),
|
||||
margin: EdgeInsets.only(top: 10, left: 20, bottom: 0, right: 20),
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
backgroundColor: MaterialStateProperty.all(isLightMode ? Theme.of(context).cardColor : Colors.black12),
|
||||
shape: MaterialStateProperty.all(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
SizedBox(width: 16),
|
||||
Expanded(
|
||||
child: Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
color: color,
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
onPressed: onTap,
|
||||
//hoverColor: Colors.transparent,
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
padding: EdgeInsets.only(top: 12, left: 20, bottom: 12, right: 15),
|
||||
//margin: EdgeInsets.only(top: 5, left: 15, bottom: 5),
|
||||
alignment: isLastTile ? Alignment.topLeft : null,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Image.asset(
|
||||
image,
|
||||
height: 16,
|
||||
width: 16,
|
||||
color: Theme.of(context)
|
||||
.extension<CakeMenuTheme>()!
|
||||
.settingActionsIconColor,
|
||||
),
|
||||
SizedBox(width: 16),
|
||||
Expanded(
|
||||
child: Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
color: color,
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (isArrowVisible)
|
||||
Icon(
|
||||
Icons.arrow_forward_ios,
|
||||
color: color,
|
||||
size: 16,
|
||||
)
|
||||
],
|
||||
if(isArrowVisible)
|
||||
Icon(
|
||||
Icons.arrow_forward_ios,
|
||||
color: Colors.grey,
|
||||
size: 16,
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,7 +17,6 @@ class SettingActions {
|
|||
|
||||
static List<SettingActions> all = [
|
||||
connectionSettingAction,
|
||||
walletSettingAction,
|
||||
addressBookSettingAction,
|
||||
silentPaymentsSettingAction,
|
||||
litecoinMwebSettingAction,
|
||||
|
@ -31,7 +30,6 @@ class SettingActions {
|
|||
|
||||
static List<SettingActions> desktopSettings = [
|
||||
connectionSettingAction,
|
||||
walletSettingAction,
|
||||
addressBookSettingAction,
|
||||
silentPaymentsSettingAction,
|
||||
securityBackupSettingAction,
|
||||
|
@ -77,18 +75,6 @@ class SettingActions {
|
|||
},
|
||||
);
|
||||
|
||||
static SettingActions walletSettingAction = SettingActions._(
|
||||
key: ValueKey('dashboard_page_menu_widget_wallet_menu_button_key'),
|
||||
name: (context) => S.of(context).wallets,
|
||||
image: 'assets/images/wallet_menu.png',
|
||||
onTap: (BuildContext context) {
|
||||
Navigator.of(context).pushNamed(Routes.walletList, arguments: (_) {
|
||||
Navigator.of(context).pop(); // pops wallet list
|
||||
Navigator.of(context).pop(); // pops drawer
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
static SettingActions addressBookSettingAction = SettingActions._(
|
||||
key: ValueKey('dashboard_page_menu_widget_address_book_button_key'),
|
||||
name: (context) => S.of(context).address_book_menu,
|
||||
|
|
|
@ -21,16 +21,20 @@ class StandardListRow extends StatelessWidget {
|
|||
Widget build(BuildContext context) {
|
||||
final leading = buildLeading(context);
|
||||
final trailing = buildTrailing(context);
|
||||
|
||||
return InkWell(
|
||||
onTap: () => onTap?.call(context),
|
||||
child: Container(
|
||||
return Container(
|
||||
height: 56,
|
||||
padding: EdgeInsets.only(left: 24, right: 24),
|
||||
decoration: decoration ??
|
||||
BoxDecoration(
|
||||
color: Theme.of(context).colorScheme.background,
|
||||
padding: EdgeInsets.only(left: 12, right: 12),
|
||||
child: TextButton(
|
||||
onPressed: () => onTap?.call(context),
|
||||
style: ButtonStyle(
|
||||
//backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor),
|
||||
shape: MaterialStateProperty.all(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
|
@ -97,10 +101,10 @@ class StandardListSeparator extends StatelessWidget {
|
|||
return Container(
|
||||
height: height,
|
||||
padding: padding,
|
||||
color: Theme.of(context).colorScheme.background,
|
||||
color: Colors.transparent,
|
||||
child: Container(
|
||||
height: height,
|
||||
color: Theme.of(context).extension<CakeTextTheme>()!.textfieldUnderlineColor,
|
||||
color: Colors.transparent,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
@ -140,6 +144,7 @@ class SectionStandardList extends StatelessWidget {
|
|||
|
||||
final int sectionCount;
|
||||
final bool hasTopSeparator;
|
||||
|
||||
final int Function(int sectionIndex) itemCounter;
|
||||
final Widget Function(int sectionIndex, int itemIndex) itemBuilder;
|
||||
final Widget Function(int sectionIndex)? sectionTitleBuilder;
|
||||
|
|
|
@ -21,6 +21,7 @@ import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
|
|||
import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
|
||||
import 'package:cake_wallet/themes/theme_base.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -28,6 +29,8 @@ import 'package:flutter/material.dart';
|
|||
class MoneroDarkTheme extends DarkTheme {
|
||||
MoneroDarkTheme({required int raw}) : super(raw: raw);
|
||||
|
||||
@override
|
||||
ThemeType get type => ThemeType.oled;
|
||||
@override
|
||||
String get title => S.current.monero_dark_theme;
|
||||
@override
|
||||
|
|
|
@ -27,7 +27,7 @@ import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart';
|
|||
import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
enum ThemeType { light, bright, dark }
|
||||
enum ThemeType { light, bright, dark, oled}
|
||||
|
||||
abstract class ThemeBase {
|
||||
ThemeBase({required this.raw}) {
|
||||
|
|
|
@ -52,6 +52,8 @@ import 'package:http/http.dart' as http;
|
|||
import 'package:mobx/mobx.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../../themes/theme_base.dart';
|
||||
|
||||
part 'dashboard_view_model.g.dart';
|
||||
|
||||
class DashboardViewModel = DashboardViewModelBase with _$DashboardViewModel;
|
||||
|
@ -70,7 +72,7 @@ abstract class DashboardViewModelBase with Store {
|
|||
required this.sharedPreferences,
|
||||
required this.keyService})
|
||||
: hasTradeAction = false,
|
||||
hasExchangeAction = false,
|
||||
hasSwapAction = false,
|
||||
isShowFirstYatIntroduction = false,
|
||||
isShowSecondYatIntroduction = false,
|
||||
isShowThirdYatIntroduction = false,
|
||||
|
@ -480,6 +482,34 @@ abstract class DashboardViewModelBase with Store {
|
|||
@computed
|
||||
bool get hasEnabledMwebBefore => settingsStore.hasEnabledMwebBefore;
|
||||
|
||||
@action
|
||||
double getShadowSpread() {
|
||||
double spread = 0;
|
||||
if (settingsStore.currentTheme.type == ThemeType.bright)
|
||||
spread = 0;
|
||||
else if (settingsStore.currentTheme.type == ThemeType.light)
|
||||
spread = 0;
|
||||
else if (settingsStore.currentTheme.type == ThemeType.dark)
|
||||
spread = 0;
|
||||
else if (settingsStore.currentTheme.type == ThemeType.oled)
|
||||
spread = 0;
|
||||
return spread;
|
||||
}
|
||||
|
||||
@action
|
||||
double getShadowBlur() {
|
||||
double blur = 0;
|
||||
if (settingsStore.currentTheme.type == ThemeType.bright)
|
||||
blur = 0;
|
||||
else if (settingsStore.currentTheme.type == ThemeType.light)
|
||||
blur = 0;
|
||||
else if (settingsStore.currentTheme.type == ThemeType.dark)
|
||||
blur = 0;
|
||||
else if (settingsStore.currentTheme.type == ThemeType.oled)
|
||||
blur = 0;
|
||||
return blur;
|
||||
}
|
||||
|
||||
@action
|
||||
void setMwebEnabled() {
|
||||
if (!hasMweb) {
|
||||
|
@ -530,10 +560,10 @@ abstract class DashboardViewModelBase with Store {
|
|||
void furtherShowYatPopup(bool shouldShow) => settingsStore.shouldShowYatPopup = shouldShow;
|
||||
|
||||
@computed
|
||||
bool get isEnabledExchangeAction => settingsStore.exchangeStatus != ExchangeApiMode.disabled;
|
||||
bool get isEnabledSwapAction => settingsStore.exchangeStatus != ExchangeApiMode.disabled;
|
||||
|
||||
@observable
|
||||
bool hasExchangeAction;
|
||||
bool hasSwapAction;
|
||||
|
||||
@computed
|
||||
bool get isEnabledTradeAction => !settingsStore.disableTradeOption;
|
||||
|
@ -736,7 +766,7 @@ abstract class DashboardViewModelBase with Store {
|
|||
}
|
||||
|
||||
void updateActions() {
|
||||
hasExchangeAction = !isHaven;
|
||||
hasSwapAction = !isHaven;
|
||||
hasTradeAction = !isHaven;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,9 @@ abstract class DisplaySettingsViewModelBase with Store {
|
|||
@computed
|
||||
bool get disabledFiatApiMode => _settingsStore.fiatApiMode == FiatApiMode.disabled;
|
||||
|
||||
@computed
|
||||
bool get showAddressBookPopup => _settingsStore.showAddressBookPopupEnabled;
|
||||
|
||||
@action
|
||||
void setBalanceDisplayMode(BalanceDisplayMode value) => _settingsStore.balanceDisplayMode = value;
|
||||
|
||||
|
@ -66,4 +69,8 @@ abstract class DisplaySettingsViewModelBase with Store {
|
|||
void setShouldShowMarketPlaceInDashbaord(bool value) {
|
||||
_settingsStore.shouldShowMarketPlaceInDashboard = value;
|
||||
}
|
||||
|
||||
@action
|
||||
void setShowAddressBookPopup(bool value) => _settingsStore.showAddressBookPopupEnabled = value;
|
||||
|
||||
}
|
||||
|
|
|
@ -60,10 +60,6 @@ abstract class OtherSettingsViewModelBase with Store {
|
|||
bool get changeRepresentativeEnabled =>
|
||||
_wallet.type == WalletType.nano || _wallet.type == WalletType.banano;
|
||||
|
||||
@computed
|
||||
bool get showAddressBookPopup => _settingsStore.showAddressBookPopupEnabled;
|
||||
|
||||
|
||||
@computed
|
||||
bool get displayTransactionPriority => !(changeRepresentativeEnabled ||
|
||||
_wallet.type == WalletType.solana ||
|
||||
|
@ -118,9 +114,6 @@ abstract class OtherSettingsViewModelBase with Store {
|
|||
return customItem != null ? priorities.indexOf(customItem) : null;
|
||||
}
|
||||
|
||||
@action
|
||||
void setShowAddressBookPopup(bool value) => _settingsStore.showAddressBookPopupEnabled = value;
|
||||
|
||||
int? get maxCustomFeeRate {
|
||||
if (_wallet.type == WalletType.bitcoin) {
|
||||
return bitcoin!.getMaxCustomFeeRate(_wallet);
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Etherscan تاريخ",
|
||||
"event": "ﺙﺪﺣ",
|
||||
"events": "ﺙﺍﺪﺣﻷﺍ",
|
||||
"exchange": "تبديل",
|
||||
"exchange": "تبادل",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "إذا كنت ترغب في تبديل XMR من رصيد محفظة الكعكة ، فيرجى التبديل إلى محفظة Monero أولاً.",
|
||||
"exchange_new_template": "قالب جديد",
|
||||
"exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "شارك العنوان",
|
||||
"shared_seed_wallet_groups": "مجموعات محفظة البذور المشتركة",
|
||||
"show": "يعرض",
|
||||
"show_address_book_popup": "عرض \"إضافة إلى كتاب العناوين\" المنبثقة بعد الإرسال",
|
||||
"show_address_book_popup": "عرض دفتر العناوين المنبثقة",
|
||||
"show_balance": "اضغط لفترة طويلة لإظهار التوازن",
|
||||
"show_balance_toast": "اضغط لفترة طويلة لإخفاء أو إظهار التوازن",
|
||||
"show_details": "اظهر التفاصيل",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "مستندات محفظة كعكة",
|
||||
"support_title_live_chat": "الدعم المباشر",
|
||||
"support_title_other_links": "روابط دعم أخرى",
|
||||
"swap": "تبديل",
|
||||
"sweeping_wallet": "كنس المحفظة",
|
||||
"sweeping_wallet_alert": "لن يستغرق هذا وقتًا طويلاً. لا تترك هذه الشاشة وإلا فقد يتم فقد أموال سويبت",
|
||||
"switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "История на Etherscan",
|
||||
"event": "Събитие",
|
||||
"events": "събития",
|
||||
"exchange": "Разметка",
|
||||
"exchange": "Обмен",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Ако искате да смените XMR от вашия баланс на портфейла на тортата Monero, моля, преминете първо към вашия портфейл Monero.",
|
||||
"exchange_new_template": "Нов шаблон",
|
||||
"exchange_provider_unsupported": "${providerName} вече не се поддържа!",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Сподели адрес",
|
||||
"shared_seed_wallet_groups": "Споделени групи за портфейли за семена",
|
||||
"show": "Показване",
|
||||
"show_address_book_popup": "Показване на изскачането на „Добавяне към адресната книга“ след изпращане",
|
||||
"show_address_book_popup": "Показване на изскачащ прозорец на адресна книга",
|
||||
"show_balance": "Дълго натиснете, за да покажете баланса",
|
||||
"show_balance_toast": "Дълго натискане, за да се скрие или покаже баланс",
|
||||
"show_details": "Показване на подробностите",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Документи за портфейл за торта",
|
||||
"support_title_live_chat": "Подкрепа на живо",
|
||||
"support_title_other_links": "Други връзки за поддръжка",
|
||||
"swap": "Разметка",
|
||||
"sweeping_wallet": "Метещ портфейл",
|
||||
"sweeping_wallet_alert": "Това не трябва да отнема много време. Не оставяйте този екран или пометените средства могат да бъдат загубени.",
|
||||
"switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Historie Etherscanu",
|
||||
"event": "událost",
|
||||
"events": "Události",
|
||||
"exchange": "Swap",
|
||||
"exchange": "Výměna",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Pokud chcete vyměnit XMR z vaší dortové peněženky Monero Balance, nejprve přepněte na peněženku Monero.",
|
||||
"exchange_new_template": "Nová šablona",
|
||||
"exchange_provider_unsupported": "${providerName} již není podporováno!",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Sdílet adresu",
|
||||
"shared_seed_wallet_groups": "Skupiny sdílených semen",
|
||||
"show": "Show",
|
||||
"show_address_book_popup": "Po odeslání zobrazíte vyskakovací okno „Přidat do adresáře“",
|
||||
"show_address_book_popup": "Zobrazit vyskakovací okno",
|
||||
"show_balance": "Dlouhý stisknutí zobrazí rovnováhu",
|
||||
"show_balance_toast": "Dlouhý stiskněte pro skrytí nebo zobrazení rovnováhy",
|
||||
"show_details": "Zobrazit detaily",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Dokumenty peněženky dortu",
|
||||
"support_title_live_chat": "Živá podpora",
|
||||
"support_title_other_links": "Další odkazy na podporu",
|
||||
"swap": "Swap",
|
||||
"sweeping_wallet": "Zametací peněženka",
|
||||
"sweeping_wallet_alert": "To by nemělo trvat dlouho. Nenechávejte tuto obrazovku, jinak mohou být ztraceny prostředky.",
|
||||
"switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu",
|
||||
|
|
|
@ -514,8 +514,8 @@
|
|||
"placeholder_transactions": "Ihre Transaktionen werden hier angezeigt",
|
||||
"please_fill_totp": "Bitte geben Sie den 8-stelligen Code ein, der auf Ihrem anderen Gerät vorhanden ist",
|
||||
"please_make_selection": "Bitte treffen Sie unten eine Auswahl zum Erstellen oder Wiederherstellen Ihrer Wallet.",
|
||||
"Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
|
||||
"please_reference_document": "Bitte verweisen Sie auf die folgenden Dokumente, um weitere Informationen zu erhalten.",
|
||||
"Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
|
||||
"please_select": "Bitte auswählen:",
|
||||
"please_select_backup_file": "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein.",
|
||||
"please_try_to_connect_to_another_node": "Bitte versuchen Sie, sich mit einem anderen Knoten zu verbinden",
|
||||
|
@ -782,6 +782,7 @@
|
|||
"support_title_guides": "Cake Wallet Docs",
|
||||
"support_title_live_chat": "Live Support",
|
||||
"support_title_other_links": "Andere Support-Links",
|
||||
"swap": "Tauschen",
|
||||
"sweeping_wallet": "Wallet leeren",
|
||||
"sweeping_wallet_alert": "Das sollte nicht lange dauern. VERLASSEN SIE DIESEN BILDSCHIRM NICHT, ANDERNFALLS KÖNNEN DIE GELDER VERLOREN GEHEN",
|
||||
"switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Etherscan history",
|
||||
"event": "Event",
|
||||
"events": "Events",
|
||||
"exchange": "Swap",
|
||||
"exchange": "Exchange",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "If you want to swap XMR from your Cake Wallet Monero balance, please switch to your Monero wallet first.",
|
||||
"exchange_new_template": "New template",
|
||||
"exchange_provider_unsupported": "${providerName} is no longer supported!",
|
||||
|
@ -734,7 +734,7 @@
|
|||
"share_address": "Share address",
|
||||
"shared_seed_wallet_groups": "Shared Seed Wallet Groups",
|
||||
"show": "Show",
|
||||
"show_address_book_popup": "Show 'Add to Address Book' popup after sending",
|
||||
"show_address_book_popup": "Show Address Book popup",
|
||||
"show_balance": "Long Press to Show Balance",
|
||||
"show_balance_toast": "Long press to hide or show balance",
|
||||
"show_details": "Show Details",
|
||||
|
@ -782,6 +782,7 @@
|
|||
"support_title_guides": "Cake Wallet docs",
|
||||
"support_title_live_chat": "Live support",
|
||||
"support_title_other_links": "Other support links",
|
||||
"swap": "Swap",
|
||||
"sweeping_wallet": "Sweeping wallet",
|
||||
"sweeping_wallet_alert": "This shouldn’t take long. DO NOT LEAVE THIS SCREEN OR THE SWEPT FUNDS MAY BE LOST.",
|
||||
"switchToETHWallet": "Please switch to an Ethereum wallet and try again",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "historia de etherscan",
|
||||
"event": "Evento",
|
||||
"events": "Eventos",
|
||||
"exchange": "Intercambiar",
|
||||
"exchange": "Intercambio",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Si desea intercambiar XMR desde su billetera de pastel Monero Balance, primero cambie a su billetera Monero.",
|
||||
"exchange_new_template": "Nueva plantilla",
|
||||
"exchange_provider_unsupported": "¡${providerName} ya no es compatible!",
|
||||
|
@ -734,7 +734,7 @@
|
|||
"share_address": "Compartir dirección",
|
||||
"shared_seed_wallet_groups": "Grupos de billetera de semillas compartidas",
|
||||
"show": "Espectáculo",
|
||||
"show_address_book_popup": "Mostrar ventana emergente 'Agregar a la libreta de direcciones' después de enviar",
|
||||
"show_address_book_popup": "Mostrar la ventana emergente de la libreta de direcciones",
|
||||
"show_balance": "Prensa larga para mostrar equilibrio",
|
||||
"show_balance_toast": "Prensa larga para esconder o mostrar equilibrio",
|
||||
"show_details": "Mostrar detalles",
|
||||
|
@ -782,6 +782,7 @@
|
|||
"support_title_guides": "Documentos de billetera de pastel",
|
||||
"support_title_live_chat": "Soporte en tiempo real",
|
||||
"support_title_other_links": "Otros enlaces de soporte",
|
||||
"swap": "Intercambio",
|
||||
"sweeping_wallet": "Barrer billetera (gastar todos los fondos disponibles)",
|
||||
"sweeping_wallet_alert": "Esto no debería llevar mucho tiempo. NO DEJES ESTA PANTALLA O SE PUEDEN PERDER LOS FONDOS BARRIDOS",
|
||||
"switchToETHWallet": "Cambia a una billetera Ethereum e inténtelo nuevamente.",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Historique Etherscan",
|
||||
"event": "Événement",
|
||||
"events": "Événements",
|
||||
"exchange": "Échanger",
|
||||
"exchange": "Échange",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Si vous souhaitez échanger des XMR depuis le solde Monero de votre Cake Wallet, veuillez d'abord passer à votre portefeuille Monero.",
|
||||
"exchange_new_template": "Nouveau modèle d'échange",
|
||||
"exchange_provider_unsupported": "${providerName} n'est plus pris en charge !",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Partager l'adresse",
|
||||
"shared_seed_wallet_groups": "Groupes de portefeuilles partagés",
|
||||
"show": "Montrer",
|
||||
"show_address_book_popup": "Afficher la popup `` Ajouter au carnet d'adresses '' après avoir envoyé",
|
||||
"show_address_book_popup": "Afficher la fenêtre contextuelle du carnet d'adresses",
|
||||
"show_balance": "Longue presse pour montrer l'équilibre",
|
||||
"show_balance_toast": "Longue appuyez sur pour masquer ou afficher l'équilibre",
|
||||
"show_details": "Afficher les détails",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Docs de portefeuille à gâteau",
|
||||
"support_title_live_chat": "Support en direct",
|
||||
"support_title_other_links": "Autres liens d'assistance",
|
||||
"swap": "Échanger",
|
||||
"sweeping_wallet": "Portefeuille (wallet) de consolidation",
|
||||
"sweeping_wallet_alert": "Cela ne devrait pas prendre longtemps. NE QUITTEZ PAS CET ÉCRAN OU LES FONDS TRANSFÉRÉS POURRAIENT ÊTRE PERDUS.",
|
||||
"switchToETHWallet": "Veuillez passer à un portefeuille (wallet) Ethereum et réessayer",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Etherscan tarihin kowane zamani",
|
||||
"event": "Lamarin",
|
||||
"events": "Abubuwan da suka faru",
|
||||
"exchange": "Musya",
|
||||
"exchange": "Canji",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Idan kana son canza XMR daga walat ɗin Bed Wallet ɗinka, da fatan za a canza zuwa walat ɗinku na Monero.",
|
||||
"exchange_new_template": "Sabon template",
|
||||
"exchange_provider_unsupported": "${providerName}",
|
||||
|
@ -735,7 +735,7 @@
|
|||
"share_address": "Raba adireshin",
|
||||
"shared_seed_wallet_groups": "Raba ƙungiya walat",
|
||||
"show": "Nuna",
|
||||
"show_address_book_popup": "Nuna 'ƙara don magance littafin' Popup bayan aikawa",
|
||||
"show_address_book_popup": "Nuna littafin littafin adireshi",
|
||||
"show_balance": "Dogon latsawa don nuna ma'auni",
|
||||
"show_balance_toast": "Latsa latsawa don ɓoye ko nuna ma'auni",
|
||||
"show_details": "Nuna Cikakkun bayanai",
|
||||
|
@ -783,6 +783,7 @@
|
|||
"support_title_guides": "Docs Bakin",
|
||||
"support_title_live_chat": "Tallafi na Live",
|
||||
"support_title_other_links": "Sauran hanyoyin tallafi",
|
||||
"swap": "Musya",
|
||||
"sweeping_wallet": "Kashi na kasa",
|
||||
"sweeping_wallet_alert": "Wannan ba zai samu lokacin mai tsaski. KADA KA SAMU KUNGIYARAN KUHON, ZAMAN DADIN BANKUNCI ZAI HAŘA",
|
||||
"switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "इथरस्कैन इतिहास",
|
||||
"event": "आयोजन",
|
||||
"events": "आयोजन",
|
||||
"exchange": "बदलना",
|
||||
"exchange": "अदला-बदली",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "यदि आप अपने केक वॉलेट मोनेरो बैलेंस से XMR को स्वैप करना चाहते हैं, तो कृपया पहले अपने मोनेरो वॉलेट पर स्विच करें।",
|
||||
"exchange_new_template": "नया टेम्पलेट",
|
||||
"exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!",
|
||||
|
@ -735,9 +735,9 @@
|
|||
"share_address": "पता साझा करें",
|
||||
"shared_seed_wallet_groups": "साझा बीज बटुए समूह",
|
||||
"show": "दिखाओ",
|
||||
"show_address_book_popup": "भेजने के बाद 'एड एड्रेस बुक' पॉपअप दिखाएं",
|
||||
"show_address_book_popup": "पता बुक पॉपअप दिखाएं",
|
||||
"show_balance": "बैलेंस दिखाने के लिए लॉन्ग प्रेस",
|
||||
"show_balance_toast": "बैलेंस को छिपाने या दिखाने के लिए लॉन्ग प्रेस",
|
||||
"show_balance_toast": "संतुलन को छिपाने या दिखाने के लिए लॉन्ग प्रेस",
|
||||
"show_details": "विवरण दिखाएं",
|
||||
"show_keys": "बीज / कुंजियाँ दिखाएँ",
|
||||
"show_market_place": "बाज़ार दिखाएँ",
|
||||
|
@ -783,6 +783,7 @@
|
|||
"support_title_guides": "केक बटुए डॉक्स",
|
||||
"support_title_live_chat": "लाइव सहायता",
|
||||
"support_title_other_links": "अन्य समर्थन लिंक",
|
||||
"swap": "बदलना",
|
||||
"sweeping_wallet": "स्वीपिंग वॉलेट",
|
||||
"sweeping_wallet_alert": "इसमें अधिक समय नहीं लगना चाहिए। इस स्क्रीन को न छोड़ें या स्वैप्ट फंड खो सकते हैं",
|
||||
"switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Etherscan povijest",
|
||||
"event": "Događaj",
|
||||
"events": "Događaji",
|
||||
"exchange": "Zamjena",
|
||||
"exchange": "Razmjena",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Ako želite zamijeniti XMR iz vašeg novčanika za kolač Monero, prvo se prebacite na svoj novčanik Monero.",
|
||||
"exchange_new_template": "Novi predložak",
|
||||
"exchange_provider_unsupported": "${providerName} više nije podržan!",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Podijeli adresu",
|
||||
"shared_seed_wallet_groups": "Zajedničke grupe za sjeme novčanika",
|
||||
"show": "Pokazati",
|
||||
"show_address_book_popup": "Pokažite \"dodaj u adresar\" skočni prozor nakon slanja",
|
||||
"show_address_book_popup": "Prikaži Popup adresara",
|
||||
"show_balance": "Dugački pritisak za pokazivanje ravnoteže",
|
||||
"show_balance_toast": "Dugo pritisnite da biste sakrili ili pokazali ravnotežu",
|
||||
"show_details": "Prikaži pojedinosti",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Dokumenti s kolačem kolača",
|
||||
"support_title_live_chat": "Podrška uživo",
|
||||
"support_title_other_links": "Ostale veze za podršku",
|
||||
"swap": "Mijenjati",
|
||||
"sweeping_wallet": "Čisti novčanik",
|
||||
"sweeping_wallet_alert": "Ovo ne bi trebalo dugo trajati. NE NAPUŠTAJTE OVAJ ZASLON INAČE SE POBREŠENA SREDSTVA MOGU IZGUBITI",
|
||||
"switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Etherscan պատմություն",
|
||||
"event": "Իրադարձություն",
|
||||
"events": "Իրադարձություններ",
|
||||
"exchange": "Փոխանակել",
|
||||
"exchange": "Փոխանակում",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Եթե ցանկանում եք փոխանակել XMR ձեր տորթի դրամապանակից Monero Relandal- ից, խնդրում ենք նախ անցնել ձեր Monero դրամապանակին:",
|
||||
"exchange_new_template": "Նոր տեսակ",
|
||||
"exchange_provider_unsupported": "${providerName} այլևս չի ապահովվում",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Կիսվել հասցեով",
|
||||
"shared_seed_wallet_groups": "Համօգտագործված սերմերի դրամապանակների խմբեր",
|
||||
"show": "Ցուցահանդես",
|
||||
"show_address_book_popup": "Show ույց տալ «Ուղարկելուց հետո« Հասցեների գրքի »թռուցիկ",
|
||||
"show_address_book_popup": "Show ուցադրել հասցեի գրքի թռուցիկ",
|
||||
"show_balance": "Երկար մամուլ, հավասարակշռությունը ցույց տալու համար",
|
||||
"show_balance_toast": "Երկար սեղմեք `հավասարակշռությունը թաքցնելու կամ ցույց տալու համար",
|
||||
"show_details": "Ցուցադրել մանրամասներ",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Տորթ դրամապանակի փաստաթղթեր",
|
||||
"support_title_live_chat": "Անմիջական աջակցություն",
|
||||
"support_title_other_links": "Այլ աջակցության հղումներ",
|
||||
"swap": "Փոխանակել",
|
||||
"sweeping_wallet": "Դրամապանակը մաքրվում է",
|
||||
"sweeping_wallet_alert": "Սա չի տևի երկար։ Խնդրում ենք չլքել այս էկրանը կամ մաքրված միջոցները կկորչեն։",
|
||||
"switchToETHWallet": "Խնդրում ենք անցնել Ethereum դրամապանակ և փորձել կրկին",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Sejarah Etherscan",
|
||||
"event": "Peristiwa",
|
||||
"events": "Acara",
|
||||
"exchange": "Menukar",
|
||||
"exchange": "Menukarkan",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Jika Anda ingin bertukar XMR dari Saldo Monero Dompet Kue Anda, silakan beralih ke Monero Wallet Anda terlebih dahulu.",
|
||||
"exchange_new_template": "Template baru",
|
||||
"exchange_provider_unsupported": "${providerName} tidak lagi didukung!",
|
||||
|
@ -736,7 +736,7 @@
|
|||
"share_address": "Bagikan alamat",
|
||||
"shared_seed_wallet_groups": "Kelompok dompet benih bersama",
|
||||
"show": "Menunjukkan",
|
||||
"show_address_book_popup": "Tampilkan popup 'Tambahkan ke Alamat' setelah mengirim",
|
||||
"show_address_book_popup": "Tampilkan Alamat Buku Popup",
|
||||
"show_balance": "PRESS PANJANG UNTUK MENUNJUKKAN Balance",
|
||||
"show_balance_toast": "Tekan panjang untuk menyembunyikan atau menunjukkan keseimbangan",
|
||||
"show_details": "Tampilkan Rincian",
|
||||
|
@ -784,6 +784,7 @@
|
|||
"support_title_guides": "DOKS DOKO CAKE",
|
||||
"support_title_live_chat": "Dukungan langsung",
|
||||
"support_title_other_links": "Tautan dukungan lainnya",
|
||||
"swap": "Menukar",
|
||||
"sweeping_wallet": "Dompet menyapu",
|
||||
"sweeping_wallet_alert": "Ini seharusnya tidak memakan waktu lama. Jangan tinggalkan layar ini atau dana swept mungkin hilang.",
|
||||
"switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi",
|
||||
|
|
|
@ -735,7 +735,7 @@
|
|||
"share_address": "Condividi indirizzo",
|
||||
"shared_seed_wallet_groups": "Gruppi di portafoglio di semi condivisi",
|
||||
"show": "Spettacolo",
|
||||
"show_address_book_popup": "Mostra il popup \"Aggiungi alla rubrica\" dopo l'invio",
|
||||
"show_address_book_popup": "Mostra popup della rubrica",
|
||||
"show_balance": "Lunga stampa per mostrare l'equilibrio",
|
||||
"show_balance_toast": "A lungo pressa per nascondere o mostrare l'equilibrio",
|
||||
"show_details": "Mostra dettagli",
|
||||
|
@ -783,6 +783,7 @@
|
|||
"support_title_guides": "Documenti del portafoglio per torta",
|
||||
"support_title_live_chat": "Supporto dal vivo",
|
||||
"support_title_other_links": "Altri collegamenti di supporto",
|
||||
"swap": "Scambio",
|
||||
"sweeping_wallet": "Portafoglio ampio",
|
||||
"sweeping_wallet_alert": "Questo non dovrebbe richiedere molto tempo. NON LASCIARE QUESTA SCHERMATA O I FONDI SPAZZATI POTREBBERO ANDARE PERSI",
|
||||
"switchToETHWallet": "Passa a un portafoglio Ethereum e riprova",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "イーサスキャンの歴史",
|
||||
"event": "イベント",
|
||||
"events": "イベント",
|
||||
"exchange": "スワップ",
|
||||
"exchange": "交換",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "XMRをケーキウォレットモネロバランスから交換したい場合は、最初にMoneroウォレットに切り替えてください。",
|
||||
"exchange_new_template": "新しいテンプレート",
|
||||
"exchange_provider_unsupported": "${providerName}はサポートされなくなりました!",
|
||||
|
@ -734,7 +734,7 @@
|
|||
"share_address": "住所を共有する",
|
||||
"shared_seed_wallet_groups": "共有シードウォレットグループ",
|
||||
"show": "見せる",
|
||||
"show_address_book_popup": "送信後に「アドレスブックに追加」ポップアップを表示します",
|
||||
"show_address_book_popup": "アドレス帳のポップアップを表示します",
|
||||
"show_balance": "バランスを示すためにロングプレス",
|
||||
"show_balance_toast": "バランスを隠したり表示したりするためにロングプレス",
|
||||
"show_details": "詳細を表示",
|
||||
|
@ -782,6 +782,7 @@
|
|||
"support_title_guides": "ケーキウォレットドキュメント",
|
||||
"support_title_live_chat": "ライブサポート",
|
||||
"support_title_other_links": "その他のサポートリンク",
|
||||
"swap": "スワップ",
|
||||
"sweeping_wallet": "スイープウォレット",
|
||||
"sweeping_wallet_alert": "これには時間がかかりません。この画面から離れないでください。そうしないと、スイープ ファンドが失われる可能性があります",
|
||||
"switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"share_address": "주소 공유",
|
||||
"shared_seed_wallet_groups": "공유 종자 지갑 그룹",
|
||||
"show": "보여주다",
|
||||
"show_address_book_popup": "전송 후 '주소 책에 추가'팝업을 표시하십시오",
|
||||
"show_address_book_popup": "주소록 팝업을 보여주십시오",
|
||||
"show_balance": "균형을 보여주기 위해 긴 언론",
|
||||
"show_balance_toast": "균형을 숨기거나 보여주기 위해 긴 누르십시오",
|
||||
"show_details": "세부정보 표시",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "케이크 지갑 문서",
|
||||
"support_title_live_chat": "실시간 지원",
|
||||
"support_title_other_links": "다른 지원 링크",
|
||||
"swap": "교환",
|
||||
"sweeping_wallet": "스위핑 지갑",
|
||||
"sweeping_wallet_alert": "오래 걸리지 않습니다. 이 화면을 떠나지 마십시오. 그렇지 않으면 스웹트 자금이 손실될 수 있습니다.",
|
||||
"switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요.",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"share_address": "လိပ်စာမျှဝေပါ။",
|
||||
"shared_seed_wallet_groups": "shared မျိုးစေ့ပိုက်ဆံအိတ်အုပ်စုများ",
|
||||
"show": "ပြသ",
|
||||
"show_address_book_popup": "ပေးပို့ပြီးနောက် 'address book' popup ကိုပြပါ",
|
||||
"show_address_book_popup": "လိပ်စာစာအုပ် popup ပြပါ",
|
||||
"show_balance": "ချိန်ခွင်လျှာကိုပြသရန်ရှည်လျားသောစာနယ်ဇင်း",
|
||||
"show_balance_toast": "ချိန်ခွင်လျှာကိုဖျောက်ရန်သို့မဟုတ်ပြသရန်ရှည်လျားသောစာနယ်ဇင်း",
|
||||
"show_details": "အသေးစိတ်ပြ",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "ကိတ်မုန့်ပိုက်ဆံအိတ်များ",
|
||||
"support_title_live_chat": "တိုက်ရိုက်ပံ့ပိုးမှု",
|
||||
"support_title_other_links": "အခြားအထောက်အပံ့လင့်များ",
|
||||
"swap": "လဲလှယ်",
|
||||
"sweeping_wallet": "ိုက်ဆံအိတ် တံမြက်လှည်း",
|
||||
"sweeping_wallet_alert": "ဒါက ကြာကြာမခံသင့်ပါဘူး။ ဤစခရင်ကို ချန်မထားပါနှင့် သို့မဟုတ် ထုတ်ယူထားသော ရန်ပုံငွေများ ဆုံးရှုံးနိုင်သည်",
|
||||
"switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Etherscan-geschiedenis",
|
||||
"event": "Evenement",
|
||||
"events": "Evenementen",
|
||||
"exchange": "Ruil",
|
||||
"exchange": "Aandelenbeurs",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Als je XMR uit je cake -portemonnee Monero -balans wilt ruilen, schakel dan eerst over naar je Monero -portemonnee.",
|
||||
"exchange_new_template": "Nieuwe sjabloon",
|
||||
"exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Deel adres",
|
||||
"shared_seed_wallet_groups": "Gedeelde zaadportelgroepen",
|
||||
"show": "Show",
|
||||
"show_address_book_popup": "Toon 'Toevoegen aan adresboek' pop -up na verzenden",
|
||||
"show_address_book_popup": "Toon adresboek pop -up",
|
||||
"show_balance": "Lange pers om evenwicht te tonen",
|
||||
"show_balance_toast": "Lange pers om evenwicht te verbergen of te tonen",
|
||||
"show_details": "Toon details",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Cake -portemonnee documenten",
|
||||
"support_title_live_chat": "Live ondersteuning",
|
||||
"support_title_other_links": "Andere ondersteuningslinks",
|
||||
"swap": "Ruil",
|
||||
"sweeping_wallet": "Vegende portemonnee",
|
||||
"sweeping_wallet_alert": "Dit duurt niet lang. VERLAAT DIT SCHERM NIET, ANDERS KAN HET SWEPT-GELD VERLOREN WORDEN",
|
||||
"switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Historia Etherscanu",
|
||||
"event": "Wydarzenie",
|
||||
"events": "Wydarzenia",
|
||||
"exchange": "Zamieniać",
|
||||
"exchange": "Giełda",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Jeśli chcesz zamienić XMR z salda Monero Portfer, najpierw przejdź na portfel Monero.",
|
||||
"exchange_new_template": "Nowy szablon wymiany",
|
||||
"exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Udostępnij adres",
|
||||
"shared_seed_wallet_groups": "Wspólne grupy portfeli nasion",
|
||||
"show": "Pokazywać",
|
||||
"show_address_book_popup": "Pokaż wysypkę „Dodaj do książki” po wysłaniu",
|
||||
"show_address_book_popup": "Pokaż okienko książki adresowej",
|
||||
"show_balance": "Długa prasa, aby pokazać równowagę",
|
||||
"show_balance_toast": "Długa naciśnij, aby ukryć lub pokazać równowagę",
|
||||
"show_details": "Pokaż szczegóły",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Dokumenty portfela ciasta",
|
||||
"support_title_live_chat": "Wsparcie na żywo",
|
||||
"support_title_other_links": "Inne linki wsparcia",
|
||||
"swap": "Zamieniać",
|
||||
"sweeping_wallet": "Zamiatanie portfela",
|
||||
"sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE WYCHODŹ Z TEGO EKRANU, W PRZECIWNYM WYPADKU MOŻE ZOSTAĆ UTRACONA ŚRODKI",
|
||||
"switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "história Etherscan",
|
||||
"event": "Evento",
|
||||
"events": "Eventos",
|
||||
"exchange": "Trocar",
|
||||
"exchange": "Intercâmbio",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Se você deseja trocar o XMR do balanço da carteira de bolo, mude para a sua carteira Monero primeiro.",
|
||||
"exchange_new_template": "Novo modelo",
|
||||
"exchange_provider_unsupported": "${providerName} não é mais suportado!",
|
||||
|
@ -735,7 +735,7 @@
|
|||
"share_address": "Compartilhar endereço",
|
||||
"shared_seed_wallet_groups": "Grupos de carteira de sementes compartilhados",
|
||||
"show": "Mostrar",
|
||||
"show_address_book_popup": "Mostre pop -up 'Adicionar ao livro de endereços' depois de enviar",
|
||||
"show_address_book_popup": "Mostrar pop -up de livro de endereços",
|
||||
"show_balance": "Pressione há muito tempo para mostrar o equilíbrio",
|
||||
"show_balance_toast": "Pressione há muito tempo para se esconder ou mostrar equilíbrio",
|
||||
"show_details": "Mostrar detalhes",
|
||||
|
@ -783,6 +783,7 @@
|
|||
"support_title_guides": "Documentos da carteira de bolo",
|
||||
"support_title_live_chat": "Apoio ao vivo",
|
||||
"support_title_other_links": "Outros links de suporte",
|
||||
"swap": "Trocar",
|
||||
"sweeping_wallet": "Carteira varrendo",
|
||||
"sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE WYCHODŹ Z TEGO EKRANU, W PRZECIWNYM WYPADKU MOŻE ZOSTAĆ UTRACONA ŚRODKI",
|
||||
"switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "История Эфириума",
|
||||
"event": "Событие",
|
||||
"events": "События",
|
||||
"exchange": "Менять",
|
||||
"exchange": "Обмен",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Если вы хотите поменять XMR с баланса с кошельком для торта Monero, сначала переключитесь на свой кошелек Monero.",
|
||||
"exchange_new_template": "Новый шаблон",
|
||||
"exchange_provider_unsupported": "${providerName} больше не поддерживается!",
|
||||
|
@ -734,7 +734,7 @@
|
|||
"share_address": "Поделиться адресом",
|
||||
"shared_seed_wallet_groups": "Общие группы кошелька семян",
|
||||
"show": "Показывать",
|
||||
"show_address_book_popup": "Покажите всплывающее окно «Добавить в адрес адреса» после отправки",
|
||||
"show_address_book_popup": "Показать адресную книгу всплывающее окно",
|
||||
"show_balance": "Длинная пресса, чтобы показать баланс",
|
||||
"show_balance_toast": "Длинная нажавка, чтобы скрыть или показать баланс",
|
||||
"show_details": "Показать детали",
|
||||
|
@ -782,6 +782,7 @@
|
|||
"support_title_guides": "Корт кошелек документов",
|
||||
"support_title_live_chat": "Живая поддержка",
|
||||
"support_title_other_links": "Другие ссылки на поддержку",
|
||||
"swap": "Менять",
|
||||
"sweeping_wallet": "Подметание кошелька",
|
||||
"sweeping_wallet_alert": "Это не должно занять много времени. НЕ ПОКИДАЙТЕ ЭТОТ ЭКРАН, ИНАЧЕ ВЫЧИСЛЕННЫЕ СРЕДСТВА МОГУТ БЫТЬ ПОТЕРЯНЫ",
|
||||
"switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку.",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"share_address": "แชร์ที่อยู่",
|
||||
"shared_seed_wallet_groups": "กลุ่มกระเป๋าเงินที่ใช้ร่วมกัน",
|
||||
"show": "แสดง",
|
||||
"show_address_book_popup": "แสดง 'เพิ่มในสมุดรายชื่อ' ป๊อปอัพหลังจากส่ง",
|
||||
"show_address_book_popup": "แสดงสมุดที่อยู่ป๊อปอัพ",
|
||||
"show_balance": "กดยาวเพื่อแสดงความสมดุล",
|
||||
"show_balance_toast": "กดนานเพื่อซ่อนหรือแสดงความสมดุล",
|
||||
"show_details": "แสดงรายละเอียด",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "เอกสารกระเป๋าเงินเค้ก",
|
||||
"support_title_live_chat": "การสนับสนุนสด",
|
||||
"support_title_other_links": "ลิงค์สนับสนุนอื่น ๆ",
|
||||
"swap": "แลกเปลี่ยน",
|
||||
"sweeping_wallet": "กวาดกระเป๋าสตางค์",
|
||||
"sweeping_wallet_alert": "การดำเนินการนี้ใช้เวลาไม่นาน อย่าออกจากหน้าจอนี้ มิฉะนั้นเงินที่กวาดไปอาจสูญหาย",
|
||||
"switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Ibahagi ang address",
|
||||
"shared_seed_wallet_groups": "Ibinahaging mga pangkat ng pitaka ng binhi",
|
||||
"show": "Ipakita",
|
||||
"show_address_book_popup": "Ipakita ang popup na 'Idagdag sa Address Book' pagkatapos magpadala",
|
||||
"show_address_book_popup": "Ipakita ang Address Book Popup",
|
||||
"show_balance": "Mahabang pindutin upang ipakita ang balanse",
|
||||
"show_balance_toast": "Mahabang pindutin upang itago o ipakita ang balanse",
|
||||
"show_details": "Ipakita ang mga detalye",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Cake wallet doc",
|
||||
"support_title_live_chat": "Live na suporta",
|
||||
"support_title_other_links": "Iba pang mga link sa suporta",
|
||||
"swap": "Palitan",
|
||||
"sweeping_wallet": "Sweeping wallet",
|
||||
"sweeping_wallet_alert": "Hindi ito dapat magtagal. HUWAG iwanan ang screen na ito o maaaring mawala ang mga pondo.",
|
||||
"switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Etherscan geçmişi",
|
||||
"event": "Etkinlik",
|
||||
"events": "Olaylar",
|
||||
"exchange": "Takas",
|
||||
"exchange": "Değişme",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "XMR'yi kek cüzdanı Monero bakiyenizden değiştirmek istiyorsanız, lütfen önce Monero cüzdanınıza geçin.",
|
||||
"exchange_new_template": "Yeni şablon",
|
||||
"exchange_provider_unsupported": "${providerName} artık desteklenmiyor!",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"share_address": "Adresi paylaş",
|
||||
"shared_seed_wallet_groups": "Paylaşılan tohum cüzdan grupları",
|
||||
"show": "Göstermek",
|
||||
"show_address_book_popup": "Gönderdikten sonra 'adres defterine ekle' açılır",
|
||||
"show_address_book_popup": "Adres Kitabı Popup'ı Göster",
|
||||
"show_balance": "Dengeyi Göstermek İçin Uzun Basın",
|
||||
"show_balance_toast": "Dengeyi gizlemek veya göstermek için uzun basın",
|
||||
"show_details": "Detayları Göster",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "Kek Cüzdan Dokümanlar",
|
||||
"support_title_live_chat": "Canlı destek",
|
||||
"support_title_other_links": "Diğer destek bağlantıları",
|
||||
"swap": "Takas",
|
||||
"sweeping_wallet": "Süpürme cüzdanı",
|
||||
"sweeping_wallet_alert": "Bu uzun sürmemeli. BU EKRANDAN BIRAKMAYIN YOKSA SÜPÜRÜLEN FONLAR KAYBOLABİLİR",
|
||||
"switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin",
|
||||
|
|
|
@ -294,7 +294,7 @@
|
|||
"etherscan_history": "Історія Etherscan",
|
||||
"event": "Подія",
|
||||
"events": "Події",
|
||||
"exchange": "Обміняти",
|
||||
"exchange": "Обмін",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Якщо ви хочете поміняти XMR зі свого балансу для тортів Monero Balance, спочатку перейдіть на свій гаманець Monero.",
|
||||
"exchange_new_template": "Новий шаблон",
|
||||
"exchange_provider_unsupported": "${providerName} більше не підтримується!",
|
||||
|
@ -734,7 +734,7 @@
|
|||
"share_address": "Поділитися адресою",
|
||||
"shared_seed_wallet_groups": "Спільні групи насіннєвих гаманців",
|
||||
"show": "Показувати",
|
||||
"show_address_book_popup": "Показати спливаюче вікно \"Додати до адресної книги\" після надсилання",
|
||||
"show_address_book_popup": "Показати спливаюче вікно адреси книги",
|
||||
"show_balance": "Довга преса, щоб показати рівновагу",
|
||||
"show_balance_toast": "Довга преса, щоб приховати або показати рівновагу",
|
||||
"show_details": "Показати деталі",
|
||||
|
@ -782,6 +782,7 @@
|
|||
"support_title_guides": "Торт гаманці",
|
||||
"support_title_live_chat": "Жива підтримка",
|
||||
"support_title_other_links": "Інші посилання на підтримку",
|
||||
"swap": "Обміняти",
|
||||
"sweeping_wallet": "Підмітаня гаманця",
|
||||
"sweeping_wallet_alert": "Це не повинно зайняти багато часу. НЕ ЗАЛИШАЙТЕ ЦЬОГО ЕКРАНУ, АБО КОШТИ МОЖУТЬ БУТИ ВТРАЧЕНІ",
|
||||
"switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу",
|
||||
|
|
|
@ -735,7 +735,7 @@
|
|||
"share_address": "پتہ شیئر کریں۔",
|
||||
"shared_seed_wallet_groups": "مشترکہ بیج پرس گروپ",
|
||||
"show": "دکھائیں",
|
||||
"show_address_book_popup": "بھیجنے کے بعد 'ایڈریس میں شامل کریں کتاب' پاپ اپ دکھائیں",
|
||||
"show_address_book_popup": "ایڈریس بک پاپ اپ دکھائیں",
|
||||
"show_balance": "توازن ظاہر کرنے کے لئے طویل پریس",
|
||||
"show_balance_toast": "توازن چھپانے یا ظاہر کرنے کے لئے طویل پریس",
|
||||
"show_details": "تفصیلات دکھائیں",
|
||||
|
@ -783,6 +783,7 @@
|
|||
"support_title_guides": "کیک پرس کے دستاویزات",
|
||||
"support_title_live_chat": "براہ راست مدد",
|
||||
"support_title_other_links": "دوسرے سپورٹ لنکس",
|
||||
"swap": "تبادلہ",
|
||||
"sweeping_wallet": "جھاڑو دینے والا پرس",
|
||||
"sweeping_wallet_alert": "اس میں زیادہ وقت نہیں لینا چاہئے۔ اس اسکرین کو مت چھوڑیں یا بہہ جانے والے فنڈز ضائع ہوسکتے ہیں۔",
|
||||
"switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ",
|
||||
|
|
|
@ -293,7 +293,7 @@
|
|||
"etherscan_history": "Lịch sử Etherscan",
|
||||
"event": "Sự kiện",
|
||||
"events": "Các sự kiện",
|
||||
"exchange": "Tráo đổi",
|
||||
"exchange": "Trao đổi",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Nếu bạn muốn trao đổi XMR từ CAPE CAME MONERO BALANCE, vui lòng chuyển sang ví Monero của bạn trước.",
|
||||
"exchange_new_template": "Mẫu mới",
|
||||
"exchange_provider_unsupported": "${providerName} không còn được hỗ trợ nữa!",
|
||||
|
@ -732,7 +732,7 @@
|
|||
"share_address": "Chia sẻ địa chỉ",
|
||||
"shared_seed_wallet_groups": "Nhóm ví hạt được chia sẻ",
|
||||
"show": "Trình diễn",
|
||||
"show_address_book_popup": "Hiển thị cửa sổ bật lên 'Thêm vào sổ địa chỉ' sau khi gửi",
|
||||
"show_address_book_popup": "Hiển thị cửa sổ bật lên sổ sách địa chỉ",
|
||||
"show_balance": "Báo chí dài để hiển thị sự cân bằng",
|
||||
"show_balance_toast": "Nhấn dài để ẩn hoặc hiển thị sự cân bằng",
|
||||
"show_details": "Hiển thị chi tiết",
|
||||
|
@ -780,6 +780,7 @@
|
|||
"support_title_guides": "Cake Wallet Docs",
|
||||
"support_title_live_chat": "Hỗ trợ trực tiếp",
|
||||
"support_title_other_links": "Liên kết hỗ trợ khác",
|
||||
"swap": "Tráo đổi",
|
||||
"sweeping_wallet": "Quét ví",
|
||||
"sweeping_wallet_alert": "Việc này không nên mất nhiều thời gian. KHÔNG RỜI KHỎI MÀN HÌNH NÀY HOẶC CÁC KHOẢN TIỀN ĐƯỢC QUÉT CÓ THỂ BỊ MẤT.",
|
||||
"switchToETHWallet": "Vui lòng chuyển sang ví Ethereum và thử lại",
|
||||
|
|
|
@ -295,7 +295,7 @@
|
|||
"etherscan_history": "Etherscan itan",
|
||||
"event": "Iṣẹlẹ",
|
||||
"events": "Awọn iṣẹlẹ",
|
||||
"exchange": "Eepo",
|
||||
"exchange": "Paarọ",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Ti o ba fẹ lati yi XMR lati dọgba oyinbo oyinbo kekere rẹ ti a fi omi ṣan rẹ, jọwọ yipada si apamọwọ Monrou akọkọ.",
|
||||
"exchange_new_template": "Àwòṣe títun",
|
||||
"exchange_provider_unsupported": "${providerName} ko ni atilẹyin mọ!",
|
||||
|
@ -734,7 +734,7 @@
|
|||
"share_address": "Pín àdírẹ́sì",
|
||||
"shared_seed_wallet_groups": "Awọn ẹgbẹ ti a pin irugbin",
|
||||
"show": "Fihan",
|
||||
"show_address_book_popup": "Fihan 'ṣafikun si Agbejade Iwe' Lẹhin fifiranṣẹ",
|
||||
"show_address_book_popup": "Fihan Agbejade Iwe Adirẹsi",
|
||||
"show_balance": "Tẹ Tẹ lati ṣafihan iwọntunwọnsi",
|
||||
"show_balance_toast": "Tẹ Tẹ lati tọju tabi ṣafihan iwọntunwọnsi",
|
||||
"show_details": "Fi ìsọfúnni kékeré hàn",
|
||||
|
@ -782,6 +782,7 @@
|
|||
"support_title_guides": "Awọn iwe apamọwọ oyinbo akara oyinbo",
|
||||
"support_title_live_chat": "Atilẹyin ifiwe",
|
||||
"support_title_other_links": "Awọn ọna asopọ atilẹyin miiran",
|
||||
"swap": "Eepo",
|
||||
"sweeping_wallet": "Fi owo iwe iwe wofo",
|
||||
"sweeping_wallet_alert": "Yio kọja pada si ikan yii. Kì yoo daadaa leede yii tabi owo ti o ti fi se iwe iwe naa yoo gbe.",
|
||||
"switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"share_address": "分享地址",
|
||||
"shared_seed_wallet_groups": "共享种子钱包组",
|
||||
"show": "展示",
|
||||
"show_address_book_popup": "发送后显示“添加到通讯簿”弹出窗口",
|
||||
"show_address_book_popup": "显示地址簿弹出",
|
||||
"show_balance": "长印刷以显示平衡",
|
||||
"show_balance_toast": "长按以隐藏或显示平衡",
|
||||
"show_details": "显示详细信息",
|
||||
|
@ -781,6 +781,7 @@
|
|||
"support_title_guides": "蛋糕钱包文档",
|
||||
"support_title_live_chat": "实时支持",
|
||||
"support_title_other_links": "其他支持链接",
|
||||
"swap": "交换",
|
||||
"sweeping_wallet": "扫一扫钱包",
|
||||
"sweeping_wallet_alert": "\n这应该不会花很长时间。请勿离开此屏幕,否则可能会丢失所掠取的资金",
|
||||
"switchToETHWallet": "请切换到以太坊钱包并重试",
|
||||
|
|
|
@ -8,7 +8,7 @@ if [[ ! -d "monero_c/.git" ]];
|
|||
then
|
||||
git clone https://github.com/mrcyjanek/monero_c --branch master monero_c
|
||||
cd monero_c
|
||||
git checkout 127c54599c612d7d3d226e4c016d5812e7a0966d
|
||||
git checkout 9d9b1f2f2373fc9a99c6556a93eea63fe343cf58
|
||||
git reset --hard
|
||||
git submodule update --init --force --recursive
|
||||
./apply_patches.sh monero
|
||||
|
|
Loading…
Reference in a new issue