Skip to content

Commit b3b66f5

Browse files
committed
feat: 버튼 클릭 시 모달 노출 유무 수정
1 parent 8ca7453 commit b3b66f5

File tree

7 files changed

+133
-21
lines changed

7 files changed

+133
-21
lines changed

app/admin-new/(components)/Sidebar.tsx

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@ import React from "react";
22
import Image from "next/image";
33
import classNames from "classnames";
44
import { useRouter, useSearchParams } from "next/navigation";
5+
import HintDialog from "@/components/common/Hint-Dialog-new/Dialog";
56

67
import {
78
logoProps,
89
plusDisableProps,
910
plusProps,
1011
subscribeLinkURL,
1112
} from "@/admin-new/(consts)/sidebar";
12-
import { getSelectedThemeId, getStatus } from "@/utils/localStorage";
13+
import {
14+
getSelectedThemeId,
15+
getStatus,
16+
removeAccessToken,
17+
} from "@/utils/localStorage";
1318
import { useSelectedThemeReset } from "@/components/atoms/selectedTheme.atom";
19+
import { useIsLoggedInWrite } from "@/components/atoms/account.atom";
20+
import { useDrawerState } from "@/components/atoms/drawer.atom";
21+
import useModal from "@/hooks/useModal";
1422

1523
interface Theme {
1624
id: number;
@@ -30,6 +38,10 @@ interface Props {
3038
export default function Sidebar(props: Props) {
3139
const router = useRouter();
3240
const resetSelectedTheme = useSelectedThemeReset();
41+
// const setIsLoggedIn = useIsLoggedInWrite();
42+
const [drawer, setDrawer] = useDrawerState();
43+
const { open } = useModal();
44+
3345
const status = getStatus();
3446
const searchParams = useSearchParams();
3547
const selectedThemeId = getSelectedThemeId();
@@ -40,6 +52,34 @@ export default function Sidebar(props: Props) {
4052
categories,
4153
handleClickSelected,
4254
} = props;
55+
56+
// const handleLogout = () => {
57+
// removeAccessToken();
58+
// setIsLoggedIn(false);
59+
// };
60+
61+
const navigateToNewTheme = () => {
62+
resetSelectedTheme();
63+
router.push("/admin-new");
64+
};
65+
const handleSelectTheme = (theme: Theme) => {
66+
if (drawer.isOpen && !drawer.isSameHint) {
67+
open(HintDialog, { type: "put", fn: () => handleClickSelected(theme) });
68+
} else {
69+
setDrawer({ ...drawer, isOpen: false });
70+
handleClickSelected(theme);
71+
}
72+
};
73+
74+
const handleCreateTheme = () => {
75+
if (drawer.isOpen && !drawer.isSameHint) {
76+
open(HintDialog, { type: "put", fn: navigateToNewTheme });
77+
} else {
78+
setDrawer({ ...drawer, isOpen: false });
79+
navigateToNewTheme();
80+
}
81+
};
82+
4383
return (
4484
<div className="sidebar">
4585
<div className="sidebar__top">
@@ -51,7 +91,6 @@ export default function Sidebar(props: Props) {
5191
</div>
5292
<div className="sidebar__theme-title">우리 지점 테마</div>
5393
</div>
54-
5594
<div className="sidebar__scroll">
5695
<ul className="sidebar__theme-list">
5796
{[...categories].reverse().map((theme) => (
@@ -65,7 +104,7 @@ export default function Sidebar(props: Props) {
65104
className={classNames("sidebar__theme-button", {
66105
selected: selectedThemeId === theme.id?.toString() && params,
67106
})}
68-
onClick={() => handleClickSelected(theme)}
107+
onClick={() => handleSelectTheme(theme)}
69108
>
70109
{theme.title}
71110
</button>
@@ -80,11 +119,7 @@ export default function Sidebar(props: Props) {
80119
selected: !params,
81120
}
82121
)}
83-
onClick={() => {
84-
resetSelectedTheme();
85-
86-
router.push("/admin-new");
87-
}}
122+
onClick={handleCreateTheme}
88123
>
89124
<Image {...(params ? plusDisableProps : plusProps)} />새 테마
90125
추가하기

app/admin-new/(components)/ThemeDrawer/hooks/useEditHint.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import useHintUpload from "@/queries/getPreSignedUrl";
1313
import useModal from "@/hooks/useModal";
1414
import extractFilename from "@/utils/helper";
1515
import { getHintList } from "@/queries/getHintList";
16-
16+
import { useDrawerState } from "@/components/atoms/drawer.atom";
1717
import { DrawerType } from "../types/themeDrawerTypes";
1818

1919
const useEditHint = ({
@@ -34,6 +34,8 @@ const useEditHint = ({
3434

3535
const drawerRef = useRef<HTMLFormElement>(null);
3636

37+
const [drawer, setDrawer] = useDrawerState();
38+
3739
useEffect(() => {
3840
setCreateHint((prev) => ({
3941
...prev,
@@ -63,9 +65,29 @@ const useEditHint = ({
6365
Boolean(!answerImages.length);
6466

6567
useEffect(() => {
66-
if (hintType === "Add") {
68+
const isSameHint =
69+
String(createHint.hintCode) === String(selectedHint.hintCode) &&
70+
Number(createHint.progress) === Number(selectedHint.progress) &&
71+
String(createHint.contents) === String(selectedHint.contents) &&
72+
String(createHint.answer) === String(selectedHint.answer) &&
73+
// 서버에 올라간 사진 삭제 여부를 비교
74+
createHint.hintImageUrlList === selectedHint.hintImageUrlList &&
75+
createHint.answerImageUrlList === selectedHint.answerImageUrlList &&
76+
// 로컬 업로드 사진 하나라도 있으면 변경된 것
77+
Boolean(!hintImages.length) &&
78+
Boolean(!answerImages.length);
79+
80+
setDrawer((prevDrawer) => ({
81+
...prevDrawer,
82+
isSameHint,
83+
}));
84+
}, [isSameHint, setDrawer]);
85+
86+
useEffect(() => {
87+
if (drawer.hintType === "Add") {
6788
return;
6889
}
90+
6991
if (isSameHint || isImcomplete) {
7092
setIsDisabled(true);
7193
} else {

app/admin-new/(components)/ThemeInfo/Container.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import classNames from "classnames";
55
import useModal from "@/hooks/useModal";
66
import Dialog from "@/components/common/Dialog-new/Dialog";
77
import { useSelectedHintReset } from "@/components/atoms/selectedHint.atom";
8+
import { useDrawerState } from "@/components/atoms/drawer.atom";
89

910
import ThemeDrawer from "../ThemeDrawer/Container";
1011

@@ -16,21 +17,19 @@ export default function ThemeInfo() {
1617
const { open } = useModal();
1718
const resetSelectedHint = useSelectedHintReset();
1819

19-
const [openHintDrawer, setOpenHintDrawer] = useState(false);
20-
const [hintType, setHintType] = useState<string>("Add");
20+
const [drawer, setDrawerState] = useDrawerState();
2121

2222
const handleOpenModal = () => {
2323
open(Dialog, { type: "put" });
2424
};
2525

2626
const handleCloseDrawer = () => {
2727
resetSelectedHint();
28-
setOpenHintDrawer(false);
28+
setDrawerState({ ...drawer, isOpen: false, hintType: "" });
2929
};
3030

3131
const handleHintCreate = (type: string) => {
32-
setOpenHintDrawer(true);
33-
setHintType(type);
32+
setDrawerState({ ...drawer, isOpen: true, hintType: type });
3433
};
3534

3635
useEffect(() => {
@@ -49,17 +48,17 @@ export default function ThemeInfo() {
4948
return (
5049
<div
5150
className={classNames("theme-infomation", {
52-
"drawer-open": openHintDrawer,
51+
"drawer-open": drawer.isOpen,
5352
})}
5453
>
5554
<ThemeInfoTitle handleOpenModal={handleOpenModal} />
5655
<ThemeInfoBody handleOpenModal={handleOpenModal} />
5756
<ThemeInfoHint handleHintCreate={handleHintCreate} />
58-
{openHintDrawer && (
57+
{drawer.isOpen && (
5958
<ThemeDrawer
6059
handleHintCreate={handleHintCreate}
6160
onCloseDrawer={handleCloseDrawer}
62-
hintType={hintType}
61+
hintType={drawer.hintType}
6362
/>
6463
)}
6564
</div>

app/admin-new/(components)/ThemeInfo/ThemeInfoHint.tsx

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ import classNames from "classnames";
33

44
import { useGetHintList } from "@/queries/getHintList";
55
import { useSelectedThemeValue } from "@/components/atoms/selectedTheme.atom";
6+
import HintDialog from "@/components/common/Hint-Dialog-new/Dialog";
67
import {
78
SelectedHintType,
89
useSelectedHint,
910
useSelectedHintReset,
1011
} from "@/components/atoms/selectedHint.atom";
1112
import { useCreateHintReset } from "@/components/atoms/createHint.atom";
13+
import { useDrawerState } from "@/components/atoms/drawer.atom";
14+
import useModal from "@/hooks/useModal";
1215

1316
interface ThemeDrawerProps {
1417
handleHintCreate: (type: string) => void;
@@ -21,18 +24,41 @@ const ThemeInfoHint: React.FC<ThemeDrawerProps> = ({ handleHintCreate }) => {
2124
const [selectedHint, setSelectedHint] = useSelectedHint();
2225
const resetSelectedHint = useSelectedHintReset();
2326
const resetCreateHint = useCreateHintReset();
27+
const [drawer, setDrawer] = useDrawerState();
28+
const { open } = useModal();
2429

25-
const handleAddHintBtn = () => {
30+
const handleResetCreateHint = () => {
2631
resetSelectedHint();
2732
resetCreateHint();
2833
handleHintCreate("Add");
2934
};
35+
36+
const handleAddHintBtn = () => {
37+
if (drawer.isOpen && !drawer.isSameHint) {
38+
open(HintDialog, {
39+
type: "",
40+
fn: handleResetCreateHint,
41+
});
42+
} else handleResetCreateHint();
43+
};
44+
3045
const handleEditHintBtn = (
3146
e: React.MouseEvent<HTMLLIElement, globalThis.MouseEvent>,
3247
hintElement: SelectedHintType
3348
) => {
34-
setSelectedHint(hintElement);
35-
handleHintCreate("Edit");
49+
if (drawer.isOpen && !drawer.isSameHint) {
50+
open(HintDialog, {
51+
type: "put",
52+
fn: () => {
53+
setSelectedHint(hintElement);
54+
handleHintCreate("Edit");
55+
setDrawer({ ...drawer, isOpen: true, hintType: "put" });
56+
},
57+
});
58+
} else {
59+
setSelectedHint(hintElement);
60+
handleHintCreate("Edit");
61+
}
3662
};
3763

3864
return (
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {
2+
atom,
3+
useRecoilValue,
4+
useRecoilState,
5+
useSetRecoilState,
6+
} from "recoil";
7+
8+
interface DrawerType {
9+
isOpen: boolean;
10+
hintType: string;
11+
isSameHint: boolean;
12+
}
13+
14+
const drawerState = atom<DrawerType>({
15+
key: "drawer",
16+
default: { isOpen: false, hintType: "", isSameHint: false },
17+
});
18+
19+
export const useDrawerState = () => useRecoilState(drawerState);
20+
export const useDrawerStateValue = () => useRecoilValue(drawerState);
21+
export const useDrawerStateWrite = () => useSetRecoilState(drawerState);

app/components/common/Hint-Dialog-new/Dialog.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import { useDeleteHint } from "@/mutations/deleteHint";
1111
import { useSelectedHint } from "@/components/atoms/selectedHint.atom";
1212

1313
import ModalPortal from "./ModalPortal";
14+
import {
15+
useDrawerState,
16+
} from "@/components/atoms/drawer.atom";
1417

1518
interface DialogProps {
1619
type?: string | "";
@@ -38,13 +41,15 @@ const Dialog = forwardRef<HTMLFormElement, DialogProps>((props) => {
3841
const [selectedHint] = useSelectedHint();
3942

4043
const { mutateAsync: deleteHint } = useDeleteHint();
44+
const [drawer, setDrawer] = useDrawerState();
4145

4246
const onSubmit: SubmitHandler<FormValues> = () => {
4347
const { id } = selectedHint;
4448

4549
if (type === "put") {
4650
fn();
4751
close();
52+
setDrawer({ ...drawer, isOpen: false });
4853
} else if (type === "delete") {
4954
deleteHint({ id });
5055
close();

app/utils/localStorage.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,7 @@ export const getSelectedThemeId = () => getLocalStorage(THEME_ID);
7575
export const removeAccessToken = () => {
7676
removeLocalStorageItem(ACCESS_TOKEN);
7777
};
78+
79+
export const removeLocalStorageAll = () => {
80+
localStorage.clear();
81+
};

0 commit comments

Comments
 (0)