[question][fix] fix useQuestionVote

pull/521/head
Jeff Sieu 3 years ago
parent c0b3313acc
commit 9fda043862

@ -48,6 +48,16 @@ const createVoteCallbacks = (
type MutationKey = Parameters<typeof trpc.useMutation>[0]; type MutationKey = Parameters<typeof trpc.useMutation>[0];
type QueryKey = Parameters<typeof trpc.useQuery>[0][0]; type QueryKey = Parameters<typeof trpc.useQuery>[0][0];
const getVoteValue = (vote: Vote | null) => {
if (vote === Vote.UPVOTE) {
return 1;
}
if (vote === Vote.DOWNVOTE) {
return -1;
}
return 0;
};
export const useQuestionVote = (id: string) => { export const useQuestionVote = (id: string) => {
const utils = trpc.useContext(); const utils = trpc.useContext();
@ -58,50 +68,42 @@ export const useQuestionVote = (id: string) => {
// 'questions.questions.getQuestionsByFilterAndContent', // 'questions.questions.getQuestionsByFilterAndContent',
], ],
onMutate: async (previousVote, currentVote) => { onMutate: async (previousVote, currentVote) => {
// Update question list
const questionQueries = utils.queryClient.getQueriesData([ const questionQueries = utils.queryClient.getQueriesData([
'questions.questions.getQuestionsByFilterAndContent', 'questions.questions.getQuestionsByFilterAndContent',
]); ]);
const getVoteValue = (vote: Vote | null) => {
if (vote === Vote.UPVOTE) {
return 1;
}
if (vote === Vote.DOWNVOTE) {
return -1;
}
return 0;
};
const voteValueChange = const voteValueChange =
getVoteValue(currentVote) - getVoteValue(previousVote); getVoteValue(currentVote) - getVoteValue(previousVote);
for (const [key, query] of questionQueries) { if (questionQueries !== undefined) {
if (query === undefined) { for (const [key, query] of questionQueries) {
continue; if (query === undefined) {
continue;
}
const { pages, ...restQuery } = query as InfiniteData<{
data: Array<Question>;
}>;
const newQuery = {
pages: pages.map(({ data, ...restPage }) => ({
data: data.map((question) => {
if (question.id === id) {
const { numVotes, ...restQuestion } = question;
return {
numVotes: numVotes + voteValueChange,
...restQuestion,
};
}
return question;
}),
...restPage,
})),
...restQuery,
};
utils.queryClient.setQueryData(key, newQuery);
} }
const { pages, ...restQuery } = query as InfiniteData<{
data: Array<Question>;
}>;
const newQuery = {
pages: pages.map(({ data, ...restPage }) => ({
data: data.map((question) => {
if (question.id === id) {
const { numVotes, ...restQuestion } = question;
return {
numVotes: numVotes + voteValueChange,
...restQuestion,
};
}
return question;
}),
...restPage,
})),
...restQuery,
};
utils.queryClient.setQueryData(key, newQuery);
} }
const prevQuestion = utils.queryClient.getQueryData([ const prevQuestion = utils.queryClient.getQueryData([
@ -109,17 +111,19 @@ export const useQuestionVote = (id: string) => {
{ {
id, id,
}, },
]) as Question; ]) as Question | undefined;
const newQuestion = { if (prevQuestion !== undefined) {
...prevQuestion, const newQuestion = {
numVotes: prevQuestion.numVotes + voteValueChange, ...prevQuestion,
}; numVotes: prevQuestion.numVotes + voteValueChange,
};
utils.queryClient.setQueryData( utils.queryClient.setQueryData(
['questions.questions.getQuestionById', { id }], ['questions.questions.getQuestionById', { id }],
newQuestion, newQuestion,
); );
}
}, },
query: 'questions.questions.user.getVote', query: 'questions.questions.user.getVote',
setDownVoteKey: 'questions.questions.user.setDownVote', setDownVoteKey: 'questions.questions.user.setDownVote',

Loading…
Cancel
Save