Fix ask for save location
This commit is contained in:
parent
af52bb27d3
commit
9b58a4ca7e
@ -7,7 +7,6 @@ import { createWallet } from '../../../../qortal-ui-crypto/api/createWallet.js'
|
|||||||
import { doLogin, doLogout, doSelectAddress } from '../../redux/app/app-actions.js'
|
import { doLogin, doLogout, doSelectAddress } from '../../redux/app/app-actions.js'
|
||||||
import { doStoreWallet } from '../../redux/user/user-actions.js'
|
import { doStoreWallet } from '../../redux/user/user-actions.js'
|
||||||
import { checkApiKey } from '../../apiKeyUtils.js'
|
import { checkApiKey } from '../../apiKeyUtils.js'
|
||||||
import FileSaver from 'file-saver'
|
|
||||||
import ripple from '../../functional-components/loading-ripple.js'
|
import ripple from '../../functional-components/loading-ripple.js'
|
||||||
import snackbar from '../../functional-components/snackbar.js'
|
import snackbar from '../../functional-components/snackbar.js'
|
||||||
import '../../functional-components/random-sentence-generator.js'
|
import '../../functional-components/random-sentence-generator.js'
|
||||||
@ -587,17 +586,45 @@ class CreateAccountSection extends connect(store)(LitElement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async downloadBackup(wallet) {
|
async downloadBackup(wallet) {
|
||||||
|
let backupname = ""
|
||||||
const state = store.getState()
|
const state = store.getState()
|
||||||
const data = await wallet.generateSaveWalletData(this._pass, state.config.crypto.kdfThreads, () => { })
|
const data = await wallet.generateSaveWalletData(this._pass, state.config.crypto.kdfThreads, () => { })
|
||||||
const dataString = JSON.stringify(data)
|
const dataString = JSON.stringify(data)
|
||||||
const blob = new Blob([dataString], { type: 'text/plain;charset=utf-8' })
|
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() {
|
downloadSeedphrase() {
|
||||||
|
let seedname = ""
|
||||||
const seed = this.shadowRoot.getElementById('randSentence').parsedString
|
const seed = this.shadowRoot.getElementById('randSentence').parsedString
|
||||||
const blob = new Blob([seed], { type: 'text/plain;charset=utf-8' })
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,11 +2,11 @@ import { LitElement, html, css } from 'lit'
|
|||||||
import { connect } from 'pwa-helpers'
|
import { connect } from 'pwa-helpers'
|
||||||
import { store } from '../../store.js'
|
import { store } from '../../store.js'
|
||||||
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
|
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
|
||||||
|
import snackbar from '../../functional-components/snackbar.js'
|
||||||
|
|
||||||
import '@material/mwc-dialog'
|
import '@material/mwc-dialog'
|
||||||
import '@material/mwc-button'
|
import '@material/mwc-button'
|
||||||
import '@material/mwc-icon'
|
import '@material/mwc-icon'
|
||||||
import FileSaver from 'file-saver'
|
|
||||||
|
|
||||||
class ExportKeys extends connect(store)(LitElement) {
|
class ExportKeys extends connect(store)(LitElement) {
|
||||||
static get properties() {
|
static get properties() {
|
||||||
@ -222,11 +222,37 @@ class ExportKeys extends connect(store)(LitElement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async exportKey(cMasterKey, cName, cAddress) {
|
async exportKey(cMasterKey, cName, cAddress) {
|
||||||
|
let exportname = ""
|
||||||
const myPrivateMasterKey = cMasterKey
|
const myPrivateMasterKey = cMasterKey
|
||||||
const myCoinName = cName
|
const myCoinName = cName
|
||||||
const myCoinAddress = cAddress
|
const myCoinAddress = cAddress
|
||||||
const blob = new Blob([`${myPrivateMasterKey}`], { type: 'text/plain;charset=utf-8' })
|
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) {
|
stateChanged(state) {
|
||||||
|
@ -3,12 +3,12 @@ import { connect } from 'pwa-helpers'
|
|||||||
import { store } from '../../store.js'
|
import { store } from '../../store.js'
|
||||||
import { allowQAPPAutoAuth, removeQAPPAutoAuth, removeQAPPAutoLists, allowQAPPAutoLists } from '../../redux/app/app-actions.js'
|
import { allowQAPPAutoAuth, removeQAPPAutoAuth, removeQAPPAutoLists, allowQAPPAutoLists } from '../../redux/app/app-actions.js'
|
||||||
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
|
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
|
||||||
|
import snackbar from '../../functional-components/snackbar.js'
|
||||||
|
|
||||||
import '@material/mwc-checkbox'
|
import '@material/mwc-checkbox'
|
||||||
import '@material/mwc-textfield'
|
import '@material/mwc-textfield'
|
||||||
import '@material/mwc-icon'
|
import '@material/mwc-icon'
|
||||||
import '@vaadin/password-field/vaadin-password-field.js'
|
import '@vaadin/password-field/vaadin-password-field.js'
|
||||||
import FileSaver from 'file-saver'
|
|
||||||
|
|
||||||
class SecurityView extends connect(store)(LitElement) {
|
class SecurityView extends connect(store)(LitElement) {
|
||||||
static get properties() {
|
static get properties() {
|
||||||
@ -155,13 +155,39 @@ class SecurityView extends connect(store)(LitElement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async downloadBackup() {
|
async downloadBackup() {
|
||||||
|
let backupname = ''
|
||||||
this.backupErrorMessage = ''
|
this.backupErrorMessage = ''
|
||||||
const state = store.getState()
|
const state = store.getState()
|
||||||
const password = this.shadowRoot.getElementById('downloadBackupPassword').value
|
const password = this.shadowRoot.getElementById('downloadBackupPassword').value
|
||||||
const data = await state.app.wallet.generateSaveWalletData(password, state.config.crypto.kdfThreads, () => { })
|
const data = await state.app.wallet.generateSaveWalletData(password, state.config.crypto.kdfThreads, () => { })
|
||||||
const dataString = JSON.stringify(data)
|
const dataString = JSON.stringify(data)
|
||||||
const blob = new Blob([dataString], { type: 'text/plain;charset=utf-8' })
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ import { connect } from 'pwa-helpers'
|
|||||||
import { store } from '../store.js'
|
import { store } from '../store.js'
|
||||||
import { doAddNode, doSetNode, doLoadNodeConfig } from '../redux/app/app-actions.js'
|
import { doAddNode, doSetNode, doLoadNodeConfig } from '../redux/app/app-actions.js'
|
||||||
import { get, translate, translateUnsafeHTML } from 'lit-translate'
|
import { get, translate, translateUnsafeHTML } from 'lit-translate'
|
||||||
import FileSaver from 'file-saver'
|
|
||||||
import snackbar from './snackbar.js'
|
import snackbar from './snackbar.js'
|
||||||
import '../components/language-selector.js'
|
import '../components/language-selector.js'
|
||||||
import '../custom-elements/frag-file-input.js'
|
import '../custom-elements/frag-file-input.js'
|
||||||
@ -320,16 +319,36 @@ class SettingsPage extends connect(store)(LitElement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
exportQortalNodesList() {
|
exportQortalNodesList() {
|
||||||
|
let nodelist = ""
|
||||||
const qortalNodesList = JSON.stringify(localStorage.getItem("myQortalNodes"))
|
const qortalNodesList = JSON.stringify(localStorage.getItem("myQortalNodes"))
|
||||||
const qortalNodesListSave = JSON.parse((qortalNodesList) || "[]")
|
const qortalNodesListSave = JSON.parse((qortalNodesList) || "[]")
|
||||||
const blob = new Blob([qortalNodesListSave], { type: 'text/plain;charset=utf-8' })
|
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")
|
async saveFileToDisk(blob, fileName) {
|
||||||
snackbar.add({
|
try {
|
||||||
labelText: `${snack4string} qortal.nodes`,
|
const fileHandle = await self.showSaveFilePicker({
|
||||||
dismiss: true
|
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() {
|
renderImportNodesListButton() {
|
||||||
|
@ -11,7 +11,6 @@ import '../components/ButtonIconCopy.js'
|
|||||||
import '../components/QortalQrcodeGenerator.js'
|
import '../components/QortalQrcodeGenerator.js'
|
||||||
import '../components/frag-file-input.js'
|
import '../components/frag-file-input.js'
|
||||||
import '../components/time-elements/index.js'
|
import '../components/time-elements/index.js'
|
||||||
import FileSaver from 'file-saver'
|
|
||||||
import '@material/mwc-button'
|
import '@material/mwc-button'
|
||||||
import '@material/mwc-checkbox'
|
import '@material/mwc-checkbox'
|
||||||
import '@material/mwc-dialog'
|
import '@material/mwc-dialog'
|
||||||
@ -3723,52 +3722,66 @@ class MultiWallet extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
exportQortAddressbook() {
|
exportQortAddressbook() {
|
||||||
|
let bookname = ""
|
||||||
const qortBookData = JSON.stringify(localStorage.getItem("addressbookQort"))
|
const qortBookData = JSON.stringify(localStorage.getItem("addressbookQort"))
|
||||||
const qortBookSave = JSON.parse((qortBookData) || "[]")
|
const qortBookSave = JSON.parse((qortBookData) || "[]")
|
||||||
const blob = new Blob([qortBookSave], { type: 'text/plain;charset=utf-8' })
|
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() {
|
exportBtcAddressbook() {
|
||||||
|
let bookname = ""
|
||||||
const btcBookData = JSON.stringify(localStorage.getItem("addressbookBtc"))
|
const btcBookData = JSON.stringify(localStorage.getItem("addressbookBtc"))
|
||||||
const btcBookSave = JSON.parse((btcBookData) || "[]")
|
const btcBookSave = JSON.parse((btcBookData) || "[]")
|
||||||
const blob = new Blob([btcBookSave], { type: 'text/plain;charset=utf-8' })
|
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() {
|
exportLtcAddressbook() {
|
||||||
|
let bookname = ""
|
||||||
const ltcBookData = JSON.stringify(localStorage.getItem("addressbookLtc"))
|
const ltcBookData = JSON.stringify(localStorage.getItem("addressbookLtc"))
|
||||||
const ltcBookSave = JSON.parse((ltcBookData) || "[]")
|
const ltcBookSave = JSON.parse((ltcBookData) || "[]")
|
||||||
const blob = new Blob([ltcBookSave], { type: 'text/plain;charset=utf-8' })
|
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() {
|
exportDogeAddressbook() {
|
||||||
|
let bookname = ""
|
||||||
const dogeBookData = JSON.stringify(localStorage.getItem("addressbookDoge"))
|
const dogeBookData = JSON.stringify(localStorage.getItem("addressbookDoge"))
|
||||||
const dogeBookSave = JSON.parse((dogeBookData) || "[]")
|
const dogeBookSave = JSON.parse((dogeBookData) || "[]")
|
||||||
const blob = new Blob([dogeBookSave], { type: 'text/plain;charset=utf-8' })
|
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() {
|
exportDgbAddressbook() {
|
||||||
|
let bookname = ""
|
||||||
const dgbBookData = JSON.stringify(localStorage.getItem("addressbookDgb"))
|
const dgbBookData = JSON.stringify(localStorage.getItem("addressbookDgb"))
|
||||||
const dgbBookSave = JSON.parse((dgbBookData) || "[]")
|
const dgbBookSave = JSON.parse((dgbBookData) || "[]")
|
||||||
const blob = new Blob([dgbBookSave], { type: 'text/plain;charset=utf-8' })
|
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() {
|
exportRvnAddressbook() {
|
||||||
|
let bookname = ""
|
||||||
const rvnBookData = JSON.stringify(localStorage.getItem("addressbookRvn"))
|
const rvnBookData = JSON.stringify(localStorage.getItem("addressbookRvn"))
|
||||||
const rvnBookSave = JSON.parse((rvnBookData) || "[]")
|
const rvnBookSave = JSON.parse((rvnBookData) || "[]")
|
||||||
const blob = new Blob([rvnBookSave], { type: 'text/plain;charset=utf-8' })
|
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() {
|
exportArrrAddressbook() {
|
||||||
|
let bookname = ""
|
||||||
const arrrBookData = JSON.stringify(localStorage.getItem("addressbookArrr"))
|
const arrrBookData = JSON.stringify(localStorage.getItem("addressbookArrr"))
|
||||||
const arrrBookSave = JSON.parse((arrrBookData) || "[]")
|
const arrrBookSave = JSON.parse((arrrBookData) || "[]")
|
||||||
const blob = new Blob([arrrBookSave], { type: 'text/plain;charset=utf-8' })
|
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) {
|
importQortAddressbook(file) {
|
||||||
@ -4947,7 +4960,7 @@ class MultiWallet extends LitElement {
|
|||||||
} else if ( this._selectedWallet === "btc" ) {
|
} else if ( this._selectedWallet === "btc" ) {
|
||||||
return html`<vaadin-button theme="primary small" style="width: 100%;" @click=${() => this.exportBtcAddressbook()}><vaadin-icon icon="vaadin:cloud-download" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange54")}</vaadin-button>`
|
return html`<vaadin-button theme="primary small" style="width: 100%;" @click=${() => this.exportBtcAddressbook()}><vaadin-icon icon="vaadin:cloud-download" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange54")}</vaadin-button>`
|
||||||
} else if ( this._selectedWallet === "ltc" ) {
|
} else if ( this._selectedWallet === "ltc" ) {
|
||||||
return html`<vaadin-button theme="primary small" style="width: 100%;" @click=${() => this.exportKLtcAddressbook()}><vaadin-icon icon="vaadin:cloud-download" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange54")}</vaadin-button>`
|
return html`<vaadin-button theme="primary small" style="width: 100%;" @click=${() => this.exportLtcAddressbook()}><vaadin-icon icon="vaadin:cloud-download" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange54")}</vaadin-button>`
|
||||||
} else if ( this._selectedWallet === "doge" ) {
|
} else if ( this._selectedWallet === "doge" ) {
|
||||||
return html`<vaadin-button theme="primary small" style="width: 100%;" @click=${() => this.exportDogeAddressbook()}><vaadin-icon icon="vaadin:cloud-download" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange54")}</vaadin-button>`
|
return html`<vaadin-button theme="primary small" style="width: 100%;" @click=${() => this.exportDogeAddressbook()}><vaadin-icon icon="vaadin:cloud-download" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange54")}</vaadin-button>`
|
||||||
} else if ( this._selectedWallet === "dgb" ) {
|
} 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) {
|
isEmptyArray(arr) {
|
||||||
if (!arr) {
|
if (!arr) {
|
||||||
return true
|
return true
|
||||||
|
Loading…
x
Reference in New Issue
Block a user