Skip to content

Commit 2a8efa2

Browse files
committed
feat(search): 키워드 검색 기능 구현 (TMDB 연동, 디바운스)
1 parent d944996 commit 2a8efa2

File tree

12 files changed

+54
-48
lines changed

12 files changed

+54
-48
lines changed

src/Layout.jsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { Outlet } from "react-router-dom";
2-
import NavigationBar from "./components/NavigationBar.jsx";
32

43
export default function Layout() {
54
return (
65
<div>
7-
<NavigationBar />
86
<div>
97
<Outlet />
108
</div>

src/pages/DetailPage.jsx

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import styled from "styled-components";
22

3+
import NavigationBar from "./components/NavigationBar";
4+
35
import { useParams } from "react-router-dom";
46

5-
import useTmdbDetailData from "../data/hooks/useTmdbDetailData";
7+
import useTmdbDetailData from "./data/hooks/useTmdbDetailData";
68

79
// <-------------------- function -------------------->
810

@@ -14,20 +16,23 @@ export default function DetailPage() {
1416
// <-------------------- return -------------------->
1517

1618
return (
17-
<Detail>
18-
<Poster
19-
className="poster"
20-
src={`https://image.tmdb.org/t/p/w500${tmdbDetail.backdrop_path}`}
21-
alt={tmdbDetail.title}
22-
/>
23-
<Info>
24-
<TitleRating>
25-
<Title>{tmdbDetail.title}</Title>
26-
<Rating>{tmdbDetail.vote_average}</Rating>
27-
</TitleRating>
28-
<Overview>{tmdbDetail.overview}</Overview>
29-
</Info>
30-
</Detail>
19+
<>
20+
<NavigationBar />
21+
<Detail>
22+
<Poster
23+
className="poster"
24+
src={`https://image.tmdb.org/t/p/w500${tmdbDetail.backdrop_path}`}
25+
alt={tmdbDetail.title}
26+
/>
27+
<Info>
28+
<TitleRating>
29+
<Title>{tmdbDetail.title}</Title>
30+
<Rating>{tmdbDetail.vote_average}</Rating>
31+
</TitleRating>
32+
<Overview>{tmdbDetail.overview}</Overview>
33+
</Info>
34+
</Detail>
35+
</>
3136
);
3237
}
3338

src/pages/MainPage.jsx

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
1-
import styled from 'styled-components';
1+
import styled from "styled-components";
2+
import Card from "./components/Card.jsx";
23

3-
import Card from '../components/Card.jsx';
4-
import useTmdbTopData from '../data/hooks/useTmdbTopData.js';
5-
import useTmdbMainData from '../data/hooks/useTmdbMainData.js';
6-
import useTmdbKeywordData from '../data/hooks/useTmdbKeywordData.js';
4+
import useTmdbTopData from "./data/hooks/useTmdbTopData.js";
5+
import useTmdbMainData from "./data/hooks/useTmdbMainData.js";
6+
import useTmdbKeywordData from "./data/hooks/useTmdbKeywordData.js";
77

8-
import NavigationBar from '../components/NavigationBar.jsx';
8+
import { Swiper, SwiperSlide } from "swiper/react";
9+
import { Navigation, Pagination, Autoplay } from "swiper/modules";
10+
import "swiper/css";
11+
import "swiper/css/navigation";
12+
import "swiper/css/pagination";
913

10-
import { Swiper, SwiperSlide } from 'swiper/react';
11-
import { Navigation, Pagination, Autoplay } from 'swiper/modules';
12-
import 'swiper/css';
13-
import 'swiper/css/navigation';
14-
import 'swiper/css/pagination';
15-
import { useSearchParams } from 'react-router-dom';
14+
import { useSearchParams } from "react-router-dom";
15+
import NavigationBar from "./components/NavigationBar.jsx";
1616

1717
// <-------------------- function -------------------->
1818

1919
export default function MainPage() {
20-
const [keyword, setKeyword] = useSearchParams();
20+
const [searchParams] = useSearchParams();
21+
const query = searchParams.get("keyword")?.trim();
22+
2123
const tmdbTop = useTmdbTopData();
22-
const query = keyword.get("keyword")?.trim();
23-
const tmdbMain = query ? useTmdbKeywordData(query) : useTmdbMainData(query);
24+
const tmdbMainData = useTmdbMainData();
25+
const tmdbKeywordData = useTmdbKeywordData(query);
26+
27+
const tmdbData = query ? tmdbKeywordData : tmdbMainData;
2428

2529
// <-------------------- return -------------------->
2630

2731
return (
2832
<>
33+
<NavigationBar />
2934
<Container>
30-
<Top10>TOP 10 🏆</Top10>
35+
<Top10>🏆 TOP 10</Top10>
3136
<Swiper
3237
modules={[Navigation, Pagination, Autoplay]}
3338
navigation
@@ -46,12 +51,12 @@ export default function MainPage() {
4651
))}
4752
</Swiper>
4853

49-
<Popular>Popular ✨</Popular>
50-
<Mainapi>
51-
{tmdbMain.map((api) => (
52-
<Card movie={api} key={api.id} />
54+
<Popular>✨ Popular</Popular>
55+
<MainList>
56+
{tmdbData.map((movie) => (
57+
<Card movie={movie} key={movie.id} />
5358
))}
54-
</Mainapi>
59+
</MainList>
5560
</Container>
5661
</>
5762
);
@@ -75,7 +80,7 @@ const Popular = styled.p`
7580
padding-left: 100px;
7681
`;
7782

78-
const Mainapi = styled.div`
83+
const MainList = styled.div`
7984
display: flex;
8085
flex-wrap: wrap;
8186
justify-content: center;
File renamed without changes.

src/components/NavigationBar.jsx renamed to src/pages/components/NavigationBar.jsx

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import styled from "styled-components";
22
import { Link, useSearchParams } from "react-router-dom";
33
import { useEffect, useState } from "react";
44

5-
import useDebounce from "../data/hooks/useDebounce.js";
5+
import useDebounce from "./hooks/useDebounce.js";
66
import useTmdbKeywordData from "../data/hooks/useTmdbKeywordData.js";
77

88
// <-------------------- function -------------------->
@@ -12,17 +12,18 @@ export default function NavigationBar() {
1212
const keywordParam = searchParams.get("keyword") || "";
1313
const [keyword, setKeyword] = useState(keywordParam);
1414

15-
const debouncedKeyword = useDebounce(keyword, 500);
16-
const searchKeyword = useTmdbKeywordData(debouncedKeyword);
15+
const debouncedKeyword = useDebounce(keyword, 100);
16+
useTmdbKeywordData(debouncedKeyword);
1717

1818
useEffect(() => {
1919
if (keyword.trim() === "") {
20-
searchParams.delete("keyword");
21-
setSearchParams(searchParams);
20+
const params = new URLSearchParams(searchParams);
21+
params.delete("keyword");
22+
setSearchParams(params);
2223
} else {
2324
setSearchParams({ keyword });
2425
}
25-
}, [keyword]);
26+
}, [keyword, searchParams, setSearchParams]);
2627

2728
// <-------------------- return -------------------->
2829

@@ -40,9 +41,6 @@ export default function NavigationBar() {
4041
onChange={(e) => setKeyword(e.target.value)}
4142
/>
4243
</SearchBox>
43-
44-
{/* <-------------------- 검색 결과 표시 */}
45-
4644
<Buttons>
4745
<LoginBtn>로그인</LoginBtn>
4846
<SignupBtn>회원가입</SignupBtn>
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)