Skip to content

Commit 66dd38f

Browse files
committed
feat: Integrate modern screens and components for enhanced user experience in group management
1 parent 72fea4d commit 66dd38f

File tree

5 files changed

+604
-70
lines changed

5 files changed

+604
-70
lines changed

frontend/navigation/GroupsStackNavigator.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import { createNativeStackNavigator } from '@react-navigation/native-stack';
2-
import AddExpenseScreen from '../screens/AddExpenseScreen';
3-
import GroupDetailsScreen from '../screens/GroupDetailsScreen';
42
import GroupSettingsScreen from '../screens/GroupSettingsScreen';
53
import HomeScreen from '../screens/HomeScreen';
64
import JoinGroupScreen from '../screens/JoinGroupScreen';
5+
import ModernAddExpenseScreen from '../screens/ModernAddExpenseScreen';
6+
import ModernGroupDetailsScreen from '../screens/ModernGroupDetailsScreen';
77

88
const Stack = createNativeStackNavigator();
99

1010
const GroupsStackNavigator = () => {
1111
return (
1212
<Stack.Navigator>
1313
<Stack.Screen name="GroupsList" component={HomeScreen} options={{ headerShown: false }}/>
14-
<Stack.Screen name="GroupDetails" component={GroupDetailsScreen} />
15-
<Stack.Screen name="AddExpense" component={AddExpenseScreen} options={{ title: 'Add Expense' }} />
14+
<Stack.Screen name="GroupDetails" component={ModernGroupDetailsScreen} options={{ headerShown: false }} />
15+
<Stack.Screen name="AddExpense" component={ModernAddExpenseScreen} options={{ headerShown: false }} />
1616
<Stack.Screen name="JoinGroup" component={JoinGroupScreen} options={{ headerShown: false }} />
17-
<Stack.Screen name="GroupSettings" component={GroupSettingsScreen} options={{ title: 'Group Settings' }} />
17+
<Stack.Screen name="GroupSettings" component={GroupSettingsScreen} options={{ title: 'Group Settings' }} />
1818
</Stack.Navigator>
1919
);
2020
};

frontend/navigation/MainNavigator.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
1-
import React from 'react';
2-
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
31
import { MaterialCommunityIcons } from '@expo/vector-icons';
4-
import GroupsStackNavigator from './GroupsStackNavigator';
2+
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
3+
import { ModernTabBar } from '../components/navigation/ModernNavigation';
54
import FriendsScreen from '../screens/FriendsScreen';
65
import AccountStackNavigator from './AccountStackNavigator';
6+
import GroupsStackNavigator from './GroupsStackNavigator';
77

88
const Tab = createBottomTabNavigator();
99

1010
const MainNavigator = () => {
1111
return (
12-
<Tab.Navigator screenOptions={{ headerShown: false }}>
12+
<Tab.Navigator
13+
screenOptions={{
14+
headerShown: false,
15+
tabBarStyle: { display: 'none' } // Hide default tab bar, we'll use ModernTabBar
16+
}}
17+
tabBar={(props) => <ModernTabBar {...props} />}
18+
>
1319
<Tab.Screen
1420
name="Groups"
1521
component={GroupsStackNavigator}
1622
options={{
1723
tabBarIcon: ({ color, size }) => (
1824
<MaterialCommunityIcons name="account-group" color={color} size={size} />
1925
),
26+
tabBarLabel: 'Groups'
2027
}}
2128
/>
2229
<Tab.Screen
@@ -26,6 +33,7 @@ const MainNavigator = () => {
2633
tabBarIcon: ({ color, size }) => (
2734
<MaterialCommunityIcons name="account-multiple" color={color} size={size} />
2835
),
36+
tabBarLabel: 'Friends'
2937
}}
3038
/>
3139
<Tab.Screen
@@ -35,6 +43,7 @@ const MainNavigator = () => {
3543
tabBarIcon: ({ color, size }) => (
3644
<MaterialCommunityIcons name="account-cog" color={color} size={size} />
3745
),
46+
tabBarLabel: 'Account'
3847
}}
3948
/>
4049
</Tab.Navigator>

frontend/screens/HomeScreen.js

Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@ import * as Haptics from 'expo-haptics';
55
import { LinearGradient } from 'expo-linear-gradient';
66
import { useContext, useEffect, useRef, useState } from "react";
77
import {
8-
Alert,
9-
Animated,
10-
Dimensions,
11-
FlatList,
12-
RefreshControl,
13-
ScrollView,
14-
StyleSheet,
15-
TouchableOpacity,
16-
View,
8+
Alert,
9+
Animated,
10+
Dimensions,
11+
FlatList,
12+
RefreshControl,
13+
ScrollView,
14+
StyleSheet,
15+
TouchableOpacity,
16+
View,
1717
} from "react-native";
1818
import {
19-
ActivityIndicator,
20-
Modal,
21-
Portal,
22-
Text,
19+
ActivityIndicator,
20+
Modal,
21+
Portal,
22+
Text,
2323
} from "react-native-paper";
2424
import { createGroup, getGroups, getOptimizedSettlements } from "../api/groups";
2525
import { AuthContext } from "../context/AuthContext";
@@ -65,8 +65,13 @@ const HomeScreen = ({ navigation }) => {
6565
}),
6666
]).start();
6767

68-
fetchGroups();
69-
}, []);
68+
// Only fetch groups if user is authenticated
69+
if (user && token) {
70+
fetchGroups();
71+
} else {
72+
setIsLoading(false); // Stop loading if not authenticated
73+
}
74+
}, [user, token]); // Add dependencies
7075

7176
// Calculate settlement status for a group
7277
const calculateSettlementStatus = async (groupId, userId) => {
@@ -104,22 +109,38 @@ const HomeScreen = ({ navigation }) => {
104109

105110
const fetchGroups = async () => {
106111
try {
107-
const response = await getGroups(token);
108-
const groupsData = response.data;
112+
const response = await getGroups(); // Remove token parameter
113+
console.log('Groups API Response:', response); // Debug log
114+
115+
// Handle different response structures
116+
let groupsData = response.data;
117+
if (!groupsData) {
118+
groupsData = response; // Sometimes the response itself is the data
119+
}
120+
if (!Array.isArray(groupsData)) {
121+
console.warn('Groups data is not an array:', groupsData);
122+
groupsData = []; // Fallback to empty array
123+
}
124+
109125
setGroups(groupsData);
110126

111127
// Calculate settlement status for each group
112-
const settlementPromises = groupsData.map(async (group) => {
113-
const status = await calculateSettlementStatus(group._id, user._id);
114-
return { groupId: group._id, status };
115-
});
116-
117-
const settlementsData = await Promise.all(settlementPromises);
118-
const settlementsMap = {};
119-
settlementsData.forEach(({ groupId, status }) => {
120-
settlementsMap[groupId] = status;
121-
});
122-
setGroupSettlements(settlementsMap);
128+
if (groupsData.length > 0) {
129+
const settlementPromises = groupsData.map(async (group) => {
130+
const status = await calculateSettlementStatus(group._id, user._id);
131+
return { groupId: group._id, status };
132+
});
133+
134+
const settlementsData = await Promise.all(settlementPromises);
135+
const settlementsMap = {};
136+
settlementsData.forEach(({ groupId, status }) => {
137+
settlementsMap[groupId] = status;
138+
});
139+
setGroupSettlements(settlementsMap);
140+
} else {
141+
// No groups, clear settlements
142+
setGroupSettlements({});
143+
}
123144

124145
// Animate balance numbers
125146
Animated.timing(balanceAnim, {
@@ -161,7 +182,7 @@ const HomeScreen = ({ navigation }) => {
161182

162183
setIsCreatingGroup(true);
163184
try {
164-
await createGroup(newGroupName.trim(), token);
185+
await createGroup(newGroupName.trim()); // Remove token parameter
165186
await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);
166187
hideModal();
167188
fetchGroups();

0 commit comments

Comments
 (0)