aboutsummaryrefslogtreecommitdiffstats
path: root/apps/Notes/helpers/import.js
blob: 01ad00e4b010b2cf286bbc9eab8211cd0216c062 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import fetchJson from 'helpers/fetchJson'
import { faCheck, faTimes } from '@fortawesome/free-solid-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'

export const state = s => s && <span><FontAwesomeIcon icon={s === 1 ? faCheck : faTimes} /></span>
export const color = s => s && { color: s === 1 ? 'green' : 'brown' }

const readFileAsText = (file) => new Promise((resolve, reject) => {
  const fr = new FileReader()

  fr.onload = () => resolve(fr.result)
  fr.onerror = () => reject(fr)

  fr.readAsText(file)
})

export const handleImport = async (e, files, mutateNotes, setDone) => {
  e.preventDefault()

  Array.from(files).forEach(async (file, i) => {
    const title = file.name.replace(/\.[^/.]+$/, '')
    const content = await readFileAsText(file)

    try {
      const notes = await fetchJson('/api/notes', {
        method: 'POST',
        headers: { 'Content-Type': 'plain/text; charset=utf-8' },
        body: JSON.stringify({ title, content })
      })
      if (i === files.length - 1) await mutateNotes(notes)
      setDone((prev) => ({ ...prev, [i]: 1 }))
    } catch (e) {
      setDone((prev) => ({ ...prev, [i]: 0 }))
    }
  })
}

export const handleChange = (e, setFiles, setDone) => {
  setFiles(e.currentTarget.files)
  setDone([])
}