-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[FEAT] 메인 세팅 모달 퍼블리싱 #334
[FEAT] 메인 세팅 모달 퍼블리싱 #334
Changes from all commits
0f2ed7b
e202e2f
62894d6
1f20cb5
a528db0
cd44877
4e86969
25686ab
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,98 @@ | ||||||||||||||||||||||
import styled from '@emotion/styled'; | ||||||||||||||||||||||
import { useState } from 'react'; | ||||||||||||||||||||||
|
||||||||||||||||||||||
import Button from '@/components/common/v2/button/Button'; | ||||||||||||||||||||||
import DropdownButton from '@/components/common/v2/control/DropdownButton'; | ||||||||||||||||||||||
import IconButton from '@/components/common/v2/IconButton'; | ||||||||||||||||||||||
import DeadlineBox from '@/components/common/v2/popup/DeadlineBox'; | ||||||||||||||||||||||
import PopUp from '@/components/common/v2/TextBox/PopUp'; | ||||||||||||||||||||||
import { StatusType } from '@/types/tasks/taskType'; | ||||||||||||||||||||||
|
||||||||||||||||||||||
function MainSettingModal() { | ||||||||||||||||||||||
const [status, setStatus] = useState<StatusType>('미완료'); | ||||||||||||||||||||||
|
||||||||||||||||||||||
const handleStatusChange = (newStatus: StatusType) => { | ||||||||||||||||||||||
setStatus(newStatus); | ||||||||||||||||||||||
}; | ||||||||||||||||||||||
|
||||||||||||||||||||||
return ( | ||||||||||||||||||||||
<MainSettingModalLayout> | ||||||||||||||||||||||
<MainSettingModalHeadLayout> | ||||||||||||||||||||||
<ModalTopButtonBox> | ||||||||||||||||||||||
<DropdownButton status={status} handleStatusChange={handleStatusChange} /> | ||||||||||||||||||||||
<ButtonBox> | ||||||||||||||||||||||
<IconButton iconName="IcnDelete" type="normal" size="small" disabled /> | ||||||||||||||||||||||
<IconButton iconName="IcnX" type="normal" size="small" disabled /> | ||||||||||||||||||||||
</ButtonBox> | ||||||||||||||||||||||
</ModalTopButtonBox> | ||||||||||||||||||||||
<PopUp type="title" /> | ||||||||||||||||||||||
</MainSettingModalHeadLayout> | ||||||||||||||||||||||
<MainSettingModalBodyLayout> | ||||||||||||||||||||||
<DeadlineBox date={new Date()} endTime="06:00pm" label="마감 기간" /> | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 리턴문 위에서 변수 지정해 Date 담아두고 사용하면 렌더링할 때마다 데이트 오브젝트가 새로 생기지 않게 할 수 있을 것 같아요!! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 해당 date를 전달한 곳은 임시로 데이터를 넘겨주는 부분이라서 기능 붙이면서 수정하도록 하겠습니다!! |
||||||||||||||||||||||
<PopUpTitleBox> | ||||||||||||||||||||||
<PopUp type="description" /> | ||||||||||||||||||||||
</PopUpTitleBox> | ||||||||||||||||||||||
<DeadlineBox date={new Date()} startTime="11:00am" endTime="06:00pm" label="진행 기간" /> | ||||||||||||||||||||||
Comment on lines
+31
to
+35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
시간 수정할 때 정렬이 살짝 이상해서 봤더니 사이에 띄어쓰기가 업서요 수정해주세요!! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 여기 나중에 데이터 임시로 넣어둔 부분이라서 나중에 데이터 넣으면서 수정하도록 하겠습니다! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||||||||
</MainSettingModalBodyLayout> | ||||||||||||||||||||||
<MainSettingModalButtonLayout> | ||||||||||||||||||||||
<Button type="solid" size="medium" label="확인" /> | ||||||||||||||||||||||
</MainSettingModalButtonLayout> | ||||||||||||||||||||||
</MainSettingModalLayout> | ||||||||||||||||||||||
); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
const MainSettingModalLayout = styled.article` | ||||||||||||||||||||||
display: flex; | ||||||||||||||||||||||
flex-direction: column; | ||||||||||||||||||||||
gap: 2.4rem; | ||||||||||||||||||||||
box-sizing: border-box; | ||||||||||||||||||||||
width: 41.6rem; | ||||||||||||||||||||||
height: auto; | ||||||||||||||||||||||
padding: 2.4rem 2.4rem 3.2rem; | ||||||||||||||||||||||
|
||||||||||||||||||||||
background-color: ${({ theme }) => theme.colorToken.Neutral.normal}; | ||||||||||||||||||||||
box-shadow: | ||||||||||||||||||||||
4px 4px 40px 20px #717e9833, | ||||||||||||||||||||||
-4px -4px 40px 0 #717e9833; | ||||||||||||||||||||||
border-radius: 20px; | ||||||||||||||||||||||
`; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const MainSettingModalHeadLayout = styled.section` | ||||||||||||||||||||||
display: flex; | ||||||||||||||||||||||
flex-direction: column; | ||||||||||||||||||||||
gap: 3.2rem; | ||||||||||||||||||||||
width: 100%; | ||||||||||||||||||||||
height: 9.2rem; | ||||||||||||||||||||||
`; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const MainSettingModalBodyLayout = styled.section` | ||||||||||||||||||||||
display: flex; | ||||||||||||||||||||||
flex-direction: column; | ||||||||||||||||||||||
width: 100%; | ||||||||||||||||||||||
`; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const ModalTopButtonBox = styled.div` | ||||||||||||||||||||||
display: flex; | ||||||||||||||||||||||
justify-content: space-between; | ||||||||||||||||||||||
`; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const ButtonBox = styled.div` | ||||||||||||||||||||||
display: flex; | ||||||||||||||||||||||
gap: 0.8rem; | ||||||||||||||||||||||
`; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const PopUpTitleBox = styled.div` | ||||||||||||||||||||||
display: flex; | ||||||||||||||||||||||
align-items: center; | ||||||||||||||||||||||
width: 100%; | ||||||||||||||||||||||
height: 5.9rem; | ||||||||||||||||||||||
`; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const MainSettingModalButtonLayout = styled.div` | ||||||||||||||||||||||
display: flex; | ||||||||||||||||||||||
justify-content: flex-end; | ||||||||||||||||||||||
width: 100%; | ||||||||||||||||||||||
height: 3.2rem; | ||||||||||||||||||||||
`; | ||||||||||||||||||||||
|
||||||||||||||||||||||
export default MainSettingModal; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
import styled from '@emotion/styled'; | ||
import { useState } from 'react'; | ||
|
||
import DateCorrectionModal from '@/components/common/datePicker/DateCorrectionModal'; | ||
import Icon from '@/components/common/Icon'; | ||
import formatDateWithDay from '@/utils/formatDateWithDay'; | ||
|
||
interface DateBtnProps { | ||
isAllday: boolean; | ||
isSetDate: boolean; | ||
startTime?: string; | ||
endTime: string; | ||
date: Date; | ||
handleDate: (newDate: Date) => void; | ||
} | ||
|
||
function DateBtn({ isAllday, isSetDate, startTime, endTime, date, handleDate }: DateBtnProps) { | ||
const [isOpen, setIsOpen] = useState(false); | ||
|
||
const renderTimeText = () => { | ||
if (isAllday) return null; | ||
if (startTime && endTime) { | ||
return `${startTime}-${endTime}`; | ||
} | ||
if (endTime) { | ||
return `${endTime} 까지`; | ||
} | ||
return null; | ||
}; | ||
|
||
const onClickDateBtn = () => { | ||
if (!isSetDate) setIsOpen((prev) => !prev); | ||
}; | ||
|
||
const handleModalClose = () => { | ||
setIsOpen(false); | ||
}; | ||
|
||
const handleCurrentDate = (newDate: Date) => { | ||
handleDate(newDate); | ||
setIsOpen(false); | ||
}; | ||
|
||
const handleBlur = (event: React.FocusEvent<HTMLDivElement>) => { | ||
if (!event.currentTarget.contains(event.relatedTarget)) { | ||
setIsOpen(false); | ||
} | ||
}; | ||
|
||
return ( | ||
<DateWrapper onBlur={handleBlur} tabIndex={-1}> | ||
<DateBtnLayout onClick={onClickDateBtn} isActive={isOpen}> | ||
<Icon name={isSetDate ? 'IcnModify' : 'IcnCalendar'} size="tiny" color="nomal" /> | ||
<TextBox> | ||
{formatDateWithDay(date)} {isSetDate && renderTimeText()} | ||
</TextBox> | ||
</DateBtnLayout> | ||
{isOpen && ( | ||
<DropdownStyle tabIndex={-1}> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 온블러 굳굳 👍 |
||
<DateCorrectionModal | ||
date={formatDateWithDay(date)} | ||
onClick={handleModalClose} | ||
handleCurrentDate={handleCurrentDate} | ||
top={0.8} | ||
/> | ||
</DropdownStyle> | ||
)} | ||
</DateWrapper> | ||
); | ||
} | ||
|
||
const DateWrapper = styled.div` | ||
position: relative; | ||
`; | ||
|
||
const DateBtnLayout = styled.button<{ isActive: boolean }>` | ||
display: flex; | ||
gap: 0.8rem; | ||
align-items: center; | ||
justify-content: center; | ||
width: auto; | ||
height: 3.2rem; | ||
padding: 0 1.6rem; | ||
|
||
background-color: ${({ theme, isActive }) => (isActive ? theme.color.Grey.Grey3 : theme.colorToken.Neutral.normal)}; | ||
border: 1px solid ${({ theme }) => theme.colorToken.Outline.neutralNormal}; | ||
border-radius: 8px; | ||
|
||
:hover { | ||
background-color: ${({ theme, isActive }) => (isActive ? theme.color.Grey.Grey3 : theme.color.Grey.Grey2)}; | ||
} | ||
`; | ||
|
||
const TextBox = styled.p` | ||
width: auto; | ||
height: 1.4rem; | ||
|
||
color: ${({ theme }) => theme.colorToken.Text.assistive}; | ||
${({ theme }) => theme.font.label05}; | ||
font-weight: 500; | ||
`; | ||
|
||
const DropdownStyle = styled.div` | ||
position: absolute; | ||
z-index: 3; | ||
`; | ||
|
||
export default DateBtn; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
헉 ㅋㅋ 👍 👍