View on GitHub

映画カードへの評価値コンポーネントの追加

Home

映画カードへの評価値コンポーネントの追加

コンポーネント

映画カードコンポーネント

frontend/src/app/components/movie/MovieCard.tsx

import { Movie, User } from '@/types/data'; // <- Userを追加
import Image from 'next/image';
import Link from 'next/link';
import React from 'react';
import StarRating from '../rating/StarRating'; // <- 追加

const STAR_WIDTH = 24; // <- 追加

type Props = {
  movie: Movie;
  user: User; // <- 追加
};

const MovieCard = (props: Props) => {
  const img_url = '/img/dummy_poster.png';

  return (
    <>
      <article className="h-72 w-32 shadow" key={props.movie.id}>
        <Link href={`/movies/${props.movie.id}`} className="hover:opacity-75">
          <Image src={img_url} alt="" width={120} height={180} priority={true} />
        </Link>
        {/* ↓追加 */}
        {props.user ? (
          <StarRating starWidth={STAR_WIDTH} rating={props.movie.rating?.rating} />
        ) : (
          <></>
        )}
        {/* ↑追加 */}
...(略)...
      </article>
    </>
  );
};

export default MovieCard;

映画リストコンポーネント

frontend/src/app/components/movie/MovieList.tsx

'use client';
import { Movie, User } from '@/types/data'; // <- Userを追加
import React, { useEffect, useState } from 'react';
import MovieCard from './MovieCard';
......
type Props = {
  phrase: string;
  movies: Movie[];
  perPage: number;
  user: User; // <- 追加
};

const MovieList = (props: Props) => {
......
  return (
    <>
      <div className="text-xl font-bold text-gray-800">{props.phrase}</div>
      <div className="mx-4 my-4 flex justify-between">
        <button
...(略)...
        </button>
...(略)...
        {currentMovies?.map((movie) => (
          <MovieCard movie={movie} user={props.user} key={movie.id} /> // <- userを追加
        ))}
        <button
...(略)...
        </button>
      </div>
    </>
  );
};

export default MovieList;

ページ

インデックスページ

frontend/src/app/page.tsx

import { SessionProvider } from 'next-auth/react';
import React from 'react';
import HelloAccount from './components/HelloAccount';
import connectUser from '@/services/users/connectUser';
import MovieList from './components/movie/MovieList';
import getMovies from '@/services/movies/getMovies';
import { auth } from '@/auth'; // <- 追加
import getUser from '@/services/users/getUser'; // <- 追加

const PER_PAGE = 5;

const Index = async () => {
  await connectUser();
  const session = await auth(); // <- 追加
  const user = session ? await getUser(session?.user?.email!) : null; // <- 追加
  const { movies } = await getMovies();

  return (
    <>
      <section>
        <SessionProvider>
          <HelloAccount />
        </SessionProvider>
        <MovieList phrase="本日のおすすめ" movies={movies} perPage={PER_PAGE} user={user!} />  {/* <- userを追加 */}
      </section>
    </>
  );
};

export default Index;

ブラウザで下記URLにアクセスしてください。

サインインすると、映画リスト内の各映画カードに評価値コンポーネントが表示されます。評価値コンポーネント上で任意の評価値をクリックすると、その評価値までのスターが黄色く表示されます。ただし、現時点では、評価値は記憶されないため、ブラウザを更新したり、ページを切り替えたりすると元に戻ります。また、現時点では、ユーザ情報は評価値コンポーネントの表示/非表示の判定のために参照しているだけですので、ユーザ依存の評価値は取得できません。