Skip to content

Commit

Permalink
Prevent multiple calls of runRefreshing on iOS (#6723)
Browse files Browse the repository at this point in the history
На iOS мы вызываем `runRefreshing` внутри `onTouchMove` обработчика, который может вызываеться чаще чем обновляется состояние refreshing в стейте компонента.
https://github.com/VKCOM/VKUI/blob/78e4cb5a5fe44fda8bbe87d079156566b2aa6ce9/packages/vkui/src/components/PullToRefresh/PullToRefresh.tsx#L222-L224

Это в свою очередь влечет за собой двойной вызов `onRefresh`.

Изменения
- добавляем состояние вызова `runRefreshing()` через ref, чтобы избежать повторного вызова `runRefreshing`. Cбрасываем состояние в обработчике onTouchEnd().
Это локальная проблема конкретного условия, что runRefreshing() на iOS вызывается в определённый момент ещё до конца жеста, поэтому и ref используем только в одном месте.
  • Loading branch information
mendrew authored Mar 19, 2024
1 parent a3b96b2 commit 093fde8
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion packages/vkui/src/components/PullToRefresh/PullToRefresh.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ export const PullToRefresh = ({
startYRef.current = event.startY;
};

const iosRefreshStartedRef = React.useRef(false);
const onTouchMove = (event: TouchEventInternal) => {
const { isY, shiftY } = event;
const { start, max } = initParams;
Expand All @@ -219,7 +220,10 @@ export const PullToRefresh = ({
setCanRefresh(progress > 80);
setContentShift((currentY + 10) * 2.3);

if (progress > 85 && !refreshing && platform === 'ios') {
const iosCanStartRefreshDuringGesture =
platform === 'ios' && progress > 85 && !refreshing && !iosRefreshStartedRef.current;
if (iosCanStartRefreshDuringGesture) {
iosRefreshStartedRef.current = true;
runRefreshing();
}
} else if (isY && pageYOffset === 0 && shiftY > 0 && !refreshing && touchDown) {
Expand All @@ -235,6 +239,7 @@ export const PullToRefresh = ({
const onTouchEnd = () => {
setWatching(false);
setTouchDown(false);
iosRefreshStartedRef.current = false;
};

const spinnerTransform = `translate3d(0, ${spinnerY}px, 0)`;
Expand Down

0 comments on commit 093fde8

Please sign in to comment.