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

fix(View): edit isSwipeBackTarget predicate #7392

Merged

Conversation

inomdzhon
Copy link
Contributor

@inomdzhon inomdzhon commented Aug 14, 2024


  • Unit-тесты

Описание

Была проблема, что до #6979:

  1. переменная prevSwipeBackResult использовалась в React.useEffect(), из-за чего она была всегда актуальная, т.к. обращались мы к ней после окончания рендера. В refactor: reduce motion #6979 она переместилась в render prop, где мы обращаемся к переменной до окончания рендера, поэтому и получалось так, что свайп бёк срабатывал в первый раз, пока prevSwipeBackResult являлся null, а во второй раз уже не срабатывал, т.к. prevSwipeBackResult имел предыдущее состояние. Изучил, что проверку на prevSwipeBackResult в целом можно удалить.

  2. Событие transitionend навешивалось в обход React, а также был фолбек с setTimeout(). В refactor: reduce motion #6979 события навешиваются через ReactonTransitionEnd. Иногда обработчик не вызывался. Чтобы исправить это, перенёс навешивания события на текущий элемент (isSwipeBackPrev) вместо последующего (isSwipeBackNext). Поправил тесты под это изменение.

Изменения

  • удалил React.useCallback() на обработчике события onAnimationEnd, т.к. это обычный <div /> и мемоизация ни к чему;
  • заодно отрефакторил calcPanelSwipeStyles() и calcPanelSwipeBackOverlayStyles().

Была проблема, что до #6979:

1. переменная `prevSwipeBackResult` использовалась в `React.useEffect()`, из-за чего она была всегда актуальная, т.к. обращались мы к ней после окончания рендера. В #6979 она переместилась в **render prop**, где мы обращаемся к переменной до окончания рендера, поэтому и получалось так, что свайп бёк срабатывал в первый раз, пока `prevSwipeBackResult` являлся `null`, а во второй раз уже не срабатывал, т.к. `prevSwipeBackResult` имел предыдущее состояние. Изучил, что проверку на `prevSwipeBackResult` в целом можно удалить.

2. Событие `transitionend` навешивалось в обход **React**, а также был фолбек на `setTimeout()`. В #6979 события навешиваются через **React** – `onTransitionEnd`. Иногда обработчик не вызывался. Чтобы исправить это, перенёс навешивания события на текущий элемент (`isSwipeBackPrev`) вместо последующего (`isSwipeBackNext`). Поправил тесты под это изменение.

**Изменения**

- удалил `React.useCallback()` на обработчике события `onAnimationEnd`, т.к. это обычный `<div />` и мемоизация ни к чему
- заодно отрефакторил `calcPanelSwipeStyles()` и `calcPanelSwipeBackOverlayStyles()`;
@inomdzhon inomdzhon requested a review from a team as a code owner August 14, 2024 14:51
@github-actions github-actions bot added the patch Автоматизация: PR продублируется в ветку последнего минорного релиза для выпуска патча label Aug 14, 2024
Copy link
Contributor

size-limit report 📦

Path Size
JS 377.93 KB (-0.04% 🔽)
JS (gzip) 114.61 KB (-0.03% 🔽)
JS (brotli) 94.11 KB (-0.09% 🔽)
JS import Div (tree shaking) 1.39 KB (0%)
CSS 305.67 KB (0%)
CSS (gzip) 39.22 KB (0%)
CSS (brotli) 31.48 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.

Copy link
Contributor

e2e tests

Playwright Report

Copy link
Contributor

👀 Docs deployed

Commit a9b8a8c

Copy link

codecov bot commented Aug 14, 2024

Codecov Report

Attention: Patch coverage is 92.85714% with 1 line in your changes missing coverage. Please review.

Project coverage is 92.75%. Comparing base (d3858fe) to head (a9b8a8c).
Report is 3 commits behind head on master.

Files Patch % Lines
packages/vkui/src/components/View/View.tsx 92.85% 1 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           master    #7392       +/-   ##
===========================================
+ Coverage        0   92.75%   +92.75%     
===========================================
  Files           0      374      +374     
  Lines           0    11110    +11110     
  Branches        0     3646     +3646     
===========================================
+ Hits            0    10305    +10305     
- Misses          0      805      +805     
Flag Coverage Δ
unittests 92.75% <92.85%> (?)

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.

@inomdzhon inomdzhon merged commit 88727c8 into master Aug 19, 2024
27 checks passed
@inomdzhon inomdzhon deleted the imirdzhamolov/issue7371/fix/View-is-block-after-swipe branch August 19, 2024 11:43
vkcom-publisher pushed a commit that referenced this pull request Aug 19, 2024
h2. Описание

Была проблема, что до #6979:

1. переменная `prevSwipeBackResult` использовалась в `React.useEffect()`, из-за чего она была всегда актуальная, т.к. обращались мы к ней после окончания рендера. В #6979 она переместилась в **render prop**, где мы обращаемся к переменной до окончания рендера, поэтому и получалось так, что свайп бёк срабатывал в первый раз, пока `prevSwipeBackResult` являлся `null`, а во второй раз уже не срабатывал, т.к. `prevSwipeBackResult` имел предыдущее состояние. Изучил, что проверку на `prevSwipeBackResult` в целом можно удалить.

2. Событие `transitionend` навешивалось в обход **React**, а также был фолбек с `setTimeout()`. В #6979 события навешиваются через **React** – `onTransitionEnd`. Иногда обработчик не вызывался. Чтобы исправить это, перенёс навешивания события на текущий элемент (`isSwipeBackPrev`) вместо последующего (`isSwipeBackNext`). Поправил тесты под это изменение.

h2. Изменения

- удалил `React.useCallback()` на обработчике события `onAnimationEnd`, т.к. это обычный `<div />` и мемоизация ни к чему;
- заодно отрефакторил `calcPanelSwipeStyles()` и `calcPanelSwipeBackOverlayStyles()`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
patch Автоматизация: PR продублируется в ветку последнего минорного релиза для выпуска патча
Projects
None yet
3 participants