import { BottomSheetBackdrop, type BottomSheetBackdropProps, BottomSheetModal, BottomSheetView, } from "@gorhom/bottom-sheet"; import { getQuickConnectApi } from "@jellyfin/sdk/lib/utils/api"; import { useAtom } from "jotai"; import { forwardRef, useCallback, useImperativeHandle, useMemo, useRef, useState, } from "react"; import { useTranslation } from "react-i18next"; import { Alert, Platform, View } from "react-native"; import { useHaptic } from "@/hooks/useHaptic"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { Button } from "../Button"; import { Text } from "../common/Text"; import { PinInput } from "../inputs/PinInput"; export type QuickConnectSheetRef = { present: () => void }; export const QuickConnectSheet = forwardRef( (_props, ref) => { const isTv = Platform.isTV; const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); const [quickConnectCode, setQuickConnectCode] = useState(); const modalRef = useRef(null); const successHapticFeedback = useHaptic("success"); const errorHapticFeedback = useHaptic("error"); const snapPoints = useMemo( () => (Platform.OS === "android" ? ["100%"] : ["40%"]), [], ); const isAndroid = Platform.OS === "android"; const { t } = useTranslation(); useImperativeHandle( ref, () => ({ present: () => { setQuickConnectCode(""); modalRef.current?.present(); }, }), [], ); const renderBackdrop = useCallback( (props: BottomSheetBackdropProps) => ( ), [], ); const authorizeQuickConnect = useCallback(async () => { if (!quickConnectCode) return; try { const res = await getQuickConnectApi(api!).authorizeQuickConnect({ code: quickConnectCode, userId: user?.Id, }); if (res.status === 200) { successHapticFeedback(); Alert.alert( t("home.settings.quick_connect.success"), t("home.settings.quick_connect.quick_connect_autorized"), ); setQuickConnectCode(undefined); modalRef.current?.dismiss(); } else { errorHapticFeedback(); Alert.alert( t("home.settings.quick_connect.error"), t("home.settings.quick_connect.invalid_code"), ); } } catch (_e) { errorHapticFeedback(); Alert.alert( t("home.settings.quick_connect.error"), t("home.settings.quick_connect.invalid_code"), ); } }, [ api, user, quickConnectCode, t, successHapticFeedback, errorHapticFeedback, ]); if (isTv) return null; return ( {t("home.settings.quick_connect.quick_connect_title")} {t( "home.settings.quick_connect.enter_the_quick_connect_code", )} ); }, ); QuickConnectSheet.displayName = "QuickConnectSheet";