Skip to content

Commit 0b131b9

Browse files
authored
Merge pull request #218 from AngelaChaejung/Refactor-ScheduleAdd
Refactor 1. custom hook 추가 (scheduleAdd component) 2. 모달 열기방식 수정(테스트로 kebob modal만 작업)
2 parents fa91609 + 8f0c056 commit 0b131b9

File tree

6 files changed

+101
-110
lines changed

6 files changed

+101
-110
lines changed

src/components/Schedule/ScheduleDetail.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const ScheduleDetail = () => {
4545
{/* 케밥모달이 열리면 bottomNavi는 사라집니다 */}
4646
{modalOpen ? false : <BottomNavi />}
4747
</div>
48-
{modalOpen && <KebabModal setModalOpen={setModalOpen} id={id} />}
48+
{<KebabModal modalOpen={modalOpen} setModalOpen={setModalOpen} id={id} />}
4949
<div
5050
className={`h-[202px] bg-${schedule.cardColor} pl-[18px] w-[375px] pt-[23px] pr-[21px] text-white align-
5151
`}

src/components/login/EmailLogin.jsx

+6-15
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ const EmailLogin = () => {
3636
});
3737

3838
//이메일, 비밀번호 정규 표현식
39-
const emailRegulationExp =
40-
/^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
39+
const emailRegulationExp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
4140
const passwordRegulationExp = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16}$/;
4241

