import { usePlayerContext } from "../../player/provider"; import { Spacer, View, XStack, YStack } from "tamagui"; import { CachedImage } from "@georstat/react-native-image-cache"; import { useApiClientContext } from "../jellyfin-api-provider"; import { getImageApi } from "@jellyfin/sdk/lib/utils/api"; import { ImageType } from "@jellyfin/sdk/lib/generated-client/models"; import { queryConfig } from "../../api/queries/query.config"; import { H5, Text } from "../Global/helpers/text"; import { SafeAreaView, useSafeAreaFrame } from "react-native-safe-area-context"; import { HorizontalSlider } from "../Global/helpers/slider"; import PlayPauseButton from "./helpers/buttons"; import React, { useEffect, useState } from "react"; import { seekBy, skipToNext, skipToPrevious } from "react-native-track-player/lib/src/trackPlayer"; import Icon from "../Global/helpers/icon"; import { NativeStackNavigationProp } from "@react-navigation/native-stack"; import { StackParamList } from "../types"; import { RunTimeSeconds } from "../Global/helpers/time-codes"; export default function Player({ navigation }: { navigation: NativeStackNavigationProp}): React.JSX.Element { const { apiClient } = useApiClientContext(); const { nowPlaying, progress, useSeekTo } = usePlayerContext(); const [seeking, setSeeking] = useState(false); const [progressState, setProgressState] = useState(progress!.position); const { width, height } = useSafeAreaFrame(); // Prevent gesture event to close player if we're seeking useEffect(() => { navigation.setOptions({ gestureEnabled: !seeking }); }, [ navigation, seeking ]) useEffect(() => { if (!seeking) setProgressState(Math.floor(progress!.position)) }, [ progress ]); return ( { nowPlaying && ( <> Playing from
THING
{nowPlaying?.title ?? "Untitled Track"} { navigation.goBack(); // Dismiss player modal navigation.push("Artist", { artistName: nowPlaying.artist!, artistId: nowPlaying.ArtistId }) }} > {nowPlaying.artist ?? "Unknown Artist"} {/* Buttons for favorites, song menu go here */} {/* playback progress goes here */} { useSeekTo.mutate(progressState); setSeeking(false); }, onSlideStart: (event, value) => { setSeeking(true); }, onSlideMove: (event, value) => { setProgressState(value); }, onSlideEnd: (event, value) => { const position = value; useSeekTo.mutate(position); setSeeking(false); } }} /> {progressState} { /** Track metadata can go here */} {progress!.duration} seekBy(-15)} /> skipToPrevious()} /> skipToNext()} /> seekBy(15)} />
)}
); }