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:
@@ -4,8 +4,8 @@
|
|||||||
v-for="member in invitations"
|
v-for="member in invitations"
|
||||||
:key="member.id"
|
:key="member.id"
|
||||||
:member="member"
|
:member="member"
|
||||||
@accept="acceptInvitation({ id: member.id })"
|
@accept="() => member.id && acceptInvitation({ id: member.id })"
|
||||||
@reject="rejectInvitation({ id: member.id })"
|
@reject="() => member.id && rejectInvitation({ id: member.id })"
|
||||||
/>
|
/>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
@@ -24,8 +24,16 @@ defineProps<{
|
|||||||
invitations: IMember[];
|
invitations: IMember[];
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const { mutate: acceptInvitation, onError: onAcceptInvitationError } =
|
const emit = defineEmits<{
|
||||||
useMutation<{ acceptInvitation: IMember }, { id: string }>(
|
(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,
|
ACCEPT_INVITATION,
|
||||||
{
|
{
|
||||||
refetchQueries({ data }) {
|
refetchQueries({ data }) {
|
||||||
@@ -53,13 +61,26 @@ 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 { mutate: rejectInvitation, onError: onRejectInvitationError } =
|
const {
|
||||||
useMutation<{ rejectInvitation: IMember }, { id: string }>(
|
mutate: rejectInvitation,
|
||||||
|
onDone: onRejectInvitationDone,
|
||||||
|
onError: onRejectInvitationError,
|
||||||
|
} = useMutation<{ rejectInvitation: IMember }, { id: string }>(
|
||||||
REJECT_INVITATION,
|
REJECT_INVITATION,
|
||||||
{
|
{
|
||||||
refetchQueries({ data }) {
|
refetchQueries({ data }) {
|
||||||
|
// 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;
|
||||||
if (profile && group) {
|
if (profile && group) {
|
||||||
@@ -75,5 +96,14 @@ const { mutate: rejectInvitation, onError: onRejectInvitationError } =
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
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>
|
||||||
|
|||||||
@@ -19,8 +19,8 @@
|
|||||||
<o-loading v-model:active="loading"></o-loading>
|
<o-loading v-model:active="loading"></o-loading>
|
||||||
<InvitationsList
|
<InvitationsList
|
||||||
:invitations="invitations"
|
:invitations="invitations"
|
||||||
@accept-invitation="acceptInvitation"
|
@accept-invitation="refetchLoggedUserMemberships"
|
||||||
@reject-invitation="rejectInvitation"
|
@reject-invitation="refetchLoggedUserMemberships"
|
||||||
/>
|
/>
|
||||||
<section v-if="memberships && memberships.length > 0">
|
<section v-if="memberships && memberships.length > 0">
|
||||||
<GroupMemberCard
|
<GroupMemberCard
|
||||||
@@ -82,7 +82,6 @@ import { LOGGED_USER_MEMBERSHIPS } from "@/graphql/actor";
|
|||||||
import { LEAVE_GROUP } from "@/graphql/group";
|
import { LEAVE_GROUP } from "@/graphql/group";
|
||||||
import GroupMemberCard from "@/components/Group/GroupMemberCard.vue";
|
import GroupMemberCard from "@/components/Group/GroupMemberCard.vue";
|
||||||
import InvitationsList from "@/components/Group/InvitationsList.vue";
|
import InvitationsList from "@/components/Group/InvitationsList.vue";
|
||||||
import { usernameWithDomain } from "@/types/actor";
|
|
||||||
import { IMember } from "@/types/actor/member.model";
|
import { IMember } from "@/types/actor/member.model";
|
||||||
import { MemberRole, ContentType } from "@/types/enums";
|
import { MemberRole, ContentType } from "@/types/enums";
|
||||||
import RouteName from "../../router/name";
|
import RouteName from "../../router/name";
|
||||||
@@ -93,13 +92,16 @@ import { integerTransformer, useRouteQuery } from "vue-use-route-query";
|
|||||||
import { computed, inject } from "vue";
|
import { computed, inject } from "vue";
|
||||||
import { useHead } from "@/utils/head";
|
import { useHead } from "@/utils/head";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { useRouter } from "vue-router";
|
|
||||||
import { Notifier } from "@/plugins/notifier";
|
import { Notifier } from "@/plugins/notifier";
|
||||||
|
|
||||||
const page = useRouteQuery("page", 1, integerTransformer);
|
const page = useRouteQuery("page", 1, integerTransformer);
|
||||||
const limit = 10;
|
const limit = 10;
|
||||||
|
|
||||||
const { result: membershipsResult, loading } = useQuery<{
|
const {
|
||||||
|
result: membershipsResult,
|
||||||
|
loading,
|
||||||
|
refetch: refetchLoggedUserMemberships,
|
||||||
|
} = useQuery<{
|
||||||
loggedUser: Pick<IUser, "memberships">;
|
loggedUser: Pick<IUser, "memberships">;
|
||||||
}>(
|
}>(
|
||||||
LOGGED_USER_MEMBERSHIPS,
|
LOGGED_USER_MEMBERSHIPS,
|
||||||
@@ -129,26 +131,6 @@ useHead({
|
|||||||
|
|
||||||
const notifier = inject<Notifier>("notifier");
|
const notifier = inject<Notifier>("notifier");
|
||||||
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
const acceptInvitation = (member: IMember) => {
|
|
||||||
return router.push({
|
|
||||||
name: RouteName.GROUP,
|
|
||||||
params: { preferredUsername: usernameWithDomain(member.parent) },
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const rejectInvitation = ({ id: memberId }: { id: string }) => {
|
|
||||||
const index = membershipsPages.value.elements.findIndex(
|
|
||||||
(membership) =>
|
|
||||||
membership.role === MemberRole.INVITED && membership.id === memberId
|
|
||||||
);
|
|
||||||
if (index > -1) {
|
|
||||||
membershipsPages.value.elements.splice(index, 1);
|
|
||||||
membershipsPages.value.total -= 1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const { mutate: leaveGroup, onError: onLeaveGroupError } = useMutation(
|
const { mutate: leaveGroup, onError: onLeaveGroupError } = useMutation(
|
||||||
LEAVE_GROUP,
|
LEAVE_GROUP,
|
||||||
() => ({
|
() => ({
|
||||||
|
|||||||
Reference in New Issue
Block a user