4342
//유효성검사
@@ -136,11 +135,7 @@ const EmailLogin = () => {
136135
<div className="grid grid-rows pt-[100px]">
137136
<div className="h-[150px]">
138137
<div className="mx-auto w-[150px] h-[64px] overflow-hidden gap-[10px] ">
139-
<img
140-
src={gnimsLogo}
141-
alt="곰캐릭터가 우쭐거리며 왠지 잘될 것 같은 기분포즈 중"
142-
className="w-full h-full "
143-
/>
138+
<img src={gnimsLogo} alt="" className="w-full h-full " />
144139
</div>
145140
</div>
146141
<form className="mt-[-40px]">
@@ -187,7 +182,7 @@ const EmailLogin = () => {
187182
hidden={regulation.regulationPassword}
188183
// hidden={false}
189184
>
190-
8글자이상 영문숫자 조합으로 입려해주세요.
185+
8글자이상 영문숫자 조합으로 입력해주세요.
191186
</p>
192187
</div>
193188
</div>
@@ -220,18 +215,14 @@ const EmailLogin = () => {
220215
<div className="hr-sect">
221216
<div>간편 로그인</div>
222217
</div>
223-
<div className="flex gap-[110px] mx-auto h-[100px] mt-[46px]">
218+
<div className="flex gap-[110px] mx-auto h-[100px] mt-[46px] mb-[28px]">
224219
<div className="text-center ">
225220
<NaverLogin />
226-
<p className="mt-[20px] text-[#12396F] font-[400] text-[14px]">
227-
네이버
228-
</p>
221+
<p className="mt-[20px] text-[#12396F] font-[400] text-[14px]">네이버</p>
229222
</div>
230223
<div className="text-center">
231224
<KakaoLogin onEvent={onClickKakaoLongin} img={kakaologo} />
232-
<p className="mt-[20px] text-[#12396F] font-[400] text-[14px]">
233-
카카오
234-
</p>
225+
<p className="mt-[20px] text-[#12396F] font-[400] text-[14px]">카카오</p>
235226
</div>
236227
</div>
237228
<IsModal onMoalClose={onMoalClose} message={{ ModalStr }} />

src/components/modal/KebabButtonModal.jsx

+51-49
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useDispatch } from "react-redux";
77
import { __deleteSchedule } from "../../redux/modules/ScheduleSlice";
88
import { motion } from "framer-motion";
99

10-
const KebabModal = ({ setModalOpen, id }) => {
10+
const KebabModal = ({ setModalOpen, id, modalOpen }) => {
1111
const navigate = useNavigate();
1212
const dispatch = useDispatch();
1313
const scheduleEditHandler = () => {
@@ -39,55 +39,57 @@ const KebabModal = ({ setModalOpen, id }) => {
3939
const [deleteModalOpen, setDeleteModalOpen] = useState(false);
4040
return (
4141
<>
42-
<motion.div
43-
variants={list}
44-
initial="hidden"
45-
animate="visible"
46-
className="h-full w-[375px] bg-black bg-opacity-50 justify-center fixed bottom-0 z-10 flex"
47-
>
48-
{deleteModalOpen ? (
49-
<div className="text-black pt-8 items-center w-[300px] h-[167px] text-center rounded-[16px] fixed top-[38%] z-20 bg-white ">
50-
<div className="text-[18px] font-bold flex flex-col ">해당 일정을 삭제하시겠습니까? </div>
51-
<div className="mt-[14px] text-[14px] text-[#6F6F6F]">삭제된 일정은 복구가 불가능합니다.</div>
52-
<button
53-
className="bg-[#A31414] rounded-[4px] h-[40px] w-[127px] text-white mt-[18px]"
54-
onClick={confirmDeleteHandler}
55-
>
56-
삭제
57-
</button>
58-
<button
59-
className="ml-[14px] h-[40px] rounded-[4px] border-solid border-black border-[1px] w-[127px] text-black mt-[18px]"
60-
onClick={() => setDeleteModalOpen(false)}
61-
>
62-
취소
63-
</button>
64-
</div>
65-
) : (
66-
//이하는 모두 케밥버튼눌렀을 때 수정&삭제 모달
67-
<motion.div variants={item} className=" bottom-0 w-[375px] h-[205px] rounded-t-lg bg-white fixed ">
68-
<div className="h-[25px] pt-[11px]">
69-
<img src={barIcon} alt="bar" className="w-[80px] h-[3px] m-auto" />
42+
{modalOpen && (
43+
<motion.div
44+
variants={list}
45+
initial="hidden"
46+
animate="visible"
47+
className="h-full w-[375px] bg-black bg-opacity-50 justify-center fixed bottom-0 z-10 flex"
48+
>
49+
{deleteModalOpen ? (
50+
<div className="text-black pt-8 items-center w-[300px] h-[167px] text-center rounded-[16px] fixed top-[38%] z-20 bg-white ">
51+
<div className="text-[18px] font-bold flex flex-col ">해당 일정을 삭제하시겠습니까? </div>
52+
<div className="mt-[14px] text-[14px] text-[#6F6F6F]">삭제된 일정은 복구가 불가능합니다.</div>
53+
<button
54+
className="bg-[#A31414] rounded-[4px] h-[40px] w-[127px] text-white mt-[18px]"
55+
onClick={confirmDeleteHandler}
56+
>
57+
삭제
58+
</button>
59+
<button
60+
className="ml-[14px] h-[40px] rounded-[4px] border-solid border-black border-[1px] w-[127px] text-black mt-[18px]"
61+
onClick={() => setDeleteModalOpen(false)}
62+
>
63+
취소
64+
</button>
7065
</div>
71-
<div
72-
onClick={scheduleEditHandler}
73-
className="cursor-pointer text-[#121213] font-bold pt-[23px] h-[60px] flex row border-solid border-[rgb(226,226,226)] border-b-[1px]"
74-
>
75-
<img src={editIcon} alt="edit" className="w-[18px] h-[18px] ml-[30px] mr-[20px]" />
76-
수정
77-
</div>
78-
<div
79-
onClick={scheduleDeleteHandler}
80-
className="cursor-pointer text-[#A31414] font-bold pt-[23px] h-[60px] flex row border-solid border-[rgb(226,226,226)] border-b-[1px]"
81-
>
82-
<img src={deleteIcon} alt="delete" className="w-[24px] h-[24px] ml-[30px] mr-[20px] z-0" />
83-
삭제
84-
</div>
85-
<div className="cursor-pointer m-auto text-center pt-[22px] h-[60px] font-bold" onClick={closeModal}>
86-
닫기
87-
</div>
88-
</motion.div>
89-
)}
90-
</motion.div>
66+
) : (
67+
//이하는 모두 케밥버튼눌렀을 때 수정&삭제 모달
68+
<motion.div variants={item} className=" bottom-0 w-[375px] h-[205px] rounded-t-lg bg-white fixed ">
69+
<div className="h-[25px] pt-[11px]">
70+
<img src={barIcon} alt="bar" className="w-[80px] h-[3px] m-auto" />
71+
</div>
72+
<div
73+
onClick={scheduleEditHandler}
74+
className="cursor-pointer text-[#121213] font-bold pt-[23px] h-[60px] flex row border-solid border-[rgb(226,226,226)] border-b-[1px]"
75+
>
76+
<img src={editIcon} alt="edit" className="w-[18px] h-[18px] ml-[30px] mr-[20px]" />
77+
수정
78+
</div>
79+
<div
80+
onClick={scheduleDeleteHandler}
81+
className="cursor-pointer text-[#A31414] font-bold pt-[23px] h-[60px] flex row border-solid border-[rgb(226,226,226)] border-b-[1px]"
82+
>
83+
<img src={deleteIcon} alt="delete" className="w-[24px] h-[24px] ml-[30px] mr-[20px] z-0" />
84+
삭제
85+
</div>
86+
<div className="cursor-pointer m-auto text-center pt-[22px] h-[60px] font-bold" onClick={closeModal}>
87+
닫기
88+
</div>
89+
</motion.div>
90+
)}
91+
</motion.div>
92+
)}
9193
</>
9294
);
9395
};

src/components/schedule/ScheduleAdd.jsx

+11-44
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@ import React, { useEffect, useState } from "react";
22
import DatePicker from "react-datepicker";
33
import "react-datepicker/dist/react-datepicker.css";
44
import { useDispatch, useSelector } from "react-redux";
5-
import { useLocation, useNavigate } from "react-router-dom";
5+
import { useLocation } from "react-router-dom";
66
import { scheduleReset, __postSchedule, __editSchedule, __getScheduleDetail } from "../../redux/modules/ScheduleSlice";
77
import FollowingModal from "../modal/FollowingModal";
88
import ScheduleAddModal from "../modal/ScheduleAddModal";
99
import ScheduleModal from "../modal/ScheduleModal";
10+
import useCardColorSelector from "../../customHook/useCardColorSelector";
1011

1112
// state.type:"add" 은 스케줄 추가, state.type:edit은 수정
1213
const ScheduleAdd = () => {
1314
const dispatch = useDispatch();
14-
const navigate = useNavigate();
15+
1516
//스케줄 추가, 수정 분기를 결정할 state 값을 받아옴
1617
const { state } = useLocation();
1718

19+
const { border, colorSelected, eventHandler } = useCardColorSelector();
1820
useEffect(() => {
1921
if (state.type === "edit") {
2022
dispatch(__getScheduleDetail(state.id));
@@ -36,51 +38,16 @@ const ScheduleAdd = () => {
3638
state.type === "edit" ? new Date(oldSchedule.date + "T" + oldSchedule.time) : ""
3739
);
3840

39-
const [selectedColor, setColorSelected] = useState(state.type === "edit" ? oldSchedule.cardColor : "sora");
40-
4141
//제목
4242
const [subject, setSubject] = useState(state.type === "edit" ? oldSchedule.subject : "");
4343

4444
//내용
4545
const [content, setContent] = useState(state.type === "edit" ? oldSchedule.content : "");
4646

47-
const [borderSora, setBorderSora] = useState(
48-
state.type !== "edit"
49-
? "border-blackBorder"
50-
: oldSchedule.cardColor === "sora"
51-
? "border-blackBorder"
52-
: "border-none"
53-
);
54-
const [borderPink, setBorderPink] = useState(
55-
state.type !== "edit" ? "border-none" : oldSchedule.cardColor === "pink" ? "border-blackBorder" : "border-none"
56-
);
57-
const [borderGreen, setBorderGreen] = useState(
58-
state.type !== "edit" ? "border-none" : oldSchedule.cardColor === "green" ? "border-blackBorder" : "border-none"
59-
);
60-
6147
//완료모달&경고모달
6248
const [modalOpen, setModalOpen] = useState(false);
6349
const [completeModal, setCompleteModal] = useState(false);
6450

65-
//색상지정시 카드의 백그라운드컬러가 바뀌면서 selectedColor에 값이 입혀진다.
66-
const eventHandlerSora = () => {
67-
setColorSelected("sora");
68-
setBorderSora("border-blackBorder");
69-
setBorderPink("border-none");
70-
setBorderGreen("border-none");
71-
};
72-
const eventHandlerPink = () => {
73-
setColorSelected("pink");
74-
setBorderSora("border-none");
75-
setBorderPink("border-blackBorder");
76-
setBorderGreen("border-none");
77-
};
78-
const eventHandlerGreen = () => {
79-
setColorSelected("green");
80-
setBorderSora("border-none");
81-
setBorderPink("border-none");
82-
setBorderGreen("border-blackBorder");
83-
};
8451
//일정의 제목과 내용, 참여자 onChangeHandler
8552
const onSubjectChangeHandler = (e) => {
8653
setSubject(e.target.value);
@@ -105,7 +72,7 @@ const ScheduleAdd = () => {
10572

10673
if (subject.length > 0 && [selectedDate].toString().length > 0) {
10774
const newSchedule = {
108-
cardColor: selectedColor,
75+
cardColor: colorSelected,
10976
date: date,
11077
time: time,
11178
subject: subject,
@@ -152,20 +119,20 @@ const ScheduleAdd = () => {
152119
카드 테마 색상
153120
<div className="flex flex-row mt-4 ">
154121
<div
155-
className={`${borderSora} border-solid border-[4px] cursor-pointer rounded-[4px] w-[42px] h-[42px] bg-sora`}
156-
onClick={eventHandlerSora}
122+
className={`${border.sora} border-solid border-[4px] cursor-pointer rounded-[4px] w-[42px] h-[42px] bg-sora`}
123+
onClick={() => eventHandler("sora")}
157124
>
158125
{""}
159126
</div>
160127
<div
161-
className={`${borderPink} border-solid border-[4px] cursor-pointer rounded-[4px] ml-[17px] w-[42px] h-[42px] bg-pink`}
162-
onClick={eventHandlerPink}
128+
className={`${border.pink} border-solid border-[4px] cursor-pointer rounded-[4px] ml-[17px] w-[42px] h-[42px] bg-pink`}
129+
onClick={() => eventHandler("pink")}
163130
>
164131
{""}
165132
</div>
166133
<div
167-
className={`${borderGreen} border-solid border-[4px] cursor-pointer rounded-[4px] ml-[17px] w-[42px] h-[42px] bg-green`}
168-
onClick={eventHandlerGreen}
134+
className={`${border.green} border-solid border-[4px] cursor-pointer rounded-[4px] ml-[17px] w-[42px] h-[42px] bg-green`}
135+
onClick={() => eventHandler("green")}
169136
>
170137
{""}
171138
</div>

src/components/schedule/ScheduleDetail.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const ScheduleDetail = () => {
4545
{/* 케밥모달이 열리면 bottomNavi는 사라집니다 */}
4646
{modalOpen ? false : <BottomNavi />}
4747
</div>
48-
{modalOpen && <KebabModal setModalOpen={setModalOpen} id={id} />}
48+
{<KebabModal modalOpen={modalOpen} setModalOpen={setModalOpen} id={id} />}
4949
<div
5050
className={`h-[202px] bg-${schedule.cardColor} pl-[18px] w-[375px] pt-[23px] pr-[21px] text-white align-
5151
`}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { useState } from "react";
2+
3+
const useCardColorSelector = () => {
4+
const [border, setBorder] = useState({
5+
sora: "border-blackBorder",
6+
pink: "border-none",
7+
green: "border-none",
8+
});
9+
const [colorSelected, setColorSelected] = useState("");
10+
11+
// 뭐 하나를 클릭했을때 그친구만 보더를 바꾸고, 다른 친구들은 보더를 없앤다.
12+
// a를 클릭했을 때 클릭함수의 매개변수로 a를 줘서 그걸 useCardColorSelector까지 전달한다.
13+
// 모든 보더를 제거하고 a만 보더를 준다.
14+
15+
const eventHandler = (color) => {
16+
setColorSelected(color);
17+
setBorder({
18+
sora: "border-none",
19+
pink: "border-none",
20+
green: "border-none",
21+
});
22+
setBorder((prev) => ({ ...prev, [color]: "border-blackBorder" }));
23+
};
24+
25+
return {
26+
border,
27+
colorSelected,
28+
eventHandler,
29+
};
30+
};
31+
export default useCardColorSelector;

0 commit comments

Comments
 (0)