diff options
| author | jackyzha0 <[email protected]> | 2021-04-11 10:27:27 -0700 |
|---|---|---|
| committer | jackyzha0 <[email protected]> | 2021-04-11 10:27:27 -0700 |
| commit | 0144bfc9cc6c616a00a8171f3950a75ec948427e (patch) | |
| tree | 101d6c12471d411e9266cffa8e90176aff2e6fdb /frontend/src/http | |
| parent | base next bump (diff) | |
| download | ctrl-v-0144bfc9cc6c616a00a8171f3950a75ec948427e.tar.xz ctrl-v-0144bfc9cc6c616a00a8171f3950a75ec948427e.zip | |
base next refactor
Diffstat (limited to 'frontend/src/http')
| -rw-r--r-- | frontend/src/http/shared.js | 74 | ||||
| -rw-r--r-- | frontend/src/http/useFetchPaste.js | 69 |
2 files changed, 143 insertions, 0 deletions
diff --git a/frontend/src/http/shared.js b/frontend/src/http/shared.js new file mode 100644 index 0000000..00d41e9 --- /dev/null +++ b/frontend/src/http/shared.js @@ -0,0 +1,74 @@ +import axios from 'axios'; + +// uncomment for local dev +// const base = `http://localhost:8080/api` +const base = `https://api.ctrl-v.app/api` +export function fetchPaste(hash, pass = "") { + const serverURL = `${base}/${hash}` + + if (pass === "") { + return axios.get(serverURL) + } else { + const bodyFormData = new FormData(); + bodyFormData.set('password', pass); + return axios({ + method: 'post', + url: `${base}/${hash}`, + data: bodyFormData, + headers: { 'Content-Type': 'multipart/form-data' }, + }) + } +} + +export function newPaste(paste) { + const {title, content, language, pass, expiry} = paste + const bodyFormData = new FormData(); + bodyFormData.set('title', title); + bodyFormData.set('content', content); + bodyFormData.set('language', language); + bodyFormData.set('password', pass); + bodyFormData.set('expiry', parseExpiry(expiry)); + + return axios({ + method: 'post', + url: base, + data: bodyFormData, + headers: { 'Content-Type': 'multipart/form-data' }, + }) +} + +export function parseExpiry(e) { + var cur = new Date(); + var inSeconds = 0 + switch (e) { + case '5 years': + inSeconds = 600 * 6 * 24 * 7 * 4 * 12 * 5 + break; + case '1 year': + inSeconds = 600 * 6 * 24 * 7 * 4 * 12 + break; + case '1 month': + inSeconds = 600 * 6 * 24 * 7 * 4 + break; + case '1 day': + inSeconds = 600 * 6 * 24 + break; + case '1 hour': + inSeconds = 600 * 6 + break; + case '10 min': + inSeconds = 600 + break; + case '1 week': + default: + inSeconds = 600 * 6 * 24 * 7 + break; + } + return new Date(cur.getTime() + inSeconds * 1000).toISOString(); +} + +export function fmtDateStr(dateString) { + const d = new Date(dateString) + const options = { hour: '2-digit', minute: '2-digit', year: 'numeric', month: 'long', day: 'numeric' } + return d.toLocaleDateString("en-US", options).toLocaleLowerCase() +}
\ No newline at end of file diff --git a/frontend/src/http/useFetchPaste.js b/frontend/src/http/useFetchPaste.js new file mode 100644 index 0000000..ba482f9 --- /dev/null +++ b/frontend/src/http/useFetchPaste.js @@ -0,0 +1,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
\ No newline at end of file |