fix: interface is well updated after rejecting and accepting invitation in /groups/me page

InvitationList.vue now emit accept-invitation and reject-invitation as expected by MyGroups.vue

MyGroups.vue refetch data after receiving the events.

Fixes #1797
This commit is contained in:
Massedil
2025-06-19 18:35:39 +02:00
parent bfd08493d8
commit c87f884d0a
2 changed files with 77 additions and 65 deletions

View File

@@ -4,8 +4,8 @@
v-for="member in invitations"
:key="member.id"
:member="member"
@accept="acceptInvitation({ id: member.id })"
@reject="rejectInvitation({ id: member.id })"
@accept="() => member.id && acceptInvitation({ id: member.id })"
@reject="() => member.id && rejectInvitation({ id: member.id })"
/>
</section>
</template>
@@ -24,25 +24,33 @@ defineProps<{
invitations: IMember[];
}>();
const { mutate: acceptInvitation, onError: onAcceptInvitationError } =
useMutation<{ acceptInvitation: IMember }, { id: string }>(
ACCEPT_INVITATION,
{
refetchQueries({ data }) {
const profile = data?.acceptInvitation?.actor as IPerson;
const group = data?.acceptInvitation?.parent as IGroup;
if (profile && group) {
return [
{
query: PERSON_STATUS_GROUP,
variables: { id: profile.id, group: usernameWithDomain(group) },
},
];
}
return [];
},
}
);
const emit = defineEmits<{
(e: "accept-invitation", member: IMember): void;
(e: "reject-invitation", member: IMember): void;
}>();
const {
mutate: acceptInvitation,
onDone: onAcceptInvitationDone,
onError: onAcceptInvitationError,
} = useMutation<{ acceptInvitation: IMember }, { id: string }>(
ACCEPT_INVITATION,
{
refetchQueries({ data }) {
const profile = data?.acceptInvitation?.actor as IPerson;
const group = data?.acceptInvitation?.parent as IGroup;
if (profile && group) {
return [
{
query: PERSON_STATUS_GROUP,
variables: { id: profile.id, group: usernameWithDomain(group) },
},
];
}
return [];
},
}
);
const notifier = inject<Notifier>("notifier");
@@ -53,27 +61,49 @@ 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));
const { mutate: rejectInvitation, onError: onRejectInvitationError } =
useMutation<{ rejectInvitation: IMember }, { id: string }>(
REJECT_INVITATION,
{
refetchQueries({ data }) {
const profile = data?.rejectInvitation?.actor as IPerson;
const group = data?.rejectInvitation?.parent as IGroup;
if (profile && group) {
return [
{
query: PERSON_STATUS_GROUP,
variables: { id: profile.id, group: usernameWithDomain(group) },
},
];
}
return [];
},
}
);
const {
mutate: rejectInvitation,
onDone: onRejectInvitationDone,
onError: onRejectInvitationError,
} = useMutation<{ rejectInvitation: IMember }, { id: string }>(
REJECT_INVITATION,
{
refetchQueries({ data }) {
// TODO Refetching the PERSON_STATUS_GROUP query is useless for the Mygroup.vue page
const profile = data?.rejectInvitation?.actor as IPerson;
const group = data?.rejectInvitation?.parent as IGroup;
if (profile && group) {
return [
{
query: PERSON_STATUS_GROUP,
variables: { id: profile.id, group: usernameWithDomain(group) },
},
];
}
return [];
},
}
);
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));
</script>