Skip to content

Commit

Permalink
Merge pull request #48991 from dominictb/fix/47041
Browse files Browse the repository at this point in the history
fix: lottie and svg not show after switching from Inbox to Settings
  • Loading branch information
puneetlath authored Sep 16, 2024
2 parents 67dff6b + 5067317 commit 837807d
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {useIsFocused, useNavigation, useRoute} from '@react-navigation/native';
import React, {useEffect, useRef, useState} from 'react';
import {Freeze} from 'react-freeze';
import shouldSetScreenBlurred from '@libs/Navigation/shouldSetScreenBlurred';
import type ChildrenProps from '@src/types/utils/ChildrenProps';
import shouldSetScreenBlurred from './shouldSetScreenBlurred';

type FreezeWrapperProps = ChildrenProps & {
/** Prop to disable freeze */
Expand Down
46 changes: 46 additions & 0 deletions src/libs/Navigation/FreezeWrapper/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import {useIsFocused, useNavigation, useRoute} from '@react-navigation/native';
import React, {useEffect, useLayoutEffect, useRef, useState} from 'react';
import {Freeze} from 'react-freeze';
import shouldSetScreenBlurred from '@libs/Navigation/shouldSetScreenBlurred';
import type ChildrenProps from '@src/types/utils/ChildrenProps';

type FreezeWrapperProps = ChildrenProps & {
/** Prop to disable freeze */
keepVisible?: boolean;
};

function FreezeWrapper({keepVisible = false, children}: FreezeWrapperProps) {
const [isScreenBlurred, setIsScreenBlurred] = useState(false);
const [freezed, setFreezed] = useState(false);
// we need to know the screen index to determine if the screen can be frozen
const screenIndexRef = useRef<number | null>(null);
const isFocused = useIsFocused();
const navigation = useNavigation();
const currentRoute = useRoute();

useEffect(() => {
const index = navigation.getState()?.routes.findIndex((route) => route.key === currentRoute.key) ?? 0;
screenIndexRef.current = index;
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
}, []);

useEffect(() => {
const unsubscribe = navigation.addListener('state', () => {
const navigationIndex = (navigation.getState()?.index ?? 0) - (screenIndexRef.current ?? 0);
setIsScreenBlurred(shouldSetScreenBlurred(navigationIndex));
});
return () => unsubscribe();
}, [isFocused, isScreenBlurred, navigation]);

// Decouple the Suspense render task so it won't be interuptted by React's concurrent mode
// and stuck in an infinite loop
useLayoutEffect(() => {
setFreezed(!isFocused && isScreenBlurred && !keepVisible);
}, [isFocused, isScreenBlurred, keepVisible]);

return <Freeze freeze={freezed}>{children}</Freeze>;
}

FreezeWrapper.displayName = 'FreezeWrapper';

export default FreezeWrapper;

0 comments on commit 837807d

Please sign in to comment.