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