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}
+
+ )}
+
+
+ );
+}