mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-10 16:00:25 +01:00
Change for the android tv side to use tabs instead of the mobile menu Signed-off-by: Lance Chant <13349722+lancechant@users.noreply.github.com>
89 lines
2.4 KiB
TypeScript
89 lines
2.4 KiB
TypeScript
import { useSegments } from "expo-router";
|
|
import { useEffect } from "react";
|
|
import { Platform } from "react-native";
|
|
import {
|
|
disableTVMenuKeyInterception,
|
|
enableTVMenuKeyInterception,
|
|
useTVBackPress,
|
|
} from "./useTVBackPress";
|
|
|
|
export { enableTVMenuKeyInterception } from "./useTVBackPress";
|
|
|
|
/** All tab route names used in the bottom tab navigator. */
|
|
export const TAB_ROUTES = [
|
|
"(home)",
|
|
"(search)",
|
|
"(favorites)",
|
|
"(libraries)",
|
|
"(watchlists)",
|
|
"(custom-links)",
|
|
"(settings)",
|
|
] as const;
|
|
|
|
export type TabRoute = (typeof TAB_ROUTES)[number];
|
|
|
|
/** Check if a segment string is a tab route. */
|
|
export function isTabRoute(s: string): s is TabRoute {
|
|
return (TAB_ROUTES as readonly string[]).includes(s);
|
|
}
|
|
|
|
/**
|
|
* Check if we're at the root of a tab
|
|
*/
|
|
function isAtTabRoot(segments: string[]): boolean {
|
|
const lastSegment = segments[segments.length - 1];
|
|
return isTabRoute(lastSegment) || lastSegment === "index";
|
|
}
|
|
|
|
/**
|
|
* Get the current tab name from segments
|
|
*/
|
|
function getCurrentTab(segments: string[]): TabRoute | undefined {
|
|
return segments.find(isTabRoute);
|
|
}
|
|
|
|
/**
|
|
* 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();
|
|
|
|
const currentTab = getCurrentTab(segments);
|
|
const atTabRoot = isAtTabRoot(segments);
|
|
const isOnHomeRoot = atTabRoot && currentTab === "(home)";
|
|
|
|
useEffect(() => {
|
|
if (!Platform.isTV) return;
|
|
|
|
if (isOnHomeRoot) {
|
|
disableTVMenuKeyInterception();
|
|
return;
|
|
}
|
|
|
|
enableTVMenuKeyInterception();
|
|
}, [isOnHomeRoot]);
|
|
}
|
|
|
|
/**
|
|
* Handles back press at a non-Home tab root on Android TV by navigating to Home.
|
|
*
|
|
* Without NativeTabs, the Stack navigator used for the Android TV nav bar has no
|
|
* built-in tab-level back handling — pressing back at a tab root would pop the
|
|
* Stack entirely and exit the tab navigator. This hook intercepts that and routes
|
|
* to Home instead.
|
|
*/
|
|
export function useTVTabRootBackHandler(
|
|
onNavigateHome: () => void,
|
|
isAtTabRoot: boolean,
|
|
currentTab: string | undefined,
|
|
) {
|
|
useTVBackPress(() => {
|
|
if (!Platform.isTV || Platform.OS !== "android") return false;
|
|
if (!isAtTabRoot || currentTab === "(home)") return false;
|
|
onNavigateHome();
|
|
return true;
|
|
}, [isAtTabRoot, currentTab, onNavigateHome]);
|
|
}
|