Skip to content

Commit 3e074c0

Browse files
authored
Merge pull request #5 from lgrin-byte/develop
Develop to Main
2 parents 8d8f651 + a9f81dc commit 3e074c0

File tree

110 files changed

+1914
-2606
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+1914
-2606
lines changed

app/admin-old/page.tsx

Lines changed: 0 additions & 6 deletions
This file was deleted.

app/admin/(components)/CreateTheme/Container.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { FormEvent } from "react";
2-
32
import "../../(style)/createTheme.modules.sass";
3+
import { useRouter } from "next/navigation";
4+
45
import { usePostTheme } from "@/mutations/postTheme";
56
import { useCreateThemeValue } from "@/components/atoms/createTheme.atom";
67
import { useSelectedThemeWrite } from "@/components/atoms/selectedTheme.atom";
8+
import { setSelectedThemeId } from "@/utils/storageUtil";
79

810
import CreateThemeTitle from "./CreateThemeTitle";
911
import CreateThemeBody from "./CreateThemeBody";
@@ -13,7 +15,7 @@ export default function CreateTheme() {
1315
const createTheme = useCreateThemeValue();
1416
const setSelectedTheme = useSelectedThemeWrite();
1517
const { mutateAsync: postTheme } = usePostTheme();
16-
18+
const router = useRouter();
1719
const handleKeyDownSubmit = async (e: FormEvent) => {
1820
e.preventDefault();
1921
const isDisabled =
@@ -24,10 +26,16 @@ export default function CreateTheme() {
2426
if (isDisabled) {
2527
return;
2628
}
27-
const response = await postTheme(createTheme);
28-
const { id } = response.data.data;
29-
if (id) {
30-
setSelectedTheme(createTheme);
29+
try {
30+
const response = await postTheme(createTheme);
31+
const { id } = response.data.data;
32+
router.push(`/admin?themeId=${encodeURIComponent(id)}`);
33+
if (id) {
34+
setSelectedTheme(createTheme);
35+
setSelectedThemeId(id);
36+
}
37+
} catch (err) {
38+
console.error("Login failed:", err);
3139
}
3240
};
3341

app/admin/(components)/Sidebar.tsx

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
1-
import React from "react";
1+
import React, { useEffect, useState } from "react";
22
import Image from "next/image";
33
import classNames from "classnames";
44
import { useRouter, useSearchParams } from "next/navigation";
5+
import { useQueryClient } from "@tanstack/react-query";
56

6-
import HintDialog from "@/components/common/Hint-Dialog-new/Dialog";
7+
import HintDialog from "@/components/common/Dialog-new/Hint-Dialog-new/Dialog";
78
import {
89
logoProps,
910
plusDisableProps,
1011
plusProps,
1112
subscribeLinkURL,
1213
} from "@/admin/(consts)/sidebar";
1314
import {
15+
getLoginInfo,
1416
getSelectedThemeId,
1517
getStatus,
1618
removeAccessToken,
1719
removeThemeId,
18-
} from "@/utils/localStorage";
20+
} from "@/utils/storageUtil";
1921
import { useSelectedThemeReset } from "@/components/atoms/selectedTheme.atom";
20-
import { useIsLoggedInWrite } from "@/components/atoms/account.atom";
2122
import { useDrawerState } from "@/components/atoms/drawer.atom";
2223
import useModal from "@/hooks/useModal";
24+
import { QUERY_KEY } from "@/queries/getThemeList";
2325

2426
interface Theme {
2527
id: number;
@@ -29,8 +31,6 @@ interface Theme {
2931
}
3032

3133
interface Props {
32-
adminCode: string;
33-
shopName: string;
3434
categories: Theme[];
3535
selectedTheme: Theme;
3636
handleClickSelected: (theme: Theme) => void;
@@ -39,32 +39,50 @@ interface Props {
3939
export default function Sidebar(props: Props) {
4040
const router = useRouter();
4141
const resetSelectedTheme = useSelectedThemeReset();
42-
// const setIsLoggedIn = useIsLoggedInWrite();
42+
const queryClient = useQueryClient();
43+
4344
const [drawer, setDrawer] = useDrawerState();
4445
const { open } = useModal();
4546

4647
const status = getStatus();
4748
const searchParams = useSearchParams();
4849
const selectedThemeId = getSelectedThemeId();
4950
const params = new URLSearchParams(searchParams.toString()).toString();
50-
const {
51-
adminCode = "",
52-
shopName = "",
53-
categories,
54-
handleClickSelected,
55-
} = props;
51+
const { categories, handleClickSelected } = props;
52+
const [loginInfo, setLoginInfo] = useState({
53+
adminCode: "",
54+
shopName: "",
55+
});
56+
57+
useEffect(() => {
58+
const { adminCode, shopName } = getLoginInfo(); // getLoginInfo로 값 가져오기
59+
setLoginInfo({ adminCode, shopName }); // 상태 업데이트
60+
}, []);
5661

57-
// const handleLogout = () => {
58-
// removeAccessToken();
59-
// setIsLoggedIn(false);
60-
// };
62+
const handleLogout = () => {
63+
removeAccessToken();
64+
resetSelectedTheme();
65+
setLoginInfo({
66+
adminCode: "",
67+
shopName: "",
68+
});
69+
// router.push("/login");
70+
window.location.href = "/login";
71+
};
72+
useEffect(() => {
73+
if (selectedThemeId && selectedThemeId !== "0")
74+
router.push(
75+
`/admin?themeId=${encodeURIComponent(selectedThemeId)}
76+
`
77+
);
78+
}, [selectedThemeId, params]);
6179

6280
const navigateToNewTheme = () => {
6381
resetSelectedTheme();
6482
router.push("/admin");
6583
setDrawer({ ...drawer, isOpen: false });
6684
};
67-
const handleSelectTheme = (theme: Theme) => {
85+
const handleSelectTheme = async (theme: Theme) => {
6886
if (drawer.isOpen && !drawer.isSameHint) {
6987
open(HintDialog, {
7088
type: "put",
@@ -75,6 +93,7 @@ export default function Sidebar(props: Props) {
7593
});
7694
} else {
7795
setDrawer({ ...drawer, isOpen: false });
96+
await queryClient.invalidateQueries(QUERY_KEY);
7897
handleClickSelected(theme);
7998
}
8099
};
@@ -93,9 +112,18 @@ export default function Sidebar(props: Props) {
93112
<div className="sidebar">
94113
<div className="sidebar__top">
95114
<div className="sidebar__shop-info">
96-
<Image {...logoProps} className="sidebar__shop-logo" />
115+
<div className="sidebar__shop-info-img-box">
116+
<Image {...logoProps} className="sidebar__shop-logo" />
117+
<div />
118+
<button
119+
className="sidebar__shop-info-logout-btn"
120+
onClick={handleLogout}
121+
>
122+
로그아웃
123+
</button>
124+
</div>
97125
<span className="sidebar__shop-name">
98-
{shopName?.replaceAll(`"`, "")}
126+
{loginInfo.shopName?.replaceAll(`"`, "")}
99127
</span>
100128
</div>
101129
<div className="sidebar__theme-title">우리 지점 테마</div>
@@ -111,7 +139,7 @@ export default function Sidebar(props: Props) {
111139
<button
112140
type="button"
113141
className={classNames("sidebar__theme-button", {
114-
selected: selectedThemeId === theme.id?.toString() && params,
142+
selected: selectedThemeId === theme.id.toString(),
115143
})}
116144
onClick={() => handleSelectTheme(theme)}
117145
>
@@ -159,7 +187,7 @@ export default function Sidebar(props: Props) {
159187
<div className="sidebar__bottom">
160188
<p className="sidebar__admin-code-title">관리자 코드</p>
161189
<p className="sidebar__admin-code-value">
162-
{adminCode?.replaceAll(`"`, "")}
190+
{loginInfo.adminCode?.replaceAll(`"`, "")}
163191
</p>
164192
</div>
165193
</div>

app/admin/(components)/ThemeDrawer/helpers/imageHelpers.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
11
import imageCompression from "browser-image-compression";
22

3-
export const compressImage = async (file: File) => {
4-
const options = {
5-
maxSizeMB: 5,
6-
maxWidthOrHeight: 1920,
7-
useWebWorker: true,
8-
};
3+
export interface FileOptionsType {
4+
maxSizeMB: number;
5+
maxWidthOrHeight: number;
6+
useWebWorker: boolean;
7+
}
8+
export const getCompressImage = async (
9+
file: File,
10+
options: FileOptionsType
11+
) => {
12+
const compressedFile = await compressImage(file, options);
13+
try {
14+
if (compressedFile.type !== "image/png") {
15+
const pngFile = await convertToPng(compressedFile);
16+
return pngFile;
17+
} else {
18+
return compressedFile;
19+
}
20+
} catch (error) {
21+
console.error("Image compression failed", error);
22+
return file;
23+
}
24+
};
25+
26+
const compressImage = async (file: File, options: FileOptionsType) => {
927
try {
1028
const compressedFile = await imageCompression(file, options);
1129
return compressedFile; // compressedFile 반환
@@ -14,7 +32,7 @@ export const compressImage = async (file: File) => {
1432
}
1533
};
1634

17-
export const convertToPng = async (file: File): Promise<File> =>
35+
const convertToPng = async (file: File): Promise<File> =>
1836
new Promise<File>((resolve, reject) => {
1937
const img = new Image();
2038
const reader = new FileReader();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useState, useEffect, FormEvent, useRef } from "react";
22

3-
import HintDialog from "@/components/common/Hint-Dialog-new/Dialog";
3+
import HintDialog from "@/components/common/Dialog-new/Hint-Dialog-new/Dialog";
44
import {
55
InitialSelectedHint,
66
SelectedHintType,

app/admin/(components)/ThemeDrawer/hooks/useImages.ts

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import {
1111
import { useCreateHint } from "@/components/atoms/createHint.atom";
1212
import { useSelectedHint } from "@/components/atoms/selectedHint.atom";
1313
import { useToastWrite } from "@/components/atoms/toast.atom";
14-
import { getStatus } from "@/utils/localStorage";
14+
import { getStatus } from "@/utils/storageUtil";
1515
import { subscribeLinkURL } from "@/admin/(consts)/sidebar";
1616

17-
import { compressImage, convertToPng } from "../helpers/imageHelpers";
17+
import { getCompressImage } from "../helpers/imageHelpers";
1818

1919
const useImages = ({
2020
imageType,
@@ -79,19 +79,12 @@ const useImages = ({
7979
const files: File[] = [];
8080
const file = e.target.files[0];
8181
if (file.size > 5 * 1024 * 1024) {
82-
try {
83-
const compressedFile = await compressImage(file);
84-
85-
if (compressedFile.type !== "image/png") {
86-
const pngFile = await convertToPng(compressedFile);
87-
files.push(pngFile);
88-
} else {
89-
files.push(compressedFile);
90-
}
91-
} catch (error) {
92-
console.error("Image compression failed", error);
93-
files.push(file);
94-
}
82+
const options = {
83+
maxSizeMB: 5,
84+
maxWidthOrHeight: 1920,
85+
useWebWorker: true,
86+
};
87+
files.push(await getCompressImage(file, options));
9588
} else {
9689
files.push(file);
9790
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import classNames from "classnames";
44
import "../../(style)/themeInfo.modules.sass";
55

66
import useModal from "@/hooks/useModal";
7-
import Dialog from "@/components/common/Dialog-new/Dialog";
7+
import Dialog from "@/components/common/Dialog-new/Theme-Dialog/Dialog";
88
import { useDrawerState } from "@/components/atoms/drawer.atom";
99

1010
import ThemeDrawer from "../ThemeDrawer/Container";
1111

1212
import ThemeInfoTitle from "./ThemeInfoTitle";
13-
import ThemeInfoBody from "./ThemeInfoBody";
1413
import ThemeInfoHint from "./ThemeInfoHint";
14+
import ThemeImage from "./ThemeTimerImage";
1515

1616
export default function ThemeInfo() {
1717
const { open } = useModal();
@@ -46,7 +46,7 @@ export default function ThemeInfo() {
4646
})}
4747
>
4848
<ThemeInfoTitle handleOpenModal={handleOpenModal} />
49-
<ThemeInfoBody handleOpenModal={handleOpenModal} />
49+
<ThemeImage />
5050
<ThemeInfoHint handleHintCreate={handleHintCreate} />
5151
{drawer.isOpen && (
5252
<ThemeDrawer

app/admin/(components)/ThemeInfo/ThemeInfoBody.tsx

Lines changed: 0 additions & 40 deletions
This file was deleted.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ 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";
6+
import HintDialog from "@/components/common/Dialog-new/Hint-Dialog-new/Dialog";
77
import {
88
SelectedHintType,
99
useSelectedHint,

0 commit comments

Comments
 (0)