diff --git a/apps/web-dashboard/src/pages/AdminCreateRelease.jsx b/apps/web-dashboard/src/pages/AdminCreateRelease.jsx index 5f4e2381a..c54eb4836 100644 --- a/apps/web-dashboard/src/pages/AdminCreateRelease.jsx +++ b/apps/web-dashboard/src/pages/AdminCreateRelease.jsx @@ -53,7 +53,7 @@ export default function AdminCreateRelease() { navigate('/releases'); } catch (err) { toast.dismiss(loadToast); - toast.error(err.response?.data?.error || "Failed to publish release."); + toast.error(err.response?.data?.message || err.response?.data?.error || "Failed to publish release."); } finally { setLoading(false); } diff --git a/apps/web-dashboard/src/pages/Auth.jsx b/apps/web-dashboard/src/pages/Auth.jsx index f84edc218..071c23095 100644 --- a/apps/web-dashboard/src/pages/Auth.jsx +++ b/apps/web-dashboard/src/pages/Auth.jsx @@ -158,7 +158,7 @@ export default function Auth() { setUsers(prev => normalizeUsersResponse(prev).filter(u => u._id !== userId)); toast.success('User deleted'); } catch (err) { - toast.error(err.response?.data?.error || 'Failed to delete user'); + toast.error(err.response?.data?.message || err.response?.data?.error || 'Failed to delete user'); } }; @@ -171,7 +171,7 @@ export default function Auth() { setResetPasswordUser(null); setNewPassword(''); } catch (err) { - toast.error(err.response?.data?.error || 'Failed to reset password'); + toast.error(err.response?.data?.message || err.response?.data?.error || 'Failed to reset password'); } finally { setIsResetLoading(false); } @@ -228,7 +228,7 @@ export default function Auth() { setIsAddModalOpen(false); setEditingUser(null); } catch (err) { - toast.error(err.response?.data?.error || 'Failed to save user'); + toast.error(err.response?.data?.message || err.response?.data?.error || 'Failed to save user'); } }} fields={[ diff --git a/apps/web-dashboard/src/pages/CreateCollection.jsx b/apps/web-dashboard/src/pages/CreateCollection.jsx index 2e46d366d..52cd253f4 100644 --- a/apps/web-dashboard/src/pages/CreateCollection.jsx +++ b/apps/web-dashboard/src/pages/CreateCollection.jsx @@ -541,7 +541,7 @@ function CreateCollection() { completeStep('create_collection'); navigate(`/project/${projectId}/database`); } catch (err) { - const errMsg = err.response?.data?.error; + const errMsg = err.response?.data?.message || err.response?.data?.error; toast.error(typeof errMsg === 'string' ? errMsg : JSON.stringify(errMsg) || "Failed to create collection"); } finally { setLoading(false); diff --git a/apps/web-dashboard/src/pages/CreateProject.jsx b/apps/web-dashboard/src/pages/CreateProject.jsx index 9bf8edc4a..602bdcaf8 100644 --- a/apps/web-dashboard/src/pages/CreateProject.jsx +++ b/apps/web-dashboard/src/pages/CreateProject.jsx @@ -78,7 +78,7 @@ function CreateProject() { completeStep('create_project'); completeStep('get_api_key'); } catch (err) { - const errorMsg = err.response?.data?.error || err.response?.data?.message || "Failed to create project"; + const errorMsg = err.response?.data?.message || err.response?.data?.error || err.response?.data?.message || "Failed to create project"; toast.error(typeof errorMsg === 'object' ? "Validation Error" : errorMsg); } finally { setLoading(false); diff --git a/apps/web-dashboard/src/pages/OtpVerification.jsx b/apps/web-dashboard/src/pages/OtpVerification.jsx index 004aafbee..9893d0207 100644 --- a/apps/web-dashboard/src/pages/OtpVerification.jsx +++ b/apps/web-dashboard/src/pages/OtpVerification.jsx @@ -44,7 +44,7 @@ function OtpVerification() { toast.promise(sendOtpPromise, { loading: 'Sending OTP...', success: 'OTP sent to your email!', - error: (err) => err.response?.data?.error || 'Failed to send OTP' + error: (err) => err.response?.data?.message || err.response?.data?.error || 'Failed to send OTP' }); } }, [email, navigate, user, authLoading]); @@ -63,7 +63,7 @@ function OtpVerification() { navigate('/dashboard'); } catch (err) { toast.dismiss(loadingToast); - toast.error(err.response?.data?.error || 'Verification failed'); + toast.error(err.response?.data?.message || err.response?.data?.error || 'Verification failed'); } }; @@ -78,7 +78,7 @@ function OtpVerification() { setCanResend(false); } catch (err) { toast.dismiss(loadingToast); - toast.error(err.response?.data?.error || 'Failed to send OTP'); + toast.error(err.response?.data?.message || err.response?.data?.error || 'Failed to send OTP'); } }; diff --git a/apps/web-dashboard/src/pages/ProjectSettings.jsx b/apps/web-dashboard/src/pages/ProjectSettings.jsx index c36f452bb..41a641029 100644 --- a/apps/web-dashboard/src/pages/ProjectSettings.jsx +++ b/apps/web-dashboard/src/pages/ProjectSettings.jsx @@ -124,7 +124,7 @@ export default function ProjectSettings() { if (payload.resendFromEmail !== undefined) updates.resendFromEmail = payload.resendFromEmail; setProject((prev) => (prev ? { ...prev, ...updates } : prev)); } catch (err) { - toast.error(err.response?.data?.error || "Failed to save mail settings"); + toast.error(err.response?.data?.message || err.response?.data?.error || "Failed to save mail settings"); } finally { setResendKeyLoading(false); } @@ -824,7 +824,7 @@ function DatabaseConfigForm({ project, projectId, onProjectUpdate }) { setShowForm(false); setDbUri(""); } catch (err) { - const errorMsg = err.response?.data?.error || "Failed to update DB config"; + const errorMsg = err.response?.data?.message || err.response?.data?.error || "Failed to update DB config"; if (errorMsg.includes("whitelist Server IP")) { toast.error(
Access Denied!
{errorMsg}
, { duration: 6000 }); } else { @@ -842,7 +842,7 @@ function DatabaseConfigForm({ project, projectId, onProjectUpdate }) { onProjectUpdate(prev => ({ ...prev, resources: { ...prev.resources, db: { ...prev.resources.db, isExternal: false } } })); setShowForm(true); } catch (err) { - toast.error(err.response?.data?.error || "Failed to remove DB config"); + toast.error(err.response?.data?.message || err.response?.data?.error || "Failed to remove DB config"); } finally { setLoading(false); } @@ -953,7 +953,7 @@ function StorageConfigForm({ project, projectId, onProjectUpdate }) { setShowForm(false); setConfig(INITIAL_STORAGE_CONFIG); } catch (err) { - toast.error(err.response?.data?.error || "Failed to update Storage config"); + toast.error(err.response?.data?.message || err.response?.data?.error || "Failed to update Storage config"); } finally { setLoading(false); } @@ -968,7 +968,7 @@ function StorageConfigForm({ project, projectId, onProjectUpdate }) { setConfig(INITIAL_STORAGE_CONFIG); setShowForm(true); } catch (err) { - toast.error(err.response?.data?.error || "Failed to remove Storage config"); + toast.error(err.response?.data?.message || err.response?.data?.error || "Failed to remove Storage config"); } finally { setLoading(false); } @@ -1105,7 +1105,7 @@ function AllowedDomainsForm({ project, projectId, onProjectUpdate }) { setDomains(updatedDomains); onProjectUpdate((prev) => ({ ...prev, allowedDomains: updatedDomains })); } catch (err) { - toast.error(err.response?.data?.error || "Failed to update allowed domains"); + toast.error(err.response?.data?.message || err.response?.data?.error || "Failed to update allowed domains"); } finally { setLoading(false); } diff --git a/apps/web-dashboard/src/pages/Settings.jsx b/apps/web-dashboard/src/pages/Settings.jsx index 7395ad6cd..eece70eaa 100644 --- a/apps/web-dashboard/src/pages/Settings.jsx +++ b/apps/web-dashboard/src/pages/Settings.jsx @@ -28,7 +28,7 @@ export default function Settings() { toast.success("Password updated!"); setPassData({ currentPassword: '', newPassword: '' }); } catch (err) { - toast.error(err.response?.data || "Failed to update password"); + toast.error(err.response?.data?.message || err.response?.data?.error || "Failed to update password"); } finally { setLoadingPass(false); } @@ -46,7 +46,7 @@ export default function Settings() { toast.success("Account deleted. Goodbye!"); logout(); // Log user out immediately } catch (err) { - toast.error(err.response?.data || "Failed to delete account"); + toast.error(err.response?.data?.message || err.response?.data?.error || "Failed to delete account"); setShowDeleteModal(false); // Close modal on error so user can retry } finally { setLoadingDelete(false); diff --git a/apps/web-dashboard/src/pages/Webhooks.jsx b/apps/web-dashboard/src/pages/Webhooks.jsx index b5c0c17c4..38c16ebba 100644 --- a/apps/web-dashboard/src/pages/Webhooks.jsx +++ b/apps/web-dashboard/src/pages/Webhooks.jsx @@ -7,6 +7,14 @@ import { XCircle, Clock, RefreshCw, Eye, ChevronDown, ChevronUp, Copy } from 'lucide-react'; +const normalizeError = (val, defaultMsg) => { + const msg = val?.response?.data?.message || val?.response?.data?.error || val?.response?.data?.details?.[0]?.message || defaultMsg; + if (typeof msg === 'string') return msg; + if (Array.isArray(msg)) return msg.map(m => typeof m === 'string' ? m : JSON.stringify(m)).join(', '); + if (msg && typeof msg === 'object') return JSON.stringify(msg); + return String(msg); +}; + export default function Webhooks() { const { projectId } = useParams(); @@ -143,7 +151,7 @@ export default function Webhooks() { closeModal(); fetchData(); } catch (err) { - const msg = err.response?.data?.error || err.response?.data?.details?.[0]?.message || 'Failed to save webhook'; + const msg = normalizeError(err, 'Failed to save webhook'); toast.error(msg); } finally { setIsSaving(false); @@ -172,7 +180,7 @@ export default function Webhooks() { setTestResult({ webhookId: webhook._id, success: false, - error: err.response?.data?.error || 'Test failed' + error: normalizeError(err, 'Test failed') }); } finally { setTestingWebhookId(null); diff --git a/apps/web-dashboard/src/utils/api.js b/apps/web-dashboard/src/utils/api.js index 4f8d2a513..063c2ad93 100644 --- a/apps/web-dashboard/src/utils/api.js +++ b/apps/web-dashboard/src/utils/api.js @@ -74,8 +74,7 @@ api.interceptors.response.use( // 403: Show upgrade modal if it's a plan limit error if (error.response?.status === 403) { const message = ( - error.response?.data?.message || - error.response?.data?.error || + error.response?.data?.message || error.response?.data?.error || '' ).toLowerCase();