import { HeroBanner } from "@/app/components/HeroBanner"; import Link from "next/link"; import HorizontalCardScroller from "@/app/components/HorizontalCardScroller"; import { PostList } from "@/app/components/PostList"; import ProfileLabelIcon from "@/app/svgs/profilelableicon"; import SearchIcon from "@/app/svgs/SearchIcon"; import prisma from "@/lib/prisma"; export default async function Home({ searchParams }: { searchParams: Promise<{ sort?: "recent" | "popular" } | undefined> }) { const sp = await searchParams; const sort = sp?.sort ?? "recent"; // 메인페이지 설정 불러오기 const SETTINGS_KEY = "mainpage_settings" as const; const settingRow = await prisma.setting.findUnique({ where: { key: SETTINGS_KEY } }); const parsed = settingRow ? JSON.parse(settingRow.value as string) : {}; const showBanner: boolean = parsed.showBanner ?? true; const showPartnerShops: boolean = parsed.showPartnerShops ?? true; const visibleBoardIds: string[] = Array.isArray(parsed.visibleBoardIds) ? parsed.visibleBoardIds : []; // 보드 메타데이터 (메인뷰 타입 포함) const boardsMeta = visibleBoardIds.length ? await prisma.board.findMany({ where: { id: { in: visibleBoardIds } }, select: { id: true, name: true, slug: true, category: { select: { id: true, name: true } }, mainPageViewType: { select: { key: true } }, }, }) : []; const idToMeta = new Map( boardsMeta.map((b) => [ b.id, { id: b.id, name: b.name, slug: b.slug, categoryId: b.category?.id ?? null, categoryName: b.category?.name ?? "", mainTypeKey: b.mainPageViewType?.key, }, ] as const) ); const orderedBoards = visibleBoardIds .map((id) => idToMeta.get(id)) .filter((v): v is any => Boolean(v)); const firstTwo = orderedBoards.slice(0, 2); const restBoards = orderedBoards.slice(2); function formatDateYmd(d: Date) { const yyyy = d.getFullYear(); const mm = String(d.getMonth() + 1).padStart(2, "0"); const dd = String(d.getDate()).padStart(2, "0"); return `${yyyy}.${mm}.${dd}`; } const renderBoardPanel = async (board: { id: string; name: string; slug: string; categoryId: string | null; categoryName: string; mainTypeKey?: string }) => { // 같은 카테고리의 소분류(게시판) 탭 목록 const siblingBoards = board.categoryId ? await prisma.board.findMany({ where: { categoryId: board.categoryId }, select: { id: true, name: true, slug: true }, orderBy: [{ sortOrder: "asc" }, { name: "asc" }], }) : []; const isTextMain = board.mainTypeKey === "main_text"; const isSpecialRank = board.mainTypeKey === "main_special_rank"; // 특수 랭킹 타입 처리 if (isSpecialRank) { const topUsers = await prisma.user.findMany({ select: { userId: true, nickname: true, points: true, profileImage: true }, where: { status: "active" }, orderBy: { points: "desc" }, take: 3, }); return (