+
{getNetworkError ? (
{getNetworkError} Please verify that your dcrd is configured
@@ -13,9 +13,8 @@ const WalletError = () => {
) : (
- {" "}
We have detected that your wallet has disconnected. Please reload
- Decrediton to fix this problem.{" "}
+ Decrediton to fix this problem.
)}
diff --git a/app/constants/config.js b/app/constants/config.js
index b4960d0c0e..ee5d66fbd2 100644
--- a/app/constants/config.js
+++ b/app/constants/config.js
@@ -25,6 +25,7 @@ export const DISABLE_HARDWARE_ACCEL = "disable_hardware_accel";
export const LN_ENABLED = "ln_enabled";
export const TREZOR_DEBUG = "trezor_debug";
export const UPGD_ELECTRON8 = "is_electron8";
+export const AUTO_WALLET_LAUNCHING = "auto_wallet_launching";
// advanced daemon configs
export const RPCUSER = "rpc_user";
@@ -93,6 +94,7 @@ export const ASK_DEX_BTC_SPV = "ask_dex_use_btc_spv";
export const CONFIRM_DEX_SEED = "confirm_dex_seed";
export const WALLET_CREATED_AS_NEW = "wallet_created_as_new";
export const SHOW_STAKING_WARNING = "show_staking_warning";
+export const DISPLAY_WALLET_GRADIENT = "display_wallet_gradient";
export const WALLET_INITIAL_VALUE = {
[ENABLE_TICKET_BUYER]: false,
@@ -170,5 +172,6 @@ export const INITIAL_VALUES = {
[TREZOR_DEBUG]: false,
[DISABLE_HARDWARE_ACCEL]: false,
[LN_ENABLED]: false,
- [UPGD_ELECTRON8]: false
+ [UPGD_ELECTRON8]: false,
+ [AUTO_WALLET_LAUNCHING]: false
};
diff --git a/app/helpers/displayWalletGradients.js b/app/helpers/displayWalletGradients.js
new file mode 100644
index 0000000000..8f12aeff2e
--- /dev/null
+++ b/app/helpers/displayWalletGradients.js
@@ -0,0 +1,13 @@
+export const preDefinedGradients = [
+ "linear-gradient(180deg, #3871f6 0%, #9b68e8 11.87%, #d15fd2 23.73%, #f45db8 35.6%, #ff669d 47.47%, #ff7785 59.34%, #ff8d71 71.2%, #ffa565 83.07%, #ffbc63 94.94%)",
+ "linear-gradient(180deg, #d45941 0%, #dc673f 10.55%, #e3763d 21.1%, #e9843c 31.65%, #ee933b 42.19%, #f2a23c 52.74%, #f4b23e 63.29%, #f5c142 73.84%, #f5d048 84.39%), #f4e051 94.94%",
+ "linear-gradient(180deg, #69d5a6 0%, #00cbf0 31.65%, #00aaff 63.29%, #df53f7 94.94%)",
+ "linear-gradient(180deg, #1239FE 0%, #0052FF 5.93%, #0066FF 11.87%, #0077FF 17.8%, #0086FF 23.73%, #0093FF 29.67%, #00A0FF 35.6%, #00ACFF 41.53%, #00B7FF 47.47%, #00C2FF 53.4%, #00CCF0 59.34%, #00D6DF 65.27%, #00DFCF 71.2%, #00E8BE 77.14%, #00F0AE 83.07%, #00F8A0 89%, #19FF94 94.94%)",
+ "linear-gradient(360deg, #FE2BD4 3.8%, #FF1ABC 9.81%, #FF1AA3 15.82%, #FF2D8A 21.84%, #FF4472 27.85%, #FF5B5B 33.86%, #FF7145 39.87%, #FF862E 45.89%, #FF9911 51.9%, #F8AB00 57.91%, #E5BB00 63.92%, #D1C900 69.94%, #BAD710 75.95%, #A0E236 81.96%, #83ED55 87.97%, #5EF674 93.99%, #19FF94 100%)",
+ "linear-gradient(180deg, #000878 0%, #001D89 5.93%, #002E99 11.87%, #003DA7 17.8%, #004DB4 23.73%, #005CC0 29.67%, #006BCA 35.6%, #007AD2 41.53%, #0089DA 47.47%, #0098E0 53.4%, #00A7E5 59.34%, #00B6EA 65.27%, #00C4ED 71.2%, #00D3F0 77.14%, #00E2F3 83.07%, #00F1F6 89%, #33FFF8 94.94%)",
+ "linear-gradient(180deg, rgba(254, 53, 247, 0.66) 0%, rgba(252, 58, 249, 0.663266) 5.66%, rgba(245, 71, 255, 0.67294) 11.31%, rgba(234, 88, 255, 0.68865) 16.97%, rgba(217, 106, 255, 0.709792) 22.63%, rgba(195, 124, 255, 0.735553) 28.28%, rgba(169, 141, 255, 0.764944) 33.94%, rgba(139, 157, 255, 0.796835) 39.6%, rgba(107, 170, 255, 0.83) 45.25%, rgba(76, 182, 255, 0.863165) 50.91%, rgba(47, 191, 255, 0.895056) 56.57%, rgba(31, 198, 255, 0.924447) 62.22%, rgba(35, 203, 255, 0.950208) 67.88%, rgba(49, 207, 255, 0.97135) 73.54%, rgba(61, 210, 255, 0.98706) 79.19%, rgba(68, 212, 255, 0.996733) 84.85%)",
+ "linear-gradient(180deg, #0AFF1B 0%, #18FF1A 6.01%, #2EFF15 12.03%, #45FF0D 18.04%, #5AFF00 24.05%, #6EFF00 30.06%, #82FF00 36.08%, #94FF00 42.09%, #A5FF00 48.1%, #B5FF00 54.11%, #C4FF00 60.13%, #D0FF00 66.14%, #DBFF00 72.15%, #E3FF00 78.16%, #E9FF00 84.18%, #EDFF01 90.19%, #EEFF03 96.2%)",
+ "linear-gradient(180deg, #A71CBD 0%, #C200B5 5.85%, #DA00AA 11.71%, #EF009E 17.56%, #FF0091 23.42%, #FF0083 29.27%, #FF2975 35.13%, #FF4466 40.98%, #FF5C57 46.84%, #FF7347 52.69%, #FF8937 58.54%, #FF9E23 64.4%, #FFB303 70.25%, #FFC700 76.11%, #FFDA00 81.96%, #FEED00 87.82%, #EEFF03 93.67%)",
+ "linear-gradient(180deg, #FFDD00 0%, #FADE00 5.97%, #EAE000 11.95%, #D1E30F 17.92%, #ADE52A 23.89%, #7FE647 29.87%, #34E468 35.84%, #00E08C 41.81%, #00D9AF 47.78%, #00D0CF 53.76%, #00C6E9 59.73%, #00BCF9 65.7%, #00B1FF 71.68%, #00A8FF 77.65%, #00A0FF 83.62%, #009CFF 89.6%, #039AFF 95.57%)",
+ "linear-gradient(180deg, #BBD2C5 0%, #536976 46.84%, #292E49 93.67%)"
+];
diff --git a/app/helpers/index.js b/app/helpers/index.js
index d0e8fc08b3..473af5d97e 100644
--- a/app/helpers/index.js
+++ b/app/helpers/index.js
@@ -10,6 +10,7 @@ export * from "./msgTx";
export * from "./politeia";
export * from "./scripts";
export * from "./tickets";
+export * from "./displayWalletGradients";
// kidCheck takes a component and returns a component that only renders if it
// has children.
diff --git a/app/hooks/useDaemonStartup.js b/app/hooks/useDaemonStartup.js
index 7edc7072db..dcb642ba41 100644
--- a/app/hooks/useDaemonStartup.js
+++ b/app/hooks/useDaemonStartup.js
@@ -71,6 +71,9 @@ const useDaemonStartup = () => {
);
const syncFetchHeadersAttempt = useSelector(sel.syncFetchHeadersAttempt);
const syncFetchHeadersCount = useSelector(sel.syncFetchHeadersCount);
+ const syncFetchHeadersFirstHeaderTime = useSelector(
+ sel.syncFetchHeadersFirstHeaderTime
+ );
const syncFetchHeadersLastHeaderTime = useSelector(
sel.syncFetchHeadersLastHeaderTime
);
@@ -81,6 +84,8 @@ const useDaemonStartup = () => {
const syncFetchHeadersComplete = useSelector(sel.syncFetchHeadersComplete);
const syncFetchTimeStart = useSelector(sel.syncFetchTimeStart);
const selectedWalletSelector = useSelector(sel.getSelectedWallet);
+ const startWalletServiceAttempt = useSelector(sel.startWalletServiceAttempt);
+ const autoWalletLaunching = useSelector(sel.autoWalletLaunching);
// general methods
// Methods for showing positions when first starting decrediton
@@ -174,6 +179,9 @@ const useDaemonStartup = () => {
(selectedWallet) => dispatch(da.startWallet(selectedWallet)),
[dispatch]
);
+ const onCloseWallet = useCallback(() => dispatch(wla.closeWalletRequest()), [
+ dispatch
+ ]);
const onRemoveWallet = useCallback(
(selectedWallet) => dispatch(da.removeWallet(selectedWallet)),
[dispatch]
@@ -233,6 +241,23 @@ const useDaemonStartup = () => {
[dispatch]
);
+ const stopUnfinishedWallet = useCallback(
+ () => dispatch(wla.stopUnfinishedWallet()),
+ [dispatch]
+ );
+
+ const checkDisplayWalletGradients = useCallback(
+ (availableWallets) =>
+ dispatch(da.checkDisplayWalletGradients(availableWallets)),
+ [dispatch]
+ );
+
+ const setAutoWalletLaunching = useCallback(
+ (autoWalletLaunching) =>
+ dispatch(wla.setAutoWalletLaunching(autoWalletLaunching)),
+ [dispatch]
+ );
+
return {
onShowTutorial,
validateMasterPubKey,
@@ -246,6 +271,7 @@ const useDaemonStartup = () => {
goToErrorPage,
onRemoveWallet,
onStartWallet,
+ onCloseWallet,
onGetAvailableWallets,
syncDaemon,
checkNetworkMatch,
@@ -293,12 +319,15 @@ const useDaemonStartup = () => {
syncFetchMissingCfiltersEnd,
syncFetchHeadersAttempt,
syncFetchHeadersCount,
+ syncFetchHeadersFirstHeaderTime,
syncFetchHeadersLastHeaderTime,
syncDiscoverAddressesAttempt,
syncRescanAttempt,
syncFetchHeadersComplete,
syncFetchTimeStart,
selectedWalletSelector,
+ startWalletServiceAttempt,
+ autoWalletLaunching,
goToHome,
setCoinjoinCfg,
onGetDcrdLogs,
@@ -311,7 +340,10 @@ const useDaemonStartup = () => {
isProcessingManaged,
isProcessingUnmanaged,
needsProcessManagedTickets,
- isSettingAccountsPassphrase
+ stopUnfinishedWallet,
+ isSettingAccountsPassphrase,
+ checkDisplayWalletGradients,
+ setAutoWalletLaunching
};
};
diff --git a/app/index.js b/app/index.js
index 08d1b30334..66350d2ea0 100644
--- a/app/index.js
+++ b/app/index.js
@@ -76,7 +76,8 @@ const currentSettings = {
network: hasCliOption("network") || globalCfg.get(NETWORK),
networkFromCli: !!hasCliOption("network"),
theme: globalCfg.get(THEME),
- uiAnimations: globalCfg.get(cfgConstants.UI_ANIMATIONS)
+ uiAnimations: globalCfg.get(cfgConstants.UI_ANIMATIONS),
+ autoWalletLaunching: globalCfg.get(cfgConstants.AUTO_WALLET_LAUNCHING)
};
const initialState = {
settings: {
diff --git a/app/main_dev/ipc.js b/app/main_dev/ipc.js
index 6d5b24e80b..0c666de091 100644
--- a/app/main_dev/ipc.js
+++ b/app/main_dev/ipc.js
@@ -61,6 +61,8 @@ export const getAvailableWallets = (network) => {
const isPrivacy = cfg.get(cfgConstants.MIXED_ACCOUNT_CFG);
const walletDbFilePath = getWalletDb(isTestNet, wallet);
const finished = fs.existsSync(walletDbFilePath);
+ const isLN = cfg.get(cfgConstants.LN_WALLET_EXISTS);
+ const displayWalletGradient = cfg.get(cfgConstants.DISPLAY_WALLET_GRADIENT);
availableWallets.push({
network,
wallet,
@@ -68,7 +70,9 @@ export const getAvailableWallets = (network) => {
lastAccess,
isWatchingOnly,
isTrezor,
- isPrivacy
+ isPrivacy,
+ isLN,
+ displayWalletGradient
});
});
diff --git a/app/reducers/walletLoader.js b/app/reducers/walletLoader.js
index f4a68e1dd1..fe711e146a 100644
--- a/app/reducers/walletLoader.js
+++ b/app/reducers/walletLoader.js
@@ -80,7 +80,8 @@ export default function walletLoader(state = {}, action) {
return {
...state,
isWatchingOnly: action.isWatchingOnly,
- needsPassPhrase: false
+ needsPassPhrase: false,
+ syncRescanAttempt: false
};
case CLOSEWALLET_FAILED:
return {
@@ -104,7 +105,8 @@ export default function walletLoader(state = {}, action) {
syncError: null,
synced: false,
syncLastFetchedHeaderTime: null,
- needsPassPhrase: false
+ needsPassPhrase: false,
+ syncRescanAttempt: false
};
case UPDATEDISCOVERACCOUNTS:
return { ...state, discoverAccountsComplete: action.complete };
@@ -202,13 +204,17 @@ export default function walletLoader(state = {}, action) {
return {
...state,
syncFetchTimeStart: action.fetchTimeStart,
- syncFetchHeadersAttempt: true
+ syncFetchHeadersAttempt: true,
+ syncFirstFetchedHeaderTime: null
};
case SYNC_FETCHED_HEADERS_PROGRESS:
return {
...state,
syncFetchHeadersCount: action.fetchHeadersCount,
- syncLastFetchedHeaderTime: action.lastFetchedHeaderTime
+ syncLastFetchedHeaderTime: action.lastFetchedHeaderTime,
+ syncFirstFetchedHeaderTime: state.syncFirstFetchedHeaderTime
+ ? state.syncFirstFetchedHeaderTime
+ : action.lastFetchedHeaderTime
};
case SYNC_FETCHED_HEADERS_FINISHED:
return {
diff --git a/app/selectors.js b/app/selectors.js
index 53eb743cb0..cb7216e954 100644
--- a/app/selectors.js
+++ b/app/selectors.js
@@ -122,6 +122,10 @@ export const syncFetchHeadersCount = get([
"walletLoader",
"syncFetchHeadersCount"
]);
+export const syncFetchHeadersFirstHeaderTime = get([
+ "walletLoader",
+ "syncFirstFetchedHeaderTime"
+]);
export const syncFetchHeadersLastHeaderTime = get([
"walletLoader",
"syncLastFetchedHeaderTime"
@@ -177,7 +181,8 @@ const availableWalletsSelect = createSelector([availableWallets], (wallets) =>
network: wallet.network,
finished: wallet.finished,
isWatchingOnly: wallet.isWatchingOnly,
- lastAccess: wallet.lastAccess ? new Date(wallet.lastAccess) : null
+ lastAccess: wallet.lastAccess ? new Date(wallet.lastAccess) : null,
+ displayWalletGradient: wallet.displayWalletGradient
}),
wallets
)
@@ -346,6 +351,11 @@ export const unitDivisor = compose(
);
export const currentLocaleName = get(["settings", "currentSettings", "locale"]);
export const timezone = get(["settings", "currentSettings", "timezone"]);
+export const autoWalletLaunching = get([
+ "settings",
+ "currentSettings",
+ "autoWalletLaunching"
+]);
export const defaultLocaleName = createSelector(
[currentLocaleName],
(currentLocaleName) => {
@@ -977,6 +987,10 @@ export const notifiedBlockHeight = get(["notifications", "currentHeight"]);
export const currentBlockHeight = get(["grpc", "currentBlockHeight"]);
export const getNoMoreLiveTickets = get(["grpc", "noMoreLiveTickets"]);
+export const startWalletServiceAttempt = get([
+ "grpc",
+ "startWalletServiceAttempt"
+]);
export const rescanEndBlock = currentBlockHeight;
export const rescanStartBlock = compose(
diff --git a/app/stateMachines/GetStartedStateMachine.js b/app/stateMachines/GetStartedStateMachine.js
index 75d7150247..e270aacb11 100644
--- a/app/stateMachines/GetStartedStateMachine.js
+++ b/app/stateMachines/GetStartedStateMachine.js
@@ -26,10 +26,7 @@ export const getStartedMachine = Machine({
startMachine: {
initial: "preStart",
on: {
- SHOW_SETTINGS: "settings",
- SHOW_LOGS: "logs",
SHOW_TREZOR_CONFIG: "trezorConfig",
- SHOW_RELEASE_NOTES: "releaseNotes",
SHOW_CREATE_WALLET: "creatingWallet",
SHOW_SETTING_UP_WALLET: "settingUpWallet"
},
@@ -283,6 +280,13 @@ export const getStartedMachine = Machine({
onEntry: "isSyncingRPC",
on: {
WALLET_DISCOVERACCOUNTS_PASS: "walletDiscoverAccountsPassInput",
+ CANCEL_SYNCING_WALLET: {
+ target: "choosingWallet",
+ actions: assign({
+ selectedWallet: () => null,
+ passPhrase: () => null
+ })
+ },
ERROR_SYNCING_WALLET: {
target: "choosingWallet",
actions: assign({
@@ -382,15 +386,6 @@ export const getStartedMachine = Machine({
}
}
},
- releaseNotes: {
- initial: "releaseNotes",
- states: {
- releaseNotes: {}
- },
- on: {
- BACK: "startMachine.hist"
- }
- },
trezorConfig: {
initial: "trezorConfig",
states: {
@@ -400,26 +395,6 @@ export const getStartedMachine = Machine({
BACK: "startMachine.hist",
SHOW_TREZOR_CONFIG: "trezorConfig"
}
- },
- settings: {
- initial: "settings",
- states: {
- settings: {}
- },
- on: {
- BACK: "startMachine.hist",
- SHOW_LOGS: "logs"
- }
- },
- logs: {
- initial: "logs",
- states: {
- logs: {}
- },
- on: {
- BACK: "startMachine.hist",
- SHOW_SETTINGS: "settings"
- }
}
}
});
diff --git a/app/style/icons/blockchainInitial.svg b/app/style/icons/blockchainInitial.svg
index c262732325..5b824f67f0 100644
--- a/app/style/icons/blockchainInitial.svg
+++ b/app/style/icons/blockchainInitial.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/app/style/icons/blockchain_syncing_loader.gif b/app/style/icons/blockchain_syncing_loader.gif
index 737af756ea..24ccf62e15 100644
Binary files a/app/style/icons/blockchain_syncing_loader.gif and b/app/style/icons/blockchain_syncing_loader.gif differ
diff --git a/app/style/icons/closeWhite.svg b/app/style/icons/closeWhite.svg
deleted file mode 100644
index d96f036f59..0000000000
--- a/app/style/icons/closeWhite.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/app/style/icons/daemon_waiting_loader.gif b/app/style/icons/daemon_waiting_loader.gif
index e97c1da82b..644ce5d6a3 100644
Binary files a/app/style/icons/daemon_waiting_loader.gif and b/app/style/icons/daemon_waiting_loader.gif differ
diff --git a/app/style/icons/discovering_addresses_loader.gif b/app/style/icons/discovering_addresses_loader.gif
index 049e9e222e..2d046a08f3 100644
Binary files a/app/style/icons/discovering_addresses_loader.gif and b/app/style/icons/discovering_addresses_loader.gif differ
diff --git a/app/style/icons/editDefault.svg b/app/style/icons/editDefault.svg
deleted file mode 100644
index 6701ce409a..0000000000
--- a/app/style/icons/editDefault.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/app/style/icons/editDefaultDark.svg b/app/style/icons/editDefaultDark.svg
deleted file mode 100755
index 27a137081b..0000000000
--- a/app/style/icons/editDefaultDark.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/app/style/icons/editHover.svg b/app/style/icons/editHover.svg
deleted file mode 100644
index ebd8daec07..0000000000
--- a/app/style/icons/editHover.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/app/style/icons/editHoverDark.svg b/app/style/icons/editHoverDark.svg
deleted file mode 100644
index 8671c4e79c..0000000000
--- a/app/style/icons/editHoverDark.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/app/style/icons/establishing_rpc_loader.gif b/app/style/icons/establishing_rpc_loader.gif
index 8e9acb9ca3..275d832f79 100644
Binary files a/app/style/icons/establishing_rpc_loader.gif and b/app/style/icons/establishing_rpc_loader.gif differ
diff --git a/app/style/icons/fetching_headers_loader.gif b/app/style/icons/fetching_headers_loader.gif
index 590cef4c50..0f99880e79 100644
Binary files a/app/style/icons/fetching_headers_loader.gif and b/app/style/icons/fetching_headers_loader.gif differ
diff --git a/app/style/icons/finalizing_setup_loader.gif b/app/style/icons/finalizing_setup_loader.gif
index 29e0048860..3d39c8601b 100644
Binary files a/app/style/icons/finalizing_setup_loader.gif and b/app/style/icons/finalizing_setup_loader.gif differ
diff --git a/app/style/icons/scanning_blocks_loader.gif b/app/style/icons/scanning_blocks_loader.gif
index cb4c1fc4ca..6de71313c0 100644
Binary files a/app/style/icons/scanning_blocks_loader.gif and b/app/style/icons/scanning_blocks_loader.gif differ
diff --git a/app/style/themes/darkTheme.js b/app/style/themes/darkTheme.js
index f46a8e04f9..baa58f8335 100644
--- a/app/style/themes/darkTheme.js
+++ b/app/style/themes/darkTheme.js
@@ -101,13 +101,10 @@ const darkTheme = {
"menutab-hover": "#7DA7D9",
"tooltip-container": "#1F325F",
"loader-bg": "#223767",
- "display-wallet-bg": "#152042",
"select-border": "#608ACE",
"transaction-account-name-bg": "#2F4D8C",
"account-row-hover": "#1F325F",
"chart-cursor-color": "#36579E",
- "linear-progress-text-default": "#fff",
- "linear-progress-text-initial": "#7DA7D9",
"onboard-toolbar-shadow": "rgba(9,20,64,0.13)",
"onboard-toolbar-background": "#152042",
"background-copy-color": "#e9f8ff",
@@ -122,6 +119,7 @@ const darkTheme = {
"proposal-text-markdown": "var(--background-container)",
"background-address-copy-color": "#2F4D8C",
"icons-shadow": "#09144036",
+ "icons-shadow-hover": "#09144036",
"no-more-tickets-indicator-bg": "#2F4D8C",
"input-copy-hover-color": "#78d9f8",
"coinjoin-sum-color": "#7DA7D9",
@@ -138,6 +136,8 @@ const darkTheme = {
"grey-5": "#3c62b0",
"grey-6": "#B7DEEE",
"grey-7": "#608ace",
+ "light-green": "#C6ECCB",
+ "green-2": "#2ED8A3",
orange: "#ED6D47",
"main-dark-blue": "#e9f8fe0",
"light-blue": "#D4F0FD",
@@ -190,8 +190,7 @@ const darkTheme = {
"seedword-button-text": "var(--info-modal-button-text)",
"seedword-button-invalid-bg": "#f0b3a1",
- "button-icon-color-1": "#99C1E3",
- "button-icon-color-2": "#436EC3",
+ "launcher-link-color": "var(--disabled-color",
"alert-icon-bg-color": "#feb8a5",
@@ -221,13 +220,10 @@ const darkTheme = {
"testnet-logo": url(require("style/icons/testnetLogoDark.svg")),
"mainnet-logo": url(require("style/icons/decredLogoDark.svg")),
"create-wallet-icon": url(require("style/icons/createnewwalletDark.svg")),
- "wallet-blue-icon": url(require("style/icons/walletBlueDark.svg")),
"wallet-gray-icon": url(require("style/icons/walletGrayDark.svg")),
blockchain: url(require("style/icons/blockchainDark.svg")),
"blockchain-default": url(require("style/icons/blockchainDefaultDark.svg")),
"blockchain-initial": url(require("style/icons/blockchainInitialDark.svg")),
- "launcher-edit-wallets": url(require("style/icons/editDefaultDark.svg")),
- "launcher-edit-wallets-hover": url(require("style/icons/editHoverDark.svg")),
"onboarding-checkcircle": url(
require("style/icons/onboardingCheckcircleDark.svg")
),
diff --git a/app/style/themes/icons.js b/app/style/themes/icons.js
index 4232cae216..6b2a803041 100644
--- a/app/style/themes/icons.js
+++ b/app/style/themes/icons.js
@@ -129,7 +129,6 @@ const icons = {
),
"what-is-staking-icon": url(require("style/icons/what-is-staking.svg")),
"watch-only-icon": url(require("style/icons/watchOnlyNav.svg")),
- "x-white-icon": url(require("style/icons/closeWhite.svg")),
"show-pubkey-icon": url(require("style/icons/accountShowWhite.svg")),
"hide-pubkey-icon": url(require("style/icons/accountHideWhite.svg")),
"loader-animation-blockchain-syncing": url(
diff --git a/app/style/themes/lightTheme.js b/app/style/themes/lightTheme.js
index f2c32b0d16..9d315cd0c8 100644
--- a/app/style/themes/lightTheme.js
+++ b/app/style/themes/lightTheme.js
@@ -3,7 +3,7 @@ const url = (s) => `url('${s}')`;
const lightTheme = {
"background-back-color": "#fff",
- "background-container": "#f3f5f6",
+ "background-container": "#F3F5F6",
"background-container-opaque": "rgba(243, 245, 246, 0.895)",
"background-container-hover": "#f0f4f4",
"background-hovered": "#e9f8fe",
@@ -100,15 +100,11 @@ const lightTheme = {
"filter-menu-bg-hover": "#596d81",
"menutab-hover": "#596d81",
"tooltip-container": "#f3f5f6",
- "loader-bg": "#d1d5db",
- "display-wallet-bg":
- "linear-gradient(225deg, var(--white-border), var(--display-wallet-gradient-right))",
+ "loader-bg": "#F9FAFA",
"select-border": "#e7eaed",
"transaction-account-name-bg": "#E9F8FE",
"account-row-hover": "#f0f4f4",
"chart-cursor-color": "#e9f8fe",
- "linear-progress-text-default": "#fff",
- "linear-progress-text-initial": "#fff",
"onboard-toolbar-shadow": "rgba(9,20,64,0.13)",
"onboard-toolbar-background": "#fff",
"background-copy-color": "#e9f8ff",
@@ -123,6 +119,7 @@ const lightTheme = {
"proposal-text-markdown": "#f6f8fa",
"background-address-copy-color": "#e9f8ff",
"icons-shadow": "rgba(0, 0, 0, 0.12)",
+ "icons-shadow-hover": "rgba(0, 0, 0, 0.32)",
"no-more-tickets-indicator-bg": "#E6EAED",
"ease-in-out-quart": "cubic-bezier(0.77, 0, 0.175, 1)",
"input-copy-hover-color": "#78d9f8",
@@ -140,6 +137,8 @@ const lightTheme = {
"grey-5": "#8997A5",
"grey-6": "#596D81",
"grey-7": "#3D5873",
+ "light-green": "#C6ECCB",
+ "green-2": "#2ED8A3",
orange: "#ED6D47",
"light-blue": "#D4F0FD",
"main-dark-blue": "#091440",
@@ -193,6 +192,7 @@ const lightTheme = {
"seedword-button-text": "var(--main-dark-blue)",
"seedword-button-invalid-bg": "#f0b3a1",
+ "launcher-link-color": "#536076",
"alert-icon-bg-color": "#feb8a5",
/* icons */
@@ -219,13 +219,10 @@ const lightTheme = {
"testnet-logo": url(require("style/icons/testnet-logo.svg")),
"mainnet-logo": url(require("style/icons/decred-logo.svg")),
"create-wallet-icon": url(require("style/icons/createnewwallet.svg")),
- "wallet-blue-icon": url(require("style/icons/wallet-blue.svg")),
"wallet-gray-icon": url(require("style/icons/wallet-gray.svg")),
blockchain: url(require("style/icons/blockchain.svg")),
"blockchain-default": url(require("style/icons/blockchainDefault.svg")),
"blockchain-initial": url(require("style/icons/blockchainInitial.svg")),
- "launcher-edit-wallets": url(require("style/icons/editDefault.svg")),
- "launcher-edit-wallets-hover": url(require("style/icons/editHover.svg")),
"onboarding-checkcircle": url(
require("style/icons/onboarding-checkcircle.svg")
),
diff --git a/test/unit/actions/DaemonActions.spec.js b/test/unit/actions/DaemonActions.spec.js
new file mode 100644
index 0000000000..285aa81947
--- /dev/null
+++ b/test/unit/actions/DaemonActions.spec.js
@@ -0,0 +1,130 @@
+import * as da from "actions/DaemonActions";
+import { createStore } from "test-utils.js";
+import * as wal from "wallet";
+import { preDefinedGradients } from "helpers";
+
+const daemonActions = da;
+const wallet = wal;
+
+let mockAvailableWallets = [
+ {
+ wallet: "wallet1",
+ displayWalletGradient: preDefinedGradients[0],
+ lastAccess: 10
+ },
+ {
+ wallet: "wallet2",
+ displayWalletGradient: preDefinedGradients[1],
+ lastAccess: 9
+ },
+ {
+ wallet: "missing-gradient-wallet",
+ lastAccess: 8
+ },
+ {
+ wallet: "wallet4",
+ displayWalletGradient: preDefinedGradients[3],
+ lastAccess: 11
+ },
+ {
+ wallet: "missing-gradient-wallet222222222222",
+ lastAccess: 12
+ },
+ {
+ wallet: "wallet5",
+ displayWalletGradient: preDefinedGradients[5]
+ },
+ {
+ wallet: "wallet6",
+ displayWalletGradient: preDefinedGradients[6]
+ },
+ {
+ wallet: "wallet7",
+ displayWalletGradient: preDefinedGradients[7]
+ },
+ {
+ wallet: "wallet8",
+ displayWalletGradient: preDefinedGradients[8]
+ },
+ {
+ wallet: "wallet9",
+ displayWalletGradient: preDefinedGradients[9]
+ },
+ {
+ wallet: "wallet10",
+ displayWalletGradient: preDefinedGradients[10]
+ },
+ {
+ wallet: "needto-generate-random-gradient-wallet"
+ }
+];
+
+const mockConfigSet = jest.fn(() => {});
+let mockGetAvailableWallets;
+
+beforeEach(() => {
+ wallet.getWalletCfg = jest.fn(() => ({
+ set: mockConfigSet
+ }));
+ mockGetAvailableWallets = wallet.getAvailableWallets = jest.fn(() => ({
+ availableWallets: mockAvailableWallets
+ }));
+});
+
+test("test checkDisplayWalletGradients", () => {
+ const store = createStore({
+ settings: { currentSettings: { network: "testnet" } }
+ });
+
+ store.dispatch(
+ daemonActions.checkDisplayWalletGradients(mockAvailableWallets)
+ );
+
+ expect(mockConfigSet).toHaveBeenNthCalledWith(
+ 1,
+ "display_wallet_gradient",
+ preDefinedGradients[2]
+ );
+ expect(mockConfigSet).toHaveBeenNthCalledWith(
+ 2,
+ "display_wallet_gradient",
+ preDefinedGradients[4]
+ );
+ expect(mockConfigSet).toHaveBeenCalledTimes(3);
+
+ expect(mockGetAvailableWallets).toHaveBeenCalledTimes(1);
+});
+
+test("checkDisplayWalletGradients (no missing gradient)", () => {
+ mockAvailableWallets = [
+ {
+ wallet: "wallet1",
+ displayWalletGradient: preDefinedGradients[0],
+ lastAccess: 10
+ },
+ {
+ wallet: "wallet2",
+ displayWalletGradient: preDefinedGradients[1],
+ lastAccess: 9
+ },
+ {
+ wallet: "wallet4",
+ displayWalletGradient: preDefinedGradients[3],
+ lastAccess: 11
+ }
+ ];
+ mockGetAvailableWallets = wallet.getAvailableWallets = jest.fn(() => ({
+ availableWallets: mockAvailableWallets
+ }));
+
+ const store = createStore({
+ settings: { currentSettings: { network: "testnet" } }
+ });
+
+ store.dispatch(
+ daemonActions.checkDisplayWalletGradients(mockAvailableWallets)
+ );
+
+ expect(mockConfigSet).not.toHaveBeenCalled();
+ expect(mockGetAvailableWallets).not.toHaveBeenCalled();
+});
diff --git a/test/unit/components/indicators/AnimatedLinearProgressFull.spec.js b/test/unit/components/indicators/AnimatedLinearProgressFull.spec.js
index c100fac306..87979cb78d 100644
--- a/test/unit/components/indicators/AnimatedLinearProgressFull.spec.js
+++ b/test/unit/components/indicators/AnimatedLinearProgressFull.spec.js
@@ -1,4 +1,4 @@
-import AnimatedLinearProgressFull from "components/indicators/LinearProgress/AnimatedLinearProgressFull";
+import AnimatedLinearProgressFull from "components/indicators/AnimatedLinearProgressFull";
import { render } from "test-utils.js";
import { screen } from "@testing-library/react";
import * as sel from "selectors";
@@ -45,7 +45,7 @@ test("tests default AnimatedLinearProgressFull", () => {
() => 3113
));
- const checkLinearProgressBoxes = (expectedWidth, expectedBoxCount) => {
+ const checkLinearProgressBar = (expectedWidth) => {
mockGetCurrentBlockCount = selectors.getCurrentBlockCount = jest.fn(
() => testCurrentBlockCount
);
@@ -58,13 +58,13 @@ test("tests default AnimatedLinearProgressFull", () => {
)
).toBeInTheDocument();
}
- const textElement = screen.getByText(testProps.text);
- expect(textElement.previousSibling.childNodes.length).toBe(
- expectedBoxCount
- );
- const linearProgressBar = textElement.previousSibling.previousSibling;
- expect(linearProgressBar).toHaveClass("linearProgressBar");
- expect(linearProgressBar).toHaveStyle(`width: ${expectedWidth}%;`);
+
+ if (expectedWidth > 0) {
+ const textElement = screen.getByText(testProps.text);
+ const linearProgressBar = textElement.previousSibling;
+ expect(linearProgressBar).toHaveClass("linearProgressBar");
+ expect(linearProgressBar).toHaveStyle(`width: ${expectedWidth}%;`);
+ }
};
const { rerender } = render(
);
@@ -82,44 +82,45 @@ test("tests default AnimatedLinearProgressFull", () => {
screen.getByText(/2 hours ago/i).closest("div.loaderBarEstimation")
.textContent
).toBe("Time from last fetched header: 2 hours ago");
- expect(screen.getByText(testProps.text)).toHaveClass(
- `linearProgressText ${testProps.animationType}`
- );
- checkLinearProgressBoxes(0, 0);
+
+ expect(
+ screen.getByText(testProps.text).parentNode.nextSibling.firstChild
+ ).toHaveClass(`icon ${testProps.animationType}`);
+ checkLinearProgressBar(0);
/* increase current block count */
testCurrentBlockCount = 100267;
- checkLinearProgressBoxes(20.653976323535773, 1);
+ checkLinearProgressBar(20.653976323535773);
/* increase current block count */
testCurrentBlockCount = 190267;
- checkLinearProgressBoxes(39.19305567285529, 2);
+ checkLinearProgressBar(39.19305567285529);
/* increase current block count */
testCurrentBlockCount = 290267;
- checkLinearProgressBoxes(59.79203272765474, 3);
+ checkLinearProgressBar(59.79203272765474);
/* increase current block count */
testCurrentBlockCount = 350267;
- checkLinearProgressBoxes(72.15141896053441, 4);
+ checkLinearProgressBar(72.15141896053441);
/* increase current block count */
testCurrentBlockCount = 400267;
- checkLinearProgressBoxes(82.45090748793415, 5);
+ checkLinearProgressBar(82.45090748793415);
/* increase current block count */
testCurrentBlockCount = 460267;
- checkLinearProgressBoxes(94.81029372081382, 6);
+ checkLinearProgressBar(94.81029372081382);
/* increase current block count */
testCurrentBlockCount = testNeededBlocks;
- checkLinearProgressBoxes(100, 0);
+ checkLinearProgressBar(100);
// test error mode
rerender(
);
- expect(
- screen.getByText(testProps.text).previousSibling.previousSibling
- ).toHaveClass("linearProgressBar error");
+ expect(screen.getByText(testProps.text).previousSibling).toHaveClass(
+ "linearProgressBar error"
+ );
mockIsSPV.mockRestore();
mockGetNeededBlocks.mockRestore();
@@ -189,23 +190,20 @@ test("dcrwallet log line is shown or log the error to console", async () => {
test("tests when deamon is synced", () => {
const mockIsSPV = (selectors.isSPV = jest.fn(() => false));
+ const mockStakeTransactions = (selectors.stakeTransactions = jest.fn(
+ () => []
+ ));
const mockGetDaemonSynced = (selectors.getDaemonSynced = jest.fn(() => true));
- const { rerender } = render(
);
+ render(
);
const textElement = screen.getByText(testProps.text);
- expect(textElement).toHaveClass(
- `linearProgressText ${testProps.animationType}`
- );
- expect(textElement.previousSibling).toHaveStyle("");
- expect(textElement.previousSibling).toHaveClass("linearProgressBar");
-
- // test error mode
- rerender(
);
- expect(screen.getByText(testProps.text).previousSibling).toHaveClass(
- "linearProgressBar error"
- );
+ expect(
+ screen.getByText(testProps.text).parentNode.nextSibling.firstChild
+ ).toHaveClass(`icon ${testProps.animationType}`);
+ expect(textElement.previousSibling).toBe(null);
mockIsSPV.mockRestore();
+ mockStakeTransactions.mockRestore();
mockGetDaemonSynced.mockRestore();
});
@@ -214,23 +212,21 @@ test("tests when isSPV is true", () => {
const mockGetDaemonSynced = (selectors.getDaemonSynced = jest.fn(
() => false
));
-
- const { rerender } = render(
);
+ const mockStakeTransactions = (selectors.stakeTransactions = jest.fn(
+ () => []
+ ));
+ render(
);
const textElement = screen.getByText(testProps.text);
- expect(textElement).toHaveClass(
- `linearProgressText ${testProps.animationType}`
+ expect(textElement.parentNode.nextSibling.firstChild.nextSibling).toHaveClass(
+ `icon ${testProps.animationType}`
);
- expect(textElement.previousSibling).toHaveStyle("");
- expect(textElement.previousSibling).toHaveClass("linearProgressBar");
-
- // test error mode
- rerender(
);
- expect(screen.getByText(testProps.text).previousSibling).toHaveClass(
- "linearProgressBar error"
+ expect(textElement.parentNode.nextSibling.firstChild.textContent).toMatch(
+ /spv mode/i
);
mockIsSPV.mockRestore();
+ mockStakeTransactions.mockRestore();
mockGetDaemonSynced.mockRestore();
});
diff --git a/test/unit/components/views/GetStaredPage/AdvancedStartup.spec.js b/test/unit/components/views/GetStaredPage/AdvancedStartup.spec.js
index 4a5a332153..ab97306ed4 100644
--- a/test/unit/components/views/GetStaredPage/AdvancedStartup.spec.js
+++ b/test/unit/components/views/GetStaredPage/AdvancedStartup.spec.js
@@ -55,14 +55,11 @@ beforeEach(() => {
test("test remote daemon form", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
expect(mockIsAdvancedDaemon).toHaveBeenCalled();
expect(mockGetRemoteCredentials).toHaveBeenCalled();
expect(mockGetAppdataPath).toHaveBeenCalled();
- expect(
- screen.getByText(/waiting for daemon connection.../i)
- ).toBeInTheDocument();
expect(
screen.getByText(/complete one of the following/i).textContent
).toMatchInlineSnapshot(
@@ -123,7 +120,7 @@ test("test remote daemon form", async () => {
test("test local daemon form", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
user.click(screen.getByTestId("switch"));
expect(screen.getByText("Daemon Data Directory:")).toBeInTheDocument();
@@ -146,7 +143,7 @@ test("test local daemon form", async () => {
test("test skip link", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
user.click(screen.getByText(/skip/i));
await wait(() => screen.getByText(testStartDaemonErrorMsg));
diff --git a/test/unit/components/views/GetStaredPage/CreateWallet.spec.js b/test/unit/components/views/GetStaredPage/CreateWallet.spec.js
index dccd884556..8a034d145d 100644
--- a/test/unit/components/views/GetStaredPage/CreateWallet.spec.js
+++ b/test/unit/components/views/GetStaredPage/CreateWallet.spec.js
@@ -93,7 +93,7 @@ beforeEach(() => {
const goToCopySeedView = async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
user.click(screen.getByText(/create a new wallet/i));
await wait(() => screen.getByText("Wallet Name"));
user.type(screen.getByPlaceholderText(/choose a name/i), testWalletName);
@@ -110,8 +110,8 @@ const goToConfirmView = async () => {
const goToRestoreView = async () => {
render(
);
- await wait(() => screen.getByText("Welcome to Decrediton Wallet"));
- user.click(screen.getByText("Restore Existing Wallet"));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
+ user.click(screen.getByText(/restore existing wallet/i));
await wait(() => screen.getByText("Wallet Name"));
user.type(screen.getByPlaceholderText("Choose a Name"), testWalletName);
};
@@ -375,7 +375,7 @@ test("pasting valid seed words on existing seed view and receive create wallet r
// expect to jump back to the wallet choose view, and display
// the error msg received from createWalletRequest
await wait(() => screen.getByText(testCreateWalletRequestErrorMsg));
- screen.getByText(/choose a wallet to open/i);
+ screen.getByText(/choose the wallet to access/i);
});
test("pasting valid seed words on existing seed view and successfully create wallet", async () => {
@@ -412,7 +412,7 @@ test("pasting valid seed words on existing seed view and successfully create wal
expect(mockCreateWallet).toHaveBeenCalled();
expect(mockCreateWalletRequest).toHaveBeenCalled();
await wait(() =>
- expect(screen.getByText(/choose a wallet to open/i)).toBeInTheDocument()
+ expect(screen.getByText(/choose the wallet to access/i)).toBeInTheDocument()
);
});
@@ -707,7 +707,7 @@ test("test cancel button on existing seed view", async () => {
user.click(screen.getByText("Cancel"));
await wait(() => expect(mockCancelCreateWallet).toHaveBeenCalled());
await wait(() =>
- expect(screen.getByText(/choose a wallet to open/i)).toBeInTheDocument()
+ expect(screen.getByText(/choose the wallet to access/i)).toBeInTheDocument()
);
});
@@ -717,7 +717,7 @@ test("test cancel button on copy seed view", async () => {
user.click(screen.getByText("Cancel"));
await wait(() => expect(mockCancelCreateWallet).toHaveBeenCalled());
await wait(() =>
- expect(screen.getByText(/choose a wallet to open/i)).toBeInTheDocument()
+ expect(screen.getByText(/choose the wallet to access/i)).toBeInTheDocument()
);
});
@@ -733,7 +733,7 @@ test("test go back button on existing seed view", async () => {
user.click(screen.getByText(/go back/i).nextElementSibling);
await wait(() =>
- expect(screen.getByText(/choose a wallet to open/i)).toBeInTheDocument()
+ expect(screen.getByText(/choose the wallet to access/i)).toBeInTheDocument()
);
});
@@ -742,7 +742,7 @@ test("test go back button on copy seed view", async () => {
user.click(screen.getByText(/go back/i).nextElementSibling);
await wait(() =>
- expect(screen.getByText(/choose a wallet to open/i)).toBeInTheDocument()
+ expect(screen.getByText(/choose the wallet to access/i)).toBeInTheDocument()
);
});
diff --git a/test/unit/components/views/GetStaredPage/GetStartedPage.spec.js b/test/unit/components/views/GetStaredPage/GetStartedPage.spec.js
index 7d0db7afaa..c7210fa616 100644
--- a/test/unit/components/views/GetStaredPage/GetStartedPage.spec.js
+++ b/test/unit/components/views/GetStaredPage/GetStartedPage.spec.js
@@ -78,24 +78,43 @@ beforeEach(() => {
test("render empty wallet chooser view", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
expect(screen.getByText(/logs/i)).toBeInTheDocument();
expect(screen.getByText(/settings/i)).toBeInTheDocument();
- expect(
- screen.getByText(`What's New in v${testAppVersion}`)
- ).toBeInTheDocument();
+ expect(screen.getByText("Release Info")).toBeInTheDocument();
expect(screen.getByText(/create a new wallet/i)).toBeInTheDocument();
expect(screen.getByText(/restore existing wallet/i)).toBeInTheDocument();
- expect(screen.getByText(/about decrediton/i)).toBeInTheDocument();
- expect(screen.getByText(/choose a wallet to open/i)).toBeInTheDocument();
- expect(screen.getByText(/learn the basics/i)).toBeInTheDocument();
- expect(screen.getByText(/edit wallets/i)).toBeInTheDocument();
+ expect(screen.getByText(/choose the wallet to access/i)).toBeInTheDocument();
expect(screen.getByTestId("getstarted-pagebody").className).not.toMatch(
/testnetBody/
);
- expect(screen.getByText(/update available/i)).toBeInTheDocument();
- expect(screen.getByText(/new version available/i)).toBeInTheDocument();
+
+ // check tutorials
+ expect(screen.getByText(/learn about decred/i)).toBeInTheDocument();
+ user.click(screen.getByText("Decred Intro"));
+ await wait(() => screen.getByText("Back"));
+ // go back
+ user.click(screen.getByText("Back").nextElementSibling);
+ await wait(() => screen.getByText(/welcome to decrediton/i));
+
+ // open onboard tutorial again and go back by finishing it
+ user.click(screen.getByText("Decred Intro"));
+ await wait(() => screen.getByText("Back"));
+ // step forward
+ const nextButton = screen.getByRole("button", { name: "Next" });
+ user.click(nextButton);
+ expect(screen.getAllByText("Governance systems").length).toBeTruthy();
+ // finish
+ user.click(nextButton);
+ await wait(() => screen.getByText(/welcome to decrediton/i));
+
+ // check learn the basics
+ user.click(screen.getByRole("button", { name: "Learn the Basics" }));
+ await wait(() => screen.getByText("Skip"));
+ // go back
+ user.click(screen.getByText("Skip"));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
expect(mockGetDaemonSynced).toHaveBeenCalled();
expect(mockIsSPV).toHaveBeenCalled();
@@ -106,22 +125,11 @@ test("render empty wallet chooser view", async () => {
expect(mockUpdateAvailable).toHaveBeenCalled();
});
-test("render empty wallet chooser view in SPV mode", async () => {
- mockIsSPV = selectors.isSPV = jest.fn(() => true);
-
- render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
-
- expect(
- screen.getByText(/choose a wallet to open in spv mode/i)
- ).toBeInTheDocument();
-});
-
test("render empty wallet chooser view in testnet mode", async () => {
mockIsTestNet = selectors.isTestNet = jest.fn(() => true);
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
expect(screen.getByTestId("getstarted-pagebody").className).toMatch(
/testnetBody/
);
@@ -135,9 +143,9 @@ test("render empty wallet chooser view and click-on&test release notes", async (
const oldestVersionNumber = 130;
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
- user.click(screen.getByText(/what's new in/i));
+ user.click(screen.getByText(/Release Info/i));
await wait(() => screen.getByText(/newer version/i));
const header = screen.getByText(/Decrediton (.*) Released/i);
expect(header).toBeInTheDocument();
@@ -174,31 +182,35 @@ test("render empty wallet chooser view and click-on&test release notes", async (
// go back to the wallet chooser view
user.click(screen.getByText(/go back/i).nextElementSibling);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
});
test("click on settings link and go back", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
user.click(screen.getByText(/settings/i));
- await wait(() => screen.getByText(/connectivity/i));
+ await wait(() => screen.getByText("Connectivity"));
// go back
- user.click(screen.getByText(/go back/i));
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ user.click(
+ screen.getByRole("button", {
+ name: "Go back"
+ })
+ );
+ await wait(() => screen.getByText(/welcome to decrediton/i));
});
test("click on logs view", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
user.click(screen.getByText(/logs/i));
await wait(() => screen.queryByText(/system logs/i));
// go back
user.click(screen.getByText(/go back/i).nextElementSibling);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
});
test("test if app receive daemon connection data from cli", async () => {
@@ -246,7 +258,7 @@ test("start regular daemon and not receive available wallet", async () => {
mockIsSPV = selectors.isSPV = jest.fn(() => false);
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
expect(mockStartDaemon).toHaveBeenCalled();
expect(mockSyncDaemon).toHaveBeenCalled();
expect(mockCheckNetworkMatch).toHaveBeenCalled();
@@ -260,7 +272,7 @@ test("start regular daemon and receive sync daemon error", async () => {
rpcPresent: false
};
});
- const testSyncErrorMsg = "sync-error-msg";
+ const testSyncErrorMsg = { error: "sync-error-msg" };
mockSyncDaemon = daemonActions.syncDaemon = jest.fn(() => () =>
Promise.reject(testSyncErrorMsg)
);
@@ -268,9 +280,10 @@ test("start regular daemon and receive sync daemon error", async () => {
mockIsSPV = selectors.isSPV = jest.fn(() => false);
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ expect(screen.getByText("Starting Daemon...")).toBeInTheDocument();
+ await wait(() => expect(mockSyncDaemon).toHaveBeenCalled());
+ expect(screen.queryByText(/Learn about decred/i)).not.toBeInTheDocument();
expect(mockStartDaemon).toHaveBeenCalled();
- expect(mockSyncDaemon).toHaveBeenCalled();
expect(mockCheckNetworkMatch).not.toHaveBeenCalled();
wl.getCLIOptions.mockRestore();
});
@@ -289,9 +302,9 @@ test("start regular daemon and receive network match error", async () => {
mockIsSPV = selectors.isSPV = jest.fn(() => false);
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => expect(mockSyncDaemon).toHaveBeenCalled());
+ expect(screen.queryByText(/Learn about decred/i)).not.toBeInTheDocument();
expect(mockStartDaemon).toHaveBeenCalled();
- expect(mockSyncDaemon).toHaveBeenCalled();
expect(mockCheckNetworkMatch).toHaveBeenCalled();
wl.getCLIOptions.mockRestore();
});
diff --git a/test/unit/components/views/GetStaredPage/LanguageSelectPage.spec.js b/test/unit/components/views/GetStaredPage/LanguageSelectPage.spec.js
index 9215dde9fa..2619dcf9eb 100644
--- a/test/unit/components/views/GetStaredPage/LanguageSelectPage.spec.js
+++ b/test/unit/components/views/GetStaredPage/LanguageSelectPage.spec.js
@@ -31,7 +31,7 @@ beforeEach(() => {
test("render language select page", () => {
render(
);
- expect(screen.getByText(/welcome to decrediton wallet/i)).toBeInTheDocument();
+ expect(screen.getByText(/welcome to decrediton/i)).toBeInTheDocument();
expect(screen.getByText(/choose your language/i)).toBeInTheDocument();
expect(screen.getByText(testLocalesArray[0].description)).toBeInTheDocument();
expect(screen.getByTestId("getstarted-pagebody").className).not.toMatch(
diff --git a/test/unit/components/views/GetStaredPage/PreCreateWallet.spec.js b/test/unit/components/views/GetStaredPage/PreCreateWallet.spec.js
index 5439159219..9ed0823cfe 100644
--- a/test/unit/components/views/GetStaredPage/PreCreateWallet.spec.js
+++ b/test/unit/components/views/GetStaredPage/PreCreateWallet.spec.js
@@ -91,7 +91,7 @@ beforeEach(() => {
const goToGetStartedView = async () => {
render(
);
- return await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ return await wait(() => screen.getByText(/welcome to decrediton/i));
};
const goToCreateNewWalletView = async () => {
@@ -115,7 +115,7 @@ test("test when createWallet has been rejected", async () => {
expect(mockCreateWallet).toHaveBeenCalledWith(testSelectedWallet);
user.click(screen.getByText(/cancel/i));
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
});
test("daemon response success through createWallet function and createWalletPage has been reached", async () => {
@@ -333,7 +333,7 @@ test("trezor device is connected", async () => {
trezor: { device: { connected: true } }
}
});
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
user.click(screen.getByText(/restore existing wallet/i));
await wait(() => screen.getByText("Wallet Name"));
user.click(screen.getByText("Advanced Options"));
@@ -378,7 +378,7 @@ test("trezor has to auto-disable when step back from restore view", async () =>
expect(mockEnableTrezor).toHaveBeenCalled();
user.click(screen.getByText(/cancel/i));
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
expect(mockDisableTrezor).toHaveBeenCalled();
});
diff --git a/test/unit/components/views/GetStaredPage/PrivacyPage.spec.js b/test/unit/components/views/GetStaredPage/PrivacyPage.spec.js
index d6cd71810f..49146867bb 100644
--- a/test/unit/components/views/GetStaredPage/PrivacyPage.spec.js
+++ b/test/unit/components/views/GetStaredPage/PrivacyPage.spec.js
@@ -1,4 +1,4 @@
-import PrivacyPage from "components/views/GetStartedPage/PrivacyPage/PrivacyPage";
+import { PrivacyPage } from "components/views/GetStartedPage";
import { render } from "test-utils.js";
import { screen } from "@testing-library/react";
import user from "@testing-library/user-event";
diff --git a/test/unit/components/views/GetStaredPage/RescanWallet.spec.js b/test/unit/components/views/GetStaredPage/RescanWallet.spec.js
deleted file mode 100644
index 2c0d9bdcf7..0000000000
--- a/test/unit/components/views/GetStaredPage/RescanWallet.spec.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import RescanWallet from "components/views/GetStartedPage/RescanWallet/RescanWallet";
-import { render } from "test-utils.js";
-import * as sel from "selectors";
-import { screen } from "@testing-library/react";
-
-const testStartBlock = 22;
-const testEndBlock = 66;
-const testCurrentBlock = 55;
-const selectors = sel;
-
-let mockRescanStartBlock;
-let mockRescanEndBlock;
-let mockRescanCurrentBlock;
-
-beforeEach(() => {
- mockRescanStartBlock = selectors.rescanStartBlock = jest.fn(
- () => testStartBlock
- );
- mockRescanEndBlock = selectors.rescanEndBlock = jest.fn(() => testEndBlock);
- mockRescanCurrentBlock = selectors.rescanCurrentBlock = jest.fn(
- () => testCurrentBlock
- );
-});
-
-test("test RescanWallet", () => {
- render(
);
- expect(mockRescanStartBlock).toHaveBeenCalled();
- expect(mockRescanEndBlock).toHaveBeenCalled();
- expect(mockRescanCurrentBlock).toHaveBeenCalled();
-
- expect(screen.getByText(/rescan progress/i).textContent).toBe(
- `Rescan Progress (${testCurrentBlock} / ${testEndBlock})`
- );
-});
-
-test("test if startBlock is larger than currentBlock", () => {
- const testLargerStartBlock = 56;
- mockRescanStartBlock = selectors.rescanStartBlock = jest.fn(
- () => testLargerStartBlock
- );
- render(
);
-
- expect(screen.getByText(/rescan progress/i).textContent).toBe(
- `Rescan Progress (${testLargerStartBlock} / ${testEndBlock})`
- );
-});
diff --git a/test/unit/components/views/GetStaredPage/WalletSelection.spec.js b/test/unit/components/views/GetStaredPage/WalletSelection.spec.js
index 1c2357a158..6778bbcd55 100644
--- a/test/unit/components/views/GetStaredPage/WalletSelection.spec.js
+++ b/test/unit/components/views/GetStaredPage/WalletSelection.spec.js
@@ -21,6 +21,8 @@ let mockSetSelectedWallet;
let mockOpenWalletAttempt;
let mockStartRpcRequestFunc;
let mockGetSelectedWallet;
+let mockGetSelectedWalletSelector;
+let mockSetAutoWalletLaunching;
let testAvailableWallets;
const selectors = sel;
@@ -95,6 +97,9 @@ beforeEach(() => {
mockStartRpcRequestFunc = wlActions.startRpcRequestFunc = jest.fn(() => () =>
Promise.reject()
);
+ mockSetAutoWalletLaunching = wlActions.setAutoWalletLaunching = jest.fn(
+ () => () => {}
+ );
mockStartWallet = daemonActions.startWallet = jest.fn(() => () =>
Promise.resolve()
);
@@ -104,11 +109,15 @@ beforeEach(() => {
selectors.isSPV = jest.fn(() => false);
clientActions.goToHomePage = jest.fn(() => {});
selectors.stakeTransactions = jest.fn(() => []);
+ mockGetSelectedWalletSelector = selectors.getSelectedWallet = jest.fn(
+ () => () => null
+ );
+ selectors.autoWalletLaunching = jest.fn(() => undefined);
});
test("render wallet chooser view", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
expect(mockSortedAvailableWallets).toHaveBeenCalled();
expect(mockGetSelectedWallet).toHaveBeenCalled();
@@ -116,11 +125,8 @@ test("render wallet chooser view", async () => {
// check regular wallet
const regularWallet = screen.getByText(testAvailableWallets[0].value.wallet);
expect(regularWallet).toBeInTheDocument();
- expect(regularWallet.nextSibling.textContent).toMatch(
- /last accessed: 1 hour ago/i
- );
expect(regularWallet.nextSibling.nextSibling.textContent).toMatch(
- /launch wallet/i
+ /last accessed: 1 hour ago/i
);
// check unfinished wallet
@@ -128,35 +134,26 @@ test("render wallet chooser view", async () => {
testAvailableWallets[1].value.wallet
);
expect(unfinishedWallet).toBeInTheDocument();
- expect(unfinishedWallet.nextSibling.textContent).toMatch(
- /last accessed: yesterday/i
- );
- expect(unfinishedWallet.previousSibling.previousSibling.textContent).toMatch(
+ expect(unfinishedWallet.nextSibling.nextSibling.textContent).toMatch(
/setup incomplete/i
);
// check trezor wallet
const trezorWallet = screen.getByText(testAvailableWallets[2].value.wallet);
expect(trezorWallet).toBeInTheDocument();
- expect(trezorWallet.previousSibling.previousSibling.textContent).toMatch(
- /trezor/i
- );
+ expect(trezorWallet.nextSibling.textContent).toMatch(/trezor/i);
// check privacy wallet
const privacyWallet = screen.getByText(testAvailableWallets[3].value.wallet);
expect(privacyWallet).toBeInTheDocument();
- expect(privacyWallet.previousSibling.previousSibling.textContent).toMatch(
- /privacy/i
- );
+ expect(privacyWallet.nextSibling.textContent).toMatch(/privacy/i);
// check watching only wallet
const watchOnlyWallet = screen.getByText(
testAvailableWallets[4].value.wallet
);
expect(watchOnlyWallet).toBeInTheDocument();
- expect(watchOnlyWallet.previousSibling.previousSibling.textContent).toMatch(
- /watch only/i
- );
+ expect(watchOnlyWallet.nextSibling.textContent).toMatch(/watch only/i);
expect(screen.getByText("Create a New Wallet")).toBeInTheDocument();
expect(screen.getByText("Restore Existing Wallet")).toBeInTheDocument();
@@ -164,9 +161,9 @@ test("render wallet chooser view", async () => {
test("test editing wallets", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
- user.click(screen.getByText(/edit wallets/i).nextElementSibling);
+ user.click(screen.getByText(/edit wallets/i));
expect(screen.getByText("Close")).toBeInTheDocument();
expect(screen.getAllByText(/remove wallet/i).length).toBe(
testAvailableWallets.length
@@ -188,33 +185,118 @@ test("test editing wallets", async () => {
expect(mockRemoveWallet).toHaveBeenCalledWith(testAvailableWallets[0]);
expect(screen.queryByText(/warning this action/i)).not.toBeInTheDocument();
- user.click(screen.getByText("Close").nextElementSibling);
+ user.click(screen.getByText("Close"));
expect(screen.queryByText("Close")).not.toBeInTheDocument();
expect(screen.getByText(/edit wallets/i)).toBeInTheDocument();
});
-test("launch a wallet", async () => {
+const sleep = (ms) => new Promise((ok) => setTimeout(ok, ms));
+const launchWallet = async (ms) => {
+ mockStartWallet = daemonActions.startWallet = jest.fn(() => () =>
+ Promise.resolve(true)
+ );
+ mockStartRpcRequestFunc = wlActions.startRpcRequestFunc = jest.fn(
+ () => async (dispatch) => {
+ if (ms) {
+ await sleep(ms);
+ }
+ dispatch({ type: wlActions.SYNC_SYNCED });
+ Promise.resolve();
+ }
+ );
+ mockGetSelectedWalletSelector = selectors.getSelectedWallet = jest.fn(
+ () => () => ({
+ value: "mock-wallet"
+ })
+ );
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
const wallet = screen.getByText(testAvailableWallets[1].value.wallet);
user.click(wallet);
- expect(wallet.nextSibling.nextSibling.textContent).toMatch(/launch wallet/i);
- user.click(screen.getByText(/launch wallet/i));
await wait(() =>
expect(mockStartWallet).toHaveBeenCalledWith(testAvailableWallets[1])
);
+};
+
+test("launch a wallet and click on Save button on Auto Wallet launching modal", async () => {
+ await launchWallet();
+ await wait(() => screen.getByText("Finishing to load wallet"));
+
+ user.click(screen.getByRole("button", { name: "Open Wallet" }));
+ user.click(screen.getByRole("button", { name: "Save" }));
+ await wait(() => screen.queryByText("Automatic Wallet Launching"));
+
+ expect(screen.getByText("Setup Wallet")).toBeInTheDocument();
+
expect(mockSetSelectedWallet).toHaveBeenCalled();
+ expect(mockStartWallet).toHaveBeenCalled();
+ expect(mockStartRpcRequestFunc).toHaveBeenCalled();
+ expect(mockGetSelectedWalletSelector).toHaveBeenCalled();
+ expect(mockSetAutoWalletLaunching).toHaveBeenCalledWith(true);
+});
+
+test("launch a wallet and click on checkbox, then the Save button on Auto Wallet launching modal", async () => {
+ await launchWallet();
+ await wait(() => screen.getByText("Finishing to load wallet"));
+
+ user.click(screen.getByRole("button", { name: "Open Wallet" }));
+ user.click(screen.getByRole("checkbox"));
+ user.click(screen.getByRole("button", { name: "Save" }));
+ await wait(() => screen.queryByText("Automatic Wallet Launching"));
+
+ expect(screen.getByText("Setup Wallet")).toBeInTheDocument();
+ expect(mockSetAutoWalletLaunching).toHaveBeenCalledWith(false);
+});
+
+test("launch a wallet and click on Ask me later button on Auto Wallet launching modal", async () => {
+ await launchWallet();
+ await wait(() => screen.getByText("Finishing to load wallet"));
+
+ user.click(screen.getByRole("button", { name: "Open Wallet" }));
+ user.click(screen.getByRole("button", { name: "Ask me later" }));
+ await wait(() => screen.queryByText("Automatic Wallet Launching"));
+
+ expect(screen.getByText("Setup Wallet")).toBeInTheDocument();
+ expect(mockSetAutoWalletLaunching).not.toHaveBeenCalled();
+});
+
+test("launch a wallet and close Auto Wallet launching modal", async () => {
+ await launchWallet();
+ await wait(() => screen.getByText("Finishing to load wallet"));
+
+ user.click(screen.getByRole("button", { name: "Open Wallet" }));
+ user.click(screen.getByRole("button", { name: "Close" }));
+ await wait(() => screen.queryByText("Automatic Wallet Launching"));
+
+ expect(screen.getByText("Setup Wallet")).toBeInTheDocument();
+ expect(mockSetAutoWalletLaunching).not.toHaveBeenCalled();
+});
+
+test("launch a wallet and open wallet automatically ", async () => {
+ selectors.autoWalletLaunching = jest.fn(() => true);
+ await launchWallet();
+
+ expect(screen.getByText("Setup Wallet")).toBeInTheDocument();
+ expect(mockSetAutoWalletLaunching).not.toHaveBeenCalled();
+});
+
+test("launch a wallet and cancel loading", async () => {
+ await launchWallet(1000);
+ await wait(() => screen.getByText("Cancel Loading"));
+ user.click(screen.getByText("Cancel Loading"));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
+ expect(mockSetAutoWalletLaunching).not.toHaveBeenCalled();
});
test("launch an encrypted wallet", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
mockStartWallet = daemonActions.startWallet = jest.fn(() => () =>
Promise.reject(OPENWALLET_INPUT)
);
- user.click(screen.getByText(/launch wallet/i));
+ user.click(screen.getByText(testAvailableWallets[0].value.wallet));
await wait(() => expect(mockStartWallet).toHaveBeenCalled());
expect(screen.getByText(/insert your pubkey/i)).toBeInTheDocument();
expect(screen.getByText(/decrypt wallet/i)).toBeInTheDocument();
@@ -279,7 +361,7 @@ test("launch an encrypted wallet", async () => {
test("ask for passphrase if account discovery is needed", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
mockStartWallet = daemonActions.startWallet = jest.fn(() => () =>
Promise.reject(OPENWALLET_INPUTPRIVPASS)
@@ -290,7 +372,7 @@ test("ask for passphrase if account discovery is needed", async () => {
return Promise.reject(OPENWALLET_INPUTPRIVPASS);
}
);
- user.click(screen.getByText(/launch wallet/i));
+ user.click(screen.getByText(testAvailableWallets[0].value.wallet));
await wait(() => expect(mockStartWallet).toHaveBeenCalled());
let privatePassphraseInput = screen.getByPlaceholderText(
/private passphrase/i
@@ -341,7 +423,7 @@ test("ask for passphrase if account discovery is needed", async () => {
test("launch an encrypted wallet and ask private passphrase too if account discovery is needed", async () => {
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
mockStartWallet = daemonActions.startWallet = jest.fn(() => () =>
Promise.reject(OPENWALLET_INPUT)
@@ -349,8 +431,10 @@ test("launch an encrypted wallet and ask private passphrase too if account disco
mockOpenWalletAttempt = wlActions.openWalletAttempt = jest.fn(() => () =>
Promise.reject(OPENWALLET_INPUTPRIVPASS)
);
- user.click(screen.getByText(/launch wallet/i));
+
+ user.click(screen.getByText(testAvailableWallets[0].value.wallet));
await wait(() => expect(mockStartWallet).toHaveBeenCalled());
+
const publicPassphraseInput = screen.getByPlaceholderText(
/public passphrase/i
);
@@ -373,5 +457,5 @@ test("test isSyncingRPC in SPV mode and receive error from SPV sync", async () =
selectors.isSPV = jest.fn(() => true);
wlActions.spvSyncAttempt = jest.fn(() => () => Promise.reject());
render(
);
- await wait(() => screen.getByText(/welcome to decrediton wallet/i));
+ await wait(() => screen.getByText(/welcome to decrediton/i));
});
diff --git a/test/unit/components/views/SettingsPage/SettingsPage.spec.js b/test/unit/components/views/SettingsPage/SettingsPage.spec.js
index b062b056bb..0f08dec1e1 100644
--- a/test/unit/components/views/SettingsPage/SettingsPage.spec.js
+++ b/test/unit/components/views/SettingsPage/SettingsPage.spec.js
@@ -60,6 +60,7 @@ const testDefaultAllowedExternalRequests = [
];
const testDefaultUIAnimationsLabel = "Enabled";
const testUIAnimationsLabel = "Disabled";
+const testDefaultAutoWalletLaunching = false;
const testCurrentSettings = {
locale: testDefaultLocale.key,
@@ -75,7 +76,8 @@ const testCurrentSettings = {
gapLimit: testDefaultGapLimit,
timezone: testDefaultTimezone,
uiAnimations: testDefaultUIAnimationsLabel,
- allowedExternalRequests: testDefaultAllowedExternalRequests
+ allowedExternalRequests: testDefaultAllowedExternalRequests,
+ autoWalletLaunching: testDefaultAutoWalletLaunching
};
const testSettings = {
currentSettings: testCurrentSettings,
@@ -557,7 +559,7 @@ test.each([
]
])("test '%s' RadioButtonGroup", testRadioButtonGroupInput);
-const testCheckBoxInput = (label, configKey) => {
+const testCheckBoxInputOnPrivacy = (label, configKey) => {
render(
, {
initialState: {
settings: testSettings
@@ -594,7 +596,31 @@ test.each([
["Update Check", EXTERNALREQUEST_UPDATE_CHECK],
["Politeia", EXTERNALREQUEST_POLITEIA],
["Decred Block Explorer", EXTERNALREQUEST_DCRDATA]
-])("test '%s' Checkbox", testCheckBoxInput);
+])("test '%s' Checkbox", testCheckBoxInputOnPrivacy);
+
+test("test launcer CheckBox", () => {
+ render(
, {
+ initialState: {
+ settings: testSettings
+ }
+ });
+ user.click(screen.getByText("General"));
+
+ const checkbox = screen.getByLabelText(
+ "Launch wallet immediately after loading completes"
+ );
+ expect(checkbox.checked).toBe(testDefaultAutoWalletLaunching);
+
+ user.click(checkbox);
+ expect(checkbox.checked).toBe(!testDefaultAutoWalletLaunching);
+
+ const expectedChange = {
+ ...testCurrentSettings,
+ autoWalletLaunching: !testDefaultAutoWalletLaunching
+ };
+
+ expect(mockSaveSettings).toHaveBeenCalledWith(expectedChange);
+});
const getFieldRequiredErrorCount = () => {
const inputErrorString = "This field is required";