import { t } from "i18next"; import React, { useEffect } from "react"; import { BackHandler, Platform, ScrollView, View } from "react-native"; import { Text } from "@/components/common/Text"; import { useScaledTVTypography } from "@/constants/TVTypography"; import type { SavedServer, SavedServerAccount, } from "@/utils/secureCredentials"; import { TVAddIcon } from "./TVAddIcon"; import { TVBackIcon } from "./TVBackIcon"; import { TVUserIcon } from "./TVUserIcon"; interface TVUserSelectionScreenProps { server: SavedServer; onUserSelect: (account: SavedServerAccount) => void; onAddUser: () => void; onChangeServer: () => void; disabled?: boolean; } // TV event handler with fallback for non-TV platforms let useTVEventHandler: (callback: (evt: any) => void) => void; if (Platform.isTV) { try { useTVEventHandler = require("react-native").useTVEventHandler; } catch { useTVEventHandler = () => {}; } } else { useTVEventHandler = () => {}; } export const TVUserSelectionScreen: React.FC = ({ server, onUserSelect, onAddUser, onChangeServer, disabled = false, }) => { const typography = useScaledTVTypography(); const accounts = server.accounts || []; const hasAccounts = accounts.length > 0; // Handle TV remote back/menu button useTVEventHandler((evt) => { if (!evt || disabled) return; if (evt.eventType === "menu" || evt.eventType === "back") { onChangeServer(); } }); // Handle Android TV back button useEffect(() => { if (!Platform.isTV) return; const handleBackPress = () => { if (disabled) return false; onChangeServer(); return true; }; const subscription = BackHandler.addEventListener( "hardwareBackPress", handleBackPress, ); return () => subscription.remove(); }, [onChangeServer, disabled]); return ( {/* Server Info Header */} {server.name || server.address} {server.name && ( {server.address.replace(/^https?:\/\//, "")} )} {hasAccounts ? t("login.select_user") : t("login.add_user_to_login")} {/* User Icons Grid with Back and Add buttons */} {/* Back/Change Server Button (left) */} {/* User Icons */} {accounts.map((account, index) => ( onUserSelect(account)} hasTVPreferredFocus={index === 0} disabled={disabled} serverAddress={server.address} userId={account.userId} primaryImageTag={account.primaryImageTag} /> ))} {/* Add User Button (right) */} ); };