文件
mynode/packages/app-mobile/components/accessibility/FocusControl/AutoFocusProvider.tsx
chen 301194963b
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
feat: Initial clean release of CHM
2026-11-04 11:29:39 +08:00

63 行
1.8 KiB
TypeScript

import * as React from 'react';
import { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';
type AutoFocusCallback = ()=> void;
interface AutoFocusControl {
// It isn't always possible to autofocus (e.g. due to a dialog obscuring focus).
canAutoFocus(): boolean;
// Sets the callback to be triggered when it becomes possible to autofocus
setAutofocusCallback(callback: AutoFocusCallback): void;
removeAutofocusCallback(callback: AutoFocusCallback): void;
}
export const AutoFocusContext = createContext<AutoFocusControl|null>(null);
interface Props {
children: React.ReactNode;
allowAutoFocus: boolean;
}
const AutoFocusProvider: React.FC<Props> = ({ allowAutoFocus, children }) => {
const [autoFocusCallback, setAutofocusCallback] = useState<AutoFocusCallback|null>(null);
const allowAutoFocusRef = useRef(allowAutoFocus);
allowAutoFocusRef.current = allowAutoFocus;
useEffect(() => {
if (allowAutoFocus && autoFocusCallback) {
autoFocusCallback();
setAutofocusCallback(null);
}
}, [autoFocusCallback, allowAutoFocus]);
const removeAutofocusCallback = useCallback((toRemove: AutoFocusCallback) => {
setAutofocusCallback(callback => {
// Update the callback only if it's different
if (callback === toRemove) {
return null;
} else {
return callback;
}
});
}, []);
const autoFocusControl = useMemo((): AutoFocusControl => {
return {
canAutoFocus: () => {
return allowAutoFocusRef.current;
},
setAutofocusCallback: (callback) => {
setAutofocusCallback(() => callback);
},
removeAutofocusCallback,
};
}, [removeAutofocusCallback, setAutofocusCallback]);
return <AutoFocusContext.Provider value={autoFocusControl}>
{children}
</AutoFocusContext.Provider>;
};
export default AutoFocusProvider;