Skip to content

Commit 977ea16

Browse files
FatimasanusiDamola-Sodiqusmanimamu17-create
authored
feat: implement global error boundaries across routes and consolidate API endpoints for centralized service management (#219)
Co-authored-by: Damola-Sodiq <damilolasodiq149@gmail.com> Co-authored-by: Usman Imamu <usmanimamu17@gmail.com>
1 parent 330552d commit 977ea16

36 files changed

Lines changed: 958 additions & 78 deletions

package-lock.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
"@testing-library/jest-dom": "^6.9.1",
3131
"@testing-library/react": "^16.3.2",
3232
"@testing-library/user-event": "^14.6.1",
33-
"@types/axios": "^0.9.36",
3433
"@types/node": "^20",
3534
"@types/react": "^19",
3635
"@types/react-dom": "^19",

src/app/(auth)/logic/error.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"use client";
2+
/** ApexChain Network Operations Intelligence Platform */
3+
4+
import { useEffect } from "react";
5+
import { RouteErrorState } from "@/components/ui/route-state";
6+
import { logger } from "@/lib/logger";
7+
8+
export default function RouteError({
9+
error,
10+
reset,
11+
}: {
12+
error: Error & { digest?: string };
13+
reset: () => void;
14+
}) {
15+
useEffect(() => {
16+
logger.error("route-error-boundary", {
17+
message: error.message,
18+
stack: error.stack,
19+
digest: error.digest,
20+
});
21+
}, [error]);
22+
23+
return (
24+
<div className="space-y-6 p-6">
25+
<RouteErrorState
26+
title="Auth Logic Error"
27+
description={
28+
error.message || "An unexpected error occurred while loading this page."
29+
}
30+
primaryAction={{
31+
label: "Try again",
32+
onClick: reset,
33+
}}
34+
secondaryAction={{
35+
label: "Reload page",
36+
onClick: () => window.location.reload(),
37+
}}
38+
/>
39+
</div>
40+
);
41+
}

src/app/bulk-import/error.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"use client";
2+
/** ApexChain Network Operations Intelligence Platform */
3+
4+
import { useEffect } from "react";
5+
import { RouteErrorState } from "@/components/ui/route-state";
6+
import { logger } from "@/lib/logger";
7+
8+
export default function RouteError({
9+
error,
10+
reset,
11+
}: {
12+
error: Error & { digest?: string };
13+
reset: () => void;
14+
}) {
15+
useEffect(() => {
16+
logger.error("route-error-boundary", {
17+
message: error.message,
18+
stack: error.stack,
19+
digest: error.digest,
20+
});
21+
}, [error]);
22+
23+
return (
24+
<div className="space-y-6 p-6">
25+
<RouteErrorState
26+
title="Bulk Import Error"
27+
description={
28+
error.message || "An unexpected error occurred while loading this page."
29+
}
30+
primaryAction={{
31+
label: "Try again",
32+
onClick: reset,
33+
}}
34+
secondaryAction={{
35+
label: "Reload page",
36+
onClick: () => window.location.reload(),
37+
}}
38+
/>
39+
</div>
40+
);
41+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"use client";
2+
/** ApexChain Network Operations Intelligence Platform */
3+
4+
import { useEffect } from "react";
5+
import { RouteErrorState } from "@/components/ui/route-state";
6+
import { logger } from "@/lib/logger";
7+
8+
export default function RouteError({
9+
error,
10+
reset,
11+
}: {
12+
error: Error & { digest?: string };
13+
reset: () => void;
14+
}) {
15+
useEffect(() => {
16+
logger.error("route-error-boundary", {
17+
message: error.message,
18+
stack: error.stack,
19+
digest: error.digest,
20+
});
21+
}, [error]);
22+
23+
return (
24+
<div className="space-y-6 p-6">
25+
<RouteErrorState
26+
title="Import History Error"
27+
description={
28+
error.message || "An unexpected error occurred while loading this page."
29+
}
30+
primaryAction={{
31+
label: "Try again",
32+
onClick: reset,
33+
}}
34+
secondaryAction={{
35+
label: "Reload page",
36+
onClick: () => window.location.reload(),
37+
}}
38+
/>
39+
</div>
40+
);
41+
}

src/app/config/error.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"use client";
2+
/** ApexChain Network Operations Intelligence Platform */
3+
4+
import { useEffect } from "react";
5+
import { RouteErrorState } from "@/components/ui/route-state";
6+
import { logger } from "@/lib/logger";
7+
8+
export default function RouteError({
9+
error,
10+
reset,
11+
}: {
12+
error: Error & { digest?: string };
13+
reset: () => void;
14+
}) {
15+
useEffect(() => {
16+
logger.error("route-error-boundary", {
17+
message: error.message,
18+
stack: error.stack,
19+
digest: error.digest,
20+
});
21+
}, [error]);
22+
23+
return (
24+
<div className="space-y-6 p-6">
25+
<RouteErrorState
26+
title="Config Error"
27+
description={
28+
error.message || "An unexpected error occurred while loading this page."
29+
}
30+
primaryAction={{
31+
label: "Try again",
32+
onClick: reset,
33+
}}
34+
secondaryAction={{
35+
label: "Reload page",
36+
onClick: () => window.location.reload(),
37+
}}
38+
/>
39+
</div>
40+
);
41+
}

src/app/error.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,14 @@ export default function GlobalError({
2727
description={
2828
error.message || "An unexpected error occurred while loading this page."
2929
}
30-
actionLabel="Try again"
31-
onAction={reset}
32-
secondaryActionLabel="Reload page"
33-
onSecondaryAction={() => window.location.reload()}
30+
primaryAction={{
31+
label: "Try again",
32+
onClick: reset,
33+
}}
34+
secondaryAction={{
35+
label: "Reload page",
36+
onClick: () => window.location.reload(),
37+
}}
3438
/>
3539
{process.env.NODE_ENV === "development" && error.digest ? (
3640
<div className="mx-auto w-full max-w-xl rounded-xl border border-slate-200 bg-white p-4 text-xs text-slate-500 shadow-sm">

src/app/login/error.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"use client";
2+
/** ApexChain Network Operations Intelligence Platform */
3+
4+
import { useEffect } from "react";
5+
import { RouteErrorState } from "@/components/ui/route-state";
6+
import { logger } from "@/lib/logger";
7+
8+
export default function RouteError({
9+
error,
10+
reset,
11+
}: {
12+
error: Error & { digest?: string };
13+
reset: () => void;
14+
}) {
15+
useEffect(() => {
16+
logger.error("route-error-boundary", {
17+
message: error.message,
18+
stack: error.stack,
19+
digest: error.digest,
20+
});
21+
}, [error]);
22+
23+
return (
24+
<div className="space-y-6 p-6">
25+
<RouteErrorState
26+
title="Login Error"
27+
description={
28+
error.message || "An unexpected error occurred while loading this page."
29+
}
30+
primaryAction={{
31+
label: "Try again",
32+
onClick: reset,
33+
}}
34+
secondaryAction={{
35+
label: "Reload page",
36+
onClick: () => window.location.reload(),
37+
}}
38+
/>
39+
</div>
40+
);
41+
}

src/app/login/page.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { useState } from "react";
55
import { useRouter } from "next/navigation";
66
import Link from "next/link";
77
import { api } from "@/lib/api";
8+
import { ENDPOINTS } from "@/lib/endpoints";
89

910
export const dynamic = "force-static";
1011

@@ -20,7 +21,7 @@ export default function LoginPage() {
2021
setError(null);
2122
setLoading(true);
2223
try {
23-
await api.post("/auth/login", { email, password });
24+
await api.post(ENDPOINTS.auth.login, { email, password });
2425
router.push("/");
2526
router.refresh();
2627
} catch (err) {

src/app/outages/[id]/error.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"use client";
2+
/** ApexChain Network Operations Intelligence Platform */
3+
4+
import { useEffect } from "react";
5+
import { RouteErrorState } from "@/components/ui/route-state";
6+
import { logger } from "@/lib/logger";
7+
8+
export default function RouteError({
9+
error,
10+
reset,
11+
}: {
12+
error: Error & { digest?: string };
13+
reset: () => void;
14+
}) {
15+
useEffect(() => {
16+
logger.error("route-error-boundary", {
17+
message: error.message,
18+
stack: error.stack,
19+
digest: error.digest,
20+
});
21+
}, [error]);
22+
23+
return (
24+
<div className="space-y-6 p-6">
25+
<RouteErrorState
26+
title="Outage Details Error"
27+
description={
28+
error.message || "An unexpected error occurred while loading this page."
29+
}
30+
primaryAction={{
31+
label: "Try again",
32+
onClick: reset,
33+
}}
34+
secondaryAction={{
35+
label: "Reload page",
36+
onClick: () => window.location.reload(),
37+
}}
38+
/>
39+
</div>
40+
);
41+
}

0 commit comments

Comments
 (0)