61 lines
1.3 KiB
JavaScript
Executable File
61 lines
1.3 KiB
JavaScript
Executable File
/**
|
|
* save file to user
|
|
* @param {Blob} blob
|
|
* @param {string} name
|
|
*/
|
|
export function fileSave(blob, name) { ('showSaveFilePicker' in window) ? fileSaveAs(blob) : fileDownload(blob, name); }
|
|
|
|
/**
|
|
* save file with "File save as" dialog
|
|
* @param {Blob} blob
|
|
*/
|
|
async function fileSaveAs(blob) {
|
|
try {
|
|
// @ts-ignore
|
|
const writable = await (await window.showSaveFilePicker({
|
|
types: [
|
|
{
|
|
description: 'PNG Image',
|
|
accept: {
|
|
'image/png': ['.png']
|
|
}
|
|
}
|
|
]
|
|
})).createWritable();
|
|
await writable.write(blob);
|
|
await writable.close();
|
|
} catch {
|
|
alert('File not saved');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* save file with default download process
|
|
* @param {Blob} blob
|
|
* @param {string} name
|
|
*/
|
|
function fileDownload(blob, name) {
|
|
const link = document.createElement('a');
|
|
link.download = name;
|
|
link.href = URL.createObjectURL(blob);
|
|
link.click();
|
|
URL.revokeObjectURL(link.href);
|
|
link.remove();
|
|
}
|
|
|
|
/**
|
|
* @param {string} accept
|
|
* @param {BlobCallback} callBack
|
|
*/
|
|
export function fileOpen(accept, callBack) {
|
|
const input = document.createElement('input');
|
|
input.type = 'file';
|
|
input.multiple = false;
|
|
input.accept = accept;
|
|
input.onchange = async function() {
|
|
callBack((!input.files?.length) ? null : input.files[0]);
|
|
};
|
|
input.click();
|
|
input.remove();
|
|
}
|