View on GitHub

評価値の取得

Home

評価値の取得

API

評価値取得API

frontend/src/services/ratings/getRating.ts

import { ApiContext, Movie, Rating, User } from '@/types/data';
import { fetcher } from '@/utils';

const context: ApiContext = {
  apiRootUrl: process.env.NEXT_PUBLIC_API_BASE_URL,
};

/**
 * 評価値取得API
 * @param user - ユーザ
 * @param movie - 映画
 * @returns 評価値
 */
const getRating = async (user: User, movie: Movie): Promise<{ rating: Rating }> => {
  const id = user.id + '_' + String(movie.id).padStart(6, '0');
  const res = await fetcher(`${context.apiRootUrl?.replace(/\/$/g, '')}/ratings/?id=${id}`, {
    headers: {
      Accept: 'application/json',
      'Content-Type': 'application/json',
    },
    cache: 'no-store',
  });
  return res.ratings.at(-1);
};

export default getRating;

コンポーネント

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

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

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

const STAR_WIDTH = 24;

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

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

  const handleRatingClick = async (rating: number) => {
    await postRating(props.user, props.movie, rating);
    // ↓追加
    const rating_ = await getRating(props.user, props.movie);
    let movie_ = JSON.parse(JSON.stringify(props.movie));
    movie_.rating = JSON.parse(JSON.stringify(rating_));
    props.handleRatingClick(movie_);
    // ↑追加
  };
......
};

export default MovieCard;

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

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

......
const MovieList = (props: Props) => {
......
  // ↓追加
  const handleRatingClick = (movie: Movie) => {
    const movies_ = movies.map((movie_) => {
      let movie__ =
        movie_.id == movie.id
          ? JSON.parse(JSON.stringify(movie))
          : JSON.parse(JSON.stringify(movie_));
      return movie__;
    });
    setMovies(movies_);
  };
  // ↑追加

  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}
            handleRatingClick={handleRatingClick} // <- 追加
            key={movie.id}
          />
        ))}
        <button
...(略)...
        </button>
      </div>
    </>
  );
};

export default MovieList;

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

映画リスト上で評価値を更新してください。ページを切り替えても更新結果が維持されています。ただし、現時点では、ユーザ依存の処理を実装していないため、映画詳細ページを表示しても、ユーザの与えた評価値は表示されません。