diff --git a/client/package.json b/client/package.json index 1fcae11..6f52f64 100644 --- a/client/package.json +++ b/client/package.json @@ -16,6 +16,7 @@ "react-awesome-reveal": "^3.8.1", "react-dom": "^18.1.0", "react-image-gallery": "^1.2.8", + "react-infinite-scroll-component": "^6.1.0", "react-loader-spinner": "^5.1.5", "react-lottie-player": "^1.4.3", "react-router-dom": "^6.3.0", diff --git a/client/src/assets/images/aboutUsBackground.svg b/client/src/assets/images/aboutUsBackground.svg new file mode 100644 index 0000000..d2a5fc7 --- /dev/null +++ b/client/src/assets/images/aboutUsBackground.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/client/src/assets/images/homeBG1.svg b/client/src/assets/images/homeBG1.svg new file mode 100644 index 0000000..f978ef1 --- /dev/null +++ b/client/src/assets/images/homeBG1.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/client/src/assets/images/homeBG2.svg b/client/src/assets/images/homeBG2.svg new file mode 100644 index 0000000..62ae8ac --- /dev/null +++ b/client/src/assets/images/homeBG2.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/client/src/elements/ModalMovieCard/ModalMovieCard.css b/client/src/elements/ModalMovieCard/ModalMovieCard.css index 3cedcd7..4e6399d 100644 --- a/client/src/elements/ModalMovieCard/ModalMovieCard.css +++ b/client/src/elements/ModalMovieCard/ModalMovieCard.css @@ -13,7 +13,7 @@ /* Movie poster */ .moviePoster { - height: 300px; + height: 260px; margin: min(5vmin, 20px); } diff --git a/client/src/elements/ModalMovieCard/ModalMovieCard.jsx b/client/src/elements/ModalMovieCard/ModalMovieCard.jsx index c43c444..780c8cf 100644 --- a/client/src/elements/ModalMovieCard/ModalMovieCard.jsx +++ b/client/src/elements/ModalMovieCard/ModalMovieCard.jsx @@ -1,6 +1,6 @@ import React from "react"; import {RatingCircle} from "./../RatingCircle"; -import {Divider} from "../Divider"; +// import {Divider} from "../Divider"; import "./ModalMovieCard.css"; @@ -66,7 +66,7 @@ function ModalMovieCard({poster_path, title, genres, rating, overview, release_d
Overview
-
{overview}
+
{overview?.length > 0 ? overview : `No overview available.`}
diff --git a/client/src/elements/MovieCard/MovieCard.css b/client/src/elements/MovieCard/MovieCard.css index 67acd02..921be9b 100644 --- a/client/src/elements/MovieCard/MovieCard.css +++ b/client/src/elements/MovieCard/MovieCard.css @@ -1,5 +1,5 @@ :root { - --movieCardHeight: max(50vh, 250px); + --movieCardHeight: max(50vh, 260px); --movieCardWidth: 100%; --posterImageUrl: ""; } @@ -47,7 +47,7 @@ display: flex; flex-direction: column; width: var(--movieCardWidth); - height: 227px; + height: 240px; } .movieDetailContainer > * { diff --git a/client/src/pages/AboutUs/AboutUs.css b/client/src/pages/AboutUs/AboutUs.css index 94ed113..be61002 100644 --- a/client/src/pages/AboutUs/AboutUs.css +++ b/client/src/pages/AboutUs/AboutUs.css @@ -1,5 +1,7 @@ .aboutUsBody { - background-color: #e7eeed; + /* background-color: #e7eeed; */ + background: url("../../assets/images/aboutUsBackground.svg"); + background-size: cover; } .profileCardParent { diff --git a/client/src/pages/Home/Home.css b/client/src/pages/Home/Home.css index ea2bed8..65bcc69 100644 --- a/client/src/pages/Home/Home.css +++ b/client/src/pages/Home/Home.css @@ -13,14 +13,15 @@ .altText { color: var(--altTextColor); - background: linear-gradient(45deg, var(--altColorBgstart), var(--altColorBgend)); + /* background: linear-gradient(45deg, var(--altColorBgstart), var(--altColorBgend)); */ + background: url("../../assets/images/homeBG2.svg"); + background-size: cover; } -/* Maybe use for alternate if need.. -.altText2 { - color: var(--altTextColor); - background: linear-gradient(-45deg, var(--altColor), transparent); -} */ +.normalBG { + background: url("../../assets/images/homeBG1.svg"); + background-size: cover; +} .home-container { display: flex; @@ -158,6 +159,10 @@ img.lottie-animation { max-width: 20rem; } +.extra-features-content { + font-weight: 600; +} + .icon { max-height: max(100px, 20vh); margin: 0 auto; diff --git a/client/src/pages/Home/Home.jsx b/client/src/pages/Home/Home.jsx index 4a70f7e..6da4e68 100644 --- a/client/src/pages/Home/Home.jsx +++ b/client/src/pages/Home/Home.jsx @@ -23,7 +23,7 @@ export default function Home() { {/* HEADING SENTIMO AND ONE LINER */} -
+
-
+
-
+
benefits
diff --git a/client/src/pages/Recommendation/Recommendation.js b/client/src/pages/Recommendation/Recommendation.js index 537df51..73ae4c4 100644 --- a/client/src/pages/Recommendation/Recommendation.js +++ b/client/src/pages/Recommendation/Recommendation.js @@ -4,18 +4,20 @@ import { ModalContainer } from "../../components"; import "./Recommendation.css"; import { useLoading } from "../../utils/hooks/useLoading"; import { useDate } from "../../utils/hooks/useDate"; -import { fetchStats } from '../../utils/api/stats'; +import { fetchStats } from "../../utils/api/stats"; import { toast } from "react-toastify"; import { MovieCard, ModalMovieCard } from "../../elements"; -import { MapGenre } from '../../utils/MapGenre' +import { MapGenre } from "../../utils/MapGenre"; +import InfiniteScroll from "react-infinite-scroll-component"; +import { modalClasses } from "@mui/material"; export default function Recommendation() { const [page, setPage] = useState(1); const [movies, setMovies] = useState([]); const [genreNames, setGenreNames] = useState({}); const [emotion, setEmotion] = useState([0, 0, 0, 0, 0]); - const [userGenre, setUserGenre] = useState() + const [userGenre, setUserGenre] = useState(); const [genreModalOpen, setGenreModalOpen] = useState(true); const [lazyFetch, setLazyFetch] = useState(0); const { setLoading, setError, LoadingScreen } = useLoading(); @@ -24,20 +26,22 @@ export default function Recommendation() { const genreUrl = `https://api.themoviedb.org/3/genre/movie/list?api_key=4d3bc810d8690d3649ca4f41960de9b4&language=en-US`; const getMoviesOnPage = async (page) => { - const res = await fetch(`https://api.themoviedb.org/3/discover/movie?api_key=4d3bc810d8690d3649ca4f41960de9b4&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=${page}&with_watch_monetization_types=flatrate`); + const res = await fetch( + `https://api.themoviedb.org/3/discover/movie?api_key=4d3bc810d8690d3649ca4f41960de9b4&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=${page}&with_watch_monetization_types=flatrate` + ); const body = await res.json(); return body.results; - } + }; - window.addEventListener('scroll', (e) => { - if ( //buggy this code not working right - document.documentElement.scrollTop + - document.documentElement.clientHeight === - document.documentElement.scrollHeight) { - setLazyFetch(lazyFetch + 1); - } - console.log("Reached end of the movies...") - }) + // window.addEventListener('scroll', (e) => { + // if ( //buggy this code not working right + // document.documentElement.scrollTop + + // document.documentElement.clientHeight === + // document.documentElement.scrollHeight) { + // setLazyFetch(lazyFetch + 1); + // } + // console.log("Reached end of the movies...") + // }) useEffect(() => { const getStats = async () => { @@ -49,16 +53,16 @@ export default function Recommendation() { //clear and update the emotions array const updatedEmotion = [0, 0, 0, 0, 0]; res?.data?.map((e) => { - updatedEmotion[0] += e.emotion.Happy * 100 - updatedEmotion[1] += e.emotion.Sad * 100 - updatedEmotion[2] += e.emotion.Angry * 100 - updatedEmotion[3] += e.emotion.Surprise * 100 - updatedEmotion[4] += e.emotion.Fear * 100 + updatedEmotion[0] += e.emotion.Happy * 100; + updatedEmotion[1] += e.emotion.Sad * 100; + updatedEmotion[2] += e.emotion.Angry * 100; + updatedEmotion[3] += e.emotion.Surprise * 100; + updatedEmotion[4] += e.emotion.Fear * 100; return e; }); setEmotion(updatedEmotion); } else { - toast.error("Something went wrong.") + toast.error("Something went wrong."); } setLoading(false); }; @@ -80,55 +84,89 @@ export default function Recommendation() { useEffect(() => { const genreSelected = MapGenre(emotion); - setUserGenre(genreSelected) - }, [emotion]) + setUserGenre(genreSelected); + }, [emotion]); - useEffect(() => { - //filter the movies with required genre ID for user - const getMovies = async () => { - let fetchedMovies = []; - let currentPage = page; - while (fetchedMovies.length < 20) { - //keep searching for more movies - const res = await getMoviesOnPage(currentPage); - fetchedMovies.push(...res) - currentPage += 1; - } - //get next 20 movies and push to original array - console.log(fetchedMovies); - setMovies([...movies, ...fetchedMovies]); - setPage(currentPage); - }; - getMovies(); - }, [lazyFetch]) //fetch 20 more movies every time lazy fetch changes + // useEffect(() => { + // //filter the movies with required genre ID for user + // const getMovies = async () => { + // let fetchedMovies = []; + // let currentPage = page; + // while (fetchedMovies.length < 20) { + // //keep searching for more movies + // const res = await getMoviesOnPage(currentPage); + // fetchedMovies.push(...res) + // currentPage += 1; + // } + // //get next 20 movies and push to original array + // console.log(fetchedMovies); + // setMovies([...movies, ...fetchedMovies]); + // setPage(currentPage); + // }; + // getMovies(); + // }, [lazyFetch]) //fetch 20 more movies every time lazy fetch changes + + // (TODO: Stop if there is no next page available) + //filter the movies with required genre ID for user (copied this function from above) + const getMovies = async () => { + // console.log("Called getMovies now from page: ", page); + let fetchedMovies = []; + let currentPage = page; + while (fetchedMovies.length < 20) + { + //keep searching for more movies + const res = await getMoviesOnPage(currentPage); + fetchedMovies.push(...res); + currentPage += 1; + } + + // get next 20 movies and push to original array + setMovies([...movies, ...fetchedMovies]); + setPage(currentPage); + }; + + // Initially there must be some movies + if (movies.length === 0) { + getMovies(); + } + return ( -
+
- setGenreModalOpen(false)} style={{ backgroundColor: '#2A2323' }}> - Show pie chart of emotion - show genre list selected + setGenreModalOpen(false)} + style={{ backgroundColor: "#2A2323" }} + > + Show pie chart of emotion show genre list selected -
- {movies?.map((movie, i) => { - return ( -
- - genreNames[genreId])} - release_data={movie?.release_date} - rating={movie?.vote_average?.toFixed(1)} /* Only 1 decimal digit */ - overview={movie?.overview} - /> - -
- ); - })} -
+ Loading...} // Loader Component + > +
+ {movies?.map((movie, i) => { + return ( +
+ genreNames[genreId])} + release_data={movie?.release_date} + rating={movie?.vote_average?.toFixed(1)} /* Only 1 decimal digit */ + overview={movie?.overview} + /> +
+ ); + })} +
+
+
); } diff --git a/data/Emotions-Movie_Genres_Results.xlsx b/data/Emotions-Movie_Genres_Results.xlsx new file mode 100644 index 0000000..86413e7 Binary files /dev/null and b/data/Emotions-Movie_Genres_Results.xlsx differ diff --git a/data/Movie-Emotions_Survey_Responses.xlsx b/data/Movie-Emotions_Survey_Responses.xlsx new file mode 100644 index 0000000..df20f59 Binary files /dev/null and b/data/Movie-Emotions_Survey_Responses.xlsx differ