From f329a710295deed3c15f2acff9a519c0a70e98e1 Mon Sep 17 00:00:00 2001 From: dsc Date: Mon, 14 Jan 2019 01:02:44 +0100 Subject: Wizard redesign --- js/Wizard.js | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 js/Wizard.js (limited to 'js/Wizard.js') diff --git a/js/Wizard.js b/js/Wizard.js new file mode 100644 index 00000000..ccef1ba6 --- /dev/null +++ b/js/Wizard.js @@ -0,0 +1,179 @@ +.pragma library + +function updateFromQrCode(address, payment_id, amount, tx_description, recipient_name, extra_parameters) { + // Switch to recover from keys + recoverFromSeedMode = false + spendkey.text = "" + viewKeyLine.text = "" + restoreHeightItem.text = "" + + if(typeof extra_parameters.secret_view_key != "undefined") { + viewKeyLine.text = extra_parameters.secret_view_key + } + if(typeof extra_parameters.secret_spend_key != "undefined") { + spendkey.text = extra_parameters.secret_spend_key + } + if(typeof extra_parameters.restore_height != "undefined") { + restoreHeightItem.text = extra_parameters.restore_height + } + addressLine.text = address + + cameraUi.qrcode_decoded.disconnect(updateFromQrCode) + + // Check if keys are correct + checkNextButton(); +} + +function restart(){ + wizard.currentPage = 0; + wizard.settings = ({}) + wizard.currentPath = "create_wallet" + wizard.pages = paths[currentPath] + wizardRestarted(); + + //hide all pages except first + for (var i = 1; i < wizard.pages.length; i++){ + wizard.pages[i].opacity = 0; + } + //Show first pages + wizard.pages[0].opacity = 1; + +} + +function switchPage(next) { + // Android focus workaround + releaseFocus(); + + // save settings for current page; + if (next && typeof pages[currentPage].onPageClosed !== 'undefined') { + if (pages[currentPage].onPageClosed(settings) !== true) { + print ("Can't go to the next page"); + return; + }; + + } + console.log("switchpage: currentPage: ", currentPage); + + // Update prev/next button positions for mobile/desktop + prevButton.anchors.verticalCenter = (!isMobile) ? wizard.verticalCenter : undefined + prevButton.anchors.bottom = (isMobile) ? wizard.bottom : undefined + nextButton.anchors.verticalCenter = (!isMobile) ? wizard.verticalCenter : undefined + nextButton.anchors.bottom = (isMobile) ? wizard.bottom : undefined + + if (currentPage > 0 || currentPage < pages.length - 1) { + pages[currentPage].opacity = 0 + var step_value = next ? 1 : -1 + currentPage += step_value + pages[currentPage].opacity = 1; + + var nextButtonVisible = currentPage > 1 && currentPage < pages.length - 1 + nextButton.visible = nextButtonVisible + + if (typeof pages[currentPage].onPageOpened !== 'undefined') { + pages[currentPage].onPageOpened(settings,next) + } + } +} + +function openRecoveryWalletPage() { + wizardRestarted(); + print ("show recovery wallet page"); + currentPath = "recovery_wallet" + pages = paths[currentPath] + // Create temporary wallet + createWalletPage.createWallet(settings) + wizard.nextButton.visible = true + // goto next page + switchPage(true); +} + +function openCreateViewOnlyWalletPage(){ + pages[currentPage].opacity = 0 + currentPath = "create_view_only_wallet" + pages = paths[currentPath] + currentPage = pages.indexOf(createViewOnlyWalletPage) + createViewOnlyWalletPage.opacity = 1 + nextButton.visible = true + rootItem.state = "wizard"; +} + +function openCreateWalletFromDevicePage() { + wizardRestarted(); + print ("show create wallet from device page"); + currentPath = "create_wallet_from_device" + pages = paths[currentPath] + wizard.nextButton.visible = true + // goto next page + switchPage(true); +} + +function createWalletPath(isIOS, folder_path,account_name){ + // Remove trailing slash - (default on windows and mac) + if (folder_path.substring(folder_path.length -1) === "/"){ + folder_path = folder_path.substring(0,folder_path.length -1) + } + + // Store releative path on ios. + if(isIOS) + folder_path = ""; + + return folder_path + "/" + account_name + "/" + account_name +} + +function walletPathExists(directory, filename, isIOS, walletManager) { + if(!filename || filename === "") return false; + if(!directory || directory === "") return false; + + // make sure directory endswith path seperator + // @TODO: use .endswith() after Qt 5.8 + var trailing_path_sep = directory[directory.length-1]; + if(trailing_path_sep !== "/" && trailing_path_sep !== "\\") + directory += "/" + + if(isIOS) + var path = moneroAccountsDir + filename; + else + var path = directory + filename + "/" + filename; + + if (walletManager.walletExists(path)) + return true; + return false; +} + +function isAscii(str){ + for (var i = 0; i < str.length; i++) { + if (str.charCodeAt(i) > 127) + return false; + } + return true; +} + +function tr(text) { + return qsTr(text) + translationManager.emptyString +} + +function lineBreaksToSpaces(text) { + return text.trim().replace(/(\r\n|\n|\r)/gm, " "); +} + +function usefulName(path) { + // arbitrary "short enough" limit + if (path.length < 32) + return path + return path.replace(/.*[\/\\]/, '').replace(/\.keys$/, '') +} + +function checkSeed(seed) { + console.log("Checking seed") + var wordsArray = lineBreaksToSpaces(seed).split(" "); + return wordsArray.length === 25 || wordsArray.length === 24 +} + +function restoreWalletCheckViewSpendAddress(walletmanager, nettype, viewkey, spendkey, addressline){ + var addressOK = (viewkey.length > 0 || spendkey.length > 0) ? walletmanager.addressValid(addressline, nettype) : false + var viewKeyOK = (viewkey.length > 0) ? walletmanager.keyValid(viewkey, addressline, true, nettype) : true + // Spendkey is optional + var spendKeyOK = (spendkey.length > 0) ? walletmanager.keyValid(spendkey, addressline, false, nettype) : true + + return addressOK && viewKeyOK && spendKeyOK +} -- cgit v1.2.3 From c6107d8376244560068184cbfafd38d3b2f536b8 Mon Sep 17 00:00:00 2001 From: mmbyday Date: Fri, 14 Dec 2018 17:28:07 -0800 Subject: wizard: allow calendar date for restoration height --- js/Wizard.js | 43 +++++++++++++++++++++++++++++++++++++++++ wizard/WizardRestoreWallet1.qml | 33 +++++++++++++++++++++++++------ 2 files changed, 70 insertions(+), 6 deletions(-) (limited to 'js/Wizard.js') diff --git a/js/Wizard.js b/js/Wizard.js index ccef1ba6..6f0633c7 100644 --- a/js/Wizard.js +++ b/js/Wizard.js @@ -177,3 +177,46 @@ function restoreWalletCheckViewSpendAddress(walletmanager, nettype, viewkey, spe return addressOK && viewKeyOK && spendKeyOK } + +//usage: getApproximateBlockchainHeight("March 18 2016") or getApproximateBlockchainHeight("2016-11-11") +//returns estimated block height with 1 month buffer prior to requested date. +function getApproximateBlockchainHeight(_date){ + // time of monero birth 2014-04-18 10:49:53 (1397818193) + var moneroBirthTime = 1397818193; + // avg seconds per block in v1 + var secondsPerBlockV1 = 60; + // time of v2 fork 2016-03-23 15:57:38 (1458748658) + var forkTime = 1458748658; + // v2 fork block + var forkBlock = 1009827; + // avg seconds per block in V2 + var secondsPerBlockV2 = 120; + // time in UTC + var requestedTime = Math.floor(new Date(_date) / 1000); + var approxBlockchainHeight; + var secondsPerBlock; + // before monero's birth + if (requestedTime < moneroBirthTime){ + console.log("Calculated blockchain height: 0, requestedTime < moneroBirthTime " ); + return 0; + } + // time between during v1 + if (requestedTime > moneroBirthTime && requestedTime < forkTime){ + approxBlockchainHeight = Math.floor((requestedTime - moneroBirthTime)/secondsPerBlockV1); + console.log("Calculated blockchain height: " + approxBlockchainHeight ); + secondsPerBlock = secondsPerBlockV1; + } + // time is during V2 + else{ + approxBlockchainHeight = Math.floor(forkBlock + (requestedTime - forkTime)/secondsPerBlockV2); + console.log("Calculated blockchain height: " + approxBlockchainHeight ); + secondsPerBlock = secondsPerBlockV2; + } + var blocksPerMonth = 60*60*24*30/secondsPerBlock; + if(approxBlockchainHeight - blocksPerMonth > 0){ + return approxBlockchainHeight - blocksPerMonth; + } + else{ + return 0; + } +} \ No newline at end of file diff --git a/wizard/WizardRestoreWallet1.qml b/wizard/WizardRestoreWallet1.qml index cab4a03e..8b426969 100644 --- a/wizard/WizardRestoreWallet1.qml +++ b/wizard/WizardRestoreWallet1.qml @@ -40,11 +40,16 @@ Rectangle { property string viewName: "wizardCreateWallet1" function verify() { + if (restoreHeight.text.indexOf('-') === 4 && restoreHeight.text.length !== 10) { + return false; + } + + var valid = false; if(wizardController.walletRestoreMode === "keys") { - var valid = wizardRestoreWallet1.verifyFromKeys(); + valid = wizardRestoreWallet1.verifyFromKeys(); return valid; } else if(wizardController.walletRestoreMode === "seed") { - var valid = wizardWalletInput.verify(); + valid = wizardWalletInput.verify(); if(!valid) return false; valid = Wizard.checkSeed(seedInput.text); return valid; @@ -74,6 +79,10 @@ Rectangle { addressLineLength != 0 && viewKeyLineLength != 0 && spendKeyLineLength != 0) } + function checkRestoreHeight() { + return (parseInt(restoreHeight) >= 0 || restoreHeight === "") && restoreHeight.indexOf("-") === -1; + } + ColumnLayout { Layout.alignment: Qt.AlignHCenter; width: parent.width - 100 @@ -233,11 +242,13 @@ Rectangle { MoneroComponents.LineEdit { id: restoreHeight Layout.fillWidth: true - labelText: qsTr("Restore height") + translationManager.emptyString + labelText: qsTr("Wallet creation date as `YYYY-MM-DD` or restore height") + translationManager.emptyString labelFontSize: 14 * scaleRatio placeholderFontSize: 16 * scaleRatio placeholderText: qsTr("Restore height") + translationManager.emptyString - validator: RegExpValidator { regExp: /(\d+)?$/ } + validator: RegExpValidator { + regExp: /^(\d+|\d{4}-\d{2}-\d{2})$/ + } text: "0" } @@ -263,8 +274,18 @@ Rectangle { wizardController.walletOptionsName = wizardWalletInput.walletName.text; wizardController.walletOptionsLocation = wizardWalletInput.walletLocation.text; wizardController.walletOptionsSeed = seedInput.text; - if(restoreHeight.text) - wizardController.walletOptionsRestoreHeight = parseInt(restoreHeight.text); + + var _restoreHeight = 0; + if(restoreHeight.text){ + // Parse date string or restore height as integer + if(restoreHeight.text.indexOf('-') === 4 && restoreHeight.text.length === 10){ + _restoreHeight = Wizard.getApproximateBlockchainHeight(restoreHeight.text); + } else { + _restoreHeight = parseInt(restoreHeight.text) + } + + wizardController.walletOptionsRestoreHeight = _restoreHeight; + } wizardStateView.state = "wizardRestoreWallet2"; } -- cgit v1.2.3