diff --git a/backend/src/app/api/mii/list/route.ts b/backend/src/app/api/mii/list/route.ts index ba90a2a..7a4caef 100644 --- a/backend/src/app/api/mii/list/route.ts +++ b/backend/src/app/api/mii/list/route.ts @@ -89,6 +89,10 @@ export async function GET(request: NextRequest) { _count: { select: { likedBy: true }, }, + // Admin + ...(parentPage === "admin" && { + description: true, + }), }; let totalCount: number; diff --git a/frontend/public/logo.svg b/frontend/public/logo.svg new file mode 100644 index 0000000..58309aa --- /dev/null +++ b/frontend/public/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/components/mii/list/index.tsx b/frontend/src/components/mii/list/index.tsx index 4b8cb9d..1d15b35 100644 --- a/frontend/src/components/mii/list/index.tsx +++ b/frontend/src/components/mii/list/index.tsx @@ -9,7 +9,7 @@ import { Icon } from "@iconify/react"; import LikeButton from "../../like-button"; import { useStore } from "@nanostores/react"; import { session } from "../../../session"; -import Carousel from "../../carousel"; +import Description from "../../description"; interface ApiResponse { totalCount: number; @@ -26,6 +26,7 @@ export default function MiiList({ parentPage, userId }: Props) { const [searchParams] = useSearchParams(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); + const [acceptingAll, setAcceptingAll] = useState(false); const $session = useStore(session); @@ -49,6 +50,28 @@ export default function MiiList({ parentPage, userId }: Props) { }); }, [searchParams, userId, parentPage]); + async function handleAcceptAll() { + if (!data) return; + setAcceptingAll(true); + try { + await Promise.all( + data.miis.map((mii) => + fetch(`${import.meta.env.VITE_API_URL}/api/admin/accept-mii?id=${mii.id}`, { + method: "POST", + credentials: "include", + }), + ), + ); + const params = new URLSearchParams(searchParams.toString()); + if (userId) params.append("userId", userId.toString()); + if (parentPage) params.append("parentPage", parentPage); + const res = await fetch(`${import.meta.env.VITE_API_URL}/api/mii/list?${params.toString()}`, { credentials: "include" }); + if (res.ok) setData(await res.json()); + } finally { + setAcceptingAll(false); + } + } + return ( <> {loading ? ( @@ -62,6 +85,16 @@ export default function MiiList({ parentPage, userId }: Props) {
+ {parentPage === "admin" && data.miis.length > 0 && ( + + )}
@@ -91,15 +124,17 @@ export default function MiiList({ parentPage, userId }: Props) { /> ) : ( - + {[ `${import.meta.env.VITE_API_URL}/mii/${mii.id}/image?type=mii`, - ...(mii.platform === "THREE_DS" - ? [`${import.meta.env.VITE_API_URL}/mii/${mii.id}/image?type=qr-code`] - : [`${import.meta.env.VITE_API_URL}/mii/${mii.id}/image?type=features`]), - ...Array.from({ length: mii.imageCount }, (_, index) => `${import.meta.env.VITE_API_URL}/mii/${mii.id}/image?type=image${index}`), - ]} - /> + mii.platform === "THREE_DS" + ? `${import.meta.env.VITE_API_URL}/mii/${mii.id}/image?type=qr-code` + : `${import.meta.env.VITE_API_URL}/mii/${mii.id}/image?type=features`, + ...Array.from({ length: mii.imageCount }, (_, i) => `${import.meta.env.VITE_API_URL}/mii/${mii.id}/image?type=image${i}`), + ].map((src, i) => ( + mii image + ))} + )}
@@ -115,6 +150,7 @@ export default function MiiList({ parentPage, userId }: Props) { )}
+
{mii.tags.map((tag: string) => ( @@ -123,6 +159,8 @@ export default function MiiList({ parentPage, userId }: Props) { ))}
+ {parentPage === "admin" && mii.description && } +
@@ -141,7 +179,6 @@ export default function MiiList({ parentPage, userId }: Props) {
)} - {/* Admin Controls */} {parentPage === "admin" && (
diff --git a/frontend/src/pages/admin.tsx b/frontend/src/pages/admin.tsx index 8174015..aeef771 100644 --- a/frontend/src/pages/admin.tsx +++ b/frontend/src/pages/admin.tsx @@ -6,6 +6,6 @@ import { Navigate } from "react-router"; export default function AdminPage() { const $session = useStore(session); if ($session === undefined) return
Loading...
; - if ($session === null || ($session && Number($session?.user?.id) !== import.meta.env.VITE_ADMIN_USER_ID)) return ; + if ($session === null || Number($session?.user?.id) != import.meta.env.VITE_ADMIN_USER_ID) return ; return ; } diff --git a/frontend/src/pages/profile/layout.tsx b/frontend/src/pages/profile/layout.tsx index 31b2bd1..5a16395 100644 --- a/frontend/src/pages/profile/layout.tsx +++ b/frontend/src/pages/profile/layout.tsx @@ -22,8 +22,6 @@ export default function ProfileLayout() { return; } - const userId = id ? id : $session.user!.id; - fetch(`${import.meta.env.VITE_API_URL}/api/profile/${userId}/info`) .then((res) => { if (!res.ok) throw new Error("Failed to fetch profile");