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
|