{description}
30 |31 | 32 | By {!author ? "Unknown" : author} on{" "} 33 | {new Date(date).toGMTString()} 34 | 35 |
36 | 37 | 43 | Read More 44 | 45 |No movies found
"; 58 | return; 59 | } 60 | 61 | movies.forEach((movie) => { 62 | const movieDiv = document.createElement("div"); 63 | movieDiv.classList.add("movie"); 64 | 65 | const moviePoster = movie.poster_path 66 | ? `Rating: ${movie.vote_average}
75 |${movie.release_date}
76 |Your Review: ${ 77 | userReview || "No review added yet" 78 | }
79 | 82 | `; 83 | 84 | movieList.appendChild(movieDiv); 85 | }); 86 | } 87 | 88 | // Add review button handler 89 | submitReviewButton.onclick = function () { 90 | const review = reviewText.value.trim(); 91 | if (currentMovieId && review) { 92 | saveReview(currentMovieId, review); 93 | modal.style.display = "none"; 94 | searchMovies(searchInput.value); // Refresh movie list with new review 95 | } 96 | }; 97 | 98 | // Save review to localStorage 99 | function saveReview(movieId, review) { 100 | const reviews = JSON.parse(localStorage.getItem("movieReviews")) || {}; 101 | reviews[movieId] = review; 102 | localStorage.setItem("movieReviews", JSON.stringify(reviews)); 103 | } 104 | 105 | // Get review from localStorage 106 | function getReview(movieId) { 107 | const reviews = JSON.parse(localStorage.getItem("movieReviews")) || {}; 108 | return reviews[movieId]; 109 | } 110 | -------------------------------------------------------------------------------- /JavaScript/MERN Project/React-NewsPulse-App/src/Components/News.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import NewsItem from "./NewsItem"; 3 | import Spinner from "./Spinner"; 4 | import PropTypes from "prop-types"; 5 | import InfiniteScroll from "react-infinite-scroll-component"; 6 | 7 | const News = (props) => { 8 | const [articles, setArticles] = useState([]); 9 | const [loading, setLoading] = useState(true); 10 | const [page, setPage] = useState(1); 11 | const [totalResults, setTotalResults] = useState(0); 12 | 13 | const capitalizeFirstLetter = (string) => { 14 | return string.charAt(0).toUpperCase() + string.slice(1); 15 | }; 16 | const updateNews = async () => { 17 | props.setProgress(10); 18 | const url = `https://newsapi.org/v2/top-headlines?country=${props.country}&category=${props.category}&apiKey=${props.apikey}&page=${page}&pageSize=${props.pageSize}`; 19 | setLoading(true); 20 | let data = await fetch(url); 21 | props.setProgress(35); 22 | let parseData = await data.json(); 23 | props.setProgress(67); 24 | 25 | setArticles(parseData.articles); 26 | setTotalResults(parseData.totalResults); 27 | setLoading(false); 28 | 29 | props.setProgress(100); 30 | }; 31 | useEffect(() => { 32 | document.title = `${capitalizeFirstLetter(props.category)} - NewsPulse`; 33 | updateNews(); 34 | }, []); 35 | 36 | const fetchMoreData = async () => { 37 | const url = `https://newsapi.org/v2/top-headlines?country=${ 38 | props.country 39 | }&category=${props.category}&apiKey=${props.apikey}&page=${ 40 | page + 1 41 | }&pageSize=${props.pageSize}`; 42 | setPage(page + 1); 43 | let data = await fetch(url); 44 | let parseData = await data.json(); 45 | setArticles(articles.concat(parseData.articles)); 46 | setTotalResults(parseData.totalResults); 47 | }; 48 | if (!Array.isArray(articles)) { 49 | return null; 50 | } 51 | return ( 52 | <> 53 |