Files
streamyfin/hooks/useTVBackHandler.ts
2026-05-20 09:57:19 +02:00

68 lines
1.6 KiB
TypeScript

import { useSegments } from "expo-router";
import { useEffect } from "react";
import { Platform } from "react-native";
import {
disableTVMenuKeyInterception,
enableTVMenuKeyInterception,
} from "./useTVBackPress";
export { enableTVMenuKeyInterception } from "./useTVBackPress";
/**
* Check if we're at the root of a tab
*/
function isAtTabRoot(segments: string[]): boolean {
const lastSegment = segments[segments.length - 1];
const tabNames = [
"(home)",
"(search)",
"(favorites)",
"(libraries)",
"(watchlists)",
"(settings)",
"(custom-links)",
];
return tabNames.includes(lastSegment) || lastSegment === "index";
}
/**
* Get the current tab name from segments
*/
function getCurrentTab(segments: string[]): string | undefined {
return segments.find(
(s) =>
s === "(home)" ||
s === "(search)" ||
s === "(favorites)" ||
s === "(libraries)" ||
s === "(watchlists)" ||
s === "(settings)" ||
s === "(custom-links)",
);
}
/**
* Keeps tvOS menu key interception disabled on the home tab root so the system
* can apply its native app-exit behavior. Other routes can opt into
* interception when they need JS-owned back handling.
*/
export function useTVHomeBackHandler() {
const segments = useSegments();
// Get current state
const currentTab = getCurrentTab(segments);
const atTabRoot = isAtTabRoot(segments);
const isOnHomeRoot = atTabRoot && currentTab === "(home)";
useEffect(() => {
if (!Platform.isTV) return;
if (isOnHomeRoot) {
disableTVMenuKeyInterception();
return;
}
enableTVMenuKeyInterception();
}, [isOnHomeRoot]);
}