From 6c55ed92e2e0999da88eec856f746f082a6761e0 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Tue, 2 Apr 2024 22:01:48 +0200 Subject: [PATCH] moved playback and quality in one settings menu --- .../src/components/player/BottomControls.tsx | 6 +- .../player/PlaybackSpeedSelector.tsx | 109 +++++++----------- .../src/components/player/QualitySelector.tsx | 33 ++---- .../components/player/SettingsSelector.tsx | 101 ++++++++++++++++ .../expo/src/hooks/player/usePlaybackSpeed.ts | 3 + 5 files changed, 156 insertions(+), 96 deletions(-) create mode 100644 apps/expo/src/components/player/SettingsSelector.tsx diff --git a/apps/expo/src/components/player/BottomControls.tsx b/apps/expo/src/components/player/BottomControls.tsx index 8e9325c..01439a1 100644 --- a/apps/expo/src/components/player/BottomControls.tsx +++ b/apps/expo/src/components/player/BottomControls.tsx @@ -8,10 +8,9 @@ import { AudioTrackSelector } from "./AudioTrackSelector"; import { CaptionsSelector } from "./CaptionsSelector"; import { Controls } from "./Controls"; import { DownloadButton } from "./DownloadButton"; -import { PlaybackSpeedSelector } from "./PlaybackSpeedSelector"; import { ProgressBar } from "./ProgressBar"; -import { QualitySelector } from "./QualitySelector"; import { SeasonSelector } from "./SeasonEpisodeSelector"; +import { SettingsSelector } from "./SettingsSelector"; import { SourceSelector } from "./SourceSelector"; import { mapMillisecondsToTime } from "./utils"; @@ -83,8 +82,7 @@ export const BottomControls = ({ isLocalAsset }: { isLocalAsset: boolean }) => { - - + {Platform.OS === "android" || (Platform.OS === "ios" && isDevelopmentProvisioningProfile()) ? ( diff --git a/apps/expo/src/components/player/PlaybackSpeedSelector.tsx b/apps/expo/src/components/player/PlaybackSpeedSelector.tsx index 2553474..955b608 100644 --- a/apps/expo/src/components/player/PlaybackSpeedSelector.tsx +++ b/apps/expo/src/components/player/PlaybackSpeedSelector.tsx @@ -1,82 +1,59 @@ -import { useState } from "react"; +import type { SheetProps } from "tamagui"; import { MaterialCommunityIcons } from "@expo/vector-icons"; import { useTheme } from "tamagui"; import { usePlaybackSpeed } from "~/hooks/player/usePlaybackSpeed"; -import { MWButton } from "../ui/Button"; -import { Controls } from "./Controls"; import { Settings } from "./settings/Sheet"; -export const PlaybackSpeedSelector = () => { +export const PlaybackSpeedSelector = (props: SheetProps) => { const theme = useTheme(); - const [open, setOpen] = useState(false); - const { currentSpeed, changePlaybackSpeed } = usePlaybackSpeed(); - - const speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]; + const { speeds, currentSpeed, changePlaybackSpeed } = usePlaybackSpeed(); return ( - <> - - + + + + props.onOpenChange?.(false)} /> } - onPress={() => setOpen(true)} - > - Playback - - - - - - - - setOpen(false)} - /> - } - title="Playback settings" - /> - - {speeds.map((speed) => ( - - ) - } - onPress={() => { - changePlaybackSpeed(speed) - .then(() => setOpen(false)) - .catch((err) => { - console.log("error", err); - }); - }} - /> - ))} - - - - + title="Playback settings" + /> + + {speeds.map((speed) => ( + + ) + } + onPress={() => { + changePlaybackSpeed(speed) + .then(() => props.onOpenChange?.(false)) + .catch((err) => { + console.log("error", err); + }); + }} + /> + ))} + + + ); }; diff --git a/apps/expo/src/components/player/QualitySelector.tsx b/apps/expo/src/components/player/QualitySelector.tsx index 0e499f4..5f766a9 100644 --- a/apps/expo/src/components/player/QualitySelector.tsx +++ b/apps/expo/src/components/player/QualitySelector.tsx @@ -1,17 +1,14 @@ -import { useState } from "react"; -import { MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons"; +import type { SheetProps } from "tamagui"; +import { MaterialCommunityIcons } from "@expo/vector-icons"; import { useTheme } from "tamagui"; import { constructFullUrl } from "@movie-web/provider-utils"; import { usePlayerStore } from "~/stores/player/store"; -import { MWButton } from "../ui/Button"; -import { Controls } from "./Controls"; import { Settings } from "./settings/Sheet"; -export const QualitySelector = () => { +export const QualitySelector = (props: SheetProps) => { const theme = useTheme(); - const [open, setOpen] = useState(false); const videoRef = usePlayerStore((state) => state.videoRef); const videoSrc = usePlayerStore((state) => state.videoSrc); const stream = usePlayerStore((state) => state.interface.currentStream); @@ -46,26 +43,10 @@ export const QualitySelector = () => { return ( <> - - - } - onPress={() => setOpen(true)} - > - Quality - - - @@ -76,7 +57,7 @@ export const QualitySelector = () => { name="close" size={24} color={theme.playerSettingsUnactiveText.val} - onPress={() => setOpen(false)} + onPress={() => props.onOpenChange?.(false)} /> } title="Quality settings" diff --git a/apps/expo/src/components/player/SettingsSelector.tsx b/apps/expo/src/components/player/SettingsSelector.tsx new file mode 100644 index 0000000..d035a36 --- /dev/null +++ b/apps/expo/src/components/player/SettingsSelector.tsx @@ -0,0 +1,101 @@ +import { useState } from "react"; +import { MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons"; +import { useTheme } from "tamagui"; + +import { MWButton } from "../ui/Button"; +import { Controls } from "./Controls"; +import { PlaybackSpeedSelector } from "./PlaybackSpeedSelector"; +import { QualitySelector } from "./QualitySelector"; +import { Settings } from "./settings/Sheet"; + +export const SettingsSelector = () => { + const theme = useTheme(); + const [open, setOpen] = useState(false); + const [qualityOpen, setQualityOpen] = useState(false); + const [playbackOpen, setPlaybackOpen] = useState(false); + + return ( + <> + + + } + onPress={() => setOpen(true)} + > + Settings + + + + + + + + + + setOpen(false)} + /> + } + title="Settings" + /> + + + } + iconRight={ + + } + onPress={() => setQualityOpen(true)} + /> + + } + iconRight={ + + } + onPress={() => setPlaybackOpen(true)} + /> + + + + + ); +}; diff --git a/apps/expo/src/hooks/player/usePlaybackSpeed.ts b/apps/expo/src/hooks/player/usePlaybackSpeed.ts index c02698d..d37789a 100644 --- a/apps/expo/src/hooks/player/usePlaybackSpeed.ts +++ b/apps/expo/src/hooks/player/usePlaybackSpeed.ts @@ -2,6 +2,8 @@ import { useCallback } from "react"; import { usePlayerStore } from "~/stores/player/store"; +const speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]; + export const usePlaybackSpeed = () => { const videoRef = usePlayerStore((state) => state.videoRef); @@ -15,6 +17,7 @@ export const usePlaybackSpeed = () => { ); return { + speeds, currentSpeed: videoRef?.props.rate ?? 1, changePlaybackSpeed, } as const;