diff --git a/src/components/Pastes/PastePanel.jsx b/src/components/Pastes/PastePanel.jsx index e9cfad8..778df2f 100644 --- a/src/components/Pastes/PastePanel.jsx +++ b/src/components/Pastes/PastePanel.jsx @@ -60,19 +60,35 @@ const PastePanel = ({ onSubmit, publicPastes }) => { ? `https://api.miarma.net/v2/mpaste/pastes/${key}` : `http://localhost:8081/v2/mpaste/pastes/${key}`; - const data = await getData(url, { password: pwd }, false); + const headers = pwd ? { "X-Paste-Password": pwd } : {}; - if (!data) return; + try { + const response = await getData(url, null, false, headers); - setSelectedPaste(data); - setFormData({ - title: data.title ?? "", - content: data.content ?? "", - syntax: data.syntax || "plaintext", - burnAfter: data.burnAfter || false, - isPrivate: data.isPrivate || false, - password: "" - }); + if (response) { + setSelectedPaste(response); + setShowPasswordModal(false); + setFormData({ + title: response.title ?? "", + content: response.content ?? "", + syntax: response.syntax || "plaintext", + burnAfter: response.burnAfter || false, + isPrivate: response.isPrivate || false, + password: "" + }); + } + } catch (error) { + const status = error?.status ?? error?.response?.status; + if (status === 403) { + setShowPasswordModal(true); + return; + } + + if (status === 404) { + setShowPasswordModal(false); + navigate("/", { replace: true }); + } + } }; useEffect(() => { if (pasteKey) fetchPaste(pasteKey); }, [pasteKey]); diff --git a/src/hooks/useData.js b/src/hooks/useData.js index 9ad7365..2133914 100644 --- a/src/hooks/useData.js +++ b/src/hooks/useData.js @@ -92,10 +92,15 @@ export const useData = (config, onError) => { if (config?.baseUrl) fetchData(); }, [config, fetchData]); - const requestWrapper = async (method, endpoint, payload = null, refresh = false) => { + const requestWrapper = async (method, endpoint, payload = null, refresh = false, extraHeaders = {}) => { try { const isFormData = payload instanceof FormData; - const headers = getAuthHeaders(isFormData); + + const headers = { + ...getAuthHeaders(isFormData), + ...extraHeaders + }; + const cfg = { headers }; let response; @@ -115,11 +120,11 @@ export const useData = (config, onError) => { } catch (err) { const error = handleAxiosError(err); - if (error.status !== 422 && onError) { - onError(error); + if (error.status !== 403 && error.status !== 422) { + if (onError) onError(error); + setError(error); } - - setError(error); + throw error; } }; @@ -131,7 +136,7 @@ export const useData = (config, onError) => { dataLoading, dataError, clearError, - getData: (url, params, refresh = true) => requestWrapper("get", url, params, refresh), + getData: (url, params, refresh = true, headers = {}) => requestWrapper("get", url, params, refresh, headers), postData: (url, body, refresh = true) => requestWrapper("post", url, body, refresh), putData: (url, body, refresh = true) => requestWrapper("put", url, body, refresh), deleteData: (url, refresh = true) => requestWrapper("delete", url, null, refresh), diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index 28636a8..8e5da30 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -34,12 +34,10 @@ const HomeContent = ({ reqConfig }) => { const { searchTerm } = useSearch(); if (dataLoading) return
Error loading data
; - const filtered = data.filter(paste => - paste.title.toLowerCase().includes((searchTerm ?? "").toLowerCase()) || - paste.content.toLowerCase().includes((searchTerm ?? "").toLowerCase()) - ); + const filtered = (data && Array.isArray(data)) ? data.filter(paste => + paste.title.toLowerCase().includes((searchTerm ?? "").toLowerCase()) + ) : []; const handleSubmit = async (paste) => { try { @@ -63,7 +61,7 @@ const HomeContent = ({ reqConfig }) => { Tu paste privado ha sido creado. Puedes acceder a él mediante el siguiente enlace: