From 0144bfc9cc6c616a00a8171f3950a75ec948427e Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 11 Apr 2021 10:27:27 -0700 Subject: base next refactor --- frontend/src/http/shared.js | 74 ++++++++++++++++++++++++++++++++++++++ frontend/src/http/useFetchPaste.js | 69 +++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 frontend/src/http/shared.js create mode 100644 frontend/src/http/useFetchPaste.js (limited to 'frontend/src/http') 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 -- cgit v1.2.3 From 77c061bc0b8aecce7311ce820b3401c95797a589 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 11 Apr 2021 11:40:44 -0700 Subject: working raw paste fetch --- frontend/src/http/useFetchPaste.js | 96 ++++++++++++++------------------------ 1 file changed, 35 insertions(+), 61 deletions(-) (limited to 'frontend/src/http') diff --git a/frontend/src/http/useFetchPaste.js b/frontend/src/http/useFetchPaste.js index ba482f9..8d40cbe 100644 --- a/frontend/src/http/useFetchPaste.js +++ b/frontend/src/http/useFetchPaste.js @@ -2,68 +2,42 @@ 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 resolvePaste = (id, password = "") => { + const response = { + data: { + title: '', + content: '', + language: LANGS.detect, + expiry: '', + }, + unauthorized: false, + error: '', } - - - const setStateFromData = (data) => { - document.title = data.title - setResult({ - title: data.title, - content: data.content, - language: data.language, - expiry: fmtDateStr(data.expiry) + return fetchPaste(id, password) + .then(resp => { + const data = resp.data + response.data = { + ...data, + expiry: fmtDateStr(data.expiry) + } + return response + }) + .catch(error => { + const resp = error.response + if (!resp) { + response.error = 'network error' + return + } + + if (resp.status === 401) { + response.error = 'unauthorized' + response.unauthorized = true + return + } + + response.error = `${resp.status}: ${resp.data}` + return response }) - } - - // 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 +export default resolvePaste \ No newline at end of file -- cgit v1.2.3 From 12c995b6bd501be73b60e3bae6c46c59cebef6c2 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 11 Apr 2021 12:30:02 -0700 Subject: base resolve paste and fetch paste refactor --- frontend/src/http/resolvePaste.js | 43 ++++++++++++++++++++++++++++++++++++++ frontend/src/http/useFetchPaste.js | 43 -------------------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) create mode 100644 frontend/src/http/resolvePaste.js delete mode 100644 frontend/src/http/useFetchPaste.js (limited to 'frontend/src/http') diff --git a/frontend/src/http/resolvePaste.js b/frontend/src/http/resolvePaste.js new file mode 100644 index 0000000..8d40cbe --- /dev/null +++ b/frontend/src/http/resolvePaste.js @@ -0,0 +1,43 @@ +import {useEffect, useState} from 'react' +import {fetchPaste, fmtDateStr} from './shared' +import {LANGS} from "../components/renderers/Code"; + +const resolvePaste = (id, password = "") => { + const response = { + data: { + title: '', + content: '', + language: LANGS.detect, + expiry: '', + }, + unauthorized: false, + error: '', + } + return fetchPaste(id, password) + .then(resp => { + const data = resp.data + response.data = { + ...data, + expiry: fmtDateStr(data.expiry) + } + return response + }) + .catch(error => { + const resp = error.response + if (!resp) { + response.error = 'network error' + return + } + + if (resp.status === 401) { + response.error = 'unauthorized' + response.unauthorized = true + return + } + + response.error = `${resp.status}: ${resp.data}` + return response + }) +} + +export default resolvePaste \ No newline at end of file diff --git a/frontend/src/http/useFetchPaste.js b/frontend/src/http/useFetchPaste.js deleted file mode 100644 index 8d40cbe..0000000 --- a/frontend/src/http/useFetchPaste.js +++ /dev/null @@ -1,43 +0,0 @@ -import {useEffect, useState} from 'react' -import {fetchPaste, fmtDateStr} from './shared' -import {LANGS} from "../components/renderers/Code"; - -const resolvePaste = (id, password = "") => { - const response = { - data: { - title: '', - content: '', - language: LANGS.detect, - expiry: '', - }, - unauthorized: false, - error: '', - } - return fetchPaste(id, password) - .then(resp => { - const data = resp.data - response.data = { - ...data, - expiry: fmtDateStr(data.expiry) - } - return response - }) - .catch(error => { - const resp = error.response - if (!resp) { - response.error = 'network error' - return - } - - if (resp.status === 401) { - response.error = 'unauthorized' - response.unauthorized = true - return - } - - response.error = `${resp.status}: ${resp.data}` - return response - }) -} - -export default resolvePaste \ No newline at end of file -- cgit v1.2.3 From d58c7a3ad5dc83a08e040a855f158f8c6c09e154 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 11 Apr 2021 13:50:20 -0700 Subject: password resolution, dynamic head --- frontend/src/http/resolvePaste.js | 69 ++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 33 deletions(-) (limited to 'frontend/src/http') diff --git a/frontend/src/http/resolvePaste.js b/frontend/src/http/resolvePaste.js index 8d40cbe..aa4f8b6 100644 --- a/frontend/src/http/resolvePaste.js +++ b/frontend/src/http/resolvePaste.js @@ -2,42 +2,45 @@ import {useEffect, useState} from 'react' import {fetchPaste, fmtDateStr} from './shared' import {LANGS} from "../components/renderers/Code"; -const resolvePaste = (id, password = "") => { - const response = { - data: { - title: '', - content: '', - language: LANGS.detect, - expiry: '', - }, - unauthorized: false, - error: '', - } - return fetchPaste(id, password) - .then(resp => { - const data = resp.data - response.data = { - ...data, - expiry: fmtDateStr(data.expiry) - } - return response - }) - .catch(error => { - const resp = error.response - if (!resp) { - response.error = 'network error' - return - } +export const defaultResponse = { + data: { + title: '', + content: '', + language: LANGS.detect, + expiry: '', + }, + unauthorized: false, + error: '', +} - if (resp.status === 401) { - response.error = 'unauthorized' - response.unauthorized = true - return - } +const resolvePaste = async (id, password = "") => { + const response = {...defaultResponse} + try { + return await fetchPaste(id, password) + .then(resp => { + const data = resp.data + response.data = { + ...data, + expiry: fmtDateStr(data.expiry) + } + return response + }) + } catch (err) { + const resp = err.response + if (!resp) { + response.error = 'network error' + return response + } - response.error = `${resp.status}: ${resp.data}` + if (resp.status === 401) { + response.error = 'unauthorized' + response.unauthorized = true return response - }) + } + + response.error = `${resp.status}: ${resp.data}` + return response + } } export default resolvePaste \ No newline at end of file -- cgit v1.2.3