MCPcopy Index your code
hub / github.com/adobe/react-spectrum / useFocus

Function useFocus

packages/react-aria/src/interactions/useFocus.ts:38–91  ·  view source on GitHub ↗
(
  props: FocusProps<Target>
)

Source from the content-addressed store, hash-verified

36 * Focus events on child elements will be ignored.
37 */
38export function useFocus<Target extends FocusableElement = FocusableElement>(
39 props: FocusProps<Target>
40): FocusResult<Target> {
41 let {isDisabled, onFocus: onFocusProp, onBlur: onBlurProp, onFocusChange} = props;
42
43 const onBlur: FocusProps<Target>['onBlur'] = useCallback(
44 (e: FocusEvent<Target>) => {
45 if (getEventTarget(e) === e.currentTarget) {
46 if (onBlurProp) {
47 onBlurProp(e);
48 }
49
50 if (onFocusChange) {
51 onFocusChange(false);
52 }
53
54 return true;
55 }
56 },
57 [onBlurProp, onFocusChange]
58 );
59
60 const onSyntheticFocus = useSyntheticBlurEvent<Target>(onBlur);
61
62 const onFocus: FocusProps<Target>['onFocus'] = useCallback(
63 (e: FocusEvent<Target>) => {
64 // Double check that document.activeElement actually matches e.target in case a previously chained
65 // focus handler already moved focus somewhere else.
66
67 let eventTarget = getEventTarget(e);
68 const ownerDocument = getOwnerDocument(eventTarget);
69 const activeElement = ownerDocument ? getActiveElement(ownerDocument) : getActiveElement();
70 if (eventTarget === e.currentTarget && eventTarget === activeElement) {
71 if (onFocusProp) {
72 onFocusProp(e);
73 }
74
75 if (onFocusChange) {
76 onFocusChange(true);
77 }
78
79 onSyntheticFocus(e);
80 }
81 },
82 [onFocusChange, onFocusProp, onSyntheticFocus]
83 );
84
85 return {
86 focusProps: {
87 onFocus: !isDisabled && (onFocusProp || onFocusChange || onBlurProp) ? onFocus : undefined,
88 onBlur: !isDisabled && (onBlurProp || onFocusChange) ? onBlur : undefined
89 }
90 };
91}

Callers 11

ExampleFunction · 0.90
useFocusableFunction · 0.90
useNumberFieldFunction · 0.90
useColorAreaFunction · 0.90
useClipboardFunction · 0.90
useFocusRingFunction · 0.90
RowFunction · 0.90
MenuItemFunction · 0.90
ListBox.tsxFile · 0.90
ColorSlider.tsxFile · 0.90
Button.tsxFile · 0.90

Calls 4

getEventTargetFunction · 0.90
useSyntheticBlurEventFunction · 0.90
getOwnerDocumentFunction · 0.90
getActiveElementFunction · 0.90

Tested by 1

ExampleFunction · 0.72