Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
7877057
chore: update dependencies and react-navigation to v7
hb2708 Dec 18, 2025
d761b59
fix(platform): resolve typescript type error in getIOSVersion
hb2708 Dec 18, 2025
883adca
refactor(navigation): migrate Root and Modal navigators to native stack
hb2708 Dec 18, 2025
397e8a3
refactor(navigation): migrate tab stacks to native stack and update t…
hb2708 Dec 18, 2025
24b6e98
feat(budget): implement large header support
hb2708 Dec 18, 2025
d43e888
feat(emissions): implement large header support
hb2708 Dec 18, 2025
d385bb9
feat(settings): implement large header support
hb2708 Dec 18, 2025
edfdc48
fix(budget): resolve monthly budget navigation options and types
hb2708 Dec 18, 2025
e07cd75
style(navigation): align Add and Act tab headers with Android alignment
hb2708 Dec 18, 2025
88e8131
refactor: Migrate ActNavigator and ActTabNavigator to use native stac…
hb2708 Dec 18, 2025
5f83636
Migrate AddEmission stack to Native Stack
hb2708 Dec 19, 2025
657e1c3
refactor: migrate navigators to native-stack and standardize navigati…
hb2708 Dec 20, 2025
cd530d4
refactor: standardize navigation options for modal screens
hb2708 Dec 20, 2025
7366757
refactor: standardize navigation options for feature screens (A-E)
hb2708 Dec 20, 2025
b5c6462
refactor: standardize navigation options for feature screens (F-Z)
hb2708 Dec 20, 2025
3958fdb
refactor: remove explicit headerTitleAlign to restore platform defaults
hb2708 Dec 20, 2025
5861552
chore: Conditionally render 'Act' tab only in development builds.
hb2708 Dec 20, 2025
4bad973
fix: Update Android tab bar height constant
hb2708 Dec 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions app/components/InfoButton/InfoButton.styles.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { StyleSheet } from "react-native";

import { Layout } from "constant";
import { Colors } from "style";

export default StyleSheet.create({
infoIcon: {
marginRight: Layout.PADDING_HORIZONTAL,
color: Colors.secondary,
},
});
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ exports[`renders correctly 1`] = `
style={
{
"color": "#3957D0",
"marginRight": 16,
}
}
/>
Expand Down
2 changes: 1 addition & 1 deletion app/constant/Layout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ const screen = {
};

// Standard Android Bottom Tab Bar height (typically 56dp) plus a small 4dp buffer. We must use a hardcoded value here because the dynamic useBottomTabBarHeight hook causes a crash when used outside the Tab Navigator context (which is the case with our Native Tabs setup)
const ANDROID_TAB_BAR_HEIGHT = 60;
const ANDROID_TAB_BAR_HEIGHT = 90;

export { screen, isSmallDevice, PADDING_HORIZONTAL, SPACING, ANDROID_TAB_BAR_HEIGHT };
3 changes: 2 additions & 1 deletion app/interfaces/navigation/navigation.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { StackNavigationOptions } from "@react-navigation/stack";
import { NativeStackNavigationOptions } from "@react-navigation/native-stack";

interface NavStatelessComponent extends React.FC {
navigationOptions?: StackNavigationOptions;
navigationOptions?: StackNavigationOptions | NativeStackNavigationOptions;
}

export default NavStatelessComponent;
8 changes: 4 additions & 4 deletions app/navigation/Navigator/BottomTab/ActNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createNativeStackNavigator, NativeStackNavigationOptions } from "@react-navigation/native-stack";

import ActTabNavigator from "./ActTabNavigator";
import ActDetailScreen from "../../../screens/ActDetail";

const Stack = createStackNavigator();
const Stack = createNativeStackNavigator();

const ActNavigator = (): React.ReactElement => (
<Stack.Navigator id="ActStack">
<Stack.Screen
name="ActTabNavigator"
options={ActTabNavigator.navigationOptions}
options={ActTabNavigator.navigationOptions as NativeStackNavigationOptions}
component={ActTabNavigator}
/>
<Stack.Screen
name="ActDetail"
component={ActDetailScreen}
options={ActDetailScreen.navigationOptions}
options={ActDetailScreen.navigationOptions as NativeStackNavigationOptions}
/>
</Stack.Navigator>
);
Expand Down
17 changes: 9 additions & 8 deletions app/navigation/Navigator/BottomTab/ActTabNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import React from "react";
import { StyleSheet, TouchableOpacity, View } from "react-native";
import { createMaterialTopTabNavigator } from "@react-navigation/material-top-tabs";
import { StackNavigationOptions } from "@react-navigation/stack";
import { NativeStackNavigationOptions } from "@react-navigation/native-stack";

import { Text } from "components";
import { t } from "utils";
import { ComponentsStyle, Colors, Font } from "style";
import { Colors, Font } from "style";
import { NavStatelessComponent } from "interfaces";

import { GuideCategory } from "../../../types/guide";
Expand Down Expand Up @@ -83,13 +83,14 @@ const ActTabNavigator: NavStatelessComponent = () => (
</Tab.Navigator>
);

const navigationOptions = (): StackNavigationOptions => ({
...ComponentsStyle.transitionBetweenScreenPresets,
headerStyle: {
...ComponentsStyle.header,
},
const navigationOptions = (): NativeStackNavigationOptions => ({
title: t("ACT_SCREEN_TITLE"),
headerBackButtonDisplayMode: "minimal",
headerTitle: () => <Text.H1>{t("ACT_SCREEN_TITLE")}</Text.H1>,
headerTintColor: Colors.grey100,
headerTitleStyle: {
fontFamily: Font.FontWeight.Bold,
fontSize: Font.FontSize.Header,
},
});

ActTabNavigator.navigationOptions = navigationOptions();
Expand Down
12 changes: 6 additions & 6 deletions app/navigation/Navigator/BottomTab/AddEmissionNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,33 +1,33 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createNativeStackNavigator, NativeStackNavigationOptions } from "@react-navigation/native-stack";

import AddEmissionScreen from "../../../screens/AddEmission";
import CategorySelectionScreen from "../../../screens/CategorySelection";
import SubCategorySelectionScreen from "../../../screens/SubCategorySelection";
import BarCodeScanScreen from "../../../screens/BarCodeScan";

const Stack = createStackNavigator();
const Stack = createNativeStackNavigator();

const AddEmissionNavigator = (): React.ReactElement => (
<Stack.Navigator id="AddEmissionStack">
<Stack.Screen
name="CategorySelection"
options={CategorySelectionScreen.navigationOptions}
options={CategorySelectionScreen.navigationOptions as NativeStackNavigationOptions}
component={CategorySelectionScreen}
/>
<Stack.Screen
name="SubCategorySelection"
options={SubCategorySelectionScreen.navigationOptions}
options={SubCategorySelectionScreen.navigationOptions as NativeStackNavigationOptions}
component={SubCategorySelectionScreen}
/>
<Stack.Screen
name="AddEmission"
options={AddEmissionScreen.navigationOptions}
options={AddEmissionScreen.navigationOptions as NativeStackNavigationOptions}
component={AddEmissionScreen}
/>
<Stack.Screen
name="BarCodeScan"
options={BarCodeScanScreen.navigationOptions}
options={BarCodeScanScreen.navigationOptions as NativeStackNavigationOptions}
component={BarCodeScanScreen}
/>
</Stack.Navigator>
Expand Down
14 changes: 9 additions & 5 deletions app/navigation/Navigator/BottomTab/BudgetNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,27 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createNativeStackNavigator, NativeStackNavigationOptions } from "@react-navigation/native-stack";

import BudgetScreen from "../../../screens/Budget";
import MontlyBudgetScreen from "../../../screens/MonthlyBudget";
import AddEmissionScreen from "../../../screens/AddEmission";

const Stack = createStackNavigator();
const Stack = createNativeStackNavigator();

const BudgetNavigator = (): React.ReactElement => (
<Stack.Navigator id="BudgetStack">
<Stack.Screen name="Budget" options={BudgetScreen.navigationOptions} component={BudgetScreen} />
<Stack.Screen
name="Budget"
options={BudgetScreen.navigationOptions as NativeStackNavigationOptions}
component={BudgetScreen}
/>
<Stack.Screen
name="MonthlyBudget"
options={MontlyBudgetScreen.navigationOptions}
options={MontlyBudgetScreen.navigationOptions as NativeStackNavigationOptions}
component={MontlyBudgetScreen}
/>
<Stack.Screen
name="AddEmission"
options={AddEmissionScreen.navigationOptions}
options={AddEmissionScreen.navigationOptions as NativeStackNavigationOptions}
component={AddEmissionScreen}
/>
</Stack.Navigator>
Expand Down
12 changes: 6 additions & 6 deletions app/navigation/Navigator/BottomTab/EmissionsNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,33 +1,33 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createNativeStackNavigator, NativeStackNavigationOptions } from "@react-navigation/native-stack";

import EmissionItemScreen from "../../../screens/EmissionItem";
import EmissionsScreen from "../../../screens/Emissions";
import MonthlyEmissionsScreen from "../../../screens/MonthlyEmissions";
import RecurringEmissionsScreen from "../../../screens/RecurringEmissions";

const Stack = createStackNavigator();
const Stack = createNativeStackNavigator();

const EmissionsNavigator = (): React.ReactElement => (
<Stack.Navigator id="EmissionsStack">
<Stack.Screen
name="Emissions"
options={EmissionsScreen.navigationOptions}
options={EmissionsScreen.navigationOptions as NativeStackNavigationOptions}
component={EmissionsScreen}
/>
<Stack.Screen
name="EmissionItem"
options={EmissionItemScreen.navigationOptions}
options={EmissionItemScreen.navigationOptions as NativeStackNavigationOptions}
component={EmissionItemScreen}
/>
<Stack.Screen
name="MonthlyEmissions"
options={MonthlyEmissionsScreen.navigationOptions}
options={MonthlyEmissionsScreen.navigationOptions as NativeStackNavigationOptions}
component={MonthlyEmissionsScreen}
/>
<Stack.Screen
name="RecurringEmissions"
options={RecurringEmissionsScreen.navigationOptions}
options={RecurringEmissionsScreen.navigationOptions as NativeStackNavigationOptions}
component={RecurringEmissionsScreen}
/>
</Stack.Navigator>
Expand Down
20 changes: 10 additions & 10 deletions app/navigation/Navigator/BottomTab/SettingsNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createNativeStackNavigator, NativeStackNavigationOptions } from "@react-navigation/native-stack";

import SettingsScreen from "../../../screens/Settings";
import AboutScreen from "../../../screens/About";
Expand All @@ -10,36 +10,36 @@ import NotificationsScreen from "../../../screens/Notifications";
import MyData from "../../../screens/MyData";
import LanguagesScreen from "../../../screens/Languages/LanguagesScreen";

const Stack = createStackNavigator();
const Stack = createNativeStackNavigator();

const SettingsNavigator = (): React.ReactElement => (
<Stack.Navigator id="SettingsStack">
<Stack.Screen
name="Settings"
options={SettingsScreen.navigationOptions}
options={SettingsScreen.navigationOptions as NativeStackNavigationOptions}
component={SettingsScreen}
/>
<Stack.Screen name="About" options={AboutScreen.navigationOptions} component={AboutScreen} />
<Stack.Screen name="About" options={AboutScreen.navigationOptions as NativeStackNavigationOptions} component={AboutScreen} />
<Stack.Screen
name="SupportUs"
options={SupportUsScreen.navigationOptions}
options={SupportUsScreen.navigationOptions as NativeStackNavigationOptions}
component={SupportUsScreen}
/>
<Stack.Screen
name="MyLocation"
options={MyLocationScreen.navigationOptions}
options={MyLocationScreen.navigationOptions as NativeStackNavigationOptions}
component={MyLocationScreen}
/>
<Stack.Screen name="Faq" options={FaqScreen.navigationOptions} component={FaqScreen} />
<Stack.Screen name="Faq" options={FaqScreen.navigationOptions as NativeStackNavigationOptions} component={FaqScreen} />
<Stack.Screen
name="Notifications"
options={NotificationsScreen.navigationOptions}
options={NotificationsScreen.navigationOptions as NativeStackNavigationOptions}
component={NotificationsScreen}
/>
<Stack.Screen name="MyData" options={MyData.navigationOptions} component={MyData} />
<Stack.Screen name="MyData" options={MyData.navigationOptions as NativeStackNavigationOptions} component={MyData} />
<Stack.Screen
name="Languages"
options={LanguagesScreen.navigationOptions}
options={LanguagesScreen.navigationOptions as NativeStackNavigationOptions}
component={LanguagesScreen}
/>
</Stack.Navigator>
Expand Down
8 changes: 3 additions & 5 deletions app/navigation/Navigator/BottomTabNavigator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,9 @@ const BottomTabNavigator = (): React.ReactElement => {
options={AddEmissionOptions}
component={AddEmissionNavigator}
/>
<BottomTab.Screen
name="Act"
options={ActOptions}
component={ActNavigator}
/>
{__DEV__ && (
<BottomTab.Screen name="Act" options={ActOptions} component={ActNavigator} />
)}
<BottomTab.Screen
name="SettingsNavigator"
options={SettingsOptions}
Expand Down
4 changes: 2 additions & 2 deletions app/navigation/Navigator/InfoModalNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createStackNavigator, StackNavigationOptions } from "@react-navigation/stack";

import InfoModalScreen from "../../screens/InfoModal";

Expand All @@ -9,7 +9,7 @@ const InfoModalNavigator = (): React.ReactElement => (
<Stack.Navigator id="InfoModalStack">
<Stack.Screen
name="InfoModal"
options={InfoModalScreen.navigationOptions}
options={InfoModalScreen.navigationOptions as StackNavigationOptions}
component={InfoModalScreen}
/>
</Stack.Navigator>
Expand Down
10 changes: 5 additions & 5 deletions app/navigation/Navigator/ModalNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createNativeStackNavigator, NativeStackNavigationOptions } from "@react-navigation/native-stack";

import ComingSoonScreen from "../../screens/ComingSoon";
import PeriodicityModalScreen from "../../screens/Periodicity";
import InfoModalScreen from "../../screens/InfoModal";

const Stack = createStackNavigator();
const Stack = createNativeStackNavigator();

const ModalNavigator = (): React.ReactElement => (
<Stack.Navigator id="ModalStack">
<Stack.Screen
name="ComingSoonModal"
options={ComingSoonScreen.navigationOptions}
options={ComingSoonScreen.navigationOptions as NativeStackNavigationOptions}
component={ComingSoonScreen}
/>
<Stack.Screen
name="PeriodicityModal"
options={PeriodicityModalScreen.navigationOptions}
options={PeriodicityModalScreen.navigationOptions as NativeStackNavigationOptions}
component={PeriodicityModalScreen}
/>
<Stack.Screen
name="InfoModal"
options={InfoModalScreen.navigationOptions}
options={InfoModalScreen.navigationOptions as NativeStackNavigationOptions}
component={InfoModalScreen}
/>
</Stack.Navigator>
Expand Down
4 changes: 2 additions & 2 deletions app/navigation/Navigator/PeriodicityModalNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createStackNavigator, StackNavigationOptions } from "@react-navigation/stack";

import PeriodicityModalScreen from "../../screens/Periodicity";

Expand All @@ -9,7 +9,7 @@ const PeriodicityModalNavigator = (): React.ReactElement => (
<Stack.Navigator id="PeriodicityModalStack">
<Stack.Screen
name="PeriodicityModal"
options={PeriodicityModalScreen.navigationOptions}
options={PeriodicityModalScreen.navigationOptions as StackNavigationOptions}
component={PeriodicityModalScreen}
/>
</Stack.Navigator>
Expand Down
8 changes: 3 additions & 5 deletions app/navigation/Navigator/RootNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { createNativeStackNavigator, NativeStackNavigationOptions } from "@react-navigation/native-stack";
import { useSelector } from "react-redux";

import { Preferences } from "constant";
import { userPreferences } from "ducks";
import { ComponentsStyle } from "style";

import IntroScreen from "../../screens/Intro";
import BottomTabNavigator from "./BottomTabNavigator";

const Stack = createStackNavigator();
const screenOptions = {
const Stack = createNativeStackNavigator();
const screenOptions: NativeStackNavigationOptions = {
headerShown: false,
...ComponentsStyle.transitionBetweenScreenPresets,
};

const RootNavigator = (): React.ReactElement => {
Expand Down
20 changes: 8 additions & 12 deletions app/screens/About/AboutScreen.navigationOptions.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
import React from "react";
import { StackNavigationOptions } from "@react-navigation/stack";
import { NativeStackNavigationOptions } from "@react-navigation/native-stack";

import { Text } from "components";
import { t } from "utils";
import { Layout, Colors, ComponentsStyle } from "style";
import { Colors, Font } from "style";

const navigationOptions = (): StackNavigationOptions => ({
...ComponentsStyle.transitionBetweenScreenPresets,
headerStyle: {
...ComponentsStyle.header,
},
const navigationOptions = (): NativeStackNavigationOptions => ({
title: t("ABOUT_SCREEN_TITLE"),
headerTintColor: Colors.grey100,
headerBackButtonDisplayMode: "minimal",
headerTitle: () => (
<Text.Header style={Layout.androidNavTitle}>{t("ABOUT_SCREEN_TITLE")}</Text.Header>
),
headerTitleStyle: {
fontFamily: Font.FontWeight.Bold,
fontSize: Font.FontSize.Header,
},
});

export default navigationOptions;
Loading