Skip to content

Commit cebc2b9

Browse files
Merge pull request #231 from shikhar-sahay/starredPapers
feat: Added back-end route and noti for specific paper request
2 parents fb1f739 + 66e04d6 commit cebc2b9

File tree

3 files changed

+109
-17
lines changed

3 files changed

+109
-17
lines changed

src/app/api/request/route.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { NextResponse } from "next/server";
2+
import { connectToDatabase } from "@/lib/mongoose";
3+
import PaperRequest from "@/db/paperRequest";
4+
5+
export async function POST(req: Request) {
6+
try {
7+
await connectToDatabase();
8+
const body = await req.json();
9+
10+
const { subject, exam, slot, year } = body;
11+
12+
if (!subject || !exam || !slot || !year) {
13+
return NextResponse.json(
14+
{ error: "All fields are required." },
15+
{ status: 400 }
16+
);
17+
}
18+
19+
const newRequest = await PaperRequest.create({ subject, exam, slot, year });
20+
return NextResponse.json(
21+
{ message: "Paper request submitted successfully!", request: newRequest },
22+
{ status: 201 }
23+
);
24+
} catch (error) {
25+
console.error("Error creating paper request:", error);
26+
return NextResponse.json(
27+
{ error: "Failed to submit request." },
28+
{ status: 500 }
29+
);
30+
}
31+
}

src/components/screens/PapersPage.tsx

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ export default function PapersPage() {
5050
setSuggestions(results.map(r => r.item).slice(0, 10))
5151
}, [searchText, fuse, selectedSubject])
5252

53-
5453
const handleSelectSubject = (subject: string) => {
5554
setSelectedSubject(subject)
5655
setSearchText(subject)
@@ -70,19 +69,40 @@ export default function PapersPage() {
7069
return () => document.removeEventListener("mousedown", handleClickOutside)
7170
}, [])
7271

