Skip to content

Commit 6f0546c

Browse files
committed
resolving comments
1 parent 0aa3861 commit 6f0546c

8 files changed

Lines changed: 51 additions & 70 deletions

File tree

src/app/(web)/(oa)/assessment/[assessmentId]/page.tsx

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ import { use } from 'react';
44
import useAssessment from '@/lib/hooks/useAssessment';
55
import AssessmentIntro from '@/lib/components/assessment-flow/AssessmentIntro';
66
import AssessmentOutro from '@/lib/components/assessment-flow/AssessmentOutro';
7-
import AssessmentFlowLayout from '@/lib/components/assessment-flow/AssessmentFlowLayout';
87
import AssessmentFlowSidebar from '@/lib/components/assessment-flow/AssessmentFlowSidebar';
98
import AssessmentFlowNavbar from '@/lib/components/assessment-flow/AssessmentFlowNavbar';
10-
import AssessmentFlowMain from '@/lib/components/assessment-flow/AssessmentFlowMain';
9+
import AssessmentFlowContent from '@/lib/components/assessment-flow/AssessmentFlowContent';
1110

1211
export default function AssessmentPage({ params }: { params: Promise<{ assessmentId: string }> }) {
1312
const { assessmentId } = use(params);
@@ -46,28 +45,28 @@ export default function AssessmentPage({ params }: { params: Promise<{ assessmen
4645
}
4746

4847
return (
49-
<AssessmentFlowLayout
50-
navbar={<AssessmentFlowNavbar candidateName={assessment.candidateName} />}
51-
sidebar={
48+
<div className="flex h-screen w-full flex-col overflow-hidden">
49+
<AssessmentFlowNavbar candidateName={assessment.candidateName} />
50+
<div className="flex flex-1 overflow-hidden">
5251
<AssessmentFlowSidebar
5352
sections={assessment.sections}
5453
currentSectionIndex={assessment.currentSectionIndex}
5554
formattedTime={assessment.timer.formattedTime}
5655
/>
57-
}
58-
main={
59-
<AssessmentFlowMain
60-
currentSection={assessment.currentSection}
61-
availableLanguages={assessment.availableLanguages}
62-
publicTestCases={assessment.publicTestCases}
63-
testCaseResults={assessment.testCaseResults}
64-
isTransitioning={assessment.isTransitioning}
65-
onLanguageChange={assessment.changeLanguage}
66-
onEditorMount={assessment.handleEditorMount}
67-
onRunTests={assessment.runTests}
68-
onSubmit={assessment.submitAndContinue}
69-
/>
70-
}
71-
/>
56+
<main className="flex-1 overflow-hidden">
57+
<AssessmentFlowContent
58+
currentSection={assessment.currentSection}
59+
availableLanguages={assessment.availableLanguages}
60+
publicTestCases={assessment.publicTestCases}
61+
testCaseResults={assessment.testCaseResults}
62+
isTransitioning={assessment.isTransitioning}
63+
onLanguageChange={assessment.changeLanguage}
64+
onEditorMount={assessment.handleEditorMount}
65+
onRunTests={assessment.runTests}
66+
onSubmit={assessment.submitAndContinue}
67+
/>
68+
</main>
69+
</div>
70+
</div>
7271
);
7372
}

src/lib/components/assessment-flow/AssessmentFlowMain.tsx renamed to src/lib/components/assessment-flow/AssessmentFlowContent.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type { TestCaseDTO } from '@/lib/schemas/task-template.schema';
1313
import type { TestCaseResult } from '@/lib/hooks/useAssessment';
1414
import type { TaskLanguageOption } from '@/lib/types/candidate-assessment.types';
1515

16-
type AssessmentFlowMainProps = {
16+
type AssessmentFlowContentProps = {
1717
currentSection: SectionState | null;
1818
availableLanguages: TaskLanguageOption[];
1919
publicTestCases: TestCaseDTO[];
@@ -25,7 +25,7 @@ type AssessmentFlowMainProps = {
2525
onSubmit: () => void;
2626
};
2727

28-
export default function AssessmentFlowMain({
28+
export default function AssessmentFlowContent({
2929
currentSection,
3030
availableLanguages,
3131
publicTestCases,
@@ -35,7 +35,7 @@ export default function AssessmentFlowMain({
3535
onEditorMount,
3636
onRunTests,
3737
onSubmit,
38-
}: AssessmentFlowMainProps) {
38+
}: AssessmentFlowContentProps) {
3939
if (!currentSection) return null;
4040

4141
return (

src/lib/components/assessment-flow/AssessmentFlowLayout.tsx

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

src/lib/components/assessment-flow/AssessmentFlowSidebar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AlarmClock } from 'lucide-react';
2-
import QuestionIndicator from '@/lib/components/assessment-flow/QuestionIndicator';
2+
import AssessmentSidebarQuestion from '@/lib/components/assessment-flow/AssessmentSidebarQuestion';
33
import type { SectionState } from '@/lib/hooks/useAssessment';
44

55
type AssessmentFlowSidebarProps = {
@@ -22,7 +22,7 @@ export default function AssessmentFlowSidebar({
2222
</div>
2323
<div className="flex flex-col items-center gap-3">
2424
{sections.map((section, i) => (
25-
<QuestionIndicator
25+
<AssessmentSidebarQuestion
2626
key={section.taskTemplateId}
2727
index={i}
2828
status={section.status}

src/lib/components/assessment-flow/AssessmentIntro.tsx

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,12 @@
11
import type { CandidateAssessment } from '@/lib/types/candidate-assessment.types';
2+
import { formatDeadline, formatDuration } from '@/lib/utils/date.utils';
23

34
type AssessmentIntroProps = {
45
assessment: CandidateAssessment;
56
totalTimeSeconds: number;
67
onStart: () => void;
78
};
89

9-
// move this to utils? (thoughts)
10-
function formatDeadline(date: Date | null): string {
11-
if (!date) return 'No deadline';
12-
return new Date(date).toLocaleString('en-US', {
13-
month: 'long',
14-
day: 'numeric',
15-
year: 'numeric',
16-
hour: 'numeric',
17-
minute: '2-digit',
18-
});
19-
}
20-
21-
function formatDuration(totalSeconds: number): string {
22-
const minutes = Math.round(totalSeconds / 60);
23-
if (minutes < 60) return `${minutes} minutes`;
24-
const hours = Math.floor(minutes / 60);
25-
const remaining = minutes % 60;
26-
return remaining > 0 ? `${hours}h ${remaining}m` : `${hours} hour${hours > 1 ? 's' : ''}`;
27-
}
28-
2910
const GUIDELINES = [
3011
'Questions are linear - you cannot go back to previous questions.',
3112
'Changing or leaving this tab will be reported.',

src/lib/components/assessment-flow/QuestionIndicator.tsx renamed to src/lib/components/assessment-flow/AssessmentSidebarQuestion.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import { CircleCheck, Lock } from 'lucide-react';
22
import { cn } from '@/lib/utils/cn.utils';
33
import type { SectionStatus } from '@/lib/hooks/useAssessment';
44

5-
type QuestionIndicatorProps = {
5+
type AssessmentSidebarQuestionProps = {
66
index: number;
77
status: SectionStatus;
88
type?: 'task' | 'text';
99
};
1010

11-
export default function QuestionIndicator({
11+
export default function AssessmentSidebarQuestion({
1212
index,
1313
status,
1414
type = 'task',
15-
}: QuestionIndicatorProps) {
15+
}: AssessmentSidebarQuestionProps) {
1616
const isCompleted = status === 'completed';
1717
const isCurrent = status === 'current';
1818
const isLocked = status === 'locked' || type === 'text';

src/lib/hooks/useAssessment.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,11 @@ export default function useAssessment(assessmentId: string) {
180180
prev.map((s, i) =>
181181
i === currentSectionIndex
182182
? {
183-
...s,
184-
testCaseResults: s.testCaseResults.map(() => ({
185-
status: 'loading' as const,
186-
})),
187-
}
183+
...s,
184+
testCaseResults: s.testCaseResults.map(() => ({
185+
status: 'loading' as const,
186+
})),
187+
}
188188
: s
189189
)
190190
);

src/lib/utils/date.utils.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
export function formatDeadline(date: Date | null): string {
2+
if (!date) return 'No deadline';
3+
return new Date(date).toLocaleString('en-US', {
4+
month: 'long',
5+
day: 'numeric',
6+
year: 'numeric',
7+
hour: 'numeric',
8+
minute: '2-digit',
9+
});
10+
}
11+
12+
export function formatDuration(totalSeconds: number): string {
13+
const minutes = Math.round(totalSeconds / 60);
14+
if (minutes < 60) return `${minutes} minutes`;
15+
const hours = Math.floor(minutes / 60);
16+
const remaining = minutes % 60;
17+
return remaining > 0 ? `${hours}h ${remaining}m` : `${hours} hour${hours > 1 ? 's' : ''}`;
18+
}

0 commit comments

Comments
 (0)