Skip to content

Latest commit

 

History

History
156 lines (142 loc) · 4.21 KB

NOTES.md

File metadata and controls

156 lines (142 loc) · 4.21 KB

Initialize

mkdir Header Footer Home MovieCard MoiveDetail MovieList
// app/store.js
import { configureStore } from '@reduxjs/toolkit'

export const store = configureStore({
  reducer: {},
})
// index.js
import { store } from './app/store'
import { Provider } from 'react-redux'

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)
// features/movies/movieSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'
import axios from 'axios';

const url = "https://omdbapi.com/";
const apiKey = "48fa6eaf";

export const fetchAsyncMovies = createAsyncThunk("movies/fetchAsyncMovies", async (term) => {
    return await axios.get(`${url}?apiKey=${apiKey}&s=${term}&type=movie`)
            .then(res => res.data);
})

const initialState = {
  movies: {},
  shows: {},
  item: {},
}

export const movieSlice = createSlice({
  name: 'movies',
  initialState,
  reducers: {
    addMovies: (state,{payload}) => {
        state.movies = payload;
    },
    removeSelectedItem: state => {
        state.item={};
    }
  },
  extraReducers: {
    [fetchAsyncMovies.pending]:()=>{
        console.log("pending");
    },
    [fetchAsyncMovies.fulfilled]:(state,{payload}) => {
        console.log("fetched successfully");
        return {...state,movies:payload};
    },
  }
})

// Action creators are generated for each case reducer function
export const { removeSelectedItem } = movieSlice.actions
export const getAllMovies = (state) => state.movies.movies;
export default movieSlice.reducer
// app/store.js
import { configureStore } from '@reduxjs/toolkit'
import movieReducer from '../features/movies/movieSlice'

export const store = configureStore({
  reducer: {
    movies: movieReducer,
  },
})
// components/Home/Home.jsx
import { useEffect } from 'react';
import MovieList from '../MovieList/MovieList';
import {useDispatch} from 'react-redux';
import { fetchAsyncMovies } from '../../features/movies/movieSlice';

export default function Home() {
  const dispatch = useDispatch();
  const movieText = "Harry";
  const showText = "Friends";

  useEffect(() => {
    dispatch(fetchAsyncMovies(movieText));
  },[dispatch]);

  return (
    <div>
      <div className="banner-img"></div>
      <MovieList/>
    </div>
  )
}

Use Redux State, useSelector

// components/MovieList/MovieList.jsx
import {useSelector} from "react-redux";
import {getAllMovies} from "../../features/movies/movieSlice";
import MovieCard from "../MovieCard/MovieCard";

export default function MovieList() {
  const movies = useSelector(getAllMovies);

  const renderMovies = movies.Response === "True" ? (
    movies.Search.map((movie, index) => (
      <MovieCard key={index} movie={movie}/>
    ))
  ) : (<div className="movie-error"> <h3>{movies.Error}</h3> </div>
  );

  return (
    <div className="movie-wrapper">
      <div className="movie-list">
        <div className="movie-container">{renderMovies}</div>
      </div>
    </div>
  )
}

Using Props(No Syntax Change)

export default function MovieCard({movie}) {
  return (
    <div className='card-item'>
      <div className='card-inner'>
        <div className='card-top'>
          <img src = {movie.Poster} alt={movie.Title}/>
        </div>
        <div className='card-bottom'>
          <div className='card-info'>
            <h4>{movie.Title}</h4>
            <p>{movie.Year}</p>
          </div>
        </div>
      </div>
    </div>
  )
}