diff options
| author | Shpuld Shpuldson <shp@cock.li> | 2021-08-08 16:14:22 +0300 |
|---|---|---|
| committer | Shpuld Shpuldson <shp@cock.li> | 2021-08-08 16:14:22 +0300 |
| commit | cc170aa3ecffa75004760fc6d02bd87373132f7d (patch) | |
| tree | 7d187ff11219399318f7482e0bc032cb20d025b9 /src/services/export_import | |
| parent | c3fcbbd918ddef4e3f574a464fd10f4899bb2dce (diff) | |
| parent | 425919a0d292b79869ebefd2a4d52ed4db45d319 (diff) | |
Update master with 2.4.0
Diffstat (limited to 'src/services/export_import')
| -rw-r--r-- | src/services/export_import/export_import.js | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/services/export_import/export_import.js b/src/services/export_import/export_import.js new file mode 100644 index 00000000..ac67cf9c --- /dev/null +++ b/src/services/export_import/export_import.js @@ -0,0 +1,55 @@ +export const newExporter = ({ + filename = 'data', + getExportedObject +}) => ({ + exportData () { + const stringified = JSON.stringify(getExportedObject(), null, 2) // Pretty-print and indent with 2 spaces + + // Create an invisible link with a data url and simulate a click + const e = document.createElement('a') + e.setAttribute('download', `${filename}.json`) + e.setAttribute('href', 'data:application/json;base64,' + window.btoa(stringified)) + e.style.display = 'none' + + document.body.appendChild(e) + e.click() + document.body.removeChild(e) + } +}) + +export const newImporter = ({ + onImport, + onImportFailure, + validator = () => true +}) => ({ + importData () { + const filePicker = document.createElement('input') + filePicker.setAttribute('type', 'file') + filePicker.setAttribute('accept', '.json') + + filePicker.addEventListener('change', event => { + if (event.target.files[0]) { + // eslint-disable-next-line no-undef + const reader = new FileReader() + reader.onload = ({ target }) => { + try { + const parsed = JSON.parse(target.result) + const validationResult = validator(parsed) + if (validationResult === true) { + onImport(parsed) + } else { + onImportFailure({ validationResult }) + } + } catch (error) { + onImportFailure({ error }) + } + } + reader.readAsText(event.target.files[0]) + } + }) + + document.body.appendChild(filePicker) + filePicker.click() + document.body.removeChild(filePicker) + } +}) |
