set movie details types

This commit is contained in:
andres alcocer
2022-11-26 12:26:07 -05:00
parent a023650751
commit 907500f0f5
10 changed files with 118 additions and 82 deletions

View File

@@ -4,10 +4,24 @@ import SwiperCore, { Navigation, Pagination, Scrollbar, A11y } from 'swiper'
import { useViewport } from '../hooks/useViewport' import { useViewport } from '../hooks/useViewport'
import { IMovieDetails } from '../store/slices/movieDetailsSlice'
interface IDisplayMovie {
title: string
isNetflixMovies?: boolean
movies: IMovieDetails[]
selectMovieHandler?: (movie: IMovieDetails) => void
}
// install Swiper components // install Swiper components
SwiperCore.use([Navigation, Pagination, Scrollbar, A11y]) SwiperCore.use([Navigation, Pagination, Scrollbar, A11y])
const DisplayMovieRow = ({ title, isNetflixMovies, movies, selectMovieHandler }) => { const DisplayMovieRow = ({
title,
isNetflixMovies,
movies,
selectMovieHandler,
}: IDisplayMovie) => {
const [windowDimensions] = useViewport() const [windowDimensions] = useViewport()
const { width } = windowDimensions const { width } = windowDimensions

View File

@@ -1,14 +1,17 @@
import React, { useEffect } from 'react' import React, { useEffect } from 'react'
import * as actionMovies from '../store/slices/actionMovieSlice' import * as actionMoviesSlice from '../store/slices/actionMovieSlice'
import * as movieDetailsSlice from '../store/slices/movieDetailsSlice'
import * as netflixOriginalsSlice from '../store/slices/netflixOriginalsSlice'
import * as trendingSlice from '../store/slices/trendingSlice'
import { useAppSelector, useAppDispatch } from '../store' import { useAppSelector, useAppDispatch } from '../store'
import Header from './Header' import Header from './Header'
import DisplayMovieRow from './DisplayMovieRow' import DisplayMovieRow from './DisplayMovieRow'
const MainContent = ({ selectMovieHandler }) => { const MainContent = ({ selectMovieHandler }: { selectMovieHandler: any }) => {
// const { movieDetails } = useSelector((state) => state.movieDetails) const { movieDetails } = useAppSelector((state) => state.movieDetails)
// const netflixOriginals = useSelector((state) => state.netflixOriginals) const netflixOriginals = useAppSelector((state) => state.netflixOriginals)
// const trending = useSelector((state) => state.trending) const trending = useAppSelector((state) => state.trending)
// const topRated = useSelector((state) => state.topRated) // const topRated = useSelector((state) => state.topRated)
const actionMoviesState = useAppSelector((state) => state.action) const actionMoviesState = useAppSelector((state) => state.action)
// const comedyMovies = useSelector((state) => state.comedy) // const comedyMovies = useSelector((state) => state.comedy)
@@ -19,11 +22,17 @@ const MainContent = ({ selectMovieHandler }) => {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
useEffect(() => { useEffect(() => {
// dispatch(movieActions.fetchMovieDetails('tv', '63351')) // dispatch(movieDetailsSlice.getMovieDetailsAsync('tv', '63351'))
// dispatch(movieActions.fetchNetflixOriginals()) dispatch(
// dispatch(movieActions.fetchTrending()) movieDetailsSlice.getMovieDetailsAsync({
mediaType: 'tv',
mediaId: '63351',
})
)
dispatch(netflixOriginalsSlice.getNetflixOriginalsAsync())
dispatch(trendingSlice.getTrendingAsync())
// dispatch(movieActions.fetchTopRated()) // dispatch(movieActions.fetchTopRated())
dispatch(actionMovies.getActionMoviesAsync()) dispatch(actionMoviesSlice.getActionMoviesAsync())
// dispatch(movieActions.fetchComedyMovies()) // dispatch(movieActions.fetchComedyMovies())
// dispatch(movieActions.fetchHorrorMovies()) // dispatch(movieActions.fetchHorrorMovies())
// dispatch(movieActions.fetchRomanceMovies()) // dispatch(movieActions.fetchRomanceMovies())
@@ -32,9 +41,9 @@ const MainContent = ({ selectMovieHandler }) => {
return ( return (
<div className='container'> <div className='container'>
{/* <Header movie={movieDetails} /> */} <Header movie={movieDetails} />
<div className='movieShowcase'> <div className='movieShowcase'>
{/* <DisplayMovieRow <DisplayMovieRow
isNetflixMovies={true} isNetflixMovies={true}
title='Netflix Originals' title='Netflix Originals'
selectMovieHandler={selectMovieHandler} selectMovieHandler={selectMovieHandler}
@@ -45,7 +54,7 @@ const MainContent = ({ selectMovieHandler }) => {
selectMovieHandler={selectMovieHandler} selectMovieHandler={selectMovieHandler}
movies={trending.data} movies={trending.data}
/> />
<DisplayMovieRow {/* <DisplayMovieRow
title='Top Rated' title='Top Rated'
selectMovieHandler={selectMovieHandler} selectMovieHandler={selectMovieHandler}
movies={topRated.data} movies={topRated.data}

View File

@@ -3,12 +3,13 @@ import React, { useState } from 'react'
import MainContent from '../components/MainContent' import MainContent from '../components/MainContent'
import Modal from '../components/UI/Modal' import Modal from '../components/UI/Modal'
import ModalMovieDetails from '../components/ModalMovieDetails' import ModalMovieDetails from '../components/ModalMovieDetails'
import { IMovieDetails } from '../store/slices/movieDetailsSlice'
const Home = () => { const Home = () => {
const [toggleModal, setToggleModal] = useState(false) const [toggleModal, setToggleModal] = useState(false)
const [movieDetails, setMovieDetails] = useState({}) const [movieDetails, setMovieDetails] = useState<IMovieDetails>()
const selectMovieHandler = async (movie) => { const selectMovieHandler = async (movie: IMovieDetails) => {
setToggleModal(true) setToggleModal(true)
setMovieDetails(movie) setMovieDetails(movie)
} }

View File

@@ -1,8 +1,8 @@
import { configureStore } from '@reduxjs/toolkit' import { configureStore } from '@reduxjs/toolkit'
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux' import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
import TrendingReducer from './slices/reducerTrending' import TrendingReducer from './slices/trendingSlice'
import NetflixOriginalsReducer from './slices/reducerNetflixOriginals' import NetflixOriginalsReducer from './slices/netflixOriginalsSlice'
import TopRatedReducer from './slices/reducerTopRated' import TopRatedReducer from './slices/reducerTopRated'
import ActionMoviesReducer from './slices/actionMovieSlice' import ActionMoviesReducer from './slices/actionMovieSlice'
import ComedyMoviesReducer from './slices/reducerComedyMovies' import ComedyMoviesReducer from './slices/reducerComedyMovies'
@@ -14,8 +14,8 @@ import MovieDetailsReducer from './slices/movieDetailsSlice'
export const store = configureStore({ export const store = configureStore({
reducer: { reducer: {
// trending: TrendingReducer, trending: TrendingReducer,
// netflixOriginals: NetflixOriginalsReducer, netflixOriginals: NetflixOriginalsReducer,
// topRated: TopRatedReducer, // topRated: TopRatedReducer,
action: ActionMoviesReducer, action: ActionMoviesReducer,
// comedy: ComedyMoviesReducer, // comedy: ComedyMoviesReducer,

View File

@@ -1,21 +1,11 @@
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit' import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'
import axios from '../../axios-movies' import axios from '../../axios-movies'
// import { FETCH_ACTION_MOVIES } from '../actions/index'
import { RootState } from '../index' import { RootState } from '../index'
import { IMovieDetails } from './movieDetailsSlice'
// export default function (state = {}, action: any) { const initialState: { data: IMovieDetails[] } = {
// switch (action.type) { data: [],
// case FETCH_ACTION_MOVIES:
// const data = action.payload.data.results
// return { ...state, data }
// default:
// return state
// }
// }
const initialState = {
data: [{}],
} }
export const getActionMoviesAsync = createAsyncThunk< export const getActionMoviesAsync = createAsyncThunk<

View File

@@ -2,14 +2,8 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'
import axios from '../../axios-movies' import axios from '../../axios-movies'
import { RootState } from '../index' import { RootState } from '../index'
import {
FETCH_MOVIE_DETAILS,
FETCH_MOVIE_DETAILS_SUCCESS,
FETCH_MOVIE_DETAILS_FAIL,
} from '../actions/index'
import { string } from 'prop-types'
interface IMovieDetails { export interface IMovieDetails {
backdrop_path?: string backdrop_path?: string
poster_path?: string poster_path?: string
title: any title: any
@@ -34,25 +28,6 @@ const media_type = {
movie: 'movie', movie: 'movie',
} }
// const initialState: IInitialState = {
// isLoading: false,
// movieDetails: [],
// }
// export default function (state = initialState, action: any) {
// switch (action.type) {
// case FETCH_MOVIE_DETAILS:
// return { ...state, isLoading: true }
// case FETCH_MOVIE_DETAILS_FAIL:
// return { ...state, isLoading: false }
// case FETCH_MOVIE_DETAILS_SUCCESS:
// const movieDetails = action.payload.data
// return { ...state, movieDetails, isLoading: false }
// default:
// return state
// }
// }
const initialState: IInitialState = { const initialState: IInitialState = {
isLoading: false, isLoading: false,
movieDetails: { movieDetails: {
@@ -73,9 +48,9 @@ const initialState: IInitialState = {
export const getMovieDetailsAsync = createAsyncThunk< export const getMovieDetailsAsync = createAsyncThunk<
any, any,
string, { mediaType: string; mediaId: string },
{ state: RootState } { state: RootState }
>('movieDetails/getMovieDetailsAsync', async (mediaType, mediaId) => { >('movieDetails/getMovieDetailsAsync', async ({ mediaType, mediaId }) => {
let urlPath let urlPath
if (mediaType === media_type.movie) if (mediaType === media_type.movie)
urlPath = `/movie/${mediaId}?api_key=${process.env.API_KEY}` urlPath = `/movie/${mediaId}?api_key=${process.env.API_KEY}`

View File

@@ -0,0 +1,36 @@
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'
import axios from '../../axios-movies'
import { RootState } from '../index'
import { IMovieDetails } from './movieDetailsSlice'
const initialState: { data: IMovieDetails[] } = {
data: [],
}
export const getNetflixOriginalsAsync = createAsyncThunk<
any,
void,
{ state: RootState }
>('netflixOriginals/getNetflixOriginals', async () => {
const response = await axios.get(
`/discover/tv?api_key=${process.env.API_KEY}&with_networks=213`
)
return response.data.results
})
const netflixOriginalsSlice = createSlice({
name: 'netflixOriginals',
initialState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(
getNetflixOriginalsAsync.fulfilled,
(state, { payload }) => {
state.data = payload
}
)
},
})
export default netflixOriginalsSlice.reducer

View File

@@ -1,11 +0,0 @@
import { FETCH_NETFLIX_ORIGINALS } from '../actions/index'
export default function (state = {}, action: any) {
switch (action.type) {
case FETCH_NETFLIX_ORIGINALS:
const data = action.payload.data.results
return { ...state, data }
default:
return state
}
}

View File

@@ -1,11 +0,0 @@
import { FETCH_TRENDING } from '../actions/index'
export default function (state = {}, action: any) {
switch (action.type) {
case FETCH_TRENDING:
const data = action.payload.data.results
return { ...state, data }
default:
return state
}
}

View File

@@ -0,0 +1,33 @@
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'
import axios from '../../axios-movies'
import { RootState } from '../index'
import { IMovieDetails } from './movieDetailsSlice'
const initialState: { data: IMovieDetails[] } = {
data: [],
}
export const getTrendingAsync = createAsyncThunk<
any,
void,
{ state: RootState }
>('trending/getTrending', async () => {
const response = await axios.get(
`/trending/all/week?api_key=${process.env.API_KEY}&language=en-US`
)
return response.data.results
})
const trendingSlice = createSlice({
name: 'trending',
initialState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(getTrendingAsync.fulfilled, (state, { payload }) => {
state.data = payload
})
},
})
export default trendingSlice.reducer