diff --git a/components/common/Dropdown.tsx b/components/common/Dropdown.tsx index d9612d48..fec36d2f 100644 --- a/components/common/Dropdown.tsx +++ b/components/common/Dropdown.tsx @@ -1,14 +1,16 @@ import * as DropdownMenu from "zeego/dropdown-menu"; import {TouchableOpacity, View, ViewProps} from "react-native"; import {Text} from "@/components/common/Text"; -import React, {PropsWithChildren, useEffect, useState} from "react"; +import React, {PropsWithChildren, ReactNode, useEffect, useState} from "react"; +import DisabledSetting from "@/components/settings/DisabledSetting"; interface Props { data: T[] + disabled?: boolean placeholderText?: string, keyExtractor: (item: T) => string - titleExtractor: (item: T) => string - title: string, + titleExtractor: (item: T) => string | undefined + title: string | ReactNode, label: string, onSelected: (...item: T[]) => void multi?: boolean @@ -16,6 +18,7 @@ interface Props { const Dropdown = ({ data, + disabled, placeholderText, keyExtractor, titleExtractor, @@ -34,20 +37,30 @@ const Dropdown = ({ }, [selected]); return ( - + - - - {title} - - - - {selected?.length !== undefined ? selected.map(titleExtractor).join(",") : placeholderText} + {typeof title === 'string' ? ( + + + {title} - - + + + {selected?.length !== undefined ? selected.map(titleExtractor).join(",") : placeholderText} + + + + ) : ( + <> + {title} + + )} ({ ))} - + ) }; diff --git a/components/settings/SubtitleToggles.tsx b/components/settings/SubtitleToggles.tsx index 66c514b1..6719171d 100644 --- a/components/settings/SubtitleToggles.tsx +++ b/components/settings/SubtitleToggles.tsx @@ -7,11 +7,15 @@ import { ListGroup } from "../list/ListGroup"; import { ListItem } from "../list/ListItem"; import { Ionicons } from "@expo/vector-icons"; import { SubtitlePlaybackMode } from "@jellyfin/sdk/lib/generated-client"; +import {useSettings} from "@/utils/atoms/settings"; +import {Stepper} from "@/components/inputs/Stepper"; +import Dropdown from "@/components/common/Dropdown"; interface Props extends ViewProps {} export const SubtitleToggles: React.FC = ({ ...props }) => { const media = useMedia(); + const [_, __, pluginSettings] = useSettings(); const { settings, updateSettings } = media; const cultures = media.cultures; @@ -36,8 +40,11 @@ export const SubtitleToggles: React.FC = ({ ...props }) => { } > - - + item?.ThreeLetterISOLanguageName ?? "unknown"} + titleExtractor={(item) => item?.DisplayName} + title={ {settings?.defaultSubtitleLanguage?.DisplayName || "None"} @@ -48,48 +55,28 @@ export const SubtitleToggles: React.FC = ({ ...props }) => { color="#5A5960" /> - - - Languages - { - updateSettings({ - defaultSubtitleLanguage: null, - }); - }} - > - None - - {cultures?.map((l) => ( - { - updateSettings({ - defaultSubtitleLanguage: l, - }); - }} - > - - {l.DisplayName} - - - ))} - - + } + label="Languages" + onSelected={(defaultSubtitleLanguage) => + updateSettings({ + defaultSubtitleLanguage: defaultSubtitleLanguage.DisplayName === "None" + ? null + : defaultSubtitleLanguage + }) + } + /> - - - + + {settings?.subtitleMode || "Loading"} @@ -100,68 +87,39 @@ export const SubtitleToggles: React.FC = ({ ...props }) => { color="#5A5960" /> - - - Subtitle Mode - {subtitleModes?.map((l) => ( - { - updateSettings({ - subtitleMode: l, - }); - }} - > - {l} - - ))} - - + } + label="Subtitle Mode" + onSelected={(subtitleMode) => + updateSettings({subtitleMode}) + } + /> - + updateSettings({ rememberSubtitleSelections: value }) } /> - - - - updateSettings({ - subtitleSize: Math.max(0, settings.subtitleSize - 5), - }) - } - className="w-8 h-8 bg-neutral-800 rounded-l-lg flex items-center justify-center" - > - - - - - {settings.subtitleSize} - - - updateSettings({ - subtitleSize: Math.min(120, settings.subtitleSize + 5), - }) - } - > - + - - + + updateSettings({subtitleSize})} + />