@@ -22,6 +22,7 @@ import useMyActivityForm from '@/hooks/useMyActivityForm';
2222import ImageUploadSection from './ImageUploadSection' ;
2323import Script from 'next/script' ;
2424import { isBefore , parse } from 'date-fns' ;
25+ import RoundButton from './RoundButton' ;
2526
2627interface MyActivityFormProps {
2728 mode ?: 'EDIT' | 'REGISTER' ;
@@ -38,8 +39,8 @@ const MyActivityForm = ({ mode = 'REGISTER', activityId }: MyActivityFormProps)
3839 setValue,
3940 trigger,
4041 update,
42+ append,
4143 remove,
42- insert,
4344 detailData,
4445 isDetailLoading,
4546 isDetailFetching,
@@ -107,8 +108,7 @@ const MyActivityForm = ({ mode = 'REGISTER', activityId }: MyActivityFormProps)
107108 endTime : '' ,
108109 } ;
109110
110- const schedulesToReset =
111- detailSchedules . length > 0 ? [ emptyFirstRow , ...detailSchedules ] : [ emptyFirstRow ] ;
111+ const schedulesToReset = detailSchedules . length > 0 ? [ ...detailSchedules ] : [ emptyFirstRow ] ;
112112
113113 const formData : MyActivityFormData = {
114114 ...detailData ,
@@ -126,7 +126,7 @@ const MyActivityForm = ({ mode = 'REGISTER', activityId }: MyActivityFormProps)
126126 } , [ detailData , isDetailLoading , isDetailFetching , mode ] ) ;
127127
128128 return (
129- < div className = 'flex flex-col' >
129+ < div className = 'flex-1 flex flex-col' >
130130 < FormProvider { ...methods } >
131131 < form onSubmit = { methods . handleSubmit ( onSubmit , onError ) } >
132132 < div className = 'flex flex-col gap-6' >
@@ -252,15 +252,37 @@ const MyActivityForm = ({ mode = 'REGISTER', activityId }: MyActivityFormProps)
252252 { /* 예약 가능한 시간대 */ }
253253 < div className = 'mt-7.5' >
254254 < Label > 예약 가능한 시간대</ Label >
255+ < div className = 'flex justify-between items-center py-3 mb-6 border-b border-grayscale-100 tablet:max-w-none tablet:w-full' >
256+ < div className = 'flex flex-1 tablet:gap-3.5' >
257+ < div className = 'w-full tablet:w-[343px] flex-shrink-0' >
258+ < Label className = 'gap-0' > 날짜</ Label >
259+ </ div >
260+ < div className = 'hidden tablet:flex flex-1' >
261+ < div className = 'flex-1 min-w-0' >
262+ < Label className = 'gap-0' > 시작시간</ Label >
263+ </ div >
264+ < div className = 'flex-1 min-w-0' >
265+ < Label className = 'gap-0' > 종료시간</ Label >
266+ </ div >
267+ </ div >
268+ </ div >
269+
270+ < div className = 'flex-shrink-0' >
271+ < RoundButton
272+ mode = { 'plus' }
273+ onClick = { ( ) => {
274+ append ( {
275+ id : crypto . randomUUID ( ) ,
276+ date : '' ,
277+ startTime : '' ,
278+ endTime : '' ,
279+ } ) ;
280+ } }
281+ />
282+ </ div >
283+ </ div >
255284 { scheduleFields . map ( ( scheduleField , index ) => (
256- < div
257- key = { scheduleField . id }
258- className = { clsx (
259- 'w-full' ,
260- index === 0 ? 'pt-4' : '' ,
261- index === 1 ? 'pt-5 border-t border-grayscale-100' : '' ,
262- ) }
263- >
285+ < div key = { scheduleField . id } className = { clsx ( 'w-full pb-2.5' ) } >
264286 < DateTimeRow
265287 key = { scheduleField . id }
266288 data = { scheduleField }
@@ -271,15 +293,13 @@ const MyActivityForm = ({ mode = 'REGISTER', activityId }: MyActivityFormProps)
271293 onBlur = { ( ) => {
272294 trigger ( `schedules.${ index } ` ) ;
273295 } }
274- onAdd = { ( ) =>
275- insert ( 0 , {
276- id : crypto . randomUUID ( ) ,
277- date : '' ,
278- startTime : '' ,
279- endTime : '' ,
280- } )
281- }
282- onRemove = { ( ) => remove ( index ) }
296+ onRemove = { ( ) => {
297+ remove ( index ) ;
298+ // 최소 한 행 유지
299+ if ( scheduleFields . length === 1 ) {
300+ append ( { id : crypto . randomUUID ( ) , date : '' , startTime : '' , endTime : '' } ) ;
301+ }
302+ } }
283303 isFirstRow = { index === 0 }
284304 errors = {
285305 errors ?. schedules ?. [ index ] as Merge <
0 commit comments