Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 34 additions & 36 deletions wondrous-app/components/Pod/members/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
RequestCountEmptyState,
RequestHeader,
RequestsContainer,
ShowAllButton,
ShowMoreButton,
MemberName,
MemberMessage,
RequestActionButtons,
Expand All @@ -23,11 +23,26 @@ import {
EmptyMemberRequestsListMessage,
} from './styles';

let QUERY_LIMIT = 1;
let REFETCH_QUERY_LIMIT = undefined;
const QUERY_LIMIT = 3;
const REFETCH_QUERY_LIMIT = 20;

const useGetPodMemberRequests = (podId) => {
const [getPodUserMembershipRequests, { data, fetchMore }] = useLazyQuery(GET_POD_MEMBERSHIP_REQUEST);
const [hasMore, setHasMore] = useState(false);
const [getPodUserMembershipRequests, { data, fetchMore, previousData }] = useLazyQuery(GET_POD_MEMBERSHIP_REQUEST, {
fetchPolicy: 'cache-and-network',
nextFetchPolicy: 'cache-first',
// set notifyOnNetworkStatusChange to true if you want to trigger a rerender whenever the request status updates
notifyOnNetworkStatusChange: true,
onCompleted: ({ getPodMembershipRequest }) => {
// if previousData is undefined, it means this is the initial fetch
const limitToRefer = previousData ? REFETCH_QUERY_LIMIT : QUERY_LIMIT;
const updatedDataLength = previousData
? getPodMembershipRequest?.length - previousData?.getPodMembershipRequest?.length
: getPodMembershipRequest?.length;
// updatedDataLength >= 0 means it's not a refetch
updatedDataLength >= 0 && setHasMore(updatedDataLength >= limitToRefer);
},
});
useEffect(() => {
if (podId) {
getPodUserMembershipRequests({
Expand All @@ -38,17 +53,25 @@ const useGetPodMemberRequests = (podId) => {
});
}
}, [podId, getPodUserMembershipRequests]);
return { data: data?.getPodMembershipRequest, fetchMore };
return { data: data?.getPodMembershipRequest, fetchMore, hasMore };
};

const MemberRequests = (props) => {
const { podData = {} } = props;
const { id: podId } = podData;
const { data: podUserMembershipRequests, fetchMore } = useGetPodMemberRequests(podId);
const { data: podUserMembershipRequests, fetchMore, hasMore } = useGetPodMemberRequests(podId);
const [approveJoinPodRequest] = useMutation(APPROVE_JOIN_POD_REQUEST);
const [rejectJoinPodRequest] = useMutation(REJECT_JOIN_POD_REQUEST);
const [showShowAllButton, setShowShowAllButton] = useState(true);
const refetchQueries = [GET_POD_BY_ID];
const refetchQueries = [
GET_POD_BY_ID,
{
query: GET_POD_MEMBERSHIP_REQUEST,
variables: {
podId,
limit: podUserMembershipRequests?.length - 1,
},
},
];
const showEmptyState = podUserMembershipRequests?.length === 0;

const approveRequest = (userId, podId) => {
Expand All @@ -58,16 +81,6 @@ const MemberRequests = (props) => {
podId,
},
refetchQueries,
updateQueries: {
getPodMembershipRequest: (prev, { mutationResult }) => {
const isMutationSuccess = mutationResult.data?.approveJoinPodRequest?.success;
if (isMutationSuccess) {
const newOrgMembershipRequests = [...prev.getPodMembershipRequest].filter((req) => req.userId !== userId);
return { getPodMembershipRequest: newOrgMembershipRequests };
}
return { getPodMembershipRequest: prev };
},
},
});
};

Expand All @@ -78,31 +91,16 @@ const MemberRequests = (props) => {
podId,
},
refetchQueries,
updateQueries: {
getPodMembershipRequest: (prev, { mutationResult }) => {
const isMutationSuccess = mutationResult.data?.rejectJoinPodRequest?.success;
if (isMutationSuccess) {
const newOrgMembershipRequests = [...prev.getPodMembershipRequest].filter((req) => req.userId !== userId);
return { getPodMembershipRequest: newOrgMembershipRequests };
}
return { getPodMembershipRequest: prev };
},
},
});
};

