update
This commit is contained in:
@@ -35,7 +35,8 @@ import FontsFamily from '../../constents/FontsFamily';
|
||||
import { RootTabParamList } from '../../navigation/BottomTabs';
|
||||
|
||||
type ManagementRouteProp = RouteProp<RootTabParamList, 'Management'>;
|
||||
type ActiveTab = 'My Groups' | 'Joined Groups' | 'Requests' | 'Your Requests';
|
||||
type ActiveTab = 'My Groups' | 'Joined Groups' | 'Requests' | 'My Requests';
|
||||
type RequestSubTab = 'Join Requests' | 'My Requests';
|
||||
type GroupStatusFilter = 'ALL' | 'PENDING' | 'APPROVED' | 'ACTIVE' | 'DELAY' | 'COMPLETED' | 'REJECTED' | 'CANCELLED';
|
||||
|
||||
const GROUP_STATUS_FILTERS: GroupStatusFilter[] = [
|
||||
@@ -74,7 +75,8 @@ const ManagementScreen: React.FC = () => {
|
||||
user.role === 'ORGANIZER' ? 'My Groups' : 'Joined Groups'
|
||||
);
|
||||
const [myGroupStatusFilter, setMyGroupStatusFilter] = useState<GroupStatusFilter>('APPROVED');
|
||||
const [joinedGroupStatusFilter, setJoinedGroupStatusFilter] = useState<GroupStatusFilter>('ACTIVE');
|
||||
const [joinedGroupStatusFilter, setJoinedGroupStatusFilter] = useState<GroupStatusFilter>('ALL');
|
||||
const [requestSubTab, setRequestSubTab] = useState<RequestSubTab>('Join Requests');
|
||||
|
||||
useEffect(() => {
|
||||
if (!route.params?.actionTab) return;
|
||||
@@ -102,6 +104,9 @@ const ManagementScreen: React.FC = () => {
|
||||
};
|
||||
}, [joinedGroupStatusFilter]);
|
||||
|
||||
const requestsParams = useMemo(() => ({ page: 0, size: 10 }), []);
|
||||
const myRequestsParams = useMemo(() => ({ page: 0, size: 10 }), []);
|
||||
|
||||
console.log('joinedGroupsParams:', joinedGroupsParams);
|
||||
|
||||
|
||||
@@ -117,13 +122,12 @@ const ManagementScreen: React.FC = () => {
|
||||
);
|
||||
const { data: requestsRes, isLoading: requestsLoading, refetch: refetchRequests } = useFetch<any>(
|
||||
REQUESTS_URL,
|
||||
undefined,
|
||||
requestsParams,
|
||||
{ enabled: user.role === 'ORGANIZER' }
|
||||
);
|
||||
const { data: userReqRes, isLoading: userReqLoading, refetch: refetchUserReq } = useFetch<any>(
|
||||
USER_REQUEST,
|
||||
undefined,
|
||||
{ enabled: user.role !== 'ORGANIZER' }
|
||||
myRequestsParams
|
||||
);
|
||||
|
||||
const { mutate: updateRequest } = useUpdate<any, any>('');
|
||||
@@ -155,7 +159,7 @@ const ManagementScreen: React.FC = () => {
|
||||
const tabs: ActiveTab[] = useMemo(() =>
|
||||
user.role === 'ORGANIZER'
|
||||
? ['My Groups', 'Joined Groups', 'Requests']
|
||||
: ['Joined Groups', 'Your Requests'],
|
||||
: ['Joined Groups', 'My Requests'],
|
||||
[user.role]);
|
||||
|
||||
const handleApprove = (req: JoinRequest) => {
|
||||
@@ -192,8 +196,9 @@ const ManagementScreen: React.FC = () => {
|
||||
switch (activeTab) {
|
||||
case 'My Groups': return myGroups;
|
||||
case 'Joined Groups': return joinedGroups;
|
||||
case 'Requests': return incomingRequests;
|
||||
case 'Your Requests': return myRequests;
|
||||
case 'Requests':
|
||||
return requestSubTab === 'Join Requests' ? incomingRequests : myRequests;
|
||||
case 'My Requests': return myRequests;
|
||||
default: return [];
|
||||
}
|
||||
};
|
||||
@@ -203,8 +208,24 @@ const ManagementScreen: React.FC = () => {
|
||||
return (
|
||||
<AppView paddingHorizontal={0}>
|
||||
<View style={styles.header}>
|
||||
<Text style={[styles.title, { color: theme.colors.textPrimary }]}>Account Hub</Text>
|
||||
<Text style={[styles.subtitle, { color: theme.colors.textSecondary }]}>Manage your circles and requests</Text>
|
||||
<View style={styles.headerTitleRow}>
|
||||
<View style={{ flex: 1 }}>
|
||||
<Text style={[styles.title, { color: theme.colors.textPrimary }]}>Account Hub</Text>
|
||||
<Text style={[styles.subtitle, { color: theme.colors.textSecondary }]}>Manage your circles and requests</Text>
|
||||
</View>
|
||||
<TouchableOpacity
|
||||
onPress={onRefresh}
|
||||
disabled={refreshing}
|
||||
style={styles.refreshBtn}
|
||||
>
|
||||
<LucideIcon
|
||||
name="sync-outline"
|
||||
size={20}
|
||||
color={theme.colors.textSecondary}
|
||||
style={refreshing ? { opacity: 0.5 } : {}}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
</View>
|
||||
|
||||
<View style={[styles.tabContainer, { backgroundColor: theme.colors.borderLight }]}>
|
||||
@@ -306,6 +327,47 @@ const ManagementScreen: React.FC = () => {
|
||||
</View>
|
||||
)}
|
||||
|
||||
|
||||
|
||||
{activeTab === 'Requests' && user.role === 'ORGANIZER' && (
|
||||
<View style={styles.statusFilterContainer}>
|
||||
<ScrollView
|
||||
horizontal
|
||||
showsHorizontalScrollIndicator={false}
|
||||
contentContainerStyle={styles.statusFilterRow}
|
||||
>
|
||||
{(['Join Requests', 'My Requests'] as RequestSubTab[]).map((tab, index) => {
|
||||
const isActive = requestSubTab === tab;
|
||||
return (
|
||||
<TouchableOpacity
|
||||
key={tab}
|
||||
onPress={() => setRequestSubTab(tab)}
|
||||
style={[
|
||||
styles.statusFilterChip,
|
||||
index !== (['Join Requests', 'My Requests'] as RequestSubTab[]).length - 1 && styles.statusFilterChipSpaced,
|
||||
{
|
||||
borderColor: isActive ? theme.colors.primary : theme.colors.border,
|
||||
backgroundColor: isActive ? theme.colors.primarySoft : theme.colors.surface,
|
||||
},
|
||||
]}
|
||||
>
|
||||
<Text
|
||||
style={[
|
||||
styles.statusFilterText,
|
||||
{
|
||||
color: isActive ? theme.colors.textPrimary : theme.colors.textSecondary,
|
||||
},
|
||||
]}
|
||||
>
|
||||
{tab}
|
||||
</Text>
|
||||
</TouchableOpacity>
|
||||
);
|
||||
})}
|
||||
</ScrollView>
|
||||
</View>
|
||||
)}
|
||||
|
||||
<FlatList
|
||||
data={getFilteredData()}
|
||||
contentContainerStyle={styles.listContent}
|
||||
@@ -313,8 +375,14 @@ const ManagementScreen: React.FC = () => {
|
||||
renderItem={({ item }) => {
|
||||
if (activeTab === 'My Groups') return <MyGroupCard item={item} onManage={handleManageGroup} />;
|
||||
if (activeTab === 'Joined Groups') return <JoinedGroupCard item={item} />;
|
||||
if (activeTab === 'Requests') return <RequestCard item={item} onApprove={handleApprove} onDecline={handleDecline} />;
|
||||
if (activeTab === 'Your Requests') return <UserRequested item={item} />;
|
||||
if (activeTab === 'Requests') {
|
||||
if (requestSubTab === 'Join Requests') {
|
||||
return <RequestCard item={item} onApprove={handleApprove} onDecline={handleDecline} />;
|
||||
} else {
|
||||
return <UserRequested item={item} />;
|
||||
}
|
||||
}
|
||||
if (activeTab === 'My Requests') return <UserRequested item={item} />;
|
||||
return null;
|
||||
}}
|
||||
refreshControl={
|
||||
@@ -344,6 +412,17 @@ const styles = StyleSheet.create({
|
||||
paddingBottom: 12,
|
||||
zIndex: 10,
|
||||
},
|
||||
headerTitleRow: {
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'space-between',
|
||||
},
|
||||
refreshBtn: {
|
||||
padding: 8,
|
||||
borderRadius: 12,
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
},
|
||||
title: {
|
||||
fontSize: responsiveFontSize(3.2),
|
||||
fontFamily: FontsFamily.nunitoBold,
|
||||
|
||||
Reference in New Issue
Block a user