73-
const handleSubmit = () => {
72+
const handleSubmit = async () => {
7473
if (!selectedSubject || !selectedExam || !selectedSlot || !selectedYear) {
75-
alert("Please fill all fields before submitting")
74+
alert("⚠️ Please fill all fields before submitting.")
7675
return
7776
}
78-
console.log({ subject: selectedSubject, exam: selectedExam, slot: selectedSlot, year: selectedYear })
77+
78+
try {
79+
await axios.post("/api/request", {
80+
subject: selectedSubject,
81+
exam: selectedExam,
82+
slot: selectedSlot,
83+
year: selectedYear,
84+
})
85+
86+
alert("✅ Your paper request was submitted successfully 🎉")
87+
88+
setSearchText("")
89+
setSelectedSubject(null)
90+
setSelectedExam(null)
91+
setSelectedSlot(null)
92+
setSelectedYear(null)
93+
} catch (error) {
94+
console.error("Error submitting request:", error)
95+
alert("❌ Failed to submit your request. Please try again later.")
96+
}
7997
}
8098

8199
return (
82100
<div className="min-h-screen bg-[#F3F5FF] dark:bg-[#070114] text-black dark:text-white px-6 py-12">
83101
<main>
84102
<div className="max-w-4xl mx-auto text-center mb-16">
85-
<h2 className="font-vipnabd text-3xl md:text-4xl font-extrabold mb-12">Specific Paper Request</h2>
103+
<h2 className="font-vipnabd text-3xl md:text-4xl font-extrabold mb-12">
104+
Specific Paper Request
105+
</h2>
86106

87107
<div className="relative max-w-xl mx-auto mb-8 font-play">
88108
<Input
@@ -101,9 +121,14 @@ export default function PapersPage() {
101121
</svg>
102122
</button>
103123
{suggestions.length > 0 && (
104-
<ul ref={suggestionsRef} className="absolute z-20 max-h-[250px] w-full max-w-xl overflow-y-auto rounded-md rounded-t-none border border-t-0 bg-white text-center shadow-lg dark:bg-[#303771]">
124+
<ul
125+
ref={suggestionsRef}
126+
className="absolute z-20 max-h-[250px] w-full max-w-xl overflow-y-auto rounded-md rounded-t-none border border-t-0 bg-white text-center shadow-lg dark:bg-[#303771]">
105127
{suggestions.map((s, idx) => (
106-
<li key={idx} onClick={() => handleSelectSubject(s)} className="cursor-pointer truncate p-2 hover:bg-gray-100 dark:hover:bg-gray-800">
128+
<li
129+
key={idx}
130+
onClick={() => handleSelectSubject(s)}
131+
className="cursor-pointer truncate p-2 hover:bg-gray-100 dark:hover:bg-gray-800">
107132
{s}
108133
</li>
109134
))}
@@ -112,41 +137,54 @@ export default function PapersPage() {
112137
</div>
113138

114139
<div className="flex justify-center gap-4 mb-8">
115-
<Select onValueChange={setSelectedExam} disabled={!selectedSubject}>
140+
<Select onValueChange={setSelectedExam} disabled={!selectedSubject} value={selectedExam || undefined}>
116141
<SelectTrigger className="w-32"><SelectValue placeholder="Exam" /></SelectTrigger>
117-
<SelectContent>{exams.map((exam) => <SelectItem key={exam} value={exam}>{exam}</SelectItem>)}</SelectContent>
142+
<SelectContent>
143+
{exams.map((exam) => (
144+
<SelectItem key={exam} value={exam}>{exam}</SelectItem>
145+
))}
146+
</SelectContent>
118147
</Select>
119-
<Select onValueChange={setSelectedSlot} disabled={!selectedSubject}>
148+
<Select onValueChange={setSelectedSlot} disabled={!selectedSubject} value={selectedSlot || undefined}>
120149
<SelectTrigger className="w-32"><SelectValue placeholder="Slot" /></SelectTrigger>
121-
<SelectContent>{slots.map((slot) => <SelectItem key={slot} value={slot}>{slot}</SelectItem>)}</SelectContent>
150+
<SelectContent>
151+
{slots.map((slot) => (
152+
<SelectItem key={slot} value={slot}>{slot}</SelectItem>
153+
))}
154+
</SelectContent>
122155
</Select>
123-
<Select onValueChange={setSelectedYear} disabled={!selectedSubject}>
156+
<Select onValueChange={setSelectedYear} disabled={!selectedSubject} value={selectedYear || undefined}>
124157
<SelectTrigger className="w-32"><SelectValue placeholder="Year" /></SelectTrigger>
125158
<SelectContent>
126159
{[...years].sort((a, b) => Number(b) - Number(a)).map((year) => (
127160
<SelectItem key={year} value={year}>{year}</SelectItem>
128161
))}
129162
</SelectContent>
130-
131163
</Select>
132164
</div>
133165

134-
<Button className="px-8 py-3 rounded-lg text-base bg-[#4A55FF] hover:bg-[#3A44CC] text-white dark:bg-[#9EA8FF] dark:hover:bg-[#7D86E5] dark:text-black" onClick={handleSubmit}>Submit</Button>
166+
<Button
167+
className="px-8 py-3 rounded-lg text-base bg-[#4A55FF] hover:bg-[#3A44CC] text-white dark:bg-[#9EA8FF] dark:hover:bg-[#7D86E5] dark:text-black"
168+
onClick={handleSubmit}
169+
>
170+
Submit
171+
</Button>
135172
</div>
136173

137-
{ }
138174
<div className="max-w-6xl mx-auto mt-16 text-center">
139175
<div className="relative mb-8 text-center">
140176
<h3 className="font-vipnabd text-2xl font-bold">Explore More</h3>
141177
<div className="absolute right-0 top-1/2 -translate-y-1/2">
142-
<Button variant="outline" className="border-gray-300 dark:border-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800">
178+
<Button
179+
variant="outline"
180+
className="border-gray-300 dark:border-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800"
181+
>
143182
View All
144183
<ArrowRight className="w-4 h-4 ml-2" />
145184
</Button>
146185
</div>
147186
</div>
148187

149-
150188
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 justify-center">
151189
{[1, 2, 3, 4].map((index) => (
152190
<div key={index} className="bg-white dark:bg-[#303771] rounded-lg overflow-hidden shadow-md">

src/db/paperRequest.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import mongoose, { Schema, type Document, type Model } from "mongoose";
2+
3+
export interface IPaperRequest extends Document {
4+
subject: string;
5+
exam: string;
6+
slot: string;
7+
year: string;
8+
createdAt: Date;
9+
}
10+
11+
const paperRequestSchema = new Schema<IPaperRequest>({
12+
subject: { type: String, required: true },
13+
exam: { type: String, required: true },
14+
slot: { type: String, required: true },
15+
year: { type: String, required: true },
16+
createdAt: { type: Date, default: Date.now }
17+
});
18+
19+
const PaperRequest: Model<IPaperRequest> =
20+
mongoose.models.PaperRequest ??
21+
mongoose.model<IPaperRequest>("PaperRequest", paperRequestSchema);
22+
23+
export default PaperRequest;

0 commit comments

Comments
 (0)