Skip to content

Commit f22b885

Browse files
Merge pull request #23 from ShouryaUpadhyaya/main
Round Timer implementation
2 parents 98dc67b + 9447564 commit f22b885

File tree

10 files changed

+856
-58
lines changed

10 files changed

+856
-58
lines changed

app/api/countdown/route.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { NextRequest, NextResponse } from "next/server";
2+
import {
3+
CreateTimerRequest,
4+
StartCountdownRequest,
5+
ExtendTimerRequest,
6+
} from "@/lib/types/timer";
7+
import {
8+
createTimer,
9+
getTimerStatus,
10+
startCountdown,
11+
controlTimer,
12+
deleteTimerController,
13+
} from "@/lib/controllers/timer.controller";
14+
15+
export async function POST(request: NextRequest) {
16+
const body: CreateTimerRequest = await request.json();
17+
const result = await createTimer(body);
18+
19+
if (!result.success) {
20+
return NextResponse.json(
21+
{ message: result.error },
22+
{ status: result.status }
23+
);
24+
}
25+
26+
return NextResponse.json(
27+
{ status: "timer created successfully", ...result.data },
28+
{ status: result.status }
29+
);
30+
}
31+
32+
export async function GET() {
33+
const result = await getTimerStatus();
34+
35+
if (!result.success) {
36+
return NextResponse.json(
37+
{ message: result.error, isActive: false },
38+
{ status: result.status }
39+
);
40+
}
41+
42+
return NextResponse.json(result.data, { status: result.status });
43+
}
44+
45+
export async function PUT(request: NextRequest) {
46+
const body: StartCountdownRequest = await request.json();
47+
const result = await startCountdown(body);
48+
49+
if (!result.success) {
50+
return NextResponse.json(
51+
{ message: result.error },
52+
{ status: result.status }
53+
);
54+
}
55+
56+
return NextResponse.json(
57+
{ status: "countdown started", ...result.data },
58+
{ status: result.status }
59+
);
60+
}
61+
62+
export async function PATCH(request: NextRequest) {
63+
const body: ExtendTimerRequest & {
64+
action?: "pause" | "resume" | "stop" | "extend";
65+
} = await request.json();
66+
67+
const result = await controlTimer(body);
68+
69+
if (!result.success) {
70+
return NextResponse.json(
71+
{ message: result.error },
72+
{ status: result.status }
73+
);
74+
}
75+
76+
let statusMessage = "timer updated";
77+
if (body.action === "extend" && body.additionalTime) {
78+
statusMessage = `timer extended ${body.additionalTime} seconds`;
79+
} else if (body.action === "pause") {
80+
statusMessage = "timer paused";
81+
} else if (body.action === "resume") {
82+
statusMessage = "timer resumed";
83+
} else if (body.action === "stop") {
84+
statusMessage = "timer stopped";
85+
}
86+
87+
return NextResponse.json(
88+
{ status: statusMessage, ...result.data },
89+
{ status: result.status }
90+
);
91+
}
92+
93+
export async function DELETE(request: NextRequest) {
94+
const body: { secretKey: string } = await request.json();
95+
const result = await deleteTimerController(body);
96+
97+
if (!result.success) {
98+
return NextResponse.json(
99+
{ message: result.error },
100+
{ status: result.status }
101+
);
102+
}
103+
104+
return NextResponse.json(
105+
{ message: "timer deleted" },
106+
{ status: result.status }
107+
);
108+
}

