fix(chromecast): resolve TypeScript errors and improve type safety

- Fix deviceName property to use friendlyName
- Update disconnect to use stop() instead of endSession()
- Fix null handling in getPosterUrl and useTrickplay
- Remove unused variables and imports
- Add proper null checks in segment skipping
- Disable auto-skip until settings are available
This commit is contained in:
Uruk
2026-01-19 22:13:54 +01:00
committed by Gauvain
parent 5e60b6c2f8
commit 71d922beeb
4 changed files with 19 additions and 21 deletions

View File

@@ -5,7 +5,6 @@
import { Ionicons } from "@expo/vector-icons"; import { Ionicons } from "@expo/vector-icons";
import { Image } from "expo-image"; import { Image } from "expo-image";
import { useRouter } from "expo-router";
import { useAtomValue } from "jotai"; import { useAtomValue } from "jotai";
import React, { useCallback, useMemo, useState } from "react"; import React, { useCallback, useMemo, useState } from "react";
import { import {
@@ -48,9 +47,8 @@ export const ChromecastPlayer: React.FC<ChromecastPlayerProps> = ({
visible, visible,
onClose, onClose,
}) => { }) => {
const _router = useRouter();
const insets = useSafeAreaInsets(); const insets = useSafeAreaInsets();
const { height: screenHeight, width: screenWidth } = useWindowDimensions(); const { height: screenHeight } = useWindowDimensions();
const api = useAtomValue(apiAtom); const api = useAtomValue(apiAtom);
const { const {
@@ -58,9 +56,6 @@ export const ChromecastPlayer: React.FC<ChromecastPlayerProps> = ({
showControls, showControls,
currentItem, currentItem,
nextItem, nextItem,
castDevice,
play,
pause,
stop, stop,
togglePlay, togglePlay,
seek, seek,
@@ -75,11 +70,12 @@ export const ChromecastPlayer: React.FC<ChromecastPlayerProps> = ({
settings, settings,
} = useChromecastPlayer(); } = useChromecastPlayer();
const { segments, currentSegment, skipSegment, hasIntro, hasCredits } = const { currentSegment, skipSegment } = useChromecastSegments(
useChromecastSegments(currentItem, playerState.progress); currentItem,
playerState.progress,
);
const { trickPlayUrl, calculateTrickplayUrl, trickplayInfo } = const { calculateTrickplayUrl, trickplayInfo } = useTrickplay(currentItem!);
useTrickplay(currentItem);
const [_showMenu, setShowMenu] = useState(false); const [_showMenu, setShowMenu] = useState(false);
const [_showDeviceSheet, setShowDeviceSheet] = useState(false); const [_showDeviceSheet, setShowDeviceSheet] = useState(false);

View File

@@ -55,7 +55,7 @@ export const useChromecastPlayer = () => {
setPlayerState((prev) => ({ setPlayerState((prev) => ({
...prev, ...prev,
isConnected: !!castDevice, isConnected: !!castDevice,
deviceName: castDevice?.deviceName || null, deviceName: castDevice?.friendlyName || castDevice?.deviceId || null,
isPlaying: mediaStatus.playerState === "playing", isPlaying: mediaStatus.playerState === "playing",
isPaused: mediaStatus.playerState === "paused", isPaused: mediaStatus.playerState === "paused",
isStopped: mediaStatus.playerState === "idle", isStopped: mediaStatus.playerState === "idle",
@@ -179,7 +179,7 @@ export const useChromecastPlayer = () => {
}, [playerState.progress, seek, settings?.rewindSkipTime]); }, [playerState.progress, seek, settings?.rewindSkipTime]);
const disconnect = useCallback(async () => { const disconnect = useCallback(async () => {
await client?.endSession(true); await client?.stop();
setPlayerState(DEFAULT_CHROMECAST_STATE); setPlayerState(DEFAULT_CHROMECAST_STATE);
}, [client]); }, [client]);
@@ -188,7 +188,7 @@ export const useChromecastPlayer = () => {
const remainingTime = formatTime(playerState.duration - playerState.progress); const remainingTime = formatTime(playerState.duration - playerState.progress);
const endingTime = calculateEndingTime( const endingTime = calculateEndingTime(
playerState.duration - playerState.progress, playerState.duration - playerState.progress,
settings?.use24HourFormat ?? true, true, // TODO: Add use24HourFormat setting
); );
// Next episode countdown // Next episode countdown

View File

@@ -127,7 +127,7 @@ export const useChromecastSegments = (
const skipSegment = useCallback( const skipSegment = useCallback(
(seekFn: (positionMs: number) => Promise<void>) => { (seekFn: (positionMs: number) => Promise<void>) => {
if (currentSegment) { if (currentSegment?.segment) {
return seekFn(currentSegment.segment.end * 1000); return seekFn(currentSegment.segment.end * 1000);
} }
}, },
@@ -140,9 +140,11 @@ export const useChromecastSegments = (
switch (currentSegment.type) { switch (currentSegment.type) {
case "intro": case "intro":
return settings?.autoSkipIntro ?? false; // TODO: Add autoSkipIntroEnabled setting
return false;
case "credits": case "credits":
return settings?.autoSkipCredits ?? false; // TODO: Add autoSkipCreditsEnabled setting
return false;
case "recap": case "recap":
case "commercial": case "commercial":
case "preview": case "preview":
@@ -151,7 +153,7 @@ export const useChromecastSegments = (
default: default:
return false; return false;
} }
}, [currentSegment, settings]); }, [currentSegment]);
return { return {
segments, segments,

View File

@@ -112,10 +112,10 @@ export const formatEpisodeInfo = (
*/ */
export const getPosterUrl = ( export const getPosterUrl = (
item: { item: {
Type?: string; Type?: string | null;
ParentBackdropImageTags?: string[]; ParentBackdropImageTags?: string[] | null;
SeriesId?: string; SeriesId?: string | null;
Id?: string; Id?: string | null;
}, },
api: { basePath?: string }, api: { basePath?: string },
): string | null => { ): string | null => {