Fix tab navigator render loop

This commit is contained in:
Arnaud Vergnet 2021-05-19 09:47:36 +02:00
parent 94a0ca33a4
commit 9e6fee467f
5 changed files with 30 additions and 19 deletions

View file

@ -53,9 +53,9 @@ type StateType = {
export default class App extends React.Component<{}, StateType> { export default class App extends React.Component<{}, StateType> {
navigatorRef: { current: null | NavigationContainerRef }; navigatorRef: { current: null | NavigationContainerRef };
defaultHomeRoute: string | null; defaultHomeRoute: string | undefined;
defaultHomeData: { [key: string]: string }; defaultHomeData: { [key: string]: string } | undefined;
urlHandler: URLHandler; urlHandler: URLHandler;
@ -67,8 +67,8 @@ export default class App extends React.Component<{}, StateType> {
}; };
initLocales(); initLocales();
this.navigatorRef = React.createRef(); this.navigatorRef = React.createRef();
this.defaultHomeRoute = null; this.defaultHomeRoute = undefined;
this.defaultHomeData = {}; this.defaultHomeData = undefined;
this.urlHandler = new URLHandler(this.onInitialURLParsed, this.onDetectURL); this.urlHandler = new URLHandler(this.onInitialURLParsed, this.onDetectURL);
this.urlHandler.listen(); this.urlHandler.listen();
setSafeBounceHeight(Platform.OS === 'ios' ? 100 : 20); setSafeBounceHeight(Platform.OS === 'ios' ? 100 : 20);

View file

@ -313,18 +313,25 @@ function MainStackComponent(props: {
} }
type PropsType = { type PropsType = {
defaultHomeRoute: string | null; defaultHomeRoute?: string;
defaultHomeData: { [key: string]: string }; defaultHomeData?: { [key: string]: string };
}; };
export default function MainNavigator(props: PropsType) { function MainNavigator(props: PropsType) {
const { preferences } = usePreferences(); const { preferences } = usePreferences();
const showIntro = getPreferenceBool(PreferenceKeys.showIntro, preferences); const showIntro = getPreferenceBool(PreferenceKeys.showIntro, preferences);
const createTabNavigator = () => <TabNavigator {...props} />;
return ( return (
<MainStackComponent <MainStackComponent
showIntro={showIntro !== false} showIntro={showIntro !== false}
createTabNavigator={() => <TabNavigator {...props} />} createTabNavigator={createTabNavigator}
/> />
); );
} }
export default React.memo(
MainNavigator,
(pp: PropsType, np: PropsType) =>
pp.defaultHomeRoute === np.defaultHomeRoute &&
pp.defaultHomeData === np.defaultHomeData
);

View file

@ -136,8 +136,8 @@ function PlanningStackComponent() {
const HomeStack = createStackNavigator(); const HomeStack = createStackNavigator();
function HomeStackComponent( function HomeStackComponent(
initialRoute: string | null, initialRoute?: string,
defaultData: { [key: string]: string } defaultData?: { [key: string]: string }
) { ) {
let params; let params;
if (initialRoute) { if (initialRoute) {
@ -232,8 +232,8 @@ function PlanexStackComponent() {
const Tab = createBottomTabNavigator<TabStackParamsList>(); const Tab = createBottomTabNavigator<TabStackParamsList>();
type PropsType = { type PropsType = {
defaultHomeRoute: string | null; defaultHomeRoute?: string;
defaultHomeData: { [key: string]: string }; defaultHomeData?: { [key: string]: string };
}; };
const ICONS: { const ICONS: {
@ -264,7 +264,7 @@ const ICONS: {
}, },
}; };
export default function TabNavigator(props: PropsType) { function TabNavigator(props: PropsType) {
const { preferences } = usePreferences(); const { preferences } = usePreferences();
let defaultRoute = getPreferenceString( let defaultRoute = getPreferenceString(
PreferenceKeys.defaultStartScreen, PreferenceKeys.defaultStartScreen,
@ -324,6 +324,13 @@ export default function TabNavigator(props: PropsType) {
); );
} }
export default React.memo(
TabNavigator,
(pp: PropsType, np: PropsType) =>
pp.defaultHomeRoute === np.defaultHomeRoute &&
pp.defaultHomeData === np.defaultHomeData
);
export enum TabRoutes { export enum TabRoutes {
Services = 'services', Services = 'services',
Proxiwash = 'proxiwash', Proxiwash = 'proxiwash',

View file

@ -139,9 +139,6 @@ const generateNewsFeed = (rawFeed: RawNewsFeedType): Array<FeedItemType> => {
return finalFeed; return finalFeed;
}; };
/**
* Class defining the app's home screen
*/
function HomeScreen(props: Props) { function HomeScreen(props: Props) {
const theme = useTheme(); const theme = useTheme();
const navigation = useNavigation(); const navigation = useNavigation();

View file

@ -15,8 +15,8 @@ import { CustomDarkTheme, CustomWhiteTheme } from '../utils/Themes';
import { setupStatusBar } from '../utils/Utils'; import { setupStatusBar } from '../utils/Utils';
type Props = { type Props = {
defaultHomeRoute: string | null; defaultHomeRoute?: string;
defaultHomeData: { [key: string]: string }; defaultHomeData?: { [key: string]: string };
}; };
function MainApp(props: Props, ref?: Ref<NavigationContainerRef>) { function MainApp(props: Props, ref?: Ref<NavigationContainerRef>) {