47 lines
2.0 KiB
TypeScript
47 lines
2.0 KiB
TypeScript
/**
|
||
* FileManager Navigation Handler
|
||
*
|
||
* Handles system integration: back handler, route tracking, and per-activity navigator.
|
||
* Cross-app callers指定具体子页时使用 intent.route(IntentResolver 让 caller hint 优先于
|
||
* filter.route),OS 直接 navigateToActivity 到目标路由,不需要 App 端再做 dispatch。
|
||
*/
|
||
import React, { useCallback, useEffect } from 'react';
|
||
import { useNavigate, UNSAFE_NavigationContext } from 'react-router-dom';
|
||
import { useAppNavigationHandler } from '../../../os/hooks/useAppNavigationHandler';
|
||
import { AppNavigatorRegistry } from '../../../os/AppNavigatorRegistry';
|
||
import { useActivityContext } from '../../../os/ActivityContext';
|
||
|
||
export const FileManagerNavigationHandler: React.FC = () => {
|
||
const navigate = useNavigate();
|
||
const { navigator } = React.useContext(UNSAFE_NavigationContext);
|
||
const { activityId } = useActivityContext();
|
||
|
||
const handleBack = useCallback((): boolean => {
|
||
const index = (navigator as any).index || 0;
|
||
if (index > 0) {
|
||
navigate(-1);
|
||
return true;
|
||
}
|
||
return false;
|
||
}, [navigate, navigator]);
|
||
|
||
useAppNavigationHandler('file_manager', { onBack: handleBack });
|
||
|
||
// Activity-level navigator 注册:用于 OS 在 foreign-task push 时(如 Settings 调用
|
||
// ACTION_VIEW + type=inode/directory 把 FileManager Activity 推到 Settings task 上)通过
|
||
// navigateToActivity 把内部路由切到 baseRoute(intent.route 或 filter.route)。
|
||
// 不注册的话,OS 的 waitForNavigator 会等到 5 秒超时。
|
||
// 默认 replace=true 保持兼容;显式 { replace: false } 时尊重 push 语义。
|
||
useEffect(() => {
|
||
const navFn = (path: string, opts?: { replace?: boolean }) => {
|
||
navigate(path, { replace: opts?.replace ?? true });
|
||
};
|
||
AppNavigatorRegistry.registerActivity(activityId, { navigate: navFn, back: handleBack }, 'file_manager');
|
||
return () => {
|
||
AppNavigatorRegistry.unregisterActivity(activityId);
|
||
};
|
||
}, [activityId, handleBack, navigate]);
|
||
|
||
return null;
|
||
};
|