diff --git a/app/musics/loading.tsx b/app/musics/loading.tsx
new file mode 100644
index 0000000..fc84ba2
--- /dev/null
+++ b/app/musics/loading.tsx
@@ -0,0 +1,5 @@
+import MusicListLoading from "@/components/music-list-loading";
+
+export default function Loading() {
+ return ;
+}
diff --git a/components/dashboard-home.tsx b/components/dashboard-home.tsx
index ed8d0cc..f8519ae 100644
--- a/components/dashboard-home.tsx
+++ b/components/dashboard-home.tsx
@@ -1,36 +1,22 @@
-"use client";
-
-import AppLayout from "@cloudscape-design/components/app-layout";
import Button from "@cloudscape-design/components/button";
import Container from "@cloudscape-design/components/container";
import ContentLayout from "@cloudscape-design/components/content-layout";
import Header from "@cloudscape-design/components/header";
import SpaceBetween from "@cloudscape-design/components/space-between";
-import TopNavigation from "@cloudscape-design/components/top-navigation";
+
+import DashboardLayout from "@/components/dashboard-layout";
export default function DashboardHome({ userName }: { userName: string }) {
return (
-
-
-
XLAIR Dashboard}>
-
-
- 管理者用ダッシュボードへようこそ、{userName} さん。
-
-
-
-
-
- }
- />
-
+
+ XLAIR Dashboard}>
+
+
+ 管理者用ダッシュボードへようこそ、{userName} さん。
+
+
+
+
+
);
}
diff --git a/components/dashboard-layout.tsx b/components/dashboard-layout.tsx
new file mode 100644
index 0000000..a14733a
--- /dev/null
+++ b/components/dashboard-layout.tsx
@@ -0,0 +1,41 @@
+"use client";
+
+import AppLayout from "@cloudscape-design/components/app-layout";
+import SideNavigation from "@cloudscape-design/components/side-navigation";
+import TopNavigation from "@cloudscape-design/components/top-navigation";
+import type { ReactNode } from "react";
+
+const navigationItems = [
+ { type: "link" as const, text: "ホーム", href: "/" },
+ { type: "link" as const, text: "楽曲管理", href: "/musics" },
+];
+
+export default function DashboardLayout({
+ activeHref,
+ children,
+}: {
+ activeHref: string;
+ children: ReactNode;
+}) {
+ return (
+
+
+
+ }
+ // Remove toolsHide when an AppLayout tools panel is introduced.
+ toolsHide
+ content={children}
+ />
+
+ );
+}
diff --git a/components/music-list-loading.tsx b/components/music-list-loading.tsx
new file mode 100644
index 0000000..fb30409
--- /dev/null
+++ b/components/music-list-loading.tsx
@@ -0,0 +1,25 @@
+import Container from "@cloudscape-design/components/container";
+import ContentLayout from "@cloudscape-design/components/content-layout";
+import Header from "@cloudscape-design/components/header";
+import Spinner from "@cloudscape-design/components/spinner";
+
+import DashboardLayout from "@/components/dashboard-layout";
+
+export default function MusicListLoading() {
+ return (
+
+ 楽曲管理}>
+
+
+
+ 楽曲一覧を読み込み中
+
+
+
+
+ );
+}
diff --git a/components/music-list.tsx b/components/music-list.tsx
index 9ab6cb5..5097f11 100644
--- a/components/music-list.tsx
+++ b/components/music-list.tsx
@@ -1,14 +1,13 @@
"use client";
-import AppLayout from "@cloudscape-design/components/app-layout";
import Button from "@cloudscape-design/components/button";
import Container from "@cloudscape-design/components/container";
import ContentLayout from "@cloudscape-design/components/content-layout";
import Header from "@cloudscape-design/components/header";
import SpaceBetween from "@cloudscape-design/components/space-between";
-import TopNavigation from "@cloudscape-design/components/top-navigation";
import dynamic from "next/dynamic";
+import DashboardLayout from "@/components/dashboard-layout";
import type { MusicListResponse } from "@/lib/api";
const MusicTable = dynamic(() => import("@/components/music-table"), {
@@ -30,36 +29,19 @@ export default function MusicList({
: undefined;
return (
-
-
-
ホーム} variant="h1">
- 楽曲管理
-
- }
- >
-
-
-
-
-
-
-
-
-
- }
- />
-
+
+ 楽曲管理}>
+
+
+
+ {nextPageHref ? (
+
+
+
+ ) : null}
+
+
+
+
);
}