aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/http/useFetchPaste.js
blob: ba482f9655eb1dc4904259394703a1985be06286 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import {useEffect, useState} from 'react'
import {fetchPaste, fmtDateStr} from './shared'
import {LANGS} from "../components/renderers/Code";

const useFetchPaste = (id) => {
  const [loading, setLoading] = useState(true)
  const [err, setErr] = useState()
  const [requiresAuth, setRequiresAuth] = useState(false)
  const [validPass, setValidPass] = useState(false)
  const [result, setResult] = useState({
    title: 'fetching paste...',
    content: '',
    language: LANGS.detect,
    expiry: '',
  })

  const handleErr = error => {
    const resp = error.response

    // network err
    if (!resp) {
      setErr(error.toString())
      return
    }

    // password protected
    if (resp.status === 401) {
      setRequiresAuth(true)
      return
    }

    // catch all
    const errTxt = `${resp.status}: ${resp.data}`
    setErr(errTxt)
  }

  // callback to try verifying with password
  const getWithPassword = (password, errorCallback) => {
    fetchPaste(id, password)
      .then(resp => {
        setValidPass(true)
        setStateFromData(resp.data)
      })
      .catch(e => errorCallback(e.response.data))
  }


  const setStateFromData = (data) => {
    document.title = data.title
    setResult({
      title: data.title,
      content: data.content,
      language: data.language,
      expiry: fmtDateStr(data.expiry)
    })
  }

  // initial fetch
  useEffect(() => {
    fetchPaste(id)
      .then(resp => setStateFromData(resp.data))
      .catch(handleErr)
      .finally(() => setLoading(false))
  }, [id])

  return { loading, err, requiresAuth, validPass, getWithPassword, result }
}

export default useFetchPaste