5 changed files with 63 additions and 21 deletions
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
import { MWMediaMeta } from "@/backend/metadata/types"; |
||||
import { Helmet } from "react-helmet"; |
||||
import { useCurrentSeriesEpisodeInfo } from "../hooks/useCurrentSeriesEpisodeInfo"; |
||||
|
||||
interface PageTitleControlProps { |
||||
media?: MWMediaMeta; |
||||
} |
||||
|
||||
export function PageTitleControl(props: PageTitleControlProps) { |
||||
const { isSeries, humanizedEpisodeId } = useCurrentSeriesEpisodeInfo(); |
||||
|
||||
if (!props.media) return null; |
||||
|
||||
const title = isSeries |
||||
? `${props.media.title} - ${humanizedEpisodeId}` |
||||
: props.media.title; |
||||
|
||||
return ( |
||||
<Helmet> |
||||
<title>{title}</title> |
||||
</Helmet> |
||||
); |
||||
} |
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
import { useMemo } from "react"; |
||||
import { useVideoPlayerState } from "../VideoContext"; |
||||
|
||||
export function useCurrentSeriesEpisodeInfo() { |
||||
const { videoState } = useVideoPlayerState(); |
||||
|
||||
const { current, seasons } = videoState.seasonData; |
||||
|
||||
const currentSeasonInfo = useMemo(() => { |
||||
return seasons?.find((season) => season.id === current?.seasonId); |
||||
}, [seasons, current]); |
||||
|
||||
const currentEpisodeInfo = useMemo(() => { |
||||
return currentSeasonInfo?.episodes?.find( |
||||
(episode) => episode.id === current?.episodeId |
||||
); |
||||
}, [currentSeasonInfo, current]); |
||||
|
||||
const isSeries = Boolean( |
||||
videoState.seasonData.isSeries && videoState.seasonData.current |
||||
); |
||||
|
||||
if (!isSeries) return { isSeries: false }; |
||||
|
||||
const humanizedEpisodeId = `S${currentSeasonInfo?.number} E${currentEpisodeInfo?.number}`; |
||||
|
||||
return { |
||||
isSeries: true, |
||||
humanizedEpisodeId, |
||||
currentSeasonInfo, |
||||
currentEpisodeInfo, |
||||
}; |
||||
} |
Loading…
Reference in new issue