Skip to content

Commit 7cb637b

Browse files
committed
PEER-248: Connect question list and details
1 parent 7a89a53 commit 7cb637b

File tree

9 files changed

+102
-90
lines changed

9 files changed

+102
-90
lines changed

frontend/src/assets/dummyData.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Question } from '@/routes/questions/logic';
1+
import { Question } from '@/types/question-types';
22

33
export const dummyData: Question[] = [
44
{

frontend/src/lib/router.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { SignUp } from '@/routes/signup';
1111

1212
import { queryClient } from './query-client';
1313
import { ROUTES } from './routes';
14-
import { QuestionsList } from '@/routes/questions/list';
14+
import { Questions } from '@/routes/questions/main';
1515

1616
export const router = createBrowserRouter([
1717
{
@@ -27,7 +27,7 @@ export const router = createBrowserRouter([
2727
children: [
2828
{
2929
path: ROUTES.QUESTIONS,
30-
element: <QuestionsList />,
30+
element: <Questions />,
3131
},
3232
{
3333
path: ROUTES.QUESTION_DETAILS,

frontend/src/routes/questions/list.tsx

Lines changed: 0 additions & 13 deletions
This file was deleted.

frontend/src/routes/questions/logic.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

frontend/src/routes/questions/main.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
import { useEffect, useState } from 'react';
22
import { columns } from './table-columns';
33
import { QuestionTable } from './question-table';
4-
import { fetchQuestions, Question, ROWS_PER_PAGE } from './logic';
54
import { useInfiniteQuery } from '@tanstack/react-query';
6-
import { IGetQuestionsResponse } from '@/types/question-types';
5+
import { IGetQuestionsResponse, Question } from '@/types/question-types';
6+
import { useCrumbs } from '@/lib/hooks/use-crumbs';
7+
import { WithNavBanner } from '@/components/blocks/authed/with-nav-banner';
8+
import { dummyData } from '@/assets/dummyData';
9+
10+
const ROWS_PER_PAGE = 12;
11+
async function fetchQuestions(): Promise<IGetQuestionsResponse> {
12+
return {
13+
questions: dummyData,
14+
totalQuestions: 20,
15+
};
16+
}
17+
18+
export function Questions() {
19+
const { crumbs } = useCrumbs();
720

8-
export default function Questions() {
921
const [questions, setQuestions] = useState<Question[]>([]);
1022

1123
const { data, error, fetchNextPage, hasNextPage, isError, isFetchingNextPage } = useInfiniteQuery<
@@ -40,8 +52,10 @@ export default function Questions() {
4052
}, [data]);
4153

4254
return (
43-
<div className='container mx-auto py-10'>
44-
<QuestionTable columns={columns} data={questions} isError={isError} />
45-
</div>
55+
<WithNavBanner crumbs={crumbs}>
56+
<div className='container mx-auto py-3'>
57+
<QuestionTable columns={columns} data={questions} isError={isError} />
58+
</div>
59+
</WithNavBanner>
4660
);
4761
}

frontend/src/routes/questions/question-table.tsx

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ import {
1717
TableRow,
1818
} from '@/components/ui/table';
1919
import { Button } from '@/components/ui/button';
20-
import { ArrowLeftIcon, ArrowRightIcon } from '@radix-ui/react-icons';
20+
import {
21+
ArrowLeftIcon,
22+
ArrowRightIcon,
23+
DoubleArrowLeftIcon,
24+
DoubleArrowRightIcon,
25+
} from '@radix-ui/react-icons';
2126
import { Pagination, PaginationContent, PaginationItem } from '@/components/ui/pagination';
2227
import { Input } from '@/components/ui/input';
23-
24-
import { DIFFICULTY_OPTIONS, ROWS_PER_PAGE } from './logic';
2528
import {
2629
Select,
2730
SelectContent,
@@ -30,6 +33,7 @@ import {
3033
SelectValue,
3134
} from '@/components/ui/select';
3235
import { useState } from 'react';
36+
import { Link } from 'react-router-dom';
3337

3438
interface QuestionTableProps<TData, TValue> {
3539
columns: ColumnDef<TData, TValue>[];
@@ -44,7 +48,7 @@ export function QuestionTable<TData, TValue>({
4448
}: QuestionTableProps<TData, TValue>) {
4549
const [pagination, setPagination] = useState({
4650
pageIndex: 0,
47-
pageSize: ROWS_PER_PAGE,
51+
pageSize: 12,
4852
});
4953

5054
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);
@@ -74,7 +78,7 @@ export function QuestionTable<TData, TValue>({
7478
<div className='flex items-center py-4'>
7579
<div className='mr-2'>
7680
<Select onValueChange={handleStatusFilterChange}>
77-
<SelectTrigger className='w-[110px]'>
81+
<SelectTrigger className='w-[140px]'>
7882
<SelectValue placeholder='Status' />
7983
</SelectTrigger>
8084
<SelectContent>
@@ -86,18 +90,14 @@ export function QuestionTable<TData, TValue>({
8690
</div>
8791
<div className='mr-2'>
8892
<Select onValueChange={handleDifficultyFilterChange}>
89-
<SelectTrigger className='w-[110px]'>
93+
<SelectTrigger className='w-[140px]'>
9094
<SelectValue placeholder='Difficulty' />
9195
</SelectTrigger>
9296
<SelectContent>
9397
<SelectItem value='all'>All</SelectItem>
94-
{DIFFICULTY_OPTIONS.map((difficulty) => {
95-
return (
96-
<SelectItem key={difficulty.toLowerCase()} value={difficulty}>
97-
{difficulty}
98-
</SelectItem>
99-
);
100-
})}
98+
<SelectItem value='Easy'>Easy</SelectItem>
99+
<SelectItem value='Medium'>Medium</SelectItem>
100+
<SelectItem value='Hard'>Hard</SelectItem>
101101
</SelectContent>
102102
</Select>
103103
</div>
@@ -131,7 +131,9 @@ export function QuestionTable<TData, TValue>({
131131
<TableRow key={row.id}>
132132
{row.getVisibleCells().map((cell) => (
133133
<TableCell key={cell.id}>
134-
{flexRender(cell.column.columnDef.cell, cell.getContext())}
134+
<Link to={`/questions/${row.id}`}>
135+
{flexRender(cell.column.columnDef.cell, cell.getContext())}
136+
</Link>
135137
</TableCell>
136138
))}
137139
</TableRow>
@@ -149,6 +151,16 @@ export function QuestionTable<TData, TValue>({
149151
<Pagination className='flex items-center justify-end space-x-2 py-4'>
150152
<PaginationContent>
151153
<PaginationItem>
154+
<Button
155+
variant='outline'
156+
size='sm'
157+
onClick={() => table.firstPage()}
158+
disabled={!table.getCanPreviousPage()}
159+
>
160+
<DoubleArrowLeftIcon />
161+
</Button>
162+
</PaginationItem>
163+
<PaginationItem className='mr-1'>
152164
<Button
153165
variant='outline'
154166
size='sm'
@@ -158,7 +170,10 @@ export function QuestionTable<TData, TValue>({
158170
<ArrowLeftIcon />
159171
</Button>
160172
</PaginationItem>
161-
<PaginationItem>
173+
<PaginationItem className='text-sm'>
174+
{table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
175+
</PaginationItem>
176+
<PaginationItem className='ml-1'>
162177
<Button
163178
variant='outline'
164179
size='sm'
@@ -168,6 +183,16 @@ export function QuestionTable<TData, TValue>({
168183
<ArrowRightIcon />
169184
</Button>
170185
</PaginationItem>
186+
<PaginationItem>
187+
<Button
188+
variant='outline'
189+
size='sm'
190+
onClick={() => table.lastPage()}
191+
disabled={!table.getCanNextPage()}
192+
>
193+
<DoubleArrowRightIcon />
194+
</Button>
195+
</PaginationItem>
171196
</PaginationContent>
172197
</Pagination>
173198
</div>

frontend/src/routes/questions/table-columns.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Badge } from '@/components/ui/badge';
2+
import { Question } from '@/types/question-types';
23
import { CheckCircledIcon } from '@radix-ui/react-icons';
34
import { ColumnDef } from '@tanstack/react-table';
4-
import { Question } from './logic';
55

66
export const columns: ColumnDef<Question>[] = [
77
{
@@ -20,7 +20,12 @@ export const columns: ColumnDef<Question>[] = [
2020
{
2121
accessorKey: 'difficulty',
2222
header: 'Difficulty',
23-
cell: ({ getValue }) => getValue(),
23+
cell: ({ getValue }) => {
24+
const difficulty = getValue() as string;
25+
return (
26+
<Badge variant={difficulty.toLowerCase() as 'easy' | 'medium' | 'hard'}>{difficulty}</Badge>
27+
);
28+
},
2429
filterFn: 'equals',
2530
},
2631
{
@@ -31,7 +36,7 @@ export const columns: ColumnDef<Question>[] = [
3136
return (
3237
<div>
3338
{topics.map((topic) => (
34-
<Badge className='mr-1 text-xs' key={topic} variant='outline'>
39+
<Badge className='mr-1 text-xs' key={topic} variant='secondary'>
3540
{topic}
3641
</Badge>
3742
))}

frontend/src/types/question-types.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { Question } from '../routes/questions/logic';
1+
export type Question = {
2+
number: number;
3+
name: string;
4+
difficulty: 'Easy' | 'Medium' | 'Hard';
5+
topic: Array<string>;
6+
attempted: boolean;
7+
};
28

39
export type IGetQuestionsResponse = {
410
questions: Array<Question>;

package-lock.json

Lines changed: 24 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)