Skip to content

Commit

Permalink
fix: lottie and svg not render after switching from Inbox to Settings
Browse files Browse the repository at this point in the history
  • Loading branch information
dominictb committed Sep 11, 2024
1 parent 762bffc commit 1f95415
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
Expand Up @@ -2,7 +2,7 @@ import {useIsFocused, useNavigation, useRoute} from '@react-navigation/native';
import React, {useEffect, useRef, useState} from 'react';
import {Freeze} from 'react-freeze';
import type ChildrenProps from '@src/types/utils/ChildrenProps';
import shouldSetScreenBlurred from './shouldSetScreenBlurred';
import shouldSetScreenBlurred from '../shouldSetScreenBlurred';

Check warning on line 5 in src/libs/Navigation/FreezeWrapper/index.native.tsx

View workflow job for this annotation

GitHub Actions / Run ESLint

Unexpected parent import '../shouldSetScreenBlurred'. Use '@libs/Navigation/shouldSetScreenBlurred' instead

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 type ChildrenProps from '@src/types/utils/ChildrenProps';
import shouldSetScreenBlurred from '../shouldSetScreenBlurred';

Check warning on line 5 in src/libs/Navigation/FreezeWrapper/index.tsx

View workflow job for this annotation

GitHub Actions / Run ESLint

Unexpected parent import '../shouldSetScreenBlurred'. Use '@libs/Navigation/shouldSetScreenBlurred' instead

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 1f95415

Please sign in to comment.