Improve: error handling and data fetching in PastePanel and useData hooks

This commit is contained in:
2026-03-16 01:20:01 +01:00
parent 69140e6da1
commit f29d82f311
3 changed files with 43 additions and 24 deletions

View File

@@ -60,19 +60,35 @@ const PastePanel = ({ onSubmit, publicPastes }) => {
? `https://api.miarma.net/v2/mpaste/pastes/${key}` ? `https://api.miarma.net/v2/mpaste/pastes/${key}`
: `http://localhost:8081/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); if (response) {
setSelectedPaste(response);
setShowPasswordModal(false);
setFormData({ setFormData({
title: data.title ?? "", title: response.title ?? "",
content: data.content ?? "", content: response.content ?? "",
syntax: data.syntax || "plaintext", syntax: response.syntax || "plaintext",
burnAfter: data.burnAfter || false, burnAfter: response.burnAfter || false,
isPrivate: data.isPrivate || false, isPrivate: response.isPrivate || false,
password: "" 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]); useEffect(() => { if (pasteKey) fetchPaste(pasteKey); }, [pasteKey]);

View File

@@ -92,10 +92,15 @@ export const useData = (config, onError) => {
if (config?.baseUrl) fetchData(); if (config?.baseUrl) fetchData();
}, [config, fetchData]); }, [config, fetchData]);
const requestWrapper = async (method, endpoint, payload = null, refresh = false) => { const requestWrapper = async (method, endpoint, payload = null, refresh = false, extraHeaders = {}) => {
try { try {
const isFormData = payload instanceof FormData; const isFormData = payload instanceof FormData;
const headers = getAuthHeaders(isFormData);
const headers = {
...getAuthHeaders(isFormData),
...extraHeaders
};
const cfg = { headers }; const cfg = { headers };
let response; let response;
@@ -115,11 +120,11 @@ export const useData = (config, onError) => {
} catch (err) { } catch (err) {
const error = handleAxiosError(err); const error = handleAxiosError(err);
if (error.status !== 422 && onError) { if (error.status !== 403 && error.status !== 422) {
onError(error); if (onError) onError(error);
setError(error);
} }
setError(error);
throw error; throw error;
} }
}; };
@@ -131,7 +136,7 @@ export const useData = (config, onError) => {
dataLoading, dataLoading,
dataError, dataError,
clearError, 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), postData: (url, body, refresh = true) => requestWrapper("post", url, body, refresh),
putData: (url, body, refresh = true) => requestWrapper("put", url, body, refresh), putData: (url, body, refresh = true) => requestWrapper("put", url, body, refresh),
deleteData: (url, refresh = true) => requestWrapper("delete", url, null, refresh), deleteData: (url, refresh = true) => requestWrapper("delete", url, null, refresh),

View File

@@ -34,12 +34,10 @@ const HomeContent = ({ reqConfig }) => {
const { searchTerm } = useSearch(); const { searchTerm } = useSearch();
if (dataLoading) return <p><LoadingIcon /></p>; if (dataLoading) return <p><LoadingIcon /></p>;
if (dataError) return <p>Error loading data</p>;
const filtered = data.filter(paste => const filtered = (data && Array.isArray(data)) ? data.filter(paste =>
paste.title.toLowerCase().includes((searchTerm ?? "").toLowerCase()) || paste.title.toLowerCase().includes((searchTerm ?? "").toLowerCase())
paste.content.toLowerCase().includes((searchTerm ?? "").toLowerCase()) ) : [];
);
const handleSubmit = async (paste) => { const handleSubmit = async (paste) => {
try { try {
@@ -63,7 +61,7 @@ const HomeContent = ({ reqConfig }) => {
<span> <span>
Tu paste privado ha sido creado. Puedes acceder a él mediante el siguiente enlace: Tu paste privado ha sido creado. Puedes acceder a él mediante el siguiente enlace:
<br /><br /> <br /><br />
<a href={`https://paste.miarma.net/${key}`}>https://paste.miarma.net/${key}</a> <a href={`https://paste.miarma.net/${key}`}>https://paste.miarma.net/{key}</a>
<br /><br /> <br /><br />
Recuerda que este enlace es único y no se puede recuperar si se pierde. Recuerda que este enlace es único y no se puede recuperar si se pierde.
</span> </span>