fix: fetch discussion and ressources info when accepting a group invitation

Also ensure that the actor is included in PERSON_STATUS_GROUP, to stay consistent with LOGGED_USER_MEMBERSHIPS as used in MyGroups.vue.

The accept-invitation and refuse-invitation events needed to be emitted before refetching PERSON_STATUS_GROUP, so they can be caught by GroupView.vue before <InvitationsList> is destroyed due to the v-if becoming false.

Fixes #1800
This commit is contained in:
Massedil
2025-06-20 18:36:28 +02:00
parent 108d34305e
commit 3447bdc864
3 changed files with 77 additions and 70 deletions

View File

@@ -29,14 +29,19 @@ const emit = defineEmits<{
(e: "reject-invitation", member: IMember): void; (e: "reject-invitation", member: IMember): void;
}>(); }>();
const { const { mutate: acceptInvitation, onError: onAcceptInvitationError } =
mutate: acceptInvitation, useMutation<{ acceptInvitation: IMember }, { id: string }>(
onDone: onAcceptInvitationDone,
onError: onAcceptInvitationError,
} = useMutation<{ acceptInvitation: IMember }, { id: string }>(
ACCEPT_INVITATION, ACCEPT_INVITATION,
{ {
refetchQueries({ data }) { refetchQueries({ data }) {
if (!data?.acceptInvitation) {
console.error(data);
alert("Error while accepting invitation");
return [];
}
emit("accept-invitation", data?.acceptInvitation);
const profile = data?.acceptInvitation?.actor as IPerson; const profile = data?.acceptInvitation?.actor as IPerson;
const group = data?.acceptInvitation?.parent as IGroup; const group = data?.acceptInvitation?.parent as IGroup;
if (profile && group) { if (profile && group) {
@@ -61,25 +66,21 @@ const onError = (error: ErrorResponse) => {
} }
}; };
onAcceptInvitationDone((result) => {
if (!result.data?.acceptInvitation) {
console.error(result);
alert("Error while accepting invitation");
return;
}
emit("accept-invitation", result.data?.acceptInvitation);
});
onAcceptInvitationError((err) => onError(err as unknown as ErrorResponse)); onAcceptInvitationError((err) => onError(err as unknown as ErrorResponse));
const { const { mutate: rejectInvitation, onError: onRejectInvitationError } =
mutate: rejectInvitation, useMutation<{ rejectInvitation: IMember }, { id: string }>(
onDone: onRejectInvitationDone,
onError: onRejectInvitationError,
} = useMutation<{ rejectInvitation: IMember }, { id: string }>(
REJECT_INVITATION, REJECT_INVITATION,
{ {
refetchQueries({ data }) { refetchQueries({ data }) {
if (!data?.rejectInvitation) {
console.error(data);
alert("Error while rejecting invitation");
return [];
}
emit("reject-invitation", data?.rejectInvitation);
// TODO Refetching the PERSON_STATUS_GROUP query is useless for the Mygroup.vue page // TODO Refetching the PERSON_STATUS_GROUP query is useless for the Mygroup.vue page
const profile = data?.rejectInvitation?.actor as IPerson; const profile = data?.rejectInvitation?.actor as IPerson;
const group = data?.rejectInvitation?.parent as IGroup; const group = data?.rejectInvitation?.parent as IGroup;
@@ -96,14 +97,5 @@ const {
} }
); );
onRejectInvitationDone((result) => {
if (!result.data?.rejectInvitation) {
console.error(result);
alert("Error while rejecting invitation");
return;
}
emit("reject-invitation", result.data?.rejectInvitation);
});
onRejectInvitationError((err) => onError(err as unknown as ErrorResponse)); onRejectInvitationError((err) => onError(err as unknown as ErrorResponse));
</script> </script>

View File

@@ -338,6 +338,9 @@ export const PERSON_STATUS_GROUP = gql`
elements { elements {
id id
role role
actor {
...ActorFragment
}
parent { parent {
...ActorFragment ...ActorFragment
} }

View File

@@ -327,6 +327,8 @@
isCurrentActorAnInvitedGroupMember && groupMember !== undefined isCurrentActorAnInvitedGroupMember && groupMember !== undefined
" "
:invitations="[groupMember]" :invitations="[groupMember]"
@accept-invitation="refetchGroupInformations"
@reject-invitation="refetchGroupInformations"
/> />
<o-notification <o-notification
class="my-2" class="my-2"
@@ -688,8 +690,10 @@ const {
} = useGroup(preferredUsername, { afterDateTime: new Date() }); } = useGroup(preferredUsername, { afterDateTime: new Date() });
const router = useRouter(); const router = useRouter();
const { group: discussionGroup } = useGroupDiscussionsList(preferredUsername); const { group: discussionGroup, refetch: refetchGroupDiscussionsList } =
const { group: resourcesGroup } = useGroupResourcesList(preferredUsername, { useGroupDiscussionsList(preferredUsername);
const { group: resourcesGroup, refetch: refetchGroupResourcesList } =
useGroupResourcesList(preferredUsername, {
resourcesPage: 1, resourcesPage: 1,
resourcesLimit: 3, resourcesLimit: 3,
}); });
@@ -698,9 +702,11 @@ const { t } = useI18n({ useScope: "global" });
const { isLongEvents } = useIsLongEvents(); const { isLongEvents } = useIsLongEvents();
// const { person } = usePersonStatusGroup(group); const {
result,
const { result, subscribeToMore } = useQuery<{ subscribeToMore,
refetch: refetchPersonStatusGroup,
} = useQuery<{
person: IPerson; person: IPerson;
}>( }>(
PERSON_STATUS_GROUP, PERSON_STATUS_GROUP,
@@ -755,6 +761,12 @@ watch(
} }
); );
const refetchGroupInformations = () => {
refetchPersonStatusGroup();
refetchGroupResourcesList();
refetchGroupDiscussionsList();
};
const { mutate: joinGroupMutation, onError: onJoinGroupError } = const { mutate: joinGroupMutation, onError: onJoinGroupError } =
useMutation(JOIN_GROUP); useMutation(JOIN_GROUP);