diff --git a/app/(auth)/casting-player.tsx b/app/(auth)/casting-player.tsx index 1e6572f08..48c916532 100644 --- a/app/(auth)/casting-player.tsx +++ b/app/(auth)/casting-player.tsx @@ -3,14 +3,13 @@ * Protocol-agnostic full-screen player for all supported casting protocols */ -import { Ionicons } from "@expo/vector-icons"; import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client"; import { getTvShowsApi, getUserLibraryApi } from "@jellyfin/sdk/lib/utils/api"; import { router, Stack } from "expo-router"; import { useAtomValue } from "jotai"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; -import { ActivityIndicator, Pressable, ScrollView, View } from "react-native"; +import { ActivityIndicator, ScrollView, View } from "react-native"; import { Gesture, GestureDetector } from "react-native-gesture-handler"; import GoogleCast, { CastState, @@ -33,6 +32,7 @@ import { CastPlayerHeader } from "@/components/casting/player/CastPlayerHeader"; import { CastPlayerPoster } from "@/components/casting/player/CastPlayerPoster"; import { CastPlayerProgressBar } from "@/components/casting/player/CastPlayerProgressBar"; import { CastPlayerTitle } from "@/components/casting/player/CastPlayerTitle"; +import { CastPlayerTransportControls } from "@/components/casting/player/CastPlayerTransportControls"; import { ChromecastDeviceSheet } from "@/components/chromecast/ChromecastDeviceSheet"; import { ChromecastEpisodeList } from "@/components/chromecast/ChromecastEpisodeList"; import { ChromecastSettingsMenu } from "@/components/chromecast/ChromecastSettingsMenu"; @@ -743,90 +743,15 @@ export default function CastingPlayerScreen() { /> {/* Playback controls */} - - {/* Rewind (use settings) */} - skipBackward(settings?.rewindSkipTime ?? 10)} - style={{ - position: "relative", - justifyContent: "center", - alignItems: "center", - }} - > - - {settings?.rewindSkipTime != null && ( - - {settings.rewindSkipTime} - - )} - - - {/* Play/Pause */} - - - - - {/* Forward (use settings) */} - skipForward(settings?.forwardSkipTime ?? 10)} - style={{ - position: "relative", - justifyContent: "center", - alignItems: "center", - }} - > - - {settings?.forwardSkipTime != null && ( - - {settings.forwardSkipTime} - - )} - - + {/* Modals */} diff --git a/components/casting/player/CastPlayerTransportControls.tsx b/components/casting/player/CastPlayerTransportControls.tsx new file mode 100644 index 000000000..65aecfcc5 --- /dev/null +++ b/components/casting/player/CastPlayerTransportControls.tsx @@ -0,0 +1,122 @@ +/** + * Casting Player Transport Controls + * Playback transport row: rewind, play/pause, forward. + */ + +import { Ionicons } from "@expo/vector-icons"; +import { Pressable, View } from "react-native"; +import { Text } from "@/components/common/Text"; + +interface CastPlayerTransportControlsProps { + /** Whether playback is currently playing. */ + isPlaying: boolean; + /** Toggle play/pause on the Chromecast. */ + togglePlayPause: () => Promise; + /** Skip backward by the given number of seconds. */ + skipBackward: (seconds: number) => Promise; + /** Skip forward by the given number of seconds. */ + skipForward: (seconds: number) => Promise; + /** Configured rewind skip time in seconds, shown on the rewind button. */ + rewindSkipTime: number | null | undefined; + /** Configured forward skip time in seconds, shown on the forward button. */ + forwardSkipTime: number | null | undefined; + /** Accent color used for the play/pause button background. */ + protocolColor: string; +} + +export function CastPlayerTransportControls({ + isPlaying, + togglePlayPause, + skipBackward, + skipForward, + rewindSkipTime, + forwardSkipTime, + protocolColor, +}: CastPlayerTransportControlsProps) { + return ( + + {/* Rewind (use settings) */} + skipBackward(rewindSkipTime ?? 10)} + style={{ + position: "relative", + justifyContent: "center", + alignItems: "center", + }} + > + + {rewindSkipTime != null && ( + + {rewindSkipTime} + + )} + + + {/* Play/Pause */} + + + + + {/* Forward (use settings) */} + skipForward(forwardSkipTime ?? 10)} + style={{ + position: "relative", + justifyContent: "center", + alignItems: "center", + }} + > + + {forwardSkipTime != null && ( + + {forwardSkipTime} + + )} + + + ); +}