diff --git a/apps/portal/src/pages/questions/[questionId]/[questionSlug]/index.tsx b/apps/portal/src/pages/questions/[questionId]/[questionSlug]/index.tsx index 74253d6a..4169d97a 100644 --- a/apps/portal/src/pages/questions/[questionId]/[questionSlug]/index.tsx +++ b/apps/portal/src/pages/questions/[questionId]/[questionSlug]/index.tsx @@ -1,7 +1,7 @@ import { useRouter } from 'next/router'; import { useForm } from 'react-hook-form'; import { ArrowSmallLeftIcon } from '@heroicons/react/24/outline'; -import { Button, Collapsible, Select, TextArea } from '@tih/ui'; +import { Button, Collapsible, Select, Spinner, TextArea } from '@tih/ui'; import AnswerCard from '~/components/questions/card/AnswerCard'; import FullQuestionCard from '~/components/questions/card/FullQuestionCard'; @@ -9,10 +9,10 @@ import CommentListItem from '~/components/questions/CommentListItem'; import { SAMPLE_ANSWER, - SAMPLE_QUESTION, SAMPLE_QUESTION_COMMENT, } from '~/utils/questions/constants'; import { useFormRegister } from '~/utils/questions/useFormRegister'; +import { trpc } from '~/utils/trpc'; export type AnswerQuestionData = { answerContent: string; @@ -38,7 +38,13 @@ export default function QuestionPage() { } = useForm({ mode: 'onChange' }); const commentRegister = useFormRegister(comRegister); - const question = SAMPLE_QUESTION; + const { questionId } = router.query; + + const { data: question } = trpc.useQuery([ + 'questions.questions.getQuestionById', + { id: questionId as string }, + ]); + const comment = SAMPLE_QUESTION_COMMENT; const handleBackNavigation = () => { router.back(); @@ -54,6 +60,10 @@ export default function QuestionPage() { console.log(data); }; + if (!question) { + return ; + } + return (
@@ -67,9 +77,15 @@ export default function QuestionPage() {
- +
- +
@@ -118,7 +134,7 @@ export default function QuestionPage() {
- {Array.from({ length: question.commentCount }).map((_, index) => ( + {Array.from({ length: question.numComments }).map((_, index) => (
-

{question.answerCount} answers

+

{question.numAnswers} answers

Sort by: @@ -175,7 +191,7 @@ export default function QuestionPage() {
- {Array.from({ length: question.answerCount }).map((_, index) => ( + {Array.from({ length: question.numAnswers }).map((_, index) => ( ))} diff --git a/apps/portal/src/server/router/questions-question-router.ts b/apps/portal/src/server/router/questions-question-router.ts index b54d27b0..c4659b47 100644 --- a/apps/portal/src/server/router/questions-question-router.ts +++ b/apps/portal/src/server/router/questions-question-router.ts @@ -28,6 +28,7 @@ export const questionsQuestionRouter = createProtectedRouter() company: true, location: true, role: true, + seenAt: true, }, }, user: { @@ -92,6 +93,7 @@ export const questionsQuestionRouter = createProtectedRouter() numComments: data._count.comments, numVotes: votes, role: data.encounters[0].role ?? 'Unknown role', + seenAt: data.encounters[0].seenAt, updatedAt: data.updatedAt, user: userName, }; @@ -99,6 +101,83 @@ export const questionsQuestionRouter = createProtectedRouter() }); }, }) + .query('getQuestionById', { + input: z.object({ + id: z.string(), + }), + async resolve({ ctx, input }) { + const questionData = await ctx.prisma.questionsQuestion.findUnique({ + include: { + _count: { + select: { + answers: true, + comments: true, + }, + }, + encounters: { + select: { + company: true, + location: true, + role: true, + seenAt: true, + }, + }, + user: { + select: { + name: true, + }, + }, + votes: true, + }, + where: { + id: input.id, + }, + }); + if (!questionData) { + throw new TRPCError({ + code: 'NOT_FOUND', + message: 'Question not found', + }); + } + const votes: number = questionData.votes.reduce( + (previousValue: number, currentValue) => { + let result: number = previousValue; + + switch (currentValue.vote) { + case Vote.UPVOTE: + result += 1; + break; + case Vote.DOWNVOTE: + result -= 1; + break; + } + return result; + }, + 0, + ); + + let userName = ''; + + if (questionData.user) { + userName = questionData.user.name!; + } + + const question: Question = { + company: questionData.encounters[0].company, + content: questionData.content, + id: questionData.id, + location: questionData.encounters[0].location ?? 'Unknown location', + numAnswers: questionData._count.answers, + numComments: questionData._count.comments, + numVotes: votes, + role: questionData.encounters[0].role ?? 'Unknown role', + seenAt: questionData.encounters[0].seenAt, + updatedAt: questionData.updatedAt, + user: userName, + }; + return question; + }, + }) .mutation('create', { input: z.object({ company: z.string(), diff --git a/apps/portal/src/types/questions.d.ts b/apps/portal/src/types/questions.d.ts index 0d60ca76..1d189a11 100644 --- a/apps/portal/src/types/questions.d.ts +++ b/apps/portal/src/types/questions.d.ts @@ -8,6 +8,7 @@ export type Question = { numComments: number; numVotes: number; role: string; + seenAt: Date; updatedAt: Date; user: string; };