From 9b58a4ca7eeb1b92d08246361fa2a0c09aebf509 Mon Sep 17 00:00:00 2001
From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com>
Date: Fri, 28 Apr 2023 14:57:57 +0200
Subject: [PATCH] Fix ask for save location
---
.../login-view/create-account-section.js | 33 ++++++++++--
.../components/settings-view/export-keys.js | 30 ++++++++++-
.../components/settings-view/security-view.js | 30 ++++++++++-
.../functional-components/settings-page.js | 33 +++++++++---
.../plugins/core/wallet/wallet-app.src.js | 52 +++++++++++++++----
5 files changed, 155 insertions(+), 23 deletions(-)
diff --git a/qortal-ui-core/src/components/login-view/create-account-section.js b/qortal-ui-core/src/components/login-view/create-account-section.js
index 48c27985..69491c76 100644
--- a/qortal-ui-core/src/components/login-view/create-account-section.js
+++ b/qortal-ui-core/src/components/login-view/create-account-section.js
@@ -7,7 +7,6 @@ import { createWallet } from '../../../../qortal-ui-crypto/api/createWallet.js'
import { doLogin, doLogout, doSelectAddress } from '../../redux/app/app-actions.js'
import { doStoreWallet } from '../../redux/user/user-actions.js'
import { checkApiKey } from '../../apiKeyUtils.js'
-import FileSaver from 'file-saver'
import ripple from '../../functional-components/loading-ripple.js'
import snackbar from '../../functional-components/snackbar.js'
import '../../functional-components/random-sentence-generator.js'
@@ -587,17 +586,45 @@ class CreateAccountSection extends connect(store)(LitElement) {
}
async downloadBackup(wallet) {
+ let backupname = ""
const state = store.getState()
const data = await wallet.generateSaveWalletData(this._pass, state.config.crypto.kdfThreads, () => { })
const dataString = JSON.stringify(data)
const blob = new Blob([dataString], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `qortal_backup_${wallet.addresses[0].address}.json`)
+ backupname = "qortal_backup_" + wallet.addresses[0].address + ".json"
+ this.saveFileToDisk(blob, backupname)
}
downloadSeedphrase() {
+ let seedname = ""
const seed = this.shadowRoot.getElementById('randSentence').parsedString
const blob = new Blob([seed], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `qortal_seedphrase.txt`)
+ seedname = "qortal_seedphrase_" + wallet.addresses[0].address + ".txt"
+ this.saveFileToDisk(blob, seedname)
+ }
+
+ async saveFileToDisk(blob, fileName) {
+ try {
+ const fileHandle = await self.showSaveFilePicker({
+ suggestedName: fileName,
+ types: [{
+ description: "File",
+ }]
+ })
+ const writeFile = async (fileHandle, contents) => {
+ const writable = await fileHandle.createWritable()
+ await writable.write(contents)
+ await writable.close()
+ }
+ writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
+ let snack4string = get("general.save")
+ snackbar.add({
+ labelText: `${snack4string} ${fileName} ✅`,
+ dismiss: true
+ })
+ } catch (error) {
+ console.log(error)
+ }
}
}
diff --git a/qortal-ui-core/src/components/settings-view/export-keys.js b/qortal-ui-core/src/components/settings-view/export-keys.js
index 1456ce3a..dc7d623c 100644
--- a/qortal-ui-core/src/components/settings-view/export-keys.js
+++ b/qortal-ui-core/src/components/settings-view/export-keys.js
@@ -2,11 +2,11 @@ import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import { store } from '../../store.js'
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
+import snackbar from '../../functional-components/snackbar.js'
import '@material/mwc-dialog'
import '@material/mwc-button'
import '@material/mwc-icon'
-import FileSaver from 'file-saver'
class ExportKeys extends connect(store)(LitElement) {
static get properties() {
@@ -222,11 +222,37 @@ class ExportKeys extends connect(store)(LitElement) {
}
async exportKey(cMasterKey, cName, cAddress) {
+ let exportname = ""
const myPrivateMasterKey = cMasterKey
const myCoinName = cName
const myCoinAddress = cAddress
const blob = new Blob([`${myPrivateMasterKey}`], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `Private_Master_Key_${myCoinName}_${myCoinAddress}.txt`)
+ exportname = "Private_Master_Key_" + myCoinName + "_" + myCoinAddress + ".txt"
+ this.saveFileToDisk(blob, exportname)
+ }
+
+ async saveFileToDisk(blob, fileName) {
+ try {
+ const fileHandle = await self.showSaveFilePicker({
+ suggestedName: fileName,
+ types: [{
+ description: "File",
+ }]
+ })
+ const writeFile = async (fileHandle, contents) => {
+ const writable = await fileHandle.createWritable()
+ await writable.write(contents)
+ await writable.close()
+ }
+ writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
+ let snack4string = get("general.save")
+ snackbar.add({
+ labelText: `${snack4string} ${fileName} ✅`,
+ dismiss: true
+ })
+ } catch (error) {
+ console.log(error)
+ }
}
stateChanged(state) {
diff --git a/qortal-ui-core/src/components/settings-view/security-view.js b/qortal-ui-core/src/components/settings-view/security-view.js
index aaee8212..918e6321 100644
--- a/qortal-ui-core/src/components/settings-view/security-view.js
+++ b/qortal-ui-core/src/components/settings-view/security-view.js
@@ -3,12 +3,12 @@ import { connect } from 'pwa-helpers'
import { store } from '../../store.js'
import { allowQAPPAutoAuth, removeQAPPAutoAuth, removeQAPPAutoLists, allowQAPPAutoLists } from '../../redux/app/app-actions.js'
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
+import snackbar from '../../functional-components/snackbar.js'
import '@material/mwc-checkbox'
import '@material/mwc-textfield'
import '@material/mwc-icon'
import '@vaadin/password-field/vaadin-password-field.js'
-import FileSaver from 'file-saver'
class SecurityView extends connect(store)(LitElement) {
static get properties() {
@@ -155,13 +155,39 @@ class SecurityView extends connect(store)(LitElement) {
}
async downloadBackup() {
+ let backupname = ''
this.backupErrorMessage = ''
const state = store.getState()
const password = this.shadowRoot.getElementById('downloadBackupPassword').value
const data = await state.app.wallet.generateSaveWalletData(password, state.config.crypto.kdfThreads, () => { })
const dataString = JSON.stringify(data)
const blob = new Blob([dataString], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `qortal_backup_${state.app.selectedAddress.address}.json`)
+ backupname = "qortal_backup_" + state.app.selectedAddress.address + ".json"
+ this.saveFileToDisk(blob, backupname)
+ }
+
+ async saveFileToDisk(blob, fileName) {
+ try {
+ const fileHandle = await self.showSaveFilePicker({
+ suggestedName: fileName,
+ types: [{
+ description: "File",
+ }]
+ })
+ const writeFile = async (fileHandle, contents) => {
+ const writable = await fileHandle.createWritable()
+ await writable.write(contents)
+ await writable.close()
+ }
+ writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
+ let snack4string = get("general.save")
+ snackbar.add({
+ labelText: `${snack4string} ${fileName} ✅`,
+ dismiss: true
+ })
+ } catch (error) {
+ console.log(error)
+ }
}
}
diff --git a/qortal-ui-core/src/functional-components/settings-page.js b/qortal-ui-core/src/functional-components/settings-page.js
index 253b2cd7..5e951730 100644
--- a/qortal-ui-core/src/functional-components/settings-page.js
+++ b/qortal-ui-core/src/functional-components/settings-page.js
@@ -3,7 +3,6 @@ import { connect } from 'pwa-helpers'
import { store } from '../store.js'
import { doAddNode, doSetNode, doLoadNodeConfig } from '../redux/app/app-actions.js'
import { get, translate, translateUnsafeHTML } from 'lit-translate'
-import FileSaver from 'file-saver'
import snackbar from './snackbar.js'
import '../components/language-selector.js'
import '../custom-elements/frag-file-input.js'
@@ -320,16 +319,36 @@ class SettingsPage extends connect(store)(LitElement) {
}
exportQortalNodesList() {
+ let nodelist = ""
const qortalNodesList = JSON.stringify(localStorage.getItem("myQortalNodes"))
const qortalNodesListSave = JSON.parse((qortalNodesList) || "[]")
const blob = new Blob([qortalNodesListSave], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `qortal.nodes`)
+ nodelist = "qortal.nodes"
+ this.saveFileToDisk(blob, nodelist)
+ }
- let snack4string = get("settings.snack4")
- snackbar.add({
- labelText: `${snack4string} qortal.nodes`,
- dismiss: true
- })
+ async saveFileToDisk(blob, fileName) {
+ try {
+ const fileHandle = await self.showSaveFilePicker({
+ suggestedName: fileName,
+ types: [{
+ description: "File",
+ }]
+ })
+ const writeFile = async (fileHandle, contents) => {
+ const writable = await fileHandle.createWritable()
+ await writable.write(contents)
+ await writable.close()
+ }
+ writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
+ let snack4string = get("settings.snack4")
+ snackbar.add({
+ labelText: `${snack4string} qortal.nodes`,
+ dismiss: true
+ })
+ } catch (error) {
+ console.log(error)
+ }
}
renderImportNodesListButton() {
diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js
index 51336f37..903ed5fb 100644
--- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js
+++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js
@@ -11,7 +11,6 @@ import '../components/ButtonIconCopy.js'
import '../components/QortalQrcodeGenerator.js'
import '../components/frag-file-input.js'
import '../components/time-elements/index.js'
-import FileSaver from 'file-saver'
import '@material/mwc-button'
import '@material/mwc-checkbox'
import '@material/mwc-dialog'
@@ -3723,52 +3722,66 @@ class MultiWallet extends LitElement {
}
exportQortAddressbook() {
+ let bookname = ""
const qortBookData = JSON.stringify(localStorage.getItem("addressbookQort"))
const qortBookSave = JSON.parse((qortBookData) || "[]")
const blob = new Blob([qortBookSave], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `qortal_addressbook.qort.json`)
+ bookname = "qortal_addressbook.qort.json"
+ this.saveFileToDisk(blob, bookname)
}
exportBtcAddressbook() {
+ let bookname = ""
const btcBookData = JSON.stringify(localStorage.getItem("addressbookBtc"))
const btcBookSave = JSON.parse((btcBookData) || "[]")
const blob = new Blob([btcBookSave], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `bitcoin_addressbook.btc.json`)
+ bookname = "bitcoin_addressbook.btc.json"
+ this.saveFileToDisk(blob, bookname)
}
exportLtcAddressbook() {
+ let bookname = ""
const ltcBookData = JSON.stringify(localStorage.getItem("addressbookLtc"))
const ltcBookSave = JSON.parse((ltcBookData) || "[]")
const blob = new Blob([ltcBookSave], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `litecoin_addressbook.ltc.json`)
+ bookname = "litecoin_addressbook.ltc.json"
+ this.saveFileToDisk(blob, bookname)
}
exportDogeAddressbook() {
+ let bookname = ""
const dogeBookData = JSON.stringify(localStorage.getItem("addressbookDoge"))
const dogeBookSave = JSON.parse((dogeBookData) || "[]")
const blob = new Blob([dogeBookSave], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `dogecoin_addressbook.doge.json`)
+ bookname = "dogecoin_addressbook.doge.json"
+ this.saveFileToDisk(blob, bookname)
}
exportDgbAddressbook() {
+ let bookname = ""
const dgbBookData = JSON.stringify(localStorage.getItem("addressbookDgb"))
const dgbBookSave = JSON.parse((dgbBookData) || "[]")
const blob = new Blob([dgbBookSave], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `digibyte_addressbook.dgb.json`)
+ bookname = "digibyte_addressbook.dgb.json"
+ this.saveFileToDisk(blob, bookname)
}
exportRvnAddressbook() {
+ let bookname = ""
const rvnBookData = JSON.stringify(localStorage.getItem("addressbookRvn"))
const rvnBookSave = JSON.parse((rvnBookData) || "[]")
const blob = new Blob([rvnBookSave], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `ravencoin_addressbook.rvn.json`)
+ bookname = "ravencoin_addressbook.rvn.json"
+ this.saveFileToDisk(blob, bookname)
}
exportArrrAddressbook() {
+ let bookname = ""
const arrrBookData = JSON.stringify(localStorage.getItem("addressbookArrr"))
const arrrBookSave = JSON.parse((arrrBookData) || "[]")
const blob = new Blob([arrrBookSave], { type: 'text/plain;charset=utf-8' })
- FileSaver.saveAs(blob, `piratechain_addressbook.arrr.json`)
+ bookname = "piratechain_addressbook.arrr.json"
+ this.saveFileToDisk(blob, bookname)
}
importQortAddressbook(file) {
@@ -4947,7 +4960,7 @@ class MultiWallet extends LitElement {
} else if ( this._selectedWallet === "btc" ) {
return html` this.exportBtcAddressbook()}> ${translate("walletpage.wchange54")}`
} else if ( this._selectedWallet === "ltc" ) {
- return html` this.exportKLtcAddressbook()}> ${translate("walletpage.wchange54")}`
+ return html` this.exportLtcAddressbook()}> ${translate("walletpage.wchange54")}`
} else if ( this._selectedWallet === "doge" ) {
return html` this.exportDogeAddressbook()}> ${translate("walletpage.wchange54")}`
} else if ( this._selectedWallet === "dgb" ) {
@@ -5780,6 +5793,27 @@ class MultiWallet extends LitElement {
})
}
+ async saveFileToDisk(blob, fileName) {
+ try {
+ const fileHandle = await self.showSaveFilePicker({
+ suggestedName: fileName,
+ types: [{
+ description: "File",
+ }]
+ })
+ const writeFile = async (fileHandle, contents) => {
+ const writable = await fileHandle.createWritable()
+ await writable.write(contents)
+ await writable.close()
+ }
+ writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
+ let snack4string = get("general.save")
+ parentEpml.request('showSnackBar', `${snack4string} ${fileName} ✅`)
+ } catch (error) {
+ console.log(error)
+ }
+ }
+
isEmptyArray(arr) {
if (!arr) {
return true