Skip to content

Commit

Permalink
Merge pull request #111 from delicious-algorithme/dev
Browse files Browse the repository at this point in the history
fix: 북마크 아이디 저장 로직 수정
  • Loading branch information
Songhyejeong authored Nov 26, 2024
2 parents 33cee28 + 8e66d0d commit 121be9b
Show file tree
Hide file tree
Showing 11 changed files with 93 additions and 102 deletions.
23 changes: 19 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"styled-components": "^6.1.12",
"styled-reset": "^4.5.2",
"sweetalert2": "^11.14.4",
"uuid": "^11.0.3",
"web-vitals": "^2.1.4",
"zustand": "^4.5.5"
},
Expand Down
18 changes: 18 additions & 0 deletions src/apis/api/bookmarks.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,21 @@ export const deleteBookmarkStore = async (id) => {
};
}
};

export const getAllBookmarksIds = async () => {
try {
const { data, status } = await defaultInstance.get('/api/bookmarks/ids', {
withCredentials: true,
});
return {
data,
status,
};
} catch (e) {
console.log(e);
return {
error: e.response.data.detail,
status: e.response.status,
};
}
};
33 changes: 18 additions & 15 deletions src/components/bookmark/Bookmarks.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,12 @@ import { Loading } from '../common';

const Bookmarks = () => {
const [stores, setStores] = useState([]);
const { setSaveBookmarkId, setBookmarkStore } = useSaveBookmarkId();
const [isTimeout, setIsTimeout] = useState(false);
const { setBookmarkStore } = useSaveBookmarkId();

const navigate = useNavigate();
const { ref, inView } = useInView();

useEffect(() => {
if (stores.length > 0) {
const saveBookmarkId = stores.map((store) => store.bookmarkId);
const bookmarkIds = [...new Set(saveBookmarkId)];
setSaveBookmarkId(bookmarkIds);
}
// eslint-disable-next-line
}, [stores]);

const fetchBookmarkStores = async ({ pageParam = 0 }) => {
const auth = JSON.parse(localStorage.getItem('auth')) || {};
if (!auth.state.isLoggedIn) {
Expand Down Expand Up @@ -67,21 +59,32 @@ const Bookmarks = () => {
// eslint-disable-next-line
}, [data]);

const handleClickScrap = () => {
navigate('/webmap');
};
useEffect(() => {
if (isLoading) {
const timeout = setTimeout(() => {
setIsTimeout(true);
navigate('/*');
}, 5000);
return () => clearTimeout(timeout);
}
}, [isLoading, navigate]);

if (isTimeout) {
return null;
}

const handleClickScrap = () => navigate('/webmap');

return (
<BookmarkLayout>
{!isLoading &&
bookmarkStores.length > 0 &&
bookmarkStores.map((store) => (
<TopStoreCard
bookmarkId={store.bookmarkId}
address={store.storeResponseDto.address}
key={store.storeResponseDto.storeId}
storeId={store.storeResponseDto.storeId}
image={store.storeResponseDto.imageUrls}
id={store.storeResponseDto.storeId}
positiveRatio={store.storeResponseDto.positiveRatio}
keyword={store.storeResponseDto.positiveKeywords}
name={store.storeResponseDto.name}
Expand Down
43 changes: 13 additions & 30 deletions src/components/common/bookmark/BookmarkContainer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,27 @@ import { ReactComponent as SavedBookmarkIcon } from '../../../assets/Icon/detail
import { deleteBookmarkStore, postBookmarkStore } from '../../../apis/api/bookmarks';
import { useNavigate } from 'react-router-dom';
import styled from 'styled-components';
import { getBookmarksStores } from '../../../apis/api/bookmarks';
import { getAllBookmarksIds } from '../../../apis/api/bookmarks';
import { useSaveBookmarkId } from '../../../store';
import { useState, useEffect } from 'react';
import { useState } from 'react';

const BookmarkContainer = ({ bookmarkId, storeId }) => {
const [stores, setStores] = useState([]);
const { savedId, setSaveBookmarkId, setBookmarkStore } = useSaveBookmarkId();
const BookmarkContainer = ({ storeId }) => {
const { savedId, setSaveBookmarkId } = useSaveBookmarkId();
const [isLoading, setIsLoading] = useState(false);
const auth = JSON.parse(localStorage.getItem('auth')) || {};
const isSaved = savedId.includes(bookmarkId) && auth.state.isLoggedIn;
const isSaved = savedId.some((item) => item.storeId === storeId && auth.state.isLoggedIn);

const navigate = useNavigate();

useEffect(() => {
if (stores.length > 0) {
const saveBookmarkId = stores.map((store) => store.bookmarkId);
const bookmarkIds = [...new Set(saveBookmarkId)];
setSaveBookmarkId(bookmarkIds);
}
// eslint-disable-next-line
}, [stores]);

const handleClickBookmarks = async (e) => {
e.preventDefault();
if (!auth.state.isLoggedIn) {
navigate('/login');
}
try {
if (isSaved) {
const response = await deleteBookmarkStore(bookmarkId);
const bookmarkIdIndex = savedId.find((item) => item.storeId === storeId);
const response = await deleteBookmarkStore(bookmarkIdIndex.bookmarkId);
if (response.status === 204) {
console.log('success delete');
getAllBookmarksStores();
Expand All @@ -57,21 +48,13 @@ const BookmarkContainer = ({ bookmarkId, storeId }) => {
}
try {
setIsLoading(true);
let page = 0;
let allData = [];
let hasMoreData = true;
while (hasMoreData) {
const response = await getBookmarksStores(page);
if (response.status === 200) {
allData = allData.concat(response.data.content);
hasMoreData = response.data.last !== true;
page++;
} else {
navigate('/login');
}
const response = await getAllBookmarksIds();
if (response.status === 200) {
const bookmarkStoreIds = response.data;
setSaveBookmarkId(bookmarkStoreIds);
} else {
navigate('/login');
}
setStores(allData);
setBookmarkStore(allData);
} catch (error) {
console.log(error);
} finally {
Expand Down
3 changes: 2 additions & 1 deletion src/components/common/keyword/Keyword.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import styled from 'styled-components';
import { DarkGreen, Orange } from '../../../color';
import { v4 as uuidv4 } from 'uuid';

const Keyword = ({ keyword, type, mode }) => {
if (!keyword) {
Expand All @@ -11,7 +12,7 @@ const Keyword = ({ keyword, type, mode }) => {
<KeywordBox>
{keywordItem.map((item) => {
return (
<KeywordTag mode={mode} type={type} key={type}>
<KeywordTag mode={mode} type={type} key={uuidv4()}>
<p>#{item}</p>
</KeywordTag>
);
Expand Down
7 changes: 1 addition & 6 deletions src/components/common/store/StoreCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,9 @@ import { ReactComponent as Star } from '../../../assets/Icon/detail/Star.svg';
import { DarkGreen, DarkGrey, LightGrey, Orange } from '../../../color';
import { LocationOn } from '@mui/icons-material';
import { useNavigate } from 'react-router-dom';
import { useSaveBookmarkId } from '../../../store';

const StoreListCard = ({ image, alt, id, name, address, rating, positiveRatio, positiveKeywords }) => {
const navigate = useNavigate();
const { savedStores } = useSaveBookmarkId();

const bookmark = savedStores.find((store) => store.storeResponseDto.storeId === id);
const bookmarkId = bookmark?.bookmarkId;

const cardClickHandler = () => {
navigate(`/webmap/storeDetail/${id}`);
Expand All @@ -26,7 +21,7 @@ const StoreListCard = ({ image, alt, id, name, address, rating, positiveRatio, p
<ContentsBox>
<NameAndBookmarkContainer>
<p onClick={() => cardClickHandler(id)}>{name}</p>
<Bookmark bookmarkId={bookmarkId} storeId={id} />
<Bookmark storeId={id} />
</NameAndBookmarkContainer>
<RatingContainer>
<Star />
Expand Down
2 changes: 1 addition & 1 deletion src/components/main/TopRecommendations.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ const TopRecommendations = () => {
<TopStoreCard
image={store.imageUrls}
address={store.address}
id={store.storeId}
storeId={store.storeId}
positiveRatio={store.positiveRatio}
keyword={store.positiveKeywords}
name={store.name}
Expand Down
19 changes: 6 additions & 13 deletions src/components/storeCard/TopStoreCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,24 @@ import styled from 'styled-components';
import { useNavigate } from 'react-router-dom';
import { Orange, Grey, DarkGrey } from '../../color';
import Bookmark from '../common/bookmark/BookmarkContainer';
import { useSaveBookmarkId } from '../../store';
import { Keyword } from '../common';

const TopStoreCard = ({ image, alt, bookmarkId, id, address, name, keyword }) => {
const TopStoreCard = ({ image, alt, storeId, address, name, keyword }) => {
const navigate = useNavigate();
const { savedStores } = useSaveBookmarkId();

if (!bookmarkId) {
const bookmark = savedStores.find((store) => store.storeResponseDto.storeId === id);
bookmarkId = bookmark?.bookmarkId;
}

const cardClickHandler = (id) => {
navigate(`/webmap/storeDetail/${id}`, { state: { detailVisible: true } });
const cardClickHandler = (storeId) => {
navigate(`/webmap/storeDetail/${storeId}`, { state: { detailVisible: true } });
};
return (
<StoreCardContainer>
<ImageContainer onClick={() => cardClickHandler(id)}>
<ImageContainer onClick={() => cardClickHandler(storeId)}>
<img src={image} width="100%" height="auto" alt={alt} />
</ImageContainer>
<ContentsContainer>
<Keyword keyword={keyword} mode="card" type="positive" />
<NameAndBookmarkContainer>
<p onClick={() => cardClickHandler(id)}>{name}</p>
<Bookmark bookmarkId={bookmarkId} storeId={id} />
<p onClick={() => cardClickHandler(storeId)}>{name}</p>
<Bookmark storeId={storeId} />
</NameAndBookmarkContainer>
<Location>
<p>
Expand Down
42 changes: 12 additions & 30 deletions src/pages/MainPage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@ import { ReactComponent as Banner } from '../assets/Icon/banner/Banner.svg';
import { useIsFetch, useSaveBookmarkId } from '../store';
import { CategoryAndMap, SearchKeyword, TopRecommendations } from '../components/main';
import { SearchBar, Button, Footer } from '../components/common';
import { getBookmarksStores } from '../apis/api/bookmarks';
import { getAllBookmarksIds } from '../apis/api/bookmarks';

const MainPage = () => {
const [searchInput, setSearchInput] = useState();
const navigate = useNavigate();
const [stores, setStores] = useState([]);
const { setIsFetchAll } = useIsFetch();
const { setBookmarkStore, setSaveBookmarkId } = useSaveBookmarkId();
const { setSaveBookmarkId } = useSaveBookmarkId();

const onChangeHandler = (e) => {
setSearchInput(e.target.value);
Expand Down Expand Up @@ -40,40 +39,23 @@ const MainPage = () => {
// eslint-disable-next-line
}, []);

useEffect(() => {
if (stores.length > 0) {
const saveBookmarkId = stores.map((store) => store.bookmarkId);
const bookmarkIds = [...new Set(saveBookmarkId)];
setSaveBookmarkId(bookmarkIds);
}
// eslint-disable-next-line
}, [stores]);

const buttonClickHandler = () => {
navigate('/webmap');
};

const getAllBookmarksStores = async () => {
try {
let page = 0;
let allData = [];
let hasMoreData = true;
while (hasMoreData) {
const response = await getBookmarksStores(page);
if (response.status === 200) {
allData = allData.concat(response.data.content);
hasMoreData = response.data.last !== true;
page++;
} else if (response.status === 401) {
navigate('/login');
} else if (response.status === 404) {
navigate('/*');
} else {
navigate('/');
}
const response = await getAllBookmarksIds();
if (response.status === 200) {
const bookmarkIds = response.data;
setSaveBookmarkId(bookmarkIds);
} else if (response.status === 401) {
navigate('/login');
} else if (response.status === 404) {
navigate('/*');
} else {
navigate('/');
}
setBookmarkStore(allData);
setStores(allData);
} catch (error) {
console.log(error);
} finally {
Expand Down
4 changes: 2 additions & 2 deletions src/store/useSaveBookmarkId.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ const useSaveBookmarkId = create(
persist(
(set) => ({
savedId: initialBookmarkId,
setSaveBookmarkId: (bookmarkId) => {
set({ savedId: bookmarkId });
setSaveBookmarkId: (data) => {
set({ savedId: data });
},
savedStores: [],
setBookmarkStore: (stores) => {
Expand Down

0 comments on commit 121be9b

Please sign in to comment.