Skip to content

Commit 9c25d19

Browse files
committed
リダイレクトのエラーハンドリング
1 parent 6d37d66 commit 9c25d19

File tree

4 files changed

+60
-9
lines changed

4 files changed

+60
-9
lines changed

app/(docs)/@chat/error.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"use client"; // Error boundaries must be Client Components
2+
3+
import clsx from "clsx";
4+
import { ChatAreaContainer } from "./chat/[chatId]/chatArea";
5+
6+
export default function Error({
7+
error,
8+
// reset,
9+
}: {
10+
error: Error & { digest?: string };
11+
reset: () => void;
12+
}) {
13+
return (
14+
<ChatAreaContainer chatId={"error"}>
15+
<p>ページの読み込み中にエラーが発生しました。</p>
16+
<pre
17+
className={clsx(
18+
"border-2 border-current/20 mt-4 rounded-box p-4! bg-base-300! text-base-content!",
19+
"max-w-full whitespace-pre-wrap"
20+
)}
21+
>
22+
{error.message}
23+
</pre>
24+
{error.digest && (
25+
<p className="mt-2 text-sm text-base-content/50">
26+
Digest: {error.digest}
27+
</p>
28+
)}
29+
</ChatAreaContainer>
30+
);
31+
}

app/(docs)/@docs/default.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,38 @@
11
"use client";
22

3-
import { useEffect } from "react";
3+
import { useEffect, useState } from "react";
44
import Loading from "./[lang]/[pageId]/loading";
55
import { getRedirectFromChat } from "@/actions/getRedirectFromChat";
66
import { usePathname, useRouter } from "next/navigation";
7+
import ErrorPage from "@/error";
78

89
// /chat/チャットid に直接アクセスした場合には、
910
// チャットからそれに対応するページidを取得し、そのドキュメントに自動でリダイレクトする。
1011
export default function DocsDefaultPage() {
1112
const pathname = usePathname();
1213
const router = useRouter();
14+
const [error, setError] = useState<unknown>(null);
1315
useEffect(() => {
1416
if (pathname.startsWith("/chat/")) {
1517
const chatId = pathname.split("/chat/")[1];
16-
getRedirectFromChat(chatId).then((path) => {
17-
router.replace(path);
18-
});
18+
getRedirectFromChat(chatId)
19+
.then((path) => {
20+
router.replace(path);
21+
})
22+
.catch((err) => {
23+
console.error("Failed to get redirect path from chat:", err);
24+
setError(err);
25+
});
26+
} else if (pathname === "/chat") {
27+
router.replace("/");
28+
} else {
29+
throw new Error(`Invalid path: ${pathname}`);
1930
}
2031
}, [pathname, router]);
2132

33+
if (error) {
34+
return <ErrorPage error={error} reset={() => router.refresh()} />;
35+
}
36+
2237
return <Loading />;
2338
}

app/(docs)/@docs/error.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"use client";
2+
3+
import Error from "@/error";
4+
5+
export default Error;

app/error.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import clsx from "clsx";
44
import Link from "next/link";
55

6-
export default function Error({
6+
export default function ErrorPage({
77
error,
88
reset,
99
}: {
10-
error: Error & { digest?: string };
10+
error: unknown;
1111
reset: () => void;
1212
}) {
1313
return (
@@ -20,11 +20,11 @@ export default function Error({
2020
"max-w-full whitespace-pre-wrap"
2121
)}
2222
>
23-
{error.message}
23+
{error instanceof Error ? error.message : String(error)}
2424
</pre>
25-
{error.digest && (
25+
{"digest" in (error as { digest: string }) && (
2626
<p className="mt-2 text-sm text-base-content/50">
27-
Digest: {error.digest}
27+
Digest: {(error as { digest: string }).digest}
2828
</p>
2929
)}
3030
<div className="divider w-full self-auto!" />

0 commit comments

Comments
 (0)