From 3aff58769cf70a914382c54c1b239c929f5b33a3 Mon Sep 17 00:00:00 2001 From: "e.mukhametkhanov" Date: Fri, 3 Apr 2026 14:15:37 +0300 Subject: [PATCH 1/6] feat: fix close floating elements and modals when esc keydown --- .../components/CalendarTime/CalendarTime.tsx | 18 +-- .../components/ChipsSelect/ChipsSelect.tsx | 3 +- .../hooks/useInputKeyboardController.ts | 8 +- .../src/components/DateInput/DateInput.tsx | 4 +- .../DateRangeInput/DateRangeInput.tsx | 4 +- .../ModalCard/ModalCardInternal.tsx | 21 +--- .../ModalPage/ModalPageInternal.tsx | 21 +--- .../src/hooks/useGlobalEscKeyDown.test.tsx | 116 ++++++++++++++++++ .../vkui/src/hooks/useGlobalEscKeyDown.ts | 88 +++++++++++-- 9 files changed, 214 insertions(+), 69 deletions(-) create mode 100644 packages/vkui/src/hooks/useGlobalEscKeyDown.test.tsx diff --git a/packages/vkui/src/components/CalendarTime/CalendarTime.tsx b/packages/vkui/src/components/CalendarTime/CalendarTime.tsx index e876fa57e95..d496438b77d 100644 --- a/packages/vkui/src/components/CalendarTime/CalendarTime.tsx +++ b/packages/vkui/src/components/CalendarTime/CalendarTime.tsx @@ -152,20 +152,6 @@ export const CalendarTime = ({ } }; - const stopPropagationOfEscapeKeyboardEventWhenSelectIsOpen = React.useCallback( - (event: React.KeyboardEvent, isOpen: boolean) => { - if (isOpen && event.key === 'Escape') { - event.stopPropagation(); - } - }, - [], - ); - - const onSelectInputKeyDown = (e: React.KeyboardEvent, isOpen: boolean) => { - onPickerKeyDown(e); - stopPropagationOfEscapeKeyboardEventWhenSelectIsOpen(e, isOpen); - }; - const renderDoneButton = () => { const ButtonComponent = DoneButton ?? Button; return ( @@ -191,7 +177,7 @@ export const CalendarTime = ({ onChange={onChange} options={localHours} setTime={setHoursFn} - onInputKeyDown={onSelectInputKeyDown} + onInputKeyDown={onPickerKeyDown} inputRef={hoursInputRef} inputLabel={changeHoursLabel} inputTestId={hoursTestId} @@ -203,7 +189,7 @@ export const CalendarTime = ({ onChange={onChange} options={localMinutes} setTime={setMinutesFn} - onInputKeyDown={onSelectInputKeyDown} + onInputKeyDown={onPickerKeyDown} inputRef={minutesInputRef} inputLabel={changeMinutesLabel} inputTestId={minutesTestId} diff --git a/packages/vkui/src/components/ChipsSelect/ChipsSelect.tsx b/packages/vkui/src/components/ChipsSelect/ChipsSelect.tsx index 4794ce85d7f..dd1909fa2f5 100644 --- a/packages/vkui/src/components/ChipsSelect/ChipsSelect.tsx +++ b/packages/vkui/src/components/ChipsSelect/ChipsSelect.tsx @@ -4,6 +4,7 @@ import * as React from 'react'; import type { MouseEventHandler } from 'react'; import { classNames } from '@vkontakte/vkjs'; import { useExternRef } from '../../hooks/useExternRef'; +import { useGlobalEscKeyDown } from '../../hooks/useGlobalEscKeyDown'; import { useGlobalOnEventOutside } from '../../hooks/useGlobalOnClickOutside'; import { useMergeProps } from '../../hooks/useMergeProps'; import { Keys } from '../../lib/accessibility'; @@ -438,13 +439,13 @@ export const ChipsSelect =