Skip to content

Commit fdba385

Browse files
committed
refactor: 태그 선택 전역 state 저장
1 parent e9e0b74 commit fdba385

File tree

2 files changed

+93
-32
lines changed

2 files changed

+93
-32
lines changed

src/components/SelectTag/SelectTag.tsx

Lines changed: 73 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from "react";
1+
import { useEffect, useState } from "react";
22

33
import styles from "@/components/SelectTag/SelectTag.module.scss";
44
import TagSheet from "@/components/SelectTag/TagSheet/TagSheet";
@@ -13,48 +13,89 @@ import { useCreateReviewStore } from "@/store/useReviewStore";
1313
const SelectTag = () => {
1414
const { navigateToSelectStyle } = useRoute();
1515

16-
const { setHashTag } = useCreateReviewStore();
16+
const { createReviewData, setHashTag, setTagList } = useCreateReviewStore();
17+
18+
const { tagList, hashTag } = createReviewData;
1719

18-
const [selectedTagList, setSelectedTagList] = useState<string[]>([]);
1920
const [isBottomSheetOpen, setIsBottomSheetOpen] = useState(false);
20-
const [tagList, setTagList] = useState<string[]>([
21-
"음식이 맛있어요",
22-
"양이 많아요",
23-
"가성비가 좋아요",
24-
"메뉴 구성이 알차요",
25-
"매장이 넓어요",
26-
"단체모임 하기 좋아요",
27-
"뷰가 좋아요",
28-
"아늑해요",
29-
"분위기가 좋아요",
30-
"친절해요",
31-
"매장이 청결해요",
32-
]);
33-
34-
const handleTagClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
35-
const tag = e.currentTarget.textContent || "";
36-
37-
setSelectedTagList((prevSelectedTags) =>
38-
prevSelectedTags.includes(tag)
39-
? prevSelectedTags.filter((selectedTag) => selectedTag !== tag)
40-
: [...prevSelectedTags, tag],
41-
);
21+
22+
useEffect(() => {
23+
setHashTag(hashTag);
24+
}, [hashTag, setHashTag]);
25+
26+
const handleTagClick = (tag: string) => {
27+
const newSelectedTags = hashTag.includes(tag)
28+
? hashTag.filter((selectedTag) => selectedTag !== tag)
29+
: [...hashTag, tag];
30+
31+
setHashTag(newSelectedTags);
4232
};
4333

4434
const handleTagAdd = (newTag: string) => {
4535
setIsBottomSheetOpen(false);
46-
if (!tagList.includes(newTag)) {
47-
setTagList((prevTagList: string[]) => [...prevTagList, newTag]);
48-
setSelectedTagList((prevSelectedTags) => [...prevSelectedTags, newTag]);
49-
}
36+
setTagList([...tagList, newTag]);
37+
setHashTag([...hashTag, newTag]);
5038
};
5139

40+
// const [selectedTagList, setSelectedTagList] = useState<string[]>(createReviewData.hashTag);
41+
42+
// const [tagList, setTagList] = useState<string[]>([
43+
// "음식이 맛있어요",
44+
// "양이 많아요",
45+
// "가성비가 좋아요",
46+
// "메뉴 구성이 알차요",
47+
// "매장이 넓어요",
48+
// "단체모임 하기 좋아요",
49+
// "뷰가 좋아요",
50+
// "아늑해요",
51+
// "분위기가 좋아요",
52+
// "친절해요",
53+
// "매장이 청결해요",
54+
// ]);
55+
56+
// useEffect(() => {
57+
// setSelectedTagList(createReviewData.hashTag);
58+
// }, [createReviewData.hashTag]);
59+
60+
// const handleTagClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
61+
// const tag = e.currentTarget.textContent || "";
62+
63+
// setSelectedTagList((prevSelectedTags) => {
64+
// const newSelectedTags = prevSelectedTags.includes(tag)
65+
// ? prevSelectedTags.filter((selectedTag) => selectedTag !== tag)
66+
// : [...prevSelectedTags, tag];
67+
68+
// setHashTag(newSelectedTags);
69+
// return newSelectedTags;
70+
// });
71+
// };
72+
73+
// const handleTagAdd = (newTag: string) => {
74+
// setIsBottomSheetOpen(false);
75+
76+
// setTagList((prevTagList) => {
77+
// if (!prevTagList.includes(newTag)) {
78+
// return [...prevTagList, newTag];
79+
// }
80+
// return prevTagList;
81+
// });
82+
83+
// setSelectedTagList((prevSelectedTags) => {
84+
// if (!prevSelectedTags.includes(newTag)) {
85+
// const newSelectedTags = [...prevSelectedTags, newTag];
86+
// setHashTag(newSelectedTags);
87+
// return newSelectedTags;
88+
// }
89+
// return prevSelectedTags;
90+
// });
91+
// };
92+
5293
const handleSheetClose = () => {
5394
setIsBottomSheetOpen(false);
5495
};
5596

5697
const handleNextClick = () => {
57-
setHashTag(selectedTagList);
98+
// setHashTag(selectedTagList);
5899
navigateToSelectStyle();
59100
};
60101

@@ -74,8 +115,8 @@ const SelectTag = () => {
74115
<Tag
75116
text={tag}
76117
key={tag}
77-
onClick={handleTagClick}
78-
isSelect={selectedTagList.includes(tag)}
118+
onClick={() => handleTagClick(tag)}
119+
isSelect={hashTag.includes(tag)}
79120
/>
80121
))}
81122
<Tag variant="add" onClick={() => setIsBottomSheetOpen(true)} />

src/store/useReviewStore.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,36 @@ interface CreateReviewData {
44
ocrText: string;
55
hashTag: string[];
66
reviewStyle: string;
7+
tagList: string[];
78
}
89

910
interface CreateReviewDataStore {
1011
createReviewData: CreateReviewData;
1112
setOcrText: (ocrText: string) => void;
1213
setHashTag: (hashTag: string[]) => void;
1314
setReviewStyle: (reviewStyle: string) => void;
15+
setTagList: (tagList: string[]) => void;
1416
resetCreateReviewData: () => void;
1517
}
1618

1719
export const CREATE_REVIEW_DATA = {
1820
ocrText: "",
1921
hashTag: [],
2022
reviewStyle: "FRIENDLY",
23+
tagList: [
24+
// 초기 태그 리스트
25+
"음식이 맛있어요",
26+
"양이 많아요",
27+
"가성비가 좋아요",
28+
"메뉴 구성이 알차요",
29+
"매장이 넓어요",
30+
"단체모임 하기 좋아요",
31+
"뷰가 좋아요",
32+
"아늑해요",
33+
"분위기가 좋아요",
34+
"친절해요",
35+
"매장이 청결해요",
36+
],
2137
};
2238

2339
export const useCreateReviewStore = create<CreateReviewDataStore>((set) => ({
@@ -34,5 +50,9 @@ export const useCreateReviewStore = create<CreateReviewDataStore>((set) => ({
3450
set((state) => ({
3551
createReviewData: { ...state.createReviewData, reviewStyle },
3652
})),
53+
setTagList: (tagList: string[]) =>
54+
set((state) => ({
55+
createReviewData: { ...state.createReviewData, tagList },
56+
})),
3757
resetCreateReviewData: () => set({ createReviewData: { ...CREATE_REVIEW_DATA } }),
3858
}));

0 commit comments

Comments
 (0)