diff --git a/src/components/common/BottomSheet/BottomSheet.tsx b/src/components/common/BottomSheet/BottomSheet.tsx new file mode 100644 index 00000000..da0295c4 --- /dev/null +++ b/src/components/common/BottomSheet/BottomSheet.tsx @@ -0,0 +1,51 @@ +import { HTMLAttributes, PropsWithChildren, ReactNode } from 'react'; + +import styled from 'styled-components'; + +interface BottomSheetProps extends PropsWithChildren> { + children?: ReactNode; + isOpen: boolean; + onClose?: () => void; +} + +function BottomSheet({ children, isOpen }: BottomSheetProps) { + return ( + <> + {children} + + + ); +} + +export default BottomSheet; + +const BottomSheetModal = styled.div<{ $isModalOpen: boolean }>` + display: flex; + position: fixed; + bottom: 0; + transform: translateY(${({ $isModalOpen }) => ($isModalOpen ? 0 : '100%')}); + flex-direction: column; + gap: 0.8rem; + transition: transform 600ms cubic-bezier(0.86, 0, 0.07, 1); + z-index: 1; + border-top-left-radius: 1.2rem; + border-top-right-radius: 1.2rem; + background-color: ${({ theme }) => theme.colors.grey8}; + + padding: 4.4rem 2rem 4rem; + width: 37.5rem; + + & button { + width: 100%; + } +`; + +const ModalOverlay = styled.div<{ $isModalOpen: boolean }>` + display: ${({ $isModalOpen }) => ($isModalOpen ? 'block' : 'none')}; + position: fixed; + top: 0; + + background-color: ${({ theme }) => theme.colors.black60}; + width: 100%; + height: 100%; +`; diff --git a/src/pages/createMeeting/components/useFunnel/SetAdditionalInfo.tsx b/src/pages/createMeeting/components/useFunnel/SetAdditionalInfo.tsx index 99be77d6..bebeab4d 100644 --- a/src/pages/createMeeting/components/useFunnel/SetAdditionalInfo.tsx +++ b/src/pages/createMeeting/components/useFunnel/SetAdditionalInfo.tsx @@ -1,16 +1,22 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { isAxiosError } from 'axios'; import Button from 'components/common/atomComponents/Button'; import Text from 'components/common/atomComponents/Text'; import TextAreaInput from 'components/common/atomComponents/TextAreaInput'; +import BottomSheet from 'components/common/BottomSheet/BottomSheet'; +import useModalState from 'components/common/Modal/hooks/useModalState'; +import { durationType, placeType, weekDayType } from 'pages/createMeeting/data/meetingInfoData'; import { FunnelProps, MeetingInfo } from 'pages/createMeeting/types/useFunnelInterface'; import { useNavigate } from 'react-router-dom'; import styled from 'styled-components'; +import { theme } from 'styles/theme'; import { createMeetingApi } from 'utils/apis/legacy/createMeetingApi'; function SetAdditionalInfo({ meetingInfo, setMeetingInfo }: FunnelProps) { const navigate = useNavigate(); + const { isOpen, onOpen, onClose } = useModalState(false); + const textAreaOnChange = (e: React.ChangeEvent) => { if (e.target.value.length < 51) { setMeetingInfo((prev: MeetingInfo) => { @@ -41,22 +47,95 @@ function SetAdditionalInfo({ meetingInfo, setMeetingInfo }: FunnelProps) { } }; + const formatDate = (dateString: string) => { + const [, month, day, dayOfWeek] = dateString.split('/'); + const formattedMonth = parseInt(month, 10); + const formattedDay = parseInt(day, 10); + return `${formattedMonth}/${formattedDay} (${weekDayType[dayOfWeek]})`; + }; + + const parseAvailableDates = (availableDates: string[]) => { + const sortedDates = availableDates.sort(); + const [firstDate, lastDate] = [sortedDates[0], sortedDates[sortedDates.length - 1]]; + + return `${formatDate(firstDate)} ~ ${formatDate(lastDate)}`; + }; + return ( - - - - + + + + + + 회의방을 생성하시겠어요? + + + 입력한 회의 정보가 맞는지 확인해주세요 + + + + + + {meetingInfo.title} + + + + + + {placeType[meetingInfo.place]} + + + + + + {parseAvailableDates(meetingInfo.availableDates)} + + + + + + {durationType.find((item) => item.enum === meetingInfo.duration)?.time || ''} + + + + + + + + {'방장'.padEnd(5, 'ㅤ')} + {meetingInfo.name} + + + {'비밀번호'.padEnd(5, 'ㅤ')} + {meetingInfo.password} + + + + + + - - + + ); } @@ -73,3 +152,106 @@ const StyledBtnWrapper = styled.section` bottom: 1.2rem; border-radius: 50%; `; + +const BottomSheetDescription = styled.div` + display: flex; + flex-direction: column; + gap: 0.8rem; + margin-bottom: 2.4rem; +`; + +const BottomSheetContents = styled.div` +display:flex; +flex-direction:column; +gap:1.2rem; + margin-bottom:28px; + ` + +const MeetingInfoWrapper = styled.div` + width: 100%; + display: flex; + flex-direction: column; + gap: 1.2rem; + padding: 1.8rem 2.4rem; + background-color:${theme.colors.grey7}; + border-radius:0.8rem; + justify-content: center; + +`; + +const MeetingInfoDetail = styled.ul` + display: flex; + flex-direction: column; + gap: 4px; + justify-content: center; + padding:0; +`; + +const MeetingInfoLine = styled.li` + display: flex; + align-items: center; + gap: 0.8rem; +`; + +const HostInfoDetail = styled.ul` +display:flex; +flex-direction:column; +gap:4px; +justify-content:center; +padding:0; +` + +const HostInfoLine = styled.li` + display: flex; + align-items: center; + gap: 0.8rem; +` + +const PlaceIcon = () => { + return ( + + + + ); +}; + +const DateIcon = () => { + return ( + + + + + + ); +}; + +const TimeIcon = () => { + return ( + + + + ); +}; diff --git a/src/pages/createMeeting/components/useFunnel/SetPlace.tsx b/src/pages/createMeeting/components/useFunnel/SetPlace.tsx index 68795954..948b0136 100644 --- a/src/pages/createMeeting/components/useFunnel/SetPlace.tsx +++ b/src/pages/createMeeting/components/useFunnel/SetPlace.tsx @@ -12,7 +12,7 @@ function SetPlace({ meetingInfo, setMeetingInfo, setStep }: FunnelProps) { return ( - {placeType.map((type, i) => { + {Object.keys(placeType).map((type, i) => { return ( - - + + - - - - + + @@ -113,41 +114,11 @@ const StyledBtnSection = styled.section` `; -const BottomSheetModal = styled.div<{$isModalOpen:boolean;}>` - display:flex; - position:fixed; - bottom:${({$isModalOpen})=>$isModalOpen?0:-27.5}rem; - flex-direction:column; - gap:0.8rem; - transition: bottom 600ms cubic-bezier(0.86, 0, 0.07, 1); - z-index:1; - border-top-left-radius: 1.2rem; - border-top-right-radius: 1.2rem; - background-color: ${({ theme }) => theme.colors.grey8}; - - padding: 2.8rem 2rem 4rem; - width:37.5rem; - - & button { - width:100%; - } - -` - -const ModalOverlay = styled.div<{$isModalOpen:boolean;}>` - display:${({$isModalOpen})=>($isModalOpen?'block':'none')}; - position:fixed; - top: 0; - - background-color:${({theme})=>theme.colors.black60}; - width:100%; - height:100%; -` const BottomSheetDescription = styled.div` - display:flex; - flex-direction:column; - gap:0.8rem; - margin-bottom:2.4rem; - padding-left:0.9rem; -` \ No newline at end of file + display: flex; + flex-direction: column; + gap: 0.8rem; + margin-bottom: 2.4rem; + padding-left: 0.9rem; +`;