diff --git a/package.json b/package.json index d46a9f36..7c7f5092 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build": "yarn build:next && yarn build:server", "lint": "eslint \"./server/**/*.{ts,tsx}\" \"./src/**/*.{ts,tsx}\"", "start": "NODE_ENV=production node dist/index.js", - "i18n:extract": "extract-messages -l=en,ja,fr,nb_NO,de,ru,nl -o src/i18n/locale -d en --flat true --overwriteDefault false './src/**/!(*.test).{ts,tsx}'", + "i18n:extract": "extract-messages -l=en -o src/i18n/locale -d en --flat true --overwriteDefault false './src/**/!(*.test).{ts,tsx}'", "migration:generate": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:generate", "migration:run": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:run", "format": "prettier --write ." diff --git a/src/components/Common/Header/index.tsx b/src/components/Common/Header/index.tsx index 05f63c3b..3c743a26 100644 --- a/src/components/Common/Header/index.tsx +++ b/src/components/Common/Header/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; interface HeaderProps { extraMargin?: number; - subtext?: string; + subtext?: React.ReactNode; } const Header: React.FC = ({ diff --git a/src/components/MovieDetails/MovieCast/index.tsx b/src/components/MovieDetails/MovieCast/index.tsx new file mode 100644 index 00000000..1adcb336 --- /dev/null +++ b/src/components/MovieDetails/MovieCast/index.tsx @@ -0,0 +1,66 @@ +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import React, { useContext } from 'react'; +import { defineMessages, useIntl } from 'react-intl'; +import useSWR from 'swr'; +import { MovieDetails } from '../../../../server/models/Movie'; +import { LanguageContext } from '../../../context/LanguageContext'; +import Error from '../../../pages/_error'; +import Header from '../../Common/Header'; +import LoadingSpinner from '../../Common/LoadingSpinner'; +import PersonCard from '../../PersonCard'; + +const messages = defineMessages({ + fullcast: 'Full Cast', +}); + +const MovieCast: React.FC = () => { + const router = useRouter(); + const intl = useIntl(); + const { locale } = useContext(LanguageContext); + const { data, error } = useSWR( + `/api/v1/movie/${router.query.movieId}?language=${locale}` + ); + + if (!data && !error) { + return ; + } + + if (!data) { + return ; + } + + return ( + <> +
+ {data.title} + + } + > + {intl.formatMessage(messages.fullcast)} +
+
    + {data?.credits.cast.map((person) => { + return ( +
  • + +
  • + ); + })} +
+ + ); +}; + +export default MovieCast; diff --git a/src/components/PersonDetails/index.tsx b/src/components/PersonDetails/index.tsx index 9928dda4..3b7d96ab 100644 --- a/src/components/PersonDetails/index.tsx +++ b/src/components/PersonDetails/index.tsx @@ -56,7 +56,7 @@ const PersonDetails: React.FC = () => { return ( <> -
+
{data.profilePath && (
{ + const router = useRouter(); + const intl = useIntl(); + const { locale } = useContext(LanguageContext); + const { data, error } = useSWR( + `/api/v1/tv/${router.query.tvId}?language=${locale}` + ); + + if (!data && !error) { + return ; + } + + if (!data) { + return ; + } + + return ( + <> +
+ {data.name} + + } + > + {intl.formatMessage(messages.fullseriescast)} +
+
    + {data?.credits.cast.map((person) => { + return ( +
  • + +
  • + ); + })} +
+ + ); +}; + +export default TvCast; diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 4e695ded..88da4d24 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -18,6 +18,7 @@ "components.Layout.UserDropdown.signout": "Sign Out", "components.Layout.alphawarning": "This is ALPHA software. Almost everything is bound to be nearly broken and/or unstable. Please report issues to the Overseerr GitHub!", "components.Login.signinplex": "Sign in to continue", + "components.MovieDetails.MovieCast.fullcast": "Full Cast", "components.MovieDetails.approve": "Approve", "components.MovieDetails.available": "Available", "components.MovieDetails.budget": "Budget", @@ -224,6 +225,7 @@ "components.Slider.noresults": "No Results", "components.TitleCard.movie": "Movie", "components.TitleCard.tvshow": "Series", + "components.TvDetails.TvCast.fullseriescast": "Full Series Cast", "components.TvDetails.approve": "Approve", "components.TvDetails.approverequests": "Approve {requestCount} {requestCount, plural, one {Request} other {Requests}}", "components.TvDetails.available": "Available", diff --git a/src/pages/movie/[movieId]/cast.tsx b/src/pages/movie/[movieId]/cast.tsx new file mode 100644 index 00000000..ea23d091 --- /dev/null +++ b/src/pages/movie/[movieId]/cast.tsx @@ -0,0 +1,9 @@ +import { NextPage } from 'next'; +import React from 'react'; +import MovieCast from '../../../components/MovieDetails/MovieCast'; + +const MovieCastPage: NextPage = () => { + return ; +}; + +export default MovieCastPage; diff --git a/src/pages/tv/[tvId]/cast.tsx b/src/pages/tv/[tvId]/cast.tsx new file mode 100644 index 00000000..b7cc28b2 --- /dev/null +++ b/src/pages/tv/[tvId]/cast.tsx @@ -0,0 +1,9 @@ +import { NextPage } from 'next'; +import React from 'react'; +import TvCast from '../../../components/TvDetails/TvCast'; + +const TvCastPage: NextPage = () => { + return ; +}; + +export default TvCastPage;