const [sortingOption, setSortingOption] = useState<string>('popularity'); // 정렬 옵션
const [searchType, setSearchType] = useState('movie'); // 검색 filter 옵션
const [searchMovieValue, setSearchMovieValue] = useState('');
return (
<div>
<div className="flex justify-between h-20">
<Sort sortingOption={sortingOption} setSortingOption={setSortingOption} />
<Search
searchMovieValue={searchMovieValue}
setSearchMovieValue={setSearchMovieValue}
searchType={searchType}
setSearchType={setSearchType}
/>
</div>
<div className="p-8">{contents}</div>
{currentPage < dataList?.total_pages && ( // 다음 페이지가 있는 경우에만 더보기 버튼 표시
<div onClick={fetchMore} className="bg-blue-700 cursor-pointer text-center py-2 text-white">
더보기
</div>
)}
</div>
);
useEffect(() => {
if (searchMovieValue) {
const sortedMovies = sortData(filteredData, sortingOption);
setFilterefData(sortedMovies);
} else {
// 초기화
setDataList([]);
setCurrentPage(1);
fetchMovieData(1);
}
}, [sortingOption]);
useEffect(() => {
fetchMovieData(currentPage);
console.log('검색', searchMovieValue);
}, [currentPage, searchMovieValue]);
&sort_by=~
이런식으로 url을 수정하여 정렬된 상태로 가져올 수 있지만 그 외에는 수동으로 정렬해주어야 하기 때문에 함수를 추가했다.const sortData = (data: TMDBSearchMovie[], sortingOption: string): TMDBSearchMovie[] => {
switch (sortingOption) {
case 'popularity':
return data.slice().sort((a, b) => b.popularity - a.popularity);
case 'primary_release_date':
return data.slice().sort((a, b) => dayjs(b.release_date).diff(dayjs(a.release_date)));
case 'vote_average':
return data.slice().sort((a, b) => b.vote_average - a.vote_average);
default:
return data;
}
};
const fetchMovieData = async (page: number) => {
if (searchMovieValue) {
// 검색 했을 때
const data = await contentPageGetDataSearch(searchMovieValue, searchType, page);
setDataList(data);
if (searchType === 'movie') {
const results = data.results;
if (page === 1) {
setFilterefData([...results]);
} else {
setFilterefData([...filteredData, ...results]);
}
} else {
const results = data.results[0].known_for;
if (page === 1) {
setFilterefData([...results]);
} else {
setFilterefData([...filteredData, ...results]);
}
console.log('영화데이터', results);
}
} else {
// 검색 x
const data = await contentPageGetDataDiscover(sortingOption, formattedCurrentDate, page);
setDataList(data);
const results = data.results;
if (page === 1) {
setFilterefData([...results]);
} else {
setFilterefData([...filteredData, ...results]);
}
}
};
const fetchMovieData = async (page: number) => {
if (searchMovieValue) {
// 검색 했을 때
const data = await contentPageGetDataSearch(searchMovieValue, searchType, page);
setDataList(data);
const results = data.results;
setFilterefData([...filteredData, ...results]);
} else {
// 검색 x
const data = await contentPageGetDataDiscover(sortingOption, formattedCurrentDate, page);
setDataList(data);
const results = data.results;
setFilterefData([...filteredData, ...results]);
}
};
useEffect(() => {
// 초기화
setFilterefData([]);
// console.log(filteredData);
setDataList([]);
setCurrentPage(1);
fetchMovieData(1);
}, [sortingOption, searchMovieValue]);
처음에 저렇게 초기화 후, 다시 fetch하면 될줄 알았는데 한번에 처리해서 그런가 기존 데이터에 계속 붙어서 나왔다.
page가 1일때만 데이터가 처음부터 나오도록 수정하였다.
const fetchMovieData = async (page: number) => {
if (searchMovieValue) {
// 검색 했을 때
const data = await contentPageGetDataSearch(searchMovieValue, searchType, page);
setDataList(data);
const results = data.results;
if (page === 1) {
setFilterefData([...results]);
} else {
setFilterefData([...filteredData, ...results]);
}
} else {
// 검색 x
const data = await contentPageGetDataDiscover(sortingOption, formattedCurrentDate, page);
setDataList(data);
const results = data.results;
if (page === 1) {
setFilterefData([...results]);
} else {
setFilterefData([...filteredData, ...results]);
}
}
};
useEffect(() => {
// 초기화
setDataList([]);
setCurrentPage(1);
fetchMovieData(1);
}, [sortingOption, searchMovieValue]);
리팩토링할 때, query를 사용하여 fetching을 더 쉽게 변경하자
더보기를 했을 경우에 검색을 하면 검색한 결과가 제대로 나타나지 않는다. 이 문제를 해결하고 슬라이더 구현과 핫한 토픽출력만 하면 될 것 같다.