app/kitchen/page.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ export default function UIPage() {
8282
selectedLanguage={selectedLanguage}
8383
onLanguageChange={setSelectedLanguage}
8484
round="Round 1"
85-
timer="00:11:52"
8685
/>
8786
</div>
8887

app/ui/page.tsx

Lines changed: 87 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,22 @@ import TestCases from "@/components/TestCases/TestCases";
1111

1212
export default function UIPage() {
1313
const [selectedLanguage, setSelectedLanguage] = useState("C++");
14-
const [showModal, setShowModal] = useState<"default" | "green" | "red" | "yellow" | null>(null);
14+
const [showModal, setShowModal] = useState<
15+
"default" | "green" | "red" | "yellow" | null
16+
>(null);
1517
const [questionID, setQuestionID] = useState<number>(1);
1618

17-
const languages = ["C++", "C", "C#", "Java", "Python3", "PHP", "Rust", "Racket", "Ruby"];
19+
const languages = [
20+
"C++",
21+
"C",
22+
"C#",
23+
"Java",
24+
"Python3",
25+
"PHP",
26+
"Rust",
27+
"Racket",
28+
"Ruby",
29+
];
1830

1931
const questions = [
2032
{
@@ -49,10 +61,38 @@ export default function UIPage() {
4961
};
5062

5163
const defaultResults: TestCase[] = [
52-
{ id: 1, status: "Passed", input: "2 3", output: "5", expectedOutput: "5", isHidden: false },
53-
{ id: 2, status: "Failed", input: "10 4", output: "15", expectedOutput: "14", isHidden: false },
54-
{ id: 4, status: "Passed", input: "10 5", output: "20", expectedOutput: "20", isHidden: false },
55-
{ id: 3, status: "Passed", input: "7 8", output: "15", expectedOutput: "15", isHidden: true },
64+
{
65+
id: 1,
66+
status: "Passed",
67+
input: "2 3",
68+
output: "5",
69+
expectedOutput: "5",
70+
isHidden: false,
71+
},
72+
{
73+
id: 2,
74+
status: "Failed",
75+
input: "10 4",
76+
output: "15",
77+
expectedOutput: "14",
78+
isHidden: false,
79+
},
80+
{
81+
id: 4,
82+
status: "Passed",
83+
input: "10 5",
84+
output: "20",
85+
expectedOutput: "20",
86+
isHidden: false,
87+
},
88+
{
89+
id: 3,
90+
status: "Passed",
91+
input: "7 8",
92+
output: "15",
93+
expectedOutput: "15",
94+
isHidden: true,
95+
},
5696
];
5797

5898
const defaultCompilerDetails = {
@@ -74,15 +114,12 @@ export default function UIPage() {
74114

75115
{/*Right: Editor and Test case */}
76116
<div className="flex flex-col space-y-6 mt-0 transform -translate-x-6 translate-y-12">
77-
78-
79117
<div className="bg-[#131414]">
80118
<Editor
81119
languages={languages}
82120
selectedLanguage={selectedLanguage}
83121
onLanguageChange={setSelectedLanguage}
84122
round="Round 1"
85-
timer="00:11:52"
86123
/>
87124
</div>
88125

@@ -97,39 +134,48 @@ export default function UIPage() {
97134

98135
{/* Modal showcase */}
99136
<div className="mt-12">
100-
{(["default", "green", "destructive", "secondary"] as const).map((variant) => {
101-
const modalVariant: "default" | "green" | "red" | "yellow" =
102-
variant === "destructive" ? "red" :
103-
variant === "secondary" ? "yellow" :
104-
variant;
105-
const buttonVariant:
106-
| "green" | "secondary" | "destructive" | "link"
107-
| "outline" | "ghost" | "run" =
108-
variant === "default" ? "outline" : variant;
109-
const displayName = modalVariant.charAt(0).toUpperCase() + modalVariant.slice(1);
110-
return (
111-
<div key={variant} className="mb-6">
112-
<div className="flex gap-2 mb-2">
113-
<Button
114-
variant={buttonVariant}
115-
onClick={() => setShowModal(modalVariant)}
116-
>
117-
Show {displayName} Modal
118-
</Button>
137+
{(["default", "green", "destructive", "secondary"] as const).map(
138+
(variant) => {
139+
const modalVariant: "default" | "green" | "red" | "yellow" =
140+
variant === "destructive"
141+
? "red"
142+
: variant === "secondary"
143+
? "yellow"
144+
: variant;
145+
const buttonVariant:
146+
| "green"
147+
| "secondary"
148+
| "destructive"
149+
| "link"
150+
| "outline"
151+
| "ghost"
152+
| "run" = variant === "default" ? "outline" : variant;
153+
const displayName =
154+
modalVariant.charAt(0).toUpperCase() + modalVariant.slice(1);
155+
return (
156+
<div key={variant} className="mb-6">
157+
<div className="flex gap-2 mb-2">
158+
<Button
159+
variant={buttonVariant}
160+
onClick={() => setShowModal(modalVariant)}
161+
>
162+
Show {displayName} Modal
163+
</Button>
164+
</div>
165+
{showModal === modalVariant && (
166+
<Modal
167+
title={`Sample ${displayName} Modal`}
168+
message={`This is a demonstration of the ${modalVariant} Modal variant.`}
169+
variant={modalVariant}
170+
onClose={() => setShowModal(null)}
171+
>
172+
<Button variant={buttonVariant}>Nested Button</Button>
173+
</Modal>
174+
)}
119175
</div>
120-
{showModal === modalVariant && (
121-
<Modal
122-
title={`Sample ${displayName} Modal`}
123-
message={`This is a demonstration of the ${modalVariant} Modal variant.`}
124-
variant={modalVariant}
125-
onClose={() => setShowModal(null)}
126-
>
127-
<Button variant={buttonVariant}>Nested Button</Button>
128-
</Modal>
129-
)}
130-
</div>
131-
);
132-
})}
176+
);
177+
}
178+
)}
133179
</div>
134180
</div>
135181
);

components/Editor/Editor.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,13 @@ type EditorProps = {
2626
selectedLanguage: string;
2727
onLanguageChange: (lang: string) => void;
2828
round?: string;
29-
timer?: string;
3029
};
3130

3231
export default function Editor({
3332
languages,
3433
selectedLanguage,
3534
onLanguageChange,
3635
round,
37-
timer,
3836
}: EditorProps) {
3937
const languageExtensions: Record<string, LanguageSupport> = {
4038
cpp: cpp(),
@@ -80,7 +78,7 @@ export default function Editor({
8078
return (
8179
<div className="w-full mx-auto flex flex-col bg-[#131414] rounded-xl shadow-lg overflow-hidden">
8280
<div className="flex items-center justify-between px-6 py-3 bg-[#1e1f1f] border-b border-gray-700">
83-
<RoundTimer round={round} timer={timer} />
81+
<RoundTimer round={round} />
8482
<LanguageSelector
8583
languages={languages}
8684
selectedLanguage={selectedLanguage}

0 commit comments

Comments
 (0)