MOVIE와 TV의 api에서 전달해주는 데이터의 타입명이 달라서 분리
├── Routes
│ ├── Home.tsx
│ ├── Search.tsx
│ └── Tv.tsx
├── components
│ ├── Header.tsx
│ ├── movie
│ │ ├── LatestMovie.tsx
│ │ ├── ModalMovieDetailInfo.tsx
│ │ ├── MovieBanner.tsx
│ │ └── MovieSlider.tsx
│ ├── search
│ │ ├── ModalSearchedMovieDetailInfo.tsx
│ │ └── ModalSearchedTvDetailInfo.tsx
│ └── tv
│ ├── LatestTv.tsx
│ ├── TvBanner.tsx
│ ├── TvModalDetail.tsx
│ └── TvSlider.tsx
//Home.tsx
<Container>
<MovieBanner movies={nowPlaying.data?.results[0]} />
<TopSliderWrapper>
<Title>NOW PLAYING</Title>
<MovieSlider //슬라이드1
type={movieType.now_playing}
movies={nowPlaying.data?.results}
/>
</TopSliderWrapper>
<LatestMovie />
<SliderWrapper>
<Title>UPCOMING</Title>
<MovieSlider // 슬라이드2
type={movieType.upcoming}
movies={upComing.data?.results}
/>
</SliderWrapper>
<SliderWrapper>
<Title>TopRated</Title>
<MovieSlider // 슬라이드2
type={movieType.top_rated}
movies={topRated.data?.results}
/>
</SliderWrapper>
<AnimatePresence>
{isMatchedModalMovie ? ( // 모달
<ModalMovieDetailInfo
movietype={movietype}
movieId={movieId}
movies={ // 내가 누른 박스는 어느 슬라이드?
movietype === movieType.now_playing
? nowPlaying.data?.results
: movietype === movieType.upcoming
? upComing.data?.results
: movietype === movieType.top_rated
? topRated.data?.results
: []
}
scrollY={scrollY.get()}
/> ) : null}
</AnimatePresence>
</Container>
처음에는 <Modal> 컴포넌트를 Home, Tv 페이지에 <Slide> 컴포넌트와 나란히 위치하게 해서 layoutID 값을 어떻게 줄지 고민함
⇒ 내가 누른 슬라이더가 어떤 슬라이더인지 모달은 어떻게 알지?
⇒ 리코일을 써서 넘겨주자
// MovieSlider.tsx
const handleBoxClick = (movieId: number) => {
if (type) setMovietype(type);
navigate(`movies/${movieId}`);
};
⇒ 그런데 꼭 전역으로 상태관리를 해야할까?
export const movieTypeState = atom({
key: "movieType",
default: "",
});
export const tvTypeState = atom({
key: "tvType",
default: "",
});
export enum movieType {
now_playing = "now_playing",
latest = "latest",
upcoming = "upcoming",
top_rated = "top_rated",
searched = "searched",
}
//Home.tsx
<AnimatePresence>
{isMatchedModalMovie ? (
<ModalMovieDetailInfo
movietype={movietype}
movieId={movieId}
movies={
movietype === movieType.now_playing
? nowPlaying.data?.results
: movietype === movieType.upcoming
? upComing.data?.results
: movietype === movieType.top_rated
? topRated.data?.results
: []
}
scrollY={scrollY.get()}
/>
) : null}
</AnimatePresence>
//MovieSlider.tsx
return (
<>
<Wrrapper>
<AnimatePresence>
<Row>
{movies &&
movies
.slice(1)
.slice(offest * index, offest * index + offest)
.map(movie => (
<Box>
<Info variants={infoVariants}>
</Info>
</Box>
))}
</Row>
</AnimatePresence>
<LARR />
</LARR>
<RARR />
</RARR>
</Wrrapper>
<AnimatePresence>
{isMatchedModalMovie && type ? (
<ModalMovieDetailInfo
movietype={type}
movieId={movieId}
movies={movies}
scrollY={scrollY.get()}
/>
) : null}
</AnimatePresence>
</>
);
}
모달이 슬라이더 기준으로 렌더링 되고있음!!! ⇒ 수정 필요

SEARCH 페이지만들고 검색된 MOVIE, TV 슬라이더가 나오는 것을 확인했으니 과제 제출!