Fix a couple of Apollo cache issues
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
parent
18cd7c11f1
commit
e6b186026d
@ -145,8 +145,10 @@ export default class DiscussionComment extends Vue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateComment(): void {
|
updateComment(): void {
|
||||||
this.comment.text = this.updatedComment;
|
this.$emit("update-comment", {
|
||||||
this.$emit("update-comment", this.comment);
|
...this.comment,
|
||||||
|
text: this.updatedComment,
|
||||||
|
});
|
||||||
this.toggleEditMode();
|
this.toggleEditMode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ import { GraphQLError } from "graphql";
|
|||||||
import { DELETE_COMMENT, UPDATE_COMMENT } from "@/graphql/comment";
|
import { DELETE_COMMENT, UPDATE_COMMENT } from "@/graphql/comment";
|
||||||
import RouteName from "../../router/name";
|
import RouteName from "../../router/name";
|
||||||
import { IComment } from "../../types/comment.model";
|
import { IComment } from "../../types/comment.model";
|
||||||
import { ApolloCache, FetchResult } from "@apollo/client/core";
|
import { ApolloCache, FetchResult, gql, Reference } from "@apollo/client/core";
|
||||||
import { mixins } from "vue-class-component";
|
import { mixins } from "vue-class-component";
|
||||||
import GroupMixin from "@/mixins/group";
|
import GroupMixin from "@/mixins/group";
|
||||||
|
|
||||||
@ -310,49 +310,23 @@ export default class Discussion extends mixins(GroupMixin) {
|
|||||||
variables: {
|
variables: {
|
||||||
commentId: comment.id,
|
commentId: comment.id,
|
||||||
},
|
},
|
||||||
update: (
|
update: (store: ApolloCache<{ deleteComment: IComment }>) => {
|
||||||
store: ApolloCache<{ deleteComment: IComment }>,
|
store.writeFragment({
|
||||||
{ data }: FetchResult
|
id: store.identify(comment as unknown as Reference),
|
||||||
) => {
|
fragment: gql`
|
||||||
if (!data || !data.deleteComment) return;
|
fragment CommentDeleted on Comment {
|
||||||
const discussionData = store.readQuery<{
|
deletedAt
|
||||||
discussion: IDiscussion;
|
actor {
|
||||||
}>({
|
id
|
||||||
query: GET_DISCUSSION,
|
}
|
||||||
variables: {
|
text
|
||||||
slug: this.slug,
|
}
|
||||||
page: this.page,
|
`,
|
||||||
},
|
data: {
|
||||||
});
|
|
||||||
if (!discussionData) return;
|
|
||||||
const { discussion: discussionCached } = discussionData;
|
|
||||||
const index = discussionCached.comments.elements.findIndex(
|
|
||||||
({ id }) => id === data.deleteComment.id
|
|
||||||
);
|
|
||||||
let discussionUpdated = discussionCached;
|
|
||||||
if (index > -1) {
|
|
||||||
const updatedComment = {
|
|
||||||
...discussionCached.comments.elements[index],
|
|
||||||
deletedAt: new Date(),
|
deletedAt: new Date(),
|
||||||
|
text: "",
|
||||||
actor: null,
|
actor: null,
|
||||||
updatedComment: {
|
},
|
||||||
text: "",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
const elements = [...discussionCached.comments.elements];
|
|
||||||
elements.splice(index, 1, updatedComment);
|
|
||||||
discussionUpdated = {
|
|
||||||
...discussionCached,
|
|
||||||
comments: {
|
|
||||||
total: discussionCached.comments.total,
|
|
||||||
elements,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
store.writeQuery({
|
|
||||||
query: GET_DISCUSSION,
|
|
||||||
variables: { slug: this.slug, page: this.page },
|
|
||||||
data: { discussion: discussionUpdated },
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@ -369,20 +343,6 @@ export default class Discussion extends mixins(GroupMixin) {
|
|||||||
page: this.page,
|
page: this.page,
|
||||||
limit: this.COMMENTS_PER_PAGE,
|
limit: this.COMMENTS_PER_PAGE,
|
||||||
},
|
},
|
||||||
updateQuery: (previousResult, { fetchMoreResult }) => {
|
|
||||||
return {
|
|
||||||
discussion: {
|
|
||||||
...previousResult.discussion,
|
|
||||||
comments: {
|
|
||||||
...fetchMoreResult.discussion.comments,
|
|
||||||
elements: [
|
|
||||||
...previousResult.discussion.comments.elements,
|
|
||||||
...fetchMoreResult.discussion.comments.elements,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
this.hasMoreComments = !this.discussion.comments.elements
|
this.hasMoreComments = !this.discussion.comments.elements
|
||||||
.map(({ id }) => id)
|
.map(({ id }) => id)
|
||||||
@ -399,32 +359,6 @@ export default class Discussion extends mixins(GroupMixin) {
|
|||||||
discussionId: this.discussion.id,
|
discussionId: this.discussion.id,
|
||||||
title: this.newTitle,
|
title: this.newTitle,
|
||||||
},
|
},
|
||||||
update: (
|
|
||||||
store: ApolloCache<{ updateDiscussion: IDiscussion }>,
|
|
||||||
{ data }: FetchResult<{ updateDiscussion: IDiscussion }>
|
|
||||||
) => {
|
|
||||||
const discussionData = store.readQuery<{
|
|
||||||
discussion: IDiscussion;
|
|
||||||
}>({
|
|
||||||
query: GET_DISCUSSION,
|
|
||||||
variables: {
|
|
||||||
slug: this.slug,
|
|
||||||
page: this.page,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (discussionData && data?.updateDiscussion) {
|
|
||||||
store.writeQuery({
|
|
||||||
query: GET_DISCUSSION,
|
|
||||||
variables: { slug: this.slug, page: this.page },
|
|
||||||
data: {
|
|
||||||
discussion: {
|
|
||||||
...discussionData.discussion,
|
|
||||||
title: data?.updateDiscussion.title,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
this.editTitleMode = false;
|
this.editTitleMode = false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user