Mirror: React hooks for accessible, common web interactions. UI super powers without the UI.

Add Enter key handling

Changed files
+20 -4
src
+10 -2
src/useDialogFocus.ts
···
import { snapshotSelection, restoreSelection } from './utils/selection';
-
import { getFocusTargets, getNextFocusTarget } from './utils/focus';
+
import { getFirstFocusTarget, getFocusTargets, getNextFocusTarget } from './utils/focus';
import { useLayoutEffect } from './utils/react';
import { contains, isInputElement } from './utils/element';
import { makePriorityHook } from './usePriority';
···
event.preventDefault();
willReceiveFocus = false;
restoreSelection(selection);
+
} else if (owner && isInputElement(owner) && contains(owner, active) && event.code === 'Enter') {
+
// Move focus to first target when enter is pressed
+
event.preventDefault();
+
const newTarget = getFirstFocusTarget(ref.current);
+
if (newTarget) {
+
selection = snapshotSelection(owner);
+
newTarget.focus();
+
}
} else if (
owner &&
-
active !== owner &&
+
contains(owner, active) &&
isInputElement(owner) &&
/^(?:Key|Digit)/.test(event.code)
) {
+10 -2
src/useMenuFocus.ts
···
import { RestoreSelection, snapshotSelection, restoreSelection } from './utils/selection';
-
import { getFocusTargets } from './utils/focus';
+
import { getFirstFocusTarget, getFocusTargets } from './utils/focus';
import { useLayoutEffect } from './utils/react';
import { contains, isInputElement } from './utils/element';
import { Ref } from './types';
···
// Implement End => last item
event.preventDefault();
focusTargets[focusTargets.length - 1].focus();
-
} else if (owner && active !== owner && event.code === 'Escape') {
+
} else if (owner && isInputElement(owner) && contains(owner, active) && event.code === 'Enter') {
+
// Move focus to first target when enter is pressed
+
event.preventDefault();
+
const newTarget = getFirstFocusTarget(ref.current);
+
if (newTarget) {
+
selection = snapshotSelection(owner);
+
newTarget.focus();
+
}
+
} else if (owner && !contains(owner, active) && event.code === 'Escape') {
// Restore selection if escape is pressed
event.preventDefault();
restoreSelection(selection);