export_import.js (1644B)
- import utf8 from 'utf8'
- export const newExporter = ({
- filename = 'data',
- getExportedObject
- }) => ({
- exportData () {
- const stringified = utf8.encode(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)
- }
- })