@@ -2,6 +2,7 @@ import { useMemo } from 'react';
22import { Navigate , useLocation } from 'react-router-dom' ;
33import ClipLoader from 'react-spinners/ClipLoader' ;
44
5+ import type { IQuestion } from '@/types/dateCourse/dateCourse' ;
56import { DateCourseQuestion } from '@/constants/dateCourseQuestion' ;
67
78import {
@@ -64,6 +65,13 @@ function computeErrors(f: { budget: any; dateDurationTime: any; mealTypes?: any[
6465
6566 return e ;
6667}
68+ const TOTAL_QUESTIONS = 8 ;
69+ const Questions : IQuestion [ ] = Array . isArray ( DateCourseQuestion )
70+ ? DateCourseQuestion . slice ( 0 , TOTAL_QUESTIONS - 1 ) . map ( ( q ) => ( {
71+ ...q ,
72+ type : q . type as IQuestion [ 'type' ] ,
73+ } ) )
74+ : [ ] ;
6775
6876export default function DateCourseSearchFilterModal ( { onClose } : TProps ) {
6977 const location = useLocation ( ) ;
@@ -89,36 +97,41 @@ export default function DateCourseSearchFilterModal({ onClose }: TProps) {
8997
9098 const data = isBookmarked ? bookmarkedData : courseData ;
9199
92- const Questions = useMemo (
93- ( ) =>
94- ( Array . isArray ( DateCourseQuestion ) ? DateCourseQuestion . slice ( 0 , 7 ) : [ ] )
95- . map ( ( q ) => ( {
96- ...q ,
97- type : q . type as 'choice' | 'search' | 'time' | 'choices' | 'keyword' ,
98- } ) )
99- . filter ( ( q ) => q . filterTitle !== '' ) ,
100- [ ] ,
101- ) ;
100+ const stepFieldMap = {
101+ 0 : 'budget' ,
102+ 1 : 'datePlaces' ,
103+ 2 : 'dateDurationTime' ,
104+ 3 : 'mealTypes' ,
105+ 4 : 'transportation' ,
106+ 5 : 'userPreferredKeywords' ,
107+ 6 : 'startTime' ,
108+ } as const ;
109+
110+ const fieldValues = {
111+ budget,
112+ datePlaces,
113+ dateDurationTime,
114+ mealTypes,
115+ transportation,
116+ userPreferredKeywords,
117+ startTime,
118+ } ;
119+
120+ const valueByStep = ( idx : number ) : string | string [ ] | null => {
121+ const step = idx ; // ★ 중요
122+ const fieldName = stepFieldMap [ step as keyof typeof stepFieldMap ] ;
123+ return fieldName ? fieldValues [ fieldName ] : null ;
124+ } ;
102125
103- const valueByIndex = ( idx : number ) => {
104- switch ( idx ) {
105- case 0 :
106- return budget ;
107- case 1 :
108- return datePlaces ;
109- case 2 :
110- return dateDurationTime ;
111- case 3 :
112- return mealTypes ;
113- case 4 :
114- return transportation ;
115- case 5 :
116- return startTime ;
117- case 6 :
118- return userPreferredKeywords ;
119- default :
120- return null ;
126+ const updateByStep = ( idx : number , v : any ) => {
127+ const step = idx ; // ★ 중요
128+ const fieldName = stepFieldMap [ step as keyof typeof stepFieldMap ] ;
129+ if ( ! fieldName ) return ;
130+
131+ if ( [ 1 , 3 , 5 ] . includes ( step ) && ! Array . isArray ( v ) ) {
132+ v = [ ] ;
121133 }
134+ setField ( fieldName , v ?? null ) ;
122135 } ;
123136
124137 const errorMessages = useMemo (
@@ -133,35 +146,6 @@ export default function DateCourseSearchFilterModal({ onClose }: TProps) {
133146 [ budget , dateDurationTime , mealTypes , userPreferredKeywords , startTime ] ,
134147 ) ;
135148
136- const updateByIndex = ( idx : number , raw : any ) => {
137- let v = raw ;
138- if ( [ 1 , 3 , 6 ] . includes ( idx ) && ! Array . isArray ( v ) ) v = [ ] ;
139-
140- switch ( idx ) {
141- case 0 :
142- setField ( 'budget' , v ?? null ) ;
143- break ;
144- case 1 :
145- setField ( 'datePlaces' , v ) ;
146- break ;
147- case 2 :
148- setField ( 'dateDurationTime' , v ?? null ) ;
149- break ;
150- case 3 :
151- setField ( 'mealTypes' , v ) ;
152- break ;
153- case 4 :
154- setField ( 'transportation' , v ?? null ) ;
155- break ;
156- case 5 :
157- setField ( 'startTime' , v ?? null ) ;
158- break ;
159- case 6 :
160- setField ( 'userPreferredKeywords' , v ) ;
161- break ;
162- }
163- } ;
164-
165149 if ( bookmarkDataError || courseDataError ) {
166150 return < Navigate to = "/error" replace = { true } /> ;
167151 }
@@ -172,14 +156,15 @@ export default function DateCourseSearchFilterModal({ onClose }: TProps) {
172156 { Questions . map ( ( q , idx ) => (
173157 < DateCourseSearchFilterOption
174158 key = { q . id }
175- title = { q . filterTitle }
159+ title = { q . title }
176160 subTitle = { q . subTitle }
177161 options = { q . options }
178- value = { valueByIndex ( idx ) }
179- onChange = { ( v ) => updateByIndex ( idx , v ) }
162+ value = { valueByStep ( idx ) }
163+ onChange = { ( v ) => updateByStep ( idx , v ) }
180164 type = { q . type }
181165 apiRequestValue = { q . apiRequestValue }
182166 errorMessage = { errorMessages [ idx ] ?? '' }
167+ autoInit = { q . type === 'time' && idx === 7 }
183168 />
184169 ) ) }
185170
0 commit comments