const handleShowAllRequests = () => {
const handleShowMoreRequests = () => {
fetchMore({
variables: {
podId,
offset: podUserMembershipRequests?.length,
limit: REFETCH_QUERY_LIMIT,
},
updateQuery: (prev, { fetchMoreResult }) => {
const getPodMembershipRequest = [...prev?.getPodMembershipRequest, ...fetchMoreResult?.getPodMembershipRequest];
setShowShowAllButton(false);
return { getPodMembershipRequest };
},
});
};

Expand Down Expand Up @@ -166,8 +164,8 @@ const MemberRequests = (props) => {
))}
</MemberRequestsList>

{showShowAllButton ? (
<ShowAllButton onClick={handleShowAllRequests}>Show all</ShowAllButton>
{hasMore ? (
<ShowMoreButton onClick={handleShowMoreRequests}>Show more</ShowMoreButton>
) : (
<MemberRequestsListEndMessage>
These are all the requests for now. Come back later to see more.
Expand Down
2 changes: 1 addition & 1 deletion wondrous-app/components/Pod/members/styles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export const RequestApproveButton = styled(RequestActionButton)`
}
`;

export const ShowAllButton = styled(RequestActionButton)`
export const ShowMoreButton = styled(RequestActionButton)`
&& {
line-height: 15px;
letter-spacing: 0.01em;
Expand Down
70 changes: 34 additions & 36 deletions wondrous-app/components/organization/members/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
RequestCountEmptyState,
RequestHeader,
RequestsContainer,
ShowAllButton,
ShowMoreButton,
MemberName,
MemberMessage,
RequestActionButtons,
Expand All @@ -23,11 +23,26 @@ import {
EmptyMemberRequestsListMessage,
} from './styles';

let QUERY_LIMIT = 1;
let REFETCH_QUERY_LIMIT = undefined;
const QUERY_LIMIT = 3;
const REFETCH_QUERY_LIMIT = 20;

const useGetOrgMemberRequests = (orgId) => {
const [getOrgUserMembershipRequests, { data, fetchMore }] = useLazyQuery(GET_ORG_MEMBERSHIP_REQUEST);
const [hasMore, setHasMore] = useState(false);
const [getOrgUserMembershipRequests, { data, fetchMore, previousData }] = useLazyQuery(GET_ORG_MEMBERSHIP_REQUEST, {
fetchPolicy: 'cache-and-network',
nextFetchPolicy: 'cache-first',
// set notifyOnNetworkStatusChange to true if you want to trigger a rerender whenever the request status updates
notifyOnNetworkStatusChange: true,
onCompleted: ({ getOrgMembershipRequest }) => {
// if previousData is undefined, it means this is the initial fetch
const limitToRefer = previousData ? REFETCH_QUERY_LIMIT : QUERY_LIMIT;
const updatedDataLength = previousData
? getOrgMembershipRequest?.length - previousData?.getOrgMembershipRequest?.length
: getOrgMembershipRequest?.length;
// updatedDataLength >= 0 means it's not a refetch
updatedDataLength >= 0 && setHasMore(updatedDataLength >= limitToRefer);
},
});
useEffect(() => {
if (orgId) {
getOrgUserMembershipRequests({
Expand All @@ -38,17 +53,25 @@ const useGetOrgMemberRequests = (orgId) => {
});
}
}, [orgId, getOrgUserMembershipRequests]);
return { data: data?.getOrgMembershipRequest, fetchMore };
return { data: data?.getOrgMembershipRequest, fetchMore, hasMore };
};

const MemberRequests = (props) => {
const { orgData = {} } = props;
const { id: orgId } = orgData;
const { data: orgUserMembershipRequests, fetchMore } = useGetOrgMemberRequests(orgId);
const { data: orgUserMembershipRequests, fetchMore, hasMore } = useGetOrgMemberRequests(orgId);
const [approveJoinOrgRequest] = useMutation(APPROVE_JOIN_ORG_REQUEST);
const [rejectJoinOrgRequest] = useMutation(REJECT_JOIN_ORG_REQUEST);
const [showShowAllButton, setShowShowAllButton] = useState(true);
const refetchQueries = [GET_ORG_FROM_USERNAME];
const refetchQueries = [
GET_ORG_FROM_USERNAME,
{
query: GET_ORG_MEMBERSHIP_REQUEST,
variables: {
orgId,
limit: orgUserMembershipRequests?.length - 1,
},
},
];
const showEmptyState = orgUserMembershipRequests?.length === 0;

const approveRequest = (userId, orgId) => {
Expand All @@ -58,16 +81,6 @@ const MemberRequests = (props) => {
orgId,
},
refetchQueries,
updateQueries: {
getOrgMembershipRequest: (prev, { mutationResult }) => {
const isMutationSuccess = mutationResult.data?.approveJoinOrgRequest?.success;
if (isMutationSuccess) {
const newOrgMembershipRequests = [...prev.getOrgMembershipRequest].filter((req) => req.userId !== userId);
return { getOrgMembershipRequest: newOrgMembershipRequests };
}
return { getOrgMembershipRequest: prev };
},
},
});
};

Expand All @@ -78,31 +91,16 @@ const MemberRequests = (props) => {
orgId,
},
refetchQueries,
updateQueries: {
getOrgMembershipRequest: (prev, { mutationResult }) => {
const isMutationSuccess = mutationResult.data?.rejectJoinOrgRequest?.success;
if (isMutationSuccess) {
const newOrgMembershipRequests = [...prev.getOrgMembershipRequest].filter((req) => req.userId !== userId);
return { getOrgMembershipRequest: newOrgMembershipRequests };
}
return { getOrgMembershipRequest: prev };
},
},
});
};

const handleShowAllRequests = () => {
const handleShowMoreRequests = () => {
fetchMore({
variables: {
orgId,
offset: orgUserMembershipRequests?.length,
limit: REFETCH_QUERY_LIMIT,
},
updateQuery: (prev, { fetchMoreResult }) => {
const getOrgMembershipRequest = [...prev?.getOrgMembershipRequest, ...fetchMoreResult?.getOrgMembershipRequest];
setShowShowAllButton(false);
return { getOrgMembershipRequest };
},
});
};

Expand Down Expand Up @@ -166,8 +164,8 @@ const MemberRequests = (props) => {
))}
</MemberRequestsList>

{showShowAllButton ? (
<ShowAllButton onClick={handleShowAllRequests}>Show all</ShowAllButton>
{hasMore ? (
<ShowMoreButton onClick={handleShowMoreRequests}>Show more</ShowMoreButton>
) : (
<MemberRequestsListEndMessage>
These are all the requests for now. Come back later to see more.
Expand Down
2 changes: 1 addition & 1 deletion wondrous-app/components/organization/members/styles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ export const RequestApproveButton = styled(RequestActionButton)`
}
`;

export const ShowAllButton = styled(RequestActionButton)`
export const ShowMoreButton = styled(RequestActionButton)`
&& {
line-height: 15px;
letter-spacing: 0.01em;
Expand Down
2 changes: 2 additions & 0 deletions wondrous-app/services/apollo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ const cache = new InMemoryCache({
},
getOrgFeed: offsetLimitPagination(), // NOTE: https://www.apollographql.com/docs/react/pagination/core-api/#non-paginated-read-functions
getPodFeed: offsetLimitPagination(),
getOrgMembershipRequest: offsetLimitPagination(),
getPodMembershipRequest: offsetLimitPagination(),
getTasksForMilestone: offsetLimitPagination(['milestoneId', 'status']),
getProposalsUserCanReview: offsetLimitPagination(),
getSubmissionsUserCanReview: offsetLimitPagination(),
Expand Down