mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-05-20 22:06:35 +01:00
68 lines
1.6 KiB
TypeScript
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]);
|
|
}
|