import { HeroBanner } from "@/app/components/HeroBanner"; 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 } }) : []; const idToMeta = new Map(boardsMeta.map((b) => [b.id, b] as const)); const orderedBoards = visibleBoardIds .map((id) => idToMeta.get(id)) .filter((v): v is { id: string; name: string } => Boolean(v)); const firstTwo = orderedBoards.slice(0, 2); const restBoards = orderedBoards.slice(2); const renderBoardPanel = (board: { id: string; name: string }) => (
{board.name} 더보기
); return (
{/* 히어로 섹션: 상단 대형 비주얼 영역 (설정 온오프) */} {showBanner && (
)} {/* 제휴 샾 가로 스크롤 (설정 온오프) */} {showPartnerShops && (() => { const items = [ { id: 1, region: "경기도", name: "라온마사지샾", address: "수원시 팔달구 매산로 45", image: "/sample.jpg" }, { id: 2, region: "강원도", name: "휴앤힐링마사지샾", address: "춘천시 중앙로 112", image: "/sample.jpg" }, { id: 3, region: "충청북도", name: "소담마사지샾", address: "청주시 상당구 상당로 88", image: "/sample.jpg" }, { id: 4, region: "충청남도", name: "아늑마사지샾", address: "천안시 동남구 시민로 21", image: "/sample.jpg" }, { id: 5, region: "전라북도", name: "편안한마사지샾", address: "전주시 완산구 풍남문로 77", image: "/sample.jpg" }, { id: 6, region: "전라남도", name: "바른마사지샾", address: "여수시 중앙로 9", image: "/sample.jpg" }, { id: 7, region: "경상북도", name: "늘봄마사지샾", address: "대구시 중구 동성로3길 12", image: "/sample.jpg" }, { id: 8, region: "경상남도", name: "편히쉬다마사지샾", address: "창원시 성산구 중앙대로 150", image: "/sample.jpg" }, { id: 9, region: "제주특별자치도", name: "제주소풍마사지샾", address: "제주시 중앙로 230", image: "/sample.jpg" }, { id: 10, region: "서울특별시", name: "도심휴식마사지샾", address: "강남구 테헤란로 427", image: "/sample.jpg" }, ]; return ; })()} {/* 1행: 프로필 + 선택된 보드 2개 (최대 2개) */} {(firstTwo.length > 0) && (
프로필
Lv
홍길동
레벨
Lv. 79
등급
Iron
포인트
1,600,000
{firstTwo.map((b) => (
{renderBoardPanel(b)}
))}
)} {/* 나머지 보드: 2개씩 다음 열로 렌더링 */} {restBoards.length > 0 && ( <> {Array.from({ length: Math.ceil(restBoards.length / 2) }).map((_, i) => { const pair = restBoards.slice(i * 2, i * 2 + 2); return (
{pair.map((b) => (
{renderBoardPanel(b)}
))}
); })} )}
); }