latest
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user