This commit is contained in:
Abin Toppo
2026-03-31 13:02:17 +05:30
parent 4af33c376f
commit cbad923b1a
44 changed files with 2282 additions and 1311 deletions
+123 -51
View File
@@ -1,4 +1,4 @@
import React, { useState, useMemo, useEffect, useCallback } from 'react';
import React, { useState, useEffect, useCallback } from 'react';
import {
View,
Text,
@@ -84,83 +84,139 @@ const ManagementScreen: React.FC = () => {
setActiveTab(routeTab);
}, [route.params?.actionTab]);
const myGroupsParams = useMemo(() => {
return {
...(myGroupStatusFilter && myGroupStatusFilter !== 'ALL'
? { status: myGroupStatusFilter }
: {}),
page: 0,
size: 10,
};
}, [myGroupStatusFilter]);
const myGroupsParams = {
...(myGroupStatusFilter && myGroupStatusFilter !== 'ALL'
? { status: myGroupStatusFilter }
: {}),
page: 0,
size: 10,
};
const joinedGroupsParams = useMemo(() => {
return {
...(joinedGroupStatusFilter && joinedGroupStatusFilter !== 'ALL'
? { status: joinedGroupStatusFilter }
: {}),
page: 0,
size: 10,
};
}, [joinedGroupStatusFilter]);
const joinedGroupsParams = {
...(joinedGroupStatusFilter && joinedGroupStatusFilter !== 'ALL'
? { status: joinedGroupStatusFilter }
: {}),
page: 0,
size: 10,
};
const requestsParams = useMemo(() => ({ page: 0, size: 10 }), []);
const myRequestsParams = useMemo(() => ({ page: 0, size: 10 }), []);
const requestsParams = { page: 0, size: 10 };
const myRequestsParams = { page: 0, size: 10 };
console.log('joinedGroupsParams:', joinedGroupsParams);
const alwaysFreshFetchOptions = {
staleTime: 0,
gcTime: 0,
refetchOnMount: 'always' as const,
refetchOnReconnect: true,
};
// Data Fetching
const { data: myGroupsRes, isLoading: myLoading, refetch: refetchMy } = useFetch<any>(
const {
data: myGroupsRes,
isLoading: myLoading,
isFetching: myFetching,
refetch: refetchMy,
} = useFetch<any>(
MY_GROUPS_URL,
myGroupsParams,
{ enabled: user.role === 'ORGANIZER' }
{ enabled: user.role === 'ORGANIZER' && activeTab === 'My Groups', ...alwaysFreshFetchOptions }
);
const { data: joinedRes, isLoading: joinedLoading, refetch: refetchJoined } = useFetch<any>(
const {
data: joinedRes,
isLoading: joinedLoading,
isFetching: joinedFetching,
refetch: refetchJoined,
} = useFetch<any>(
GET_JOINED_GROUP_URL,
joinedGroupsParams
joinedGroupsParams,
{ enabled: activeTab === 'Joined Groups', ...alwaysFreshFetchOptions }
);
const { data: requestsRes, isLoading: requestsLoading, refetch: refetchRequests } = useFetch<any>(
const {
data: requestsRes,
isLoading: requestsLoading,
isFetching: requestsFetching,
refetch: refetchRequests,
} = useFetch<any>(
REQUESTS_URL,
requestsParams,
{ enabled: user.role === 'ORGANIZER' }
{
enabled: user.role === 'ORGANIZER' && activeTab === 'Requests' && requestSubTab === 'Join Requests',
...alwaysFreshFetchOptions,
}
);
const { data: userReqRes, isLoading: userReqLoading, refetch: refetchUserReq } = useFetch<any>(
const {
data: userReqRes,
isLoading: userReqLoading,
isFetching: userReqFetching,
refetch: refetchUserReq,
} = useFetch<any>(
USER_REQUEST,
myRequestsParams
myRequestsParams,
{
enabled:
activeTab === 'My Requests' ||
(user.role === 'ORGANIZER' && activeTab === 'Requests' && requestSubTab === 'My Requests'),
...alwaysFreshFetchOptions,
}
);
const { mutate: updateRequest } = useUpdate<any, any>('');
const myGroups = useMemo(() => getListFromResponse<MyGroup>(myGroupsRes), [myGroupsRes]);
const joinedGroups = useMemo(() => getListFromResponse<any>(joinedRes), [joinedRes]);
const incomingRequests = useMemo(() => getListFromResponse<JoinRequest>(requestsRes), [requestsRes]);
const myRequests = useMemo(() => getListFromResponse<any>(userReqRes), [userReqRes]);
const myGroups = getListFromResponse<MyGroup>(myGroupsRes);
const joinedGroups = getListFromResponse<any>(joinedRes);
const incomingRequests = getListFromResponse<JoinRequest>(requestsRes);
const myRequests = getListFromResponse<any>(userReqRes);
const [refreshing, setRefreshing] = useState(false);
const onRefresh = useCallback(() => {
const onRefresh = useCallback(async () => {
setRefreshing(true);
Promise.all([
refetchMy(),
refetchJoined(),
refetchRequests(),
refetchUserReq(),
]).finally(() => {
const refreshTasks = [refetchJoined(), refetchUserReq()];
if (user.role === 'ORGANIZER') {
refreshTasks.push(refetchMy(), refetchRequests());
}
await Promise.all(refreshTasks).finally(() => {
setRefreshing(false);
});
}, [refetchMy, refetchJoined, refetchRequests, refetchUserReq]);
}, [refetchMy, refetchJoined, refetchRequests, refetchUserReq, user.role]);
const refetchActiveTab = useCallback(async () => {
if (activeTab === 'My Groups' && user.role === 'ORGANIZER') {
await refetchMy();
return;
}
if (activeTab === 'Joined Groups') {
await refetchJoined();
return;
}
if (activeTab === 'Requests' && user.role === 'ORGANIZER') {
if (requestSubTab === 'Join Requests') {
await refetchRequests();
} else {
await refetchUserReq();
}
return;
}
if (activeTab === 'My Requests') {
await refetchUserReq();
}
}, [activeTab, requestSubTab, refetchMy, refetchJoined, refetchRequests, refetchUserReq, user.role]);
useFocusEffect(
useCallback(() => {
onRefresh();
}, [])
refetchActiveTab();
}, [refetchActiveTab])
);
const tabs: ActiveTab[] = useMemo(() =>
const tabs: ActiveTab[] =
user.role === 'ORGANIZER'
? ['My Groups', 'Joined Groups', 'Requests']
: ['Joined Groups', 'My Requests'],
[user.role]);
: ['Joined Groups', 'My Requests'];
const handleApprove = (req: JoinRequest) => {
updateRequest({ resource: `${APPROVE_REQUEST_URL}${req.requestId}/approve`, payload: {} } as any, {
@@ -173,7 +229,7 @@ const ManagementScreen: React.FC = () => {
};
const handleDecline = (req: JoinRequest) => {
updateRequest({ resource: `${DECLINE_REQUEST_URL}${req.requestId}/reject?reason=/`, payload: {} } as any, {
updateRequest({ resource: `${DECLINE_REQUEST_URL}${req.requestId}/reject?reason=no Reason`, payload: {} } as any, {
onSuccess: () => {
ToastAndroid.show('Request declined', ToastAndroid.SHORT);
refetchRequests();
@@ -203,7 +259,23 @@ const ManagementScreen: React.FC = () => {
}
};
const isLoading = myLoading || joinedLoading || requestsLoading || userReqLoading;
const isMyGroupsLoading = myLoading || myFetching;
const isJoinedGroupsLoading = joinedLoading || joinedFetching;
const isRequestsLoading = requestsLoading || requestsFetching;
const isUserRequestsLoading = userReqLoading || userReqFetching;
const isActiveTabLoading =
activeTab === 'My Groups'
? isMyGroupsLoading
: activeTab === 'Joined Groups'
? isJoinedGroupsLoading
: activeTab === 'Requests'
? requestSubTab === 'Join Requests'
? isRequestsLoading
: isUserRequestsLoading
: isUserRequestsLoading;
const listData = refreshing || isActiveTabLoading ? [] : getFilteredData();
return (
<AppView paddingHorizontal={0}>
@@ -369,7 +441,7 @@ const ManagementScreen: React.FC = () => {
)}
<FlatList
data={getFilteredData()}
data={listData}
contentContainerStyle={styles.listContent}
keyExtractor={(item, index) => String(item.id || item.requestId || index)}
renderItem={({ item }) => {
@@ -393,7 +465,7 @@ const ManagementScreen: React.FC = () => {
/>
}
ListEmptyComponent={
!isLoading ? (
!isActiveTabLoading && !refreshing ? (
<View style={styles.emptyState}>
<LucideIcon name="documents-outline" size={64} color={theme.colors.textMuted} />
<Text style={[styles.emptyText, { color: theme.colors.textSecondary }]}>Nothing to show here</Text>