{"version":3,"sources":["api/fetchMovies.js","api/fetchMoviePoster.js","images/placeholder-movie-poster.jpg","contexts/MoviesContext.js","images/loading-animation.gif","components/Card/Card.js","views/MovieList/MovieList.view.js","components/Banner/Banner.js","views/Movie/Movie.view.js","views/Movie/Movie.controller.js","views/UserList/UserList.view.js","views/UserList/UserList.controller.js","components/Item/Item.js","views/User/User.view.js","views/User/User.controller.js","components/Menu/Menu.js","App.js","reportWebVitals.js","index.js"],"names":["fetchMovies","searchTerm","a","requestOptions","method","headers","fetch","process","then","response","status","Promise","reject","statusText","json","movies","catch","error","console","fetchMoviePoster","title","year","res","data","poster","Poster","test","e","posterURLUponResolve","MoviesContext","createContext","MoviesProvider","children","useState","setMovies","selectedMovie","setSelectedMovie","useEffect","undefined","all","map","movie","posters","moviesWithPosters","index","Provider","value","Card","pic","shape","className","src","loadingAnimation","alt","MovieListView","useContext","setSearchTerm","inputRef","useRef","containerRef","updateMovies","event","preventDefault","current","scrollTo","focus","ref","type","placeholder","onChange","target","onKeyDown","key","onClick","to","pathname","state","origin","Banner","imgType","subtitle","isMutable","handleTitleChange","handleSubtitleChange","update","id","MovieView","location","navigation","director","wiki_page","crew","genre","plot","handleAddToList","listName","stopPropagation","listItems","JSON","parse","localStorage","getItem","Array","from","Set","setItem","stringify","addToLocalStorage","alert","document","querySelector","href","rel","UserListView","username","setUsername","setPic","watchlist","completed","dropped","favorites","Item","text","deleteCallback","UserView","setLocation","setWatchList","setCompleted","setDropped","setFavorites","removeMovieFromList","storageKeys","updatedList","filter","updateProfile","length","Menu","App","path","component","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.a5b7a4d1.chunk.js","sourcesContent":["/**\n * Attempts to retreive list of movie titles w / year.\n * Returns an array of objects containing \"title\" and \"year\" for movie.\n * @param {String=} searchTerm - Title of movie to retreive.\n */\nexport const fetchMovies = async (searchTerm) => {\n const requestOptions = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n \n const movies = await fetch(`${process.env.REACT_APP_MYMOVIELIST_API_ENDPOINT}/get-movies${searchTerm ? \"?search=\" + searchTerm : \"\"}`, requestOptions)\n .then(response => {\n if (response.status !== 200) {\n return Promise.reject(`${response.status} ${response.statusText}`);\n };\n\n return response.json();\n })\n .then(movies => movies)\n .catch(error => {\n console.error(error);\n\n return [];\n });\n\n return movies;\n };","import placeholderPoster from \"../images/placeholder-movie-poster.jpg\"\n\nconst apiKey = process.env.REACT_APP_OMDB_API_KEY;\n\n/**\n * Attempts to retreive url for movie poster via www.omdbapi.com API\n * Returns Promise object that resolves to url for movie poster\n * @param {String} title - Title of movie to retreive poster for.\n * @param {String} year - Year movie released for movie to retreive poster for.\n */\nexport const fetchMoviePoster = async (title, year) => {\n const posterURLUponResolve = await fetch(`https://www.omdbapi.com/?apikey=${apiKey}&t=${title}&y=${year}`)\n .then(res => res.json())\n .then((data) => {\n const poster = data.Poster;\n\n if (!poster || /^http/.test(poster) === false) {\n return Promise.reject(`No poster found for ${title} ${year}`);\n }\n\n return poster;\n })\n .catch(e => {\n // console.log(e);\n\n return placeholderPoster;\n });\n\n return posterURLUponResolve;\n}","export default \"data:image/jpeg;base64,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\"","// React\nimport { createContext, useState, useEffect } from \"react\";\n\n// API\nimport { fetchMovies } from '../api/fetchMovies';\nimport { fetchMoviePoster } from \"../api/fetchMoviePoster\";\n\nexport const MoviesContext = createContext();\n\nexport default function MoviesProvider({children}) {\n const [movies, setMovies] = useState([]);\n const [selectedMovie, setSelectedMovie] = useState();\n\n useEffect(() => {\n fetchMovies()\n .then((movies) => {\n setMovies(movies);\n })\n .catch(e => console.error(e));\n // eslint-disable-next-line\n }, []);\n\n useEffect(() => {\n // Needed to avoid undefined error.\n if (movies[0] !== undefined) {\n // Checks to see if current array of movies have a .poster property.\n const hasAlreadyFetchedPosters = movies[0].poster;\n\n // Essentially assigns .poster property to movies array.\n // Checks to see if property exists already before running as to avoind infinite loop.\n if (!hasAlreadyFetchedPosters) {\n // Fetches all posters at once, but only resolves when all fetches are complete.\n Promise.all(\n [...movies].map(movie => fetchMoviePoster(movie.title, movie.year))\n )\n .then(posters => {\n const moviesWithPosters = [...movies].map((movie, index) => {\n return { ...movie, \"poster\": posters[index] };\n })\n\n setMovies(moviesWithPosters);\n setSelectedMovie(moviesWithPosters[0]);\n })\n .catch(e => console.error(e))\n ;\n }\n }\n }, [movies]);\n\n return (\n \n {children}\n \n )\n}","export default __webpack_public_path__ + \"static/media/loading-animation.96b6ce3e.gif\";","import './Card.css';\n\nimport loadingAnimation from \"../../images/loading-animation.gif\";\n\nexport default function Card({ title, pic, shape = \"rect\" }) {\n return (\n \n \n

{title}

\n \n );\n }","// React\nimport { useEffect,\n useState,\n useRef,\n useContext\n} from 'react';\nimport { NavLink } from 'react-router-dom';\n\n// Styles\nimport './MovieList.view.css';\n\n// Context\nimport { MoviesContext } from '../../contexts/MoviesContext';\n\n// Components\nimport Card from '../../components/Card/Card';\n\n// API\nimport { fetchMovies } from '../../api/fetchMovies';\n\n// Icons\nimport { CgSearch } from \"react-icons/cg\";\n\nexport default function MovieListView() {\n const { movies, setMovies } = useContext(MoviesContext);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const inputRef = useRef();\n const containerRef = useRef();\n\n const updateMovies = async (event) => {\n event.preventDefault();\n\n const movies = await fetchMovies(searchTerm)\n .then(movies => movies)\n .catch(e => console.error(e));\n \n setMovies(movies);\n }\n\n useEffect(() => {\n containerRef.current.scrollTo(0, 0); // Scroll to top of page.\n inputRef.current.focus();\n }, []);\n\n return (\n
\n
\n

Movies

\n
\n setSearchTerm(event.target.value)}\n onKeyDown={event => {\n if (event.key === \"Enter\") updateMovies(event);\n }}\n />\n updateMovies(event)}\n />\n \n
\n
    \n {\n movies.map((movie) => {\n return (\n \n \n \n\n )\n })\n }\n
\n
\n );\n}","// Styles\nimport './Banner.css';\n\nexport default function Banner({ title, pic, imgType, subtitle, isMutable, handleTitleChange, handleSubtitleChange, update }) {\n return (\n
\n {title}\n
\n {\n isMutable\n ? <>\n handleTitleChange(e)} />\n handleSubtitleChange(e)} />\n update()}\n >\n Update\n \n \n : <>\n

