import classNames from "classnames"; import { useMemo } from "react"; import { Trans, useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { getAllProviders, getProviders } from "@/backend/providers/providers"; import { Button } from "@/components/buttons/Button"; import { Toggle } from "@/components/buttons/Toggle"; import { FlagIcon } from "@/components/FlagIcon"; import { Dropdown } from "@/components/form/Dropdown"; import { SortableList } from "@/components/form/SortableList"; import { Heading1 } from "@/components/utils/Text"; import { appLanguageOptions } from "@/setup/i18n"; import { isAutoplayAllowed } from "@/utils/autoplay"; import { getLocaleInfo, sortLangCodes } from "@/utils/language"; export function PreferencesPart(props: { language: string; setLanguage: (l: string) => void; enableThumbnails: boolean; setEnableThumbnails: (v: boolean) => void; enableAutoplay: boolean; setEnableAutoplay: (v: boolean) => void; enableSkipCredits: boolean; setEnableSkipCredits: (v: boolean) => void; sourceOrder: string[]; setSourceOrder: (v: string[]) => void; enableSourceOrder: boolean; setenableSourceOrder: (v: boolean) => void; }) { const { t } = useTranslation(); const sorted = sortLangCodes(appLanguageOptions.map((item) => item.code)); const allowAutoplay = isAutoplayAllowed(); const options = appLanguageOptions .sort((a, b) => sorted.indexOf(a.code) - sorted.indexOf(b.code)) .map((opt) => ({ id: opt.code, name: `${opt.name}${opt.nativeName ? ` — ${opt.nativeName}` : ""}`, leftIcon: , })); const selected = options.find( (item) => item.id === getLocaleInfo(props.language)?.code, ); const allSources = getAllProviders().listSources(); const sourceItems = useMemo(() => { const currentDeviceSources = getProviders().listSources(); return props.sourceOrder.map((id) => ({ id, name: allSources.find((s) => s.id === id)?.name || id, disabled: !currentDeviceSources.find((s) => s.id === id), })); }, [props.sourceOrder, allSources]); const navigate = useNavigate(); return (
{t("settings.preferences.title")}
{/* Column */}
{/* Language Preference */}

{t("settings.preferences.language")}

{t("settings.preferences.languageDescription")}

props.setLanguage(opt.id)} />
{/* Thumbnail Preference */}

{t("settings.preferences.thumbnail")}

{t("settings.preferences.thumbnailDescription")}

props.setEnableThumbnails(!props.enableThumbnails)} className="bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg" >

{t("settings.preferences.thumbnailLabel")}

{/* Autoplay Preference */}

{t("settings.preferences.autoplay")}

{t("settings.preferences.autoplayDescription")}

allowAutoplay ? props.setEnableAutoplay(!props.enableAutoplay) : null } className={classNames( "bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg", allowAutoplay ? "cursor-pointer opacity-100 pointer-events-auto" : "cursor-not-allowed opacity-50 pointer-events-none", )} >

{t("settings.preferences.autoplayLabel")}

{/* Skip End Credits Preference */} {props.enableAutoplay && allowAutoplay && (

{t("settings.preferences.skipCredits")}

{t("settings.preferences.skipCreditsDescription")}

props.setEnableSkipCredits(!props.enableSkipCredits) } className="bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg" >

{t("settings.preferences.skipCreditsLabel")}

)}
{/* Column */}

{t("settings.preferences.sourceOrder")}

navigate("/onboarding/extension")} /> ), }} />
props.setenableSourceOrder(!props.enableSourceOrder) } className="bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg" >

{t("settings.preferences.sourceOrderEnableLabel")}

{props.enableSourceOrder && (
props.setSourceOrder(items.map((item) => item.id)) } />
)}
); }