1+ Module . register ( "register" , {
2+ defaults : {
3+ title : "자서전 인터뷰 장비 등록하기" ,
4+ description : "인터뷰 장비의 serial ID를 입력해 주세요."
5+ } ,
6+
7+ /** post api 와 page 이동 함수 **/
8+ postData ( data ) {
9+ this . sendNotification ( "PAGE_CHANGED" , 1 ) ; // 200일 때 페이지 이동
10+ } ,
11+
12+ /** dom, style - bottom sheet control을 위해 dom 사용 **/
13+ getDom ( ) {
14+ const wrapper = document . createElement ( "div" ) ;
15+ wrapper . classList . add ( "wrapper" ) ;
16+
17+ // 타이틀, 설명
18+ const title = document . createElement ( "h1" ) ;
19+ title . textContent = this . config . title ;
20+ wrapper . appendChild ( title ) ;
21+
22+ const desc = document . createElement ( "p" ) ;
23+ desc . textContent = this . config . description ;
24+ wrapper . appendChild ( desc ) ;
25+
26+ // 입력 필드
27+ const serial_input = document . createElement ( "input" ) ;
28+ serial_input . placeholder = "Serial ID" ;
29+ wrapper . appendChild ( serial_input ) ;
30+
31+ const buttonContainer = document . createElement ( "div" ) ;
32+ buttonContainer . classList . add ( "flex-row" ) ;
33+ buttonContainer . addEventListener ( "click" , ( ) => this . showBottomSheet ( ) )
34+
35+ const information_text = document . createElement ( "p" ) ;
36+ information_text . textContent = "Serial ID를 어디서 확인하나요 ?" ;
37+
38+ // 등록하기 버튼 (아이콘 이미지)
39+ const information_icon = document . createElement ( "img" ) ;
40+ information_icon . src = "modules/default/register/assets/info_icon.svg" ; // 외부 SVG 경로
41+ information_icon . alt = "info icon" ;
42+ information_icon . classList . add ( "info_icon" ) ;
43+
44+ // 버튼 컨테이너에 요소 추가
45+ buttonContainer . appendChild ( information_text ) ;
46+ buttonContainer . appendChild ( information_icon ) ;
47+
48+ // 버튼 컨테이너를 wrapper에 추가
49+ wrapper . appendChild ( buttonContainer ) ;
50+
51+ // 등록하기 버튼
52+ const submit_btn = document . createElement ( "button" ) ;
53+ submit_btn . textContent = "등록하기" ;
54+ submit_btn . addEventListener ( "click" , ( ) => {
55+ const serialId = serial_input . value ; // input 필드 값 가져오기
56+ if ( serialId ) {
57+ const data = { serialId } ; // 보낼 데이터 구성
58+ this . postData ( data ) ; // POST 호출
59+ this . sendNotification ( "REGISTER_SUBMIT" , data ) ; // 알림 전송 (원하면)
60+ this . showBottomSheet ( ) ; // 바텀시트 보여주기 (원하면)
61+ } else {
62+ alert ( "Serial ID를 입력해주세요!" ) ;
63+ }
64+ } ) ;
65+ wrapper . appendChild ( submit_btn ) ;
66+
67+ // Bottom Sheet 생성 (처음에는 hidden)
68+ const sheet = document . createElement ( "div" ) ;
69+ sheet . className = "bottom-sheet hidden" ;
70+ sheet . innerHTML = `
71+ <h1 id="sheet-title">Serial ID 확인하기</h1>
72+ <div class="sheet-info-box">
73+ <p id="sheet-step">1/2</p>
74+ <p id="sheet-content">아래와 같이 기기의 블루투스를 연결해주세요.</p>
75+ </div>
76+ <video id="sheet-video" src="modules/default/register/video/example_video1.mp4" width="100%" autoplay loop muted></video>
77+ <button id="sheet-button">다음</button>
78+ ` ;
79+ wrapper . appendChild ( sheet ) ;
80+ this . sheetElement = sheet ;
81+
82+ // Overlay 생성 (처음에는 hidden)
83+ const overlay = document . createElement ( "div" ) ;
84+ overlay . className = "bottom-sheet-overlay hidden" ;
85+ wrapper . appendChild ( overlay ) ;
86+
87+ // overlay 클릭 시 닫기
88+ overlay . addEventListener ( "click" , ( ) => {
89+ this . hideBottomSheet ( ) ;
90+ } ) ;
91+
92+ return wrapper ;
93+ } ,
94+
95+ getStyles ( ) {
96+ return [ "register.css" ] ;
97+ } ,
98+
99+ /** bottom sheet 영역 **/
100+ showBottomSheet ( ) {
101+ const sheet = document . querySelector ( ".bottom-sheet" ) ;
102+ const overlay = document . querySelector ( ".bottom-sheet-overlay" ) ;
103+ if ( sheet && overlay ) {
104+ sheet . classList . remove ( "hidden" ) ;
105+ sheet . classList . add ( "show" ) ;
106+ overlay . classList . remove ( "hidden" ) ;
107+ overlay . classList . add ( "show" ) ;
108+
109+ const video = sheet . querySelector ( "#sheet-video" ) ;
110+ const step_t = sheet . querySelector ( "#sheet-step" ) ;
111+ const content = sheet . querySelector ( "#sheet-content" ) ;
112+ const nextBtn = sheet . querySelector ( "#sheet-button" ) ;
113+
114+ const handleClick = ( ) => {
115+ if ( nextBtn . textContent === "닫기" ) {
116+ this . hideBottomSheet ( ) ;
117+ nextBtn . removeEventListener ( "click" , handleClick ) ; // 이벤트 중복 방지
118+
119+ // 초기화
120+ step_t . textContent = "1/2" ;
121+ content . textContent = "아래와 같이 기기의 블루투스를 연결해주세요." ;
122+ video . src = "modules/default/register/video/example_video1.mp4" ;
123+ video . load ( ) ; // 비디오 소스 변경 후 로드
124+ video . play ( ) ;
125+ nextBtn . textContent = "다음" ;
126+ } else {
127+ step_t . textContent = "2/2" ;
128+ content . textContent = "아래와 같이 화면애 뜬 Serail ID를 확인해주세요." ;
129+ video . src = "modules/default/register/video/example_video2.mp4" ;
130+ video . load ( ) ; // 비디오 소스 변경 후 로드
131+ video . play ( ) ;
132+ nextBtn . textContent = "닫기" ;
133+ }
134+ } ;
135+
136+ nextBtn . addEventListener ( "click" , handleClick ) ;
137+ }
138+ } ,
139+
140+ hideBottomSheet ( ) {
141+ const sheet = document . querySelector ( ".bottom-sheet" ) ;
142+ const overlay = document . querySelector ( ".bottom-sheet-overlay" ) ;
143+ if ( sheet && overlay ) {
144+ sheet . classList . remove ( "show" ) ;
145+ sheet . classList . add ( "hidden" ) ;
146+ overlay . classList . remove ( "show" ) ;
147+ overlay . classList . add ( "hidden" ) ;
148+ }
149+ } ,
150+ } ) ;
0 commit comments