\n {title}\n

\n

\n {subtitle}\n

\n \n }\n
\n
\n );\n}","// React\nimport { useContext, useEffect, useRef } from 'react';\n\n// Components\nimport Banner from '../../components/Banner/Banner';\n\n// Styles\nimport './Movie.view.css';\n\n// Context\nimport { MoviesContext } from '../../contexts/MoviesContext';\n\n// Controller\nimport { addToLocalStorage } from './Movie.controller';\n\nexport default function MovieView({ location, navigation }) {\n const { selectedMovie, setSelectedMovie } = useContext(MoviesContext);\n const { \n title,\n year,\n poster,\n director,\n origin,\n wiki_page,\n crew,\n genre,\n plot\n } = selectedMovie ? selectedMovie : {};\n\n const containerRef = useRef();\n\n const handleAddToList = (event, listName) => {\n event.stopPropagation();\n\n addToLocalStorage(listName, title);\n alert(`Added \"${title}\" to ${listName}.`);\n }\n\n useEffect(() => {\n document.querySelector(\".content\").scrollTo(0, 0);\n \n if (location.state) {\n setSelectedMovie(location.state);\n }\n // eslint-disable-next-line\n }, []);\n\n return (\n
\n \n
\n \n \n \n \n
\n

\n {plot}\n

\n
    \n
  • \n

    Cast

    \n

    {crew}

    \n
  • \n
  • \n

    Director

    \n

    {director}

    \n
  • \n
  • \n

    Origin

    \n

    {origin}

    \n
  • \n
  • \n

    Genre

    \n

    {genre}

    \n
  • \n
\n \n \n

Wiki

\n \n
\n );\n}\n","export const addToLocalStorage = (listName, movie) => {\n let listItems = JSON.parse(localStorage.getItem(listName)) || [];\n listItems = Array.from(\n new Set([...listItems, movie])\n );\n\n localStorage.setItem(listName, JSON.stringify(listItems));\n}","// React\nimport { useEffect, useState, useRef } from 'react';\n\n// Styles\nimport './UserList.view.css';\n\n// Controllers\nimport { init } from './UserList.controller';\n\n// Components\nimport Card from '../../components/Card/Card';\n\nexport default function UserListView() {\n const [username, setUsername] = useState(\"\");\n const [pic, setPic] = useState(\"\");\n const containerRef = useRef();\n\n useEffect(() => {\n containerRef.current.scrollTo(0, 0); // Scroll to top of page.\n init();\n\n const {\n username,\n pic\n } = JSON.parse(localStorage.getItem(\"profile\"));\n\n setUsername(username);\n setPic(pic);\n }, []);\n\n return (\n
\n

Just you

\n \n
\n );\n}","export const init = () => {\n const profile = localStorage.getItem(\"profile\");\n\n if (!profile) {\n const username = \"demo user\";\n const pic = \"https://images.pexels.com/photos/4681107/pexels-photo-4681107.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1\";\n const location = \"Saint Louis, MO\";\n const watchlist = [];\n const completed = [];\n const dropped = [];\n const favorites = [];\n\n localStorage.setItem(\"profile\", JSON.stringify({ username, pic, location, watchlist, completed, dropped, favorites }));\n }\n}","import './Item.css';\n\nexport default function Item({ listName, text, deleteCallback }) {\n return (\n \n

{text}

\n deleteCallback(e, listName, text)}\n >\n x\n \n \n );\n }","// React\nimport { useEffect, useState, useRef } from 'react';\n\n// Controllers\nimport {\n init,\n updateProfile\n} from \"./User.controller\";\n\n// Styles\nimport './User.view.css';\n\n// Components\nimport Banner from '../../components/Banner/Banner';\nimport Item from '../../components/Item/Item';\n\nexport default function UserView() {\n const [username, setUsername] = useState(\"\");\n const [pic, setPic] = useState(\"\");\n const [location, setLocation] = useState(\"\");\n const [watchlist, setWatchList] = useState([]);\n const [completed, setCompleted] = useState([]);\n const [dropped, setDropped] = useState([]);\n const [favorites, setFavorites] = useState([]);\n\n const containerRef = useRef();\n\n const handleTitleChange = (e) => {\n const value = e.target.value;\n\n setUsername(value);\n }\n\n const handleSubtitleChange = (e) => {\n const value = e.target.value;\n\n setLocation(value);\n }\n\n const update = () => {\n updateProfile({ username, pic, location });\n alert(\"Username and location updated.\");\n }\n\n const removeMovieFromList = (e, listName, text) => {\n const storageKeys = {\n \"favorites\": setFavorites,\n \"watchlist\": setWatchList,\n \"completed\": setCompleted,\n \"dropped\": setDropped\n };\n const list = JSON.parse(localStorage.getItem(listName));\n const updatedList = list.filter(title => title !== text);\n\n storageKeys[listName](updatedList);\n localStorage.setItem(listName, JSON.stringify(updatedList));\n }\n\n useEffect(() => {\n containerRef.current.scrollTo(0, 0); // Scroll to top of page.\n init();\n\n const {\n username,\n pic,\n location\n } = JSON.parse(localStorage.getItem(\"profile\"));\n\n setUsername(username);\n setPic(pic);\n setLocation(location);\n\n setWatchList(JSON.parse(localStorage.getItem(\"watchlist\")) || []);\n setCompleted(JSON.parse(localStorage.getItem(\"completed\")) || []);\n setDropped(JSON.parse(localStorage.getItem(\"dropped\")) || []);\n setFavorites(JSON.parse(localStorage.getItem(\"favorites\")) || []);\n }, []);\n\n return (\n
\n \n
    \n
  • \n

    Favorites

    \n
      \n {\n favorites.length > 0\n ? favorites.map(e => \n \n )\n :
    • \n

      \n Nothing added to favorites.\n

      \n
    • \n }\n
    \n
  • \n
  • \n

    Watchlist

    \n
      \n {\n watchlist.length > 0\n ? watchlist.map(e => \n \n )\n :
    • \n

      \n Nothing added to watchlist.\n

      \n
    • \n }\n
    \n
  • \n
  • \n

    Completed

    \n
      \n {\n completed.length > 0\n ? completed.map(e => \n \n )\n :
    • \n

      \n Nothing added to completed.\n

      \n
    • \n }\n
    \n
  • \n
  • \n

    Dropped

    \n
      \n {\n dropped.length > 0\n ? dropped.map(e => \n \n )\n :
    • \n

      \n Nothing added to dropped.\n

      \n
    • \n }\n
    \n
  • \n
\n
\n );\n}","export const init = () => {\n const profile = localStorage.getItem(\"profile\");\n\n if (!profile) {\n const username = \"Demo User\";\n const pic = \"https://images.pexels.com/photos/4681107/pexels-photo-4681107.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1\";\n const location = \"Saint Louis, MO\";\n\n localStorage.setItem(\"profile\", JSON.stringify({ username, pic, location }));\n }\n}\n\nexport const updateProfile = ({ username, pic, location }) => {\n localStorage.setItem(\"profile\", JSON.stringify({ username, pic, location }));\n}","import { NavLink } from 'react-router-dom';\n\n// Icons\nimport { \n CgFilm,\n CgProfile,\n CgUserList\n } from \"react-icons/cg\";\n\n// Styles\nimport './Menu.css';\n\nexport default function Menu() {\n return (\n
\n

\n \n MyMovieList\n

\n
    \n \n
  • \n \n Profile\n
  • \n
    \n \n
  • \n \n Movies\n
  • \n
    \n \n
  • \n \n Users\n
  • \n
    \n
\n
\n );\n}","// React\nimport React from 'react';\nimport { \n HashRouter, \n Route, \n Redirect, \n Switch \n} from 'react-router-dom';\n\n// Styles\nimport './reset.css';\nimport './App.css';\n\n// Context\nimport MoviesProvider from \"./contexts/MoviesContext\";\n\n// Views\nimport MovieListView from './views/MovieList/MovieList.view';\nimport MovieView from './views/Movie/Movie.view';\nimport UserListView from './views/UserList/UserList.view';\nimport UserView from './views/User/User.view';\n\n// Components\nimport Menu from './components/Menu/Menu';\n\nexport default function App() {\n return (\n
\n \n \n
\n \n \n \n \n \n \n \n \n \n
\n \n
\n );\n}","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}