Skip to content

Commit b3dead1

Browse files
authored
Fix Voting Bug (#139)
* fix(voting): apply appropriate userId variable to required queries * refactor(feedback-card): remove opacity change if status is being updated * refactor(feedback-card): update pending states * fix: update query key management for voting mutations
1 parent 59835d4 commit b3dead1

File tree

14 files changed

+144
-44
lines changed

14 files changed

+144
-44
lines changed

src/app/organizations/[organizationSlug]/projects/[projectSlug]/[feedbackId]/page.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,14 @@ const FeedbackPage = async ({ params }: Props) => {
7070

7171
await Promise.all([
7272
queryClient.prefetchQuery({
73-
queryKey: useFeedbackByIdQuery.getKey({ rowId: feedbackId }),
74-
queryFn: useFeedbackByIdQuery.fetcher({ rowId: feedbackId }),
73+
queryKey: useFeedbackByIdQuery.getKey({
74+
rowId: feedbackId,
75+
userId: session.user.rowId,
76+
}),
77+
queryFn: useFeedbackByIdQuery.fetcher({
78+
rowId: feedbackId,
79+
userId: session.user.rowId,
80+
}),
7581
}),
7682
queryClient.prefetchQuery(
7783
freeTierCommentsOptions({ projectSlug, organizationSlug, feedbackId }),

src/app/organizations/[organizationSlug]/projects/[projectSlug]/page.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { auth } from "auth";
77
import { Page } from "components/layout";
88
import { ProjectOverview } from "components/project";
99
import {
10+
PostOrderBy,
1011
Role,
1112
useInfinitePostsQuery,
1213
useOrganizationRoleQuery,
@@ -23,7 +24,6 @@ import { freeTierFeedbackOptions } from "lib/options";
2324
import { getQueryClient, getSearchParams } from "lib/util";
2425

2526
import type { BreadcrumbRecord } from "components/core";
26-
import type { PostOrderBy } from "generated/graphql";
2727
import type { SearchParams } from "nuqs/server";
2828

2929
export const generateMetadata = async ({ params }: Props) => {
@@ -108,14 +108,20 @@ const ProjectPage = async ({ params, searchParams }: Props) => {
108108
queryKey: useInfinitePostsQuery.getKey({
109109
projectId: project.rowId,
110110
excludedStatuses,
111-
orderBy: orderBy ? (orderBy as PostOrderBy) : undefined,
111+
orderBy: orderBy
112+
? [orderBy as PostOrderBy, PostOrderBy.CreatedAtDesc]
113+
: undefined,
112114
search,
115+
userId: session.user.rowId,
113116
}),
114117
queryFn: usePostsQuery.fetcher({
115118
projectId: project.rowId,
116119
excludedStatuses,
117-
orderBy: orderBy ? (orderBy as PostOrderBy) : undefined,
120+
orderBy: orderBy
121+
? [orderBy as PostOrderBy, PostOrderBy.CreatedAtDesc]
122+
: undefined,
118123
search,
124+
userId: session.user.rowId,
119125
}),
120126
initialPageParam: undefined,
121127
}),

src/components/feedback/CommentCard/CommentCard.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import type { Session } from "next-auth";
3636

3737
interface Props extends StackProps {
3838
/** Authenticated user. */
39-
user: Session["user"];
39+
user: Session["user"] | undefined;
4040
/** Comment. */
4141
comment: CommentFragment;
4242
/** Organization ID. */
@@ -88,7 +88,10 @@ const CommentCard = ({
8888
}),
8989
queryClient.invalidateQueries({ queryKey: ["Posts.infinite"] }),
9090
queryClient.invalidateQueries({
91-
queryKey: useFeedbackByIdQuery.getKey({ rowId: feedbackId }),
91+
queryKey: useFeedbackByIdQuery.getKey({
92+
rowId: feedbackId,
93+
userId: user?.rowId,
94+
}),
9295
}),
9396
]),
9497
});

src/components/feedback/CreateComment/CreateComment.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ const CreateComment = ({ user, canCreateComment }: Props) => {
7171
queryClient.invalidateQueries({
7272
queryKey: useFeedbackByIdQuery.getKey({
7373
rowId: feedbackId,
74+
userId: user?.rowId,
7475
}),
7576
}),
7677
]);

src/components/feedback/CreateReply/CreateReply.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ const CreateReply = ({ commentId, canReply, onReply, ...rest }: Props) => {
7878
queryClient.invalidateQueries({
7979
queryKey: useFeedbackByIdQuery.getKey({
8080
rowId: feedbackId,
81+
userId: user?.rowId,
8182
}),
8283
}),
8384
queryClient.invalidateQueries(

src/components/feedback/FeedbackCard/FeedbackCard.tsx

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,18 @@ const FeedbackCard = ({
124124
useUpdatePostMutation({
125125
onMutate: (variables) => {
126126
const feedbackSnapshot = queryClient.getQueryData(
127-
useFeedbackByIdQuery.getKey({ rowId: feedback.rowId! }),
127+
useFeedbackByIdQuery.getKey({
128+
rowId: feedback.rowId!,
129+
userId: user?.rowId,
130+
}),
128131
) as FeedbackByIdQuery;
129132

130133
const postsQueryKey = useInfinitePostsQuery.getKey({
131134
projectId: feedback.project?.rowId!,
132135
excludedStatuses,
133136
orderBy: orderBy ? (orderBy as PostOrderBy) : undefined,
134137
search,
138+
userId: user?.rowId,
135139
});
136140

137141
const postsSnapshot = queryClient.getQueryData(
@@ -144,7 +148,10 @@ const FeedbackCard = ({
144148

145149
if (feedbackSnapshot) {
146150
queryClient.setQueryData(
147-
useFeedbackByIdQuery.getKey({ rowId: feedback.rowId! }),
151+
useFeedbackByIdQuery.getKey({
152+
rowId: feedback.rowId!,
153+
userId: user?.rowId,
154+
}),
148155
{
149156
post: {
150157
...feedbackSnapshot.post,
@@ -199,26 +206,26 @@ const FeedbackCard = ({
199206
}),
200207

201208
queryClient.invalidateQueries({
202-
queryKey: useFeedbackByIdQuery.getKey({ rowId: feedback.rowId! }),
209+
queryKey: useFeedbackByIdQuery.getKey({
210+
rowId: feedback.rowId!,
211+
userId: user?.rowId,
212+
}),
203213
}),
204214
]),
205215
});
206216

207-
const userUpvote = feedback?.userUpvotes?.nodes[0],
208-
userDownvote = feedback?.userDownvotes?.nodes[0],
217+
const userUpvote = user ? feedback?.userUpvotes?.nodes[0] : null,
218+
userDownvote = user ? feedback?.userDownvotes?.nodes[0] : null,
209219
totalUpvotes = feedback?.upvotes?.totalCount ?? 0,
210220
totalDownvotes = feedback?.downvotes?.totalCount ?? 0;
211221

212222
const isAuthor = user?.rowId === feedback.user?.rowId;
213223

214224
const canAdjustFeedback = isAuthor || canManageFeedback;
215225

216-
const isPending = feedback.rowId === "pending";
226+
const isFeedbackPending = feedback.rowId === "pending";
217227

218-
const actionIsPending =
219-
feedback.rowId === "pending" ||
220-
isDeleteFeedbackPending ||
221-
isUpdateStatusPending;
228+
const actionIsPending = isFeedbackPending || isDeleteFeedbackPending;
222229

223230
return (
224231
<HStack
@@ -259,7 +266,9 @@ const FeedbackCard = ({
259266
/>
260267

261268
<Text color="foreground.subtle">
262-
{dayjs(isPending ? new Date() : feedback.createdAt).fromNow()}
269+
{dayjs(
270+
isFeedbackPending ? new Date() : feedback.createdAt,
271+
).fromNow()}
263272
</Text>
264273
</Stack>
265274
</Stack>
@@ -271,6 +280,7 @@ const FeedbackCard = ({
271280
downvote={userDownvote}
272281
totalUpvotes={totalUpvotes}
273282
totalDownvotes={totalDownvotes}
283+
isFeedbackRoute={!!isFeedbackRoute}
274284
/>
275285
</HStack>
276286

@@ -296,7 +306,10 @@ const FeedbackCard = ({
296306
</StatusBadge>
297307
}
298308
triggerProps={{
299-
disabled: !canManageFeedback || actionIsPending,
309+
disabled:
310+
!canManageFeedback ||
311+
actionIsPending ||
312+
isUpdateStatusPending,
300313
}}
301314
positioning={{ strategy: "fixed" }}
302315
>
@@ -336,14 +349,15 @@ const FeedbackCard = ({
336349
fontSize="sm"
337350
color="foreground.subtle"
338351
>
339-
{`Updated ${dayjs(isPending ? new Date() : feedback.statusUpdatedAt).fromNow()}`}
352+
{`Updated ${dayjs(isUpdateStatusPending ? new Date() : feedback.statusUpdatedAt).fromNow()}`}
340353
</Text>
341354
</HStack>
342355

343356
<HStack>
344357
{canAdjustFeedback && (
345358
<HStack>
346359
<UpdateFeedback
360+
user={user}
347361
feedback={feedback}
348362
triggerProps={{
349363
disabled: actionIsPending,

src/components/feedback/FeedbackDetails/FeedbackDetails.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const FeedbackDetails = ({ user, feedbackId, ...rest }: Props) => {
2525
const { data: feedback } = useFeedbackByIdQuery(
2626
{
2727
rowId: feedbackId,
28+
userId: user?.rowId,
2829
},
2930
{
3031
select: (data) => data?.post,

src/components/feedback/Replies/Replies.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import type { Session } from "next-auth";
2222

2323
interface Props extends CollapsibleProps {
2424
/** Authenticated user. */
25-
user: Session["user"];
25+
user: Session["user"] | undefined;
2626
/** Organization ID. */
2727
organizationId: Organization["rowId"];
2828
/** Comment ID. */

src/components/feedback/ReplyCard/ReplyCard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import type { Session } from "next-auth";
2020

2121
interface Props extends HstackProps {
2222
/** Authenticated user. */
23-
user: Session["user"];
23+
user: Session["user"] | undefined;
2424
/** Reply. */
2525
reply: ReplyFragment;
2626
/** Organization ID. */

src/components/feedback/UpdateFeedback/UpdateFeedback.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { toaster } from "lib/util";
2424

2525
import type { DialogProps } from "@omnidev/sigil";
2626
import type { FeedbackFragment } from "generated/graphql";
27+
import type { Session } from "next-auth";
2728

2829
const MAX_DESCRIPTION_LENGTH = 500;
2930

@@ -47,14 +48,16 @@ const updateFeedbackSchema = z.object({
4748
});
4849

4950
interface Props extends DialogProps {
51+
/** Authenticated user. */
52+
user: Session["user"] | undefined;
5053
/** Feedback details. */
5154
feedback: Partial<FeedbackFragment>;
5255
}
5356

5457
/**
5558
* Update feedback form.
5659
*/
57-
const UpdateFeedback = ({ feedback, ...rest }: Props) => {
60+
const UpdateFeedback = ({ user, feedback, ...rest }: Props) => {
5861
const queryClient = useQueryClient();
5962

6063
const isClient = useIsClient();
@@ -74,7 +77,10 @@ const UpdateFeedback = ({ feedback, ...rest }: Props) => {
7477
queryKey: ["Posts.infinite"],
7578
}),
7679
queryClient.invalidateQueries({
77-
queryKey: useFeedbackByIdQuery.getKey({ rowId: feedback.rowId! }),
80+
queryKey: useFeedbackByIdQuery.getKey({
81+
rowId: feedback.rowId!,
82+
userId: user?.rowId,
83+
}),
7884
}),
7985
]);
8086
},

0 commit comments

Comments
 (0)