VKCOM/VKUI

[Bug]: Не изменяется sizeY в AdaptivityProvider для модалки при переходе в эмулятор

Pavel1711 opened this issue · 6 comments

Описание

Если открыть модальное окно со switch и gallery на пк, затем включить эмулятор(либо наоборот), то галерея не будет листаться и switch будет отображаться с сохраненной версией при загрузке.

Версия

6.1.0

В каких браузерах воспроизводится проблема?

No response

Шаги воспроизведения

No response

Ожидаемое поведение

Галерея листается, Switch в соответствии с платформой

Скриншоты

Снимок экрана 2024-06-11 в 16 12 30

Пример с воспроизведением

https://codesandbox.io/p/sandbox/modalpage-forked-r9hv9s

@Pavel1711 Привет, а можешь, пожалуйста, поколдовать над настройками доступа к codesandbox, а то при переходе по ссылке пишет, что Sandbox not found?

@Pavel1711 Привет, а можешь, пожалуйста, поколдовать над настройками доступа к codesandbox, а то при переходе по ссылке пишет, что Sandbox not found?

Сейчас должно быть доступно

@Pavel1711 Привет, а можешь, пожалуйста, поколдовать над настройками доступа к codesandbox, а то при переходе по ссылке пишет, что Sandbox not found?

Сейчас должно быть доступно

Спасибо, есть доступ!

@Pavel1711

Немножно поисследовал.


По поводу Gallery. Gallery перестаёт работать потому что внутри для реализации скролла мы испльзуем компонент Touch, который завязыватся на либо touch события, либо на  mouse события по такому условию:

// eslint-disable-next-line no-restricted-globals
const touchEnabled = () => canUseDOM && 'ontouchstart' in window;
/*
* Возвращает массив поддерживаемых событий
* Если браузер поддерживает pointer events или подключена handjs, вернет события указателя.
* Если нет, используем события мыши
*/
function getSupportedEvents(): string[] {
if (touchEnabled()) {
return ['touchstart', 'touchmove', 'touchend', 'touchcancel'];
}
return ['mousedown', 'mousemove', 'mouseup', 'mouseleave'];
}

При этом в DevTools, если эмулировать touch (Mobile) устройство и перезагрузить страницу, то 'ontouchstart' in window вернёт true, в то время как если перевеcти эмуляцию в Desktop, то 'ontouchstart' in window так и будет возвращать true. Обратная ситуация точно такая же, если перезагрузить приложение в Desktop режиме, то 'ontouchstart' in window будет false, в mobile режиме также будет false. А это значит, что логика Touch элемента сломается и мы повесим обработчики, которые не соответствуют событиям, отправляемым в режиме эмуляции.
Как вариант тут можно было бы подписаться на все события, но это сильно усложнит и без того сложную реализацию. Ради режима DevTools я бы не стал трогать её пока что. Хотя здорово, что заметили такую особенность. Нас сильно ещё подводит окружение в эмуляторе, которое всё же не так гибко меняется как хотелось бы.
Не думаю, что мы в ближайшее время поменяем поведение Touch, я бы советовал перезагружать приложение при включении режима эмуляции устройства ввода.


Со Switch немного иная ситуация, тут внешний вид зависит от platform. И если поменять userAgent, то platform, который вычисляется в ConfigProvider изменён не будет, потому что вычисляется только один раз. Мы делаем это намеренно, так как не ожидаем, что платформа может динамически поменяется.

Тут как вариант, на resize, вместе с определением mobile пересчитать platform и отправить результат в ConfigProvider. Использовать нашу функцию platform тут не вариант, к сожалению, потому что она мемоизируется внутри. Можно воспользоваться функцией detectIOS из @vkontakte/vkjs и отправлять в platform либо ios либо android.

А вот по поводу изменения sizeY - он всё же меняется и меняется правильно, просто внешний вид Switch больше зависит от platform.


Что ты об этом думаешь?