Skip to content
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

patch(v5): pr6325 #6393

Conversation

mendrew
Copy link
Contributor

@mendrew mendrew commented Jan 17, 2024

Cherry-picked из v6.

Мы очень хитро восстанавливаем позицию скролла, надеясь на то, что это всегда будет работать в useEffect, который сработает перед обработкой события transition (перед завершением анимации), где окончательно сбросятся все состояния.
Но в случае, если пользователь вернул панель назад, мы просто сбрасываем состояние компонента, отвечающее, за свайп. Логика, отвечающая за восстановление скролла не срабатывает, потому что это не считается как `failure`.

Вот тут мы решаем `swipeBack` был успешным (`success`), был отменён (`fail`), то есть свайп не закончен, либо это вообще не считается свайпом, потому что панель по завершении жеста осталась на той же позиции.
https://github.com/VKCOM/VKUI/blob/a4719b49f887c2584eec6655d72e373e62409c59/packages/vkui/src/components/View/View.tsx#L301-L316
Если это не свайп вовсе (пользователь вернул панель на место), то мы просто сбрасываем состояние свайпа с помощью функции `onSwipeBackCancel`.

Но в такой ситуации не сработает условие для восстановления скролла при отмене свайпа.
https://github.com/VKCOM/VKUI/blob/8dbb1de9855af8c772abcb719848175654e39a8a/src/components/View/View.tsx#L494-L500

- caused by #5725

-- Изменения
Вынес логику по восстановлению скролла при отмене свайпа в отдельный useEffect, потому что изначальный слишком большой.
Смотрю на переменные `prevSwipingBack`, `swipingBack`, чтобы понять был ли всё же свайп, потому что `swipeBackResult` нам ни о чем не скажет, даже если бы мы его устанавливали, то он не был бы тут же очищен в том же рендере из-за вызова `onSwipeBackCancel`. Также проверяю `prevSwipeBackShift`, который равен нулю, то есть смещения после жеста у панели нет, что значит, что пользователь жестом свайпа вернул панель туда откуда взял.
@github-actions github-actions bot added patch Автоматизация: PR продублируется в ветку последнего минорного релиза для выпуска патча v5 Автоматизация: PR продублируется в ветку v5 labels Jan 17, 2024
@mendrew mendrew removed the v5 Автоматизация: PR продублируется в ветку v5 label Jan 17, 2024
@mendrew mendrew added this to the v5.10.1 milestone Jan 17, 2024
Copy link
Contributor

github-actions bot commented Jan 17, 2024

size-limit report 📦

Path Size
JS 370.64 KB (+0.03% 🔺)
JS (gzip) 111.6 KB (+0.03% 🔺)
JS (brotli) 90.58 KB (+0.11% 🔺)
JS import Div (tree shaking) 2.74 KB (0%)
CSS 285.58 KB (0%)
CSS (gzip) 36.55 KB (0%)
CSS (brotli) 29.09 KB (0%)

Copy link

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit e3bb41d:

Sandbox Source
VKUI TypeScript Configuration

Copy link
Contributor

e2e tests

Playwright Report

Copy link
Contributor

github-actions bot commented Jan 17, 2024

👀 Docs deployed

Commit e3bb41d

Copy link

codecov bot commented Jan 17, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

❗ No coverage uploaded for pull request base (v5@1cb5473). Click here to learn what that means.

Additional details and impacted files
@@          Coverage Diff          @@
##             v5    #6393   +/-   ##
=====================================
  Coverage      ?   80.65%           
=====================================
  Files         ?      314           
  Lines         ?    10804           
  Branches      ?     3369           
=====================================
  Hits          ?     8714           
  Misses        ?     2090           
  Partials      ?        0           
Flag Coverage Δ
unittests 80.65% <0.00%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@mendrew mendrew marked this pull request as ready for review January 17, 2024 12:01
@mendrew mendrew requested a review from a team as a code owner January 17, 2024 12:01
@github-actions github-actions bot added the v5 Автоматизация: PR продублируется в ветку v5 label Jan 17, 2024
@mendrew mendrew removed the v5 Автоматизация: PR продублируется в ветку v5 label Jan 17, 2024
@mendrew mendrew merged commit 596613d into v5 Jan 18, 2024
47 checks passed
@mendrew mendrew deleted the mendrew/v5/cherry-pick/6325/03d7a58f34b8325f1d15da89cffd309a8f5e7615 branch January 18, 2024 07:59
vkcom-publisher pushed a commit that referenced this pull request Jan 18, 2024
Cherry-picked из v6.

Мы очень хитро восстанавливаем позицию скролла, надеясь на то, что это всегда будет работать в useEffect, который сработает перед обработкой события transition (перед завершением анимации), где окончательно сбросятся все состояния.
Но в случае, если пользователь вернул панель назад, мы просто сбрасываем состояние компонента, отвечающее, за свайп. Логика, отвечающая за восстановление скролла не срабатывает, потому что это не считается как `failure`.

Вот тут мы решаем `swipeBack` был успешным (`success`), был отменён (`fail`), то есть свайп не закончен, либо это вообще не считается свайпом, потому что панель по завершении жеста осталась на той же позиции.
https://github.com/VKCOM/VKUI/blob/a4719b49f887c2584eec6655d72e373e62409c59/packages/vkui/src/components/View/View.tsx#L301-L316
Если это не свайп вовсе (пользователь вернул панель на место), то мы просто сбрасываем состояние свайпа с помощью функции `onSwipeBackCancel`.

Но в такой ситуации не сработает условие для восстановления скролла при отмене свайпа.
https://github.com/VKCOM/VKUI/blob/8dbb1de9855af8c772abcb719848175654e39a8a/src/components/View/View.tsx#L494-L500

- caused by #5725

-- Изменения
Вынес логику по восстановлению скролла при отмене свайпа в отдельный useEffect, потому что изначальный слишком большой.
Смотрю на переменные `prevSwipingBack`, `swipingBack`, чтобы понять был ли всё же свайп, потому что `swipeBackResult` нам ни о чем не скажет, даже если бы мы его устанавливали, то он не был бы тут же очищен в том же рендере из-за вызова `onSwipeBackCancel`. Также проверяю `prevSwipeBackShift`, который равен нулю, то есть смещения после жеста у панели нет, что значит, что пользователь жестом свайпа вернул панель туда откуда взял.
@mendrew mendrew self-assigned this Jan 18, 2024
@inomdzhon inomdzhon changed the title fix(View): Restore scroll position on swipe back cancel (cherry-picked from #6325) patch(v5): pr6325 Jan 26, 2024
@inomdzhon inomdzhon removed this from the v5.10.1 milestone Feb 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
patch Автоматизация: PR продублируется в ветку последнего минорного релиза для выпуска патча
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

[Bug][View][iOS]: Теряется скролл при отмене swipeback
3 participants