Skip to content

Commit 2c449d7

Browse files
committed
Refactor GroupDetailsScreen component for improved readability and maintainability
1 parent dcb00e9 commit 2c449d7

File tree

1 file changed

+40
-42
lines changed

1 file changed

+40
-42
lines changed

frontend/screens/GroupDetailsScreen.js

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import React, { useState, useEffect, useContext } from 'react';
2-
import { View, StyleSheet, FlatList, Alert, ScrollView } from 'react-native';
3-
import { Button, Text, Card, ActivityIndicator, Appbar, FAB, Title, Paragraph, Avatar } from 'react-native-paper';
1+
import { useContext, useEffect, useState } from 'react';
2+
import { Alert, FlatList, StyleSheet, Text, View } from 'react-native';
3+
import { ActivityIndicator, Card, FAB, Paragraph, Title } from 'react-native-paper';
4+
import { getGroupExpenses, getGroupMembers, getOptimizedSettlements } from '../api/groups';
45
import { AuthContext } from '../context/AuthContext';
5-
import { getGroupMembers, getGroupExpenses, getOptimizedSettlements } from '../api/groups';
66

77
const GroupDetailsScreen = ({ route, navigation }) => {
88
const { groupId, groupName, groupIcon } = route.params;
@@ -75,10 +75,6 @@ const GroupDetailsScreen = ({ route, navigation }) => {
7575
);
7676
};
7777

78-
const renderMember = ({ item }) => (
79-
<Paragraph style={styles.memberText}>{item.user.name}</Paragraph>
80-
);
81-
8278
const renderSettlementSummary = () => {
8379
const userOwes = settlements.filter(s => s.fromUserId === user._id);
8480
const userIsOwed = settlements.filter(s => s.toUserId === user._id);
@@ -116,42 +112,44 @@ const GroupDetailsScreen = ({ route, navigation }) => {
116112
);
117113
}
118114

115+
const renderHeader = () => (
116+
<>
117+
<Card style={styles.card}>
118+
<Card.Content>
119+
<Title>Settlement Summary</Title>
120+
{renderSettlementSummary()}
121+
</Card.Content>
122+
</Card>
123+
124+
<Card style={styles.card}>
125+
<Card.Content>
126+
<Title>Members</Title>
127+
{members.map((item) => (
128+
<Paragraph key={item.userId} style={styles.memberText}>{item.user.name}</Paragraph>
129+
))}
130+
</Card.Content>
131+
</Card>
132+
133+
<Title style={styles.expensesTitle}>Expenses</Title>
134+
</>
135+
);
136+
119137
return (
120138
<View style={styles.container}>
121-
<Appbar.Header>
122-
<Appbar.BackAction onPress={() => navigation.goBack()} />
123-
<Avatar.Text size={36} label={groupIcon || groupName.charAt(0)} style={{marginLeft: 8}} />
124-
<Appbar.Content title={groupName} titleStyle={{marginLeft: 8}}/>
125-
</Appbar.Header>
126-
127-
<ScrollView style={styles.contentContainer}>
128-
<Card style={styles.card}>
129-
<Card.Content>
130-
<Title>Settlement Summary</Title>
131-
{renderSettlementSummary()}
132-
</Card.Content>
133-
</Card>
134-
135-
<Card style={styles.card}>
136-
<Card.Content>
137-
<Title>Members</Title>
138-
<FlatList
139-
data={members}
140-
renderItem={renderMember}
141-
keyExtractor={(item) => item.userId}
142-
/>
143-
</Card.Content>
144-
</Card>
145-
146-
<Title style={styles.expensesTitle}>Expenses</Title>
147-
<FlatList
148-
data={expenses}
149-
renderItem={renderExpense}
150-
keyExtractor={(item) => item._id}
151-
ListEmptyComponent={<Text>No expenses recorded yet.</Text>}
152-
contentContainerStyle={{ paddingBottom: 80 }} // To avoid FAB overlap
153-
/>
154-
</ScrollView>
139+
<FlatList
140+
style={styles.contentContainer}
141+
data={expenses}
142+
renderItem={renderExpense}
143+
keyExtractor={(item) => item._id}
144+
ListHeaderComponent={renderHeader}
145+
ListEmptyComponent={
146+
<View>
147+
{renderHeader()}
148+
<Text>No expenses recorded yet.</Text>
149+
</View>
150+
}
151+
contentContainerStyle={{ paddingBottom: 80 }} // To avoid FAB overlap
152+
/>
155153

156154
<FAB
157155
style={styles.fab}

0 commit comments

Comments
 (0)