-
Notifications
You must be signed in to change notification settings - Fork 131
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(PasswordInput): focus input after clicking on the eye icon #2892
Conversation
Как воспроизвести бесконечный цикл? У меня не получается. Есть какое-то особое условие? |
Чтобы воспроизвести бесконечный цикл нужно убрать setTimeout(() => {
// @ts-expect-error: private property
if (document.activeElement !== this.input?.input) {
this.setState({ visible: false });
}
}, 200); Обновил описание и видео у второй причины |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Все проблемы от того, что при нажатии на иконку у инпута тоже происходит blur
. А blur
в #2766 стал переключать видимость пароля, что и вызывает все перечисленные эффекты.
Но, вместо того, чтобы фиксить следствия, лучше пофиксить саму причину. Нам не нужно, чтобы при клике на иконку blur
менял видимость.
У меня есть пара варинтов:
- Детектить только тот
blur
, который происходит за пределы компонента. Это основная специализация компонентаRenderLayer
. - Фильтровать все
blur
на основеe.relatedTarget
. Если фокус переходит на элемент, который может иметь фокус, то этот элемент попадает вrelatedTarget
(иначе тамnull
). Но с этим вариантом проблема в том, что пока иконка не фокусируема, и вrelatedTarget
она не попадает. Можно было бы завернуть ее в кнопку и улучшитьa11y
заодно.
Текущее решение не работает, если на иконку кликать медленно, отпуская клик через >200 мс.
Вот здесь статейка по основам поддержки SSR.
Мне второй вариант нравится больше, но оборачивание иконки в кнопку вызовет ряд других проблем, которые я описал в #2779. Так что пока предлагаю отложить реализацию до "лучших времён" (до того, пока не начнём переосмыслять стилизацию в библиотеке)
Крутая штука! Не понимал что конкретно она делает до этого момента (звучит как тема для тех. ревью |
fixes IF-472
При повторном клике на иконку глаза в
PasswordInput
перестал возвращаться фокуc (см. видео)2022-05-19.03.18.50.mov
Это было вызвано двумя причинами:
После смены иконки не вызывался
onClick
. Это полечилось добавлениемpointer-events: none
на обе иконки (на самом деле достаточно добавить эти стили на одну иконку, но для уверенности добавил на обе)После фикса первого пункта, при потере фокуса инпут стал мгновенно переходить в режим скрытых символов. Из-за чего при ручном переходе из открытых символов в скрытые пользователь попадал в бесконечный цикл (см. видео)
2022-05-25.13.19.40.mov
Это удалось полечить проверкой того, что пользователь в данный момент сфокусирован на инпуте перед переходом в режим скрытых символов при блюре (эта логика выполняется в
setTimeout
так как при клике на иконку с глазом инпут на некоторое время теряет фокус)Не уверен, насколько легальны обращения к
document.activeElement
(в том плане не упадут ли они вSSR
окружении) без дополнительных проверок, но увидел несколько мест в публичных компонентах где также используется объектdocument
без проверок, так что не стал добавлять и к себе. Но хотелось бы понять благодаря чему такой код не упадёт вSSR
Добавил новый тест, отрефакторил существующие, удалил лишние. Не получилось отрефакторить тест с использованием
CapsLock
, вероятно, это баг в библиотекеuser-event
, так как при использовании "специального символа"{capslock}
буквы при вводе не заменяются на буквы верхнего регистра, при этом другие специальные символы, например{backspace}
отрабатывают как ожидается