diff --git a/src/components/MovieDetails/MovieCast/index.tsx b/src/components/MovieDetails/MovieCast/index.tsx index 1adcb336..744b5efb 100644 --- a/src/components/MovieDetails/MovieCast/index.tsx +++ b/src/components/MovieDetails/MovieCast/index.tsx @@ -42,11 +42,11 @@ const MovieCast: React.FC = () => { {intl.formatMessage(messages.fullcast)} + {sortedCrew.length > 0 && ( +
+ + + {intl.formatMessage(messages.viewfullcrew)} + + + + + +
+ )}
diff --git a/src/components/TvDetails/TvCrew/index.tsx b/src/components/TvDetails/TvCrew/index.tsx new file mode 100644 index 00000000..8276a318 --- /dev/null +++ b/src/components/TvDetails/TvCrew/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 type { TvDetails } from '../../../../server/models/Tv'; +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({ + fullseriescrew: 'Full Series Crew', +}); + +const TvCrew: React.FC = () => { + 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.fullseriescrew)} +
+
    + {data?.credits.crew.map((person, index) => { + return ( +
  • + +
  • + ); + })} +
+ + ); +}; + +export default TvCrew; diff --git a/src/components/TvDetails/index.tsx b/src/components/TvDetails/index.tsx index 58993258..d374c85e 100644 --- a/src/components/TvDetails/index.tsx +++ b/src/components/TvDetails/index.tsx @@ -63,6 +63,7 @@ const messages = defineMessages({ showtype: 'Show Type', anime: 'Anime', network: 'Network', + viewfullcrew: 'View Full Crew', }); interface TvDetailsProps { @@ -436,6 +437,29 @@ const TvDetails: React.FC = ({ tv }) => { ))} + {sortedCrew.length > 0 && ( + + )}
diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 5fae284e..dda83fff 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -19,6 +19,7 @@ "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.MovieCrew.fullcrew": "Full Crew", "components.MovieDetails.approve": "Approve", "components.MovieDetails.available": "Available", "components.MovieDetails.budget": "Budget", @@ -46,9 +47,11 @@ "components.MovieDetails.studio": "Studio", "components.MovieDetails.unavailable": "Unavailable", "components.MovieDetails.userrating": "User Rating", + "components.MovieDetails.viewfullcrew": "View Full Crew", "components.MovieDetails.viewrequest": "View Request", "components.PersonDetails.appearsin": "Appears in", "components.PersonDetails.ascharacter": "as {character}", + "components.PersonDetails.crewmember": "Crew Member", "components.PersonDetails.nobiography": "No biography available.", "components.PlexLoginButton.loading": "Loading…", "components.PlexLoginButton.loggingin": "Logging in…", @@ -277,6 +280,7 @@ "components.TitleCard.movie": "Movie", "components.TitleCard.tvshow": "Series", "components.TvDetails.TvCast.fullseriescast": "Full Series Cast", + "components.TvDetails.TvCrew.fullseriescrew": "Full Series Crew", "components.TvDetails.anime": "Anime", "components.TvDetails.approve": "Approve", "components.TvDetails.approverequests": "Approve {requestCount} {requestCount, plural, one {Request} other {Requests}}", @@ -305,6 +309,7 @@ "components.TvDetails.status": "Status", "components.TvDetails.unavailable": "Unavailable", "components.TvDetails.userrating": "User Rating", + "components.TvDetails.viewfullcrew": "View Full Crew", "components.UserEdit.admin": "Admin", "components.UserEdit.adminDescription": "Full administrator access. Bypasses all permission checks.", "components.UserEdit.autoapprove": "Auto Approve", diff --git a/src/pages/movie/[movieId]/crew.tsx b/src/pages/movie/[movieId]/crew.tsx new file mode 100644 index 00000000..6ba59053 --- /dev/null +++ b/src/pages/movie/[movieId]/crew.tsx @@ -0,0 +1,9 @@ +import { NextPage } from 'next'; +import React from 'react'; +import MovieCrew from '../../../components/MovieDetails/MovieCrew'; + +const MovieCrewPage: NextPage = () => { + return ; +}; + +export default MovieCrewPage; diff --git a/src/pages/tv/[tvId]/crew.tsx b/src/pages/tv/[tvId]/crew.tsx new file mode 100644 index 00000000..aec04080 --- /dev/null +++ b/src/pages/tv/[tvId]/crew.tsx @@ -0,0 +1,9 @@ +import { NextPage } from 'next'; +import React from 'react'; +import TvCrew from '../../../components/TvDetails/TvCrew'; + +const TvCrewPage: NextPage = () => { + return ; +}; + +export default TvCrewPage;