1+ 'use client' ;
2+
3+ import React , { useMemo } from 'react' ;
4+ import { GoogleMap , Marker , useJsApiLoader } from '@react-google-maps/api' ;
5+ import { useSearchParams } from "next/navigation" ;
6+ import decodeHashToName from "@/app/event/homecoming/util/decoder" ;
7+
8+ export default function HomecomingInviteCard ( ) {
9+ const sp = useSearchParams ( ) ;
10+ const hash = sp . get ( 'hash' ) ;
11+ const userName = useMemo ( ( ) => decodeHashToName ( hash ) ?. trim ( ) ?? '' , [ hash ] ) ;
12+
13+ return ( < div
14+ className = "flex flex-col w-screen h-[calc(100dvh-64px)] pt-2 pb-12 rounded-t-[50px] bg-cblack overflow-hidden shadow-[0_-1.5px_#d9d9d940]" >
15+ < div className = "flex flex-col self-center w-[390px] h-[calc(100dvh-64px)]" >
16+ { /* 상단 바 */ }
17+ < div className = "w-[30px] h-1 self-center bg-[#d9d9d9] rounded-full" />
18+
19+ { /* 상단 컬러 라인 */ }
20+ < div className = "flex justify-around items-center self-center relative h-[52px] w-[326px] mt-7" >
21+ < div className = "h-2 w-[169.5px] -rotate-15 rounded-full bg-cred absolute left-0" />
22+ < div className = "h-2 w-[169.5px] rotate-15 rounded-full bg-cblue absolute right-0" />
23+ </ div >
24+
25+ < div
26+ className = "w-[326px] h-[calc(100dvh-210px)] my-4 self-center overflow-hidden overflow-y-auto no-scrollbar" >
27+ { /* GDGoC 로고 */ }
28+ < div className = "flex flex-col items-center" >
29+ < div className = "flex items-center text-[28px] font-ocra tight-[-2.5%]" >
30+ < span className = "text-cred" > G</ span >
31+ < span className = "text-cgreen" > D</ span >
32+ < span className = "text-cyellow" > G</ span >
33+ < span className = "text-cblue" > o</ span >
34+ < span className = "text-cred mr-2" > C</ span >
35+ < span className = "text-white ml-1" > INHA</ span >
36+ </ div >
37+ </ div >
38+
39+ { /* 초대 문구 */ }
40+ < div className = "text-center mb-12" >
41+ < p className = "text-[24px] leading-snug tight-[-2.5%]" >
42+ < span className = "font-extrabold" > 제 1회 홈커밍 데이</ span > 에
43+ < br />
44+ { userName ? ( < >
45+ < span className = "font-extrabold" > { userName } </ span > 님을 초대합니다!
46+ </ > ) : ( < > 여러분을 초대합니다!</ > ) }
47+ </ p >
48+ </ div >
49+
50+ { /* 내용 블록 */ }
51+ < div className = "space-y-4 text-[14px]" >
52+
53+ { /* 일시 */ }
54+ < div className = "flex-col gap-1" >
55+ < div className = "shrink-0 text-white font-bold text-xl" > 일시</ div >
56+ < div className = "flex-1" >
57+ < span className = "font-semibold" > 2025년 12월 20일 (토) 16:00 ~</ span >
58+ </ div >
59+ </ div >
60+
61+ { /* 일정 */ }
62+ < div className = "flex-col gap-1" >
63+ < div className = "shrink-0 text-white font-bold text-xl" > 프로그램</ div >
64+ < div className = "flex-1 space-y-1" >
65+ < div className = "flex gap-2" >
66+ < span className = "font-bold w-[106px]" > OB & YB 네트워킹</ span >
67+ < span className = "text-white text-[12px] pt-px" > 선후배 간의 네트워킹 프로그램</ span >
68+ </ div >
69+ < div className = "flex gap-2" >
70+ < span className = "font-semibold w-[106px]" > 다과 및 경품 추첨</ span >
71+ < span className = "text-white text-[12px] pt-px" > 네트워킹을 위한 다과와 이벤트</ span >
72+ </ div >
73+ < div className = "flex gap-2" >
74+ < span className = "font-bold w-[106px]" > 전체 회식</ span >
75+ < span className = "text-white text-[12px] pt-px" > 행사 종료 후 식당으로 이동</ span >
76+ </ div >
77+ </ div >
78+ </ div >
79+
80+ { /* 장소 */ }
81+ < div className = "flex-col gap-2" >
82+ < div className = "shrink-0 text-white font-bold text-xl" > 장소</ div >
83+ < div className = "flex-1" >
84+ < p className = "font-bold" > 신한 스퀘어브릿지 인천</ p >
85+ < p className = "text-white text-[12px]" > (인천 연수구 컨벤시아대로 204 인스타2)</ p >
86+ </ div >
87+ </ div >
88+ </ div >
89+
90+ { /* 지도 */ }
91+ < HomecomingMap > </ HomecomingMap >
92+ </ div >
93+
94+ { /* 하단 장식 */ }
95+ < div className = "flex justify-around items-center self-center relative h-2 w-[326px]" >
96+ < div className = "absolute right-0 h-2 w-[166px] rounded-full bg-cyellow" />
97+ < div className = "absolute left-0 h-2 w-[166px] rounded-full bg-cgreen" />
98+ </ div >
99+ </ div >
100+ </ div > ) ;
101+ }
102+
103+
104+ function HomecomingMap ( ) {
105+ const { isLoaded, loadError} = useJsApiLoader ( {
106+ googleMapsApiKey : process . env . NEXT_PUBLIC_GOOGLE_MAPS_API_KEY , id : 'homecoming-map-script' ,
107+ } ) ;
108+
109+ const center = { lat : 37.388493 , lng : 126.639989 } ;
110+
111+ if ( loadError ) {
112+ return ( < div
113+ className = "rounded-2xl border border-red-300 bg-red-50 text-red-700 text-xs md:text-sm flex items-center justify-center h-[220px] md:h-[320px] lg:h-[420px]" >
114+ 지도를 불러오는 중 오류가 발생했습니다.
115+ </ div > ) ;
116+ }
117+
118+ if ( ! isLoaded ) {
119+ return ( < div
120+ className = "rounded-2xl border border-neutral-200 bg-neutral-100 text-neutral-500 text-xs md:text-sm flex items-center justify-center h-[220px] md:h-[320px] lg:h-[420px]" >
121+ 지도를 불러오는 중입니다...
122+ </ div > ) ;
123+ }
124+
125+ return ( < div className = "mt-6 rounded-2xl h-[170px] overflow-hidden" >
126+ < GoogleMap
127+ mapContainerClassName = "w-full h-full"
128+ center = { center }
129+ zoom = { 17 }
130+ options = { { disableDefaultUI : true , clickableIcons : false } }
131+ >
132+ < Marker position = { center } />
133+ </ GoogleMap >
134+ </ div > ) ;
135+ }
0 commit comments