mirror of
https://github.com/skidoodle/erettsegi-browser.git
synced 2025-02-15 05:39:15 +01:00
"minor" changes
This commit is contained in:
parent
f858856b5e
commit
ac0a47faf2
4 changed files with 111 additions and 131 deletions
28
src/components/Footer.tsx
Normal file
28
src/components/Footer.tsx
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import React from 'react'
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
const Footer: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<div className="fixed bottom-0 py-4 left-0 right-0 text-center">
|
||||||
|
<p className="text-sm text-gray-400">
|
||||||
|
<Link
|
||||||
|
href="https://albert.lol"
|
||||||
|
target="_blank"
|
||||||
|
className="text-blue-500 hover:text-blue-700"
|
||||||
|
>
|
||||||
|
albert
|
||||||
|
</Link>
|
||||||
|
{' | '}
|
||||||
|
<Link
|
||||||
|
href="https://github.com/skidoodle/erettsegi-browser"
|
||||||
|
target="_blank"
|
||||||
|
className="text-blue-500 hover:text-blue-700"
|
||||||
|
>
|
||||||
|
github
|
||||||
|
</Link>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Footer
|
|
@ -1,7 +1,7 @@
|
||||||
import { NextApiRequest, NextApiResponse } from 'next'
|
import { NextApiRequest, NextApiResponse } from 'next'
|
||||||
|
|
||||||
export default function handler(req: NextApiRequest, res: NextApiResponse) {
|
export default function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
const { ev, szint, vizsgatargy, idoszak, tipus, file } = req.query
|
const { ev, szint, vizsgatargy, idoszak } = req.query
|
||||||
const baseUrl = 'https://dload-oktatas.educatio.hu/erettsegi/feladatok_'
|
const baseUrl = 'https://dload-oktatas.educatio.hu/erettsegi/feladatok_'
|
||||||
|
|
||||||
const missingParams = []
|
const missingParams = []
|
||||||
|
@ -9,7 +9,6 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
if (!szint) missingParams.push('szint')
|
if (!szint) missingParams.push('szint')
|
||||||
if (!idoszak) missingParams.push('idoszak')
|
if (!idoszak) missingParams.push('idoszak')
|
||||||
if (!vizsgatargy) missingParams.push('vizsgatargy')
|
if (!vizsgatargy) missingParams.push('vizsgatargy')
|
||||||
if (!tipus) missingParams.push('tipus')
|
|
||||||
|
|
||||||
if (missingParams.length > 0) {
|
if (missingParams.length > 0) {
|
||||||
return res
|
return res
|
||||||
|
@ -34,14 +33,6 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
return res.status(400).json({ error: 'Érvénytelen vizsgatárgy' })
|
return res.status(400).json({ error: 'Érvénytelen vizsgatárgy' })
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (tipus) {
|
|
||||||
case 'fl':
|
|
||||||
case 'ut':
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
return res.status(400).json({ error: 'Érvénytelen típus' })
|
|
||||||
}
|
|
||||||
|
|
||||||
let honap
|
let honap
|
||||||
switch (idoszak) {
|
switch (idoszak) {
|
||||||
case 'osz':
|
case 'osz':
|
||||||
|
@ -66,51 +57,32 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
return res.status(400).json({ error: 'Érvénytelen szint' })
|
return res.status(400).json({ error: 'Érvénytelen szint' })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const feladat = 'fl'
|
||||||
|
const utmutato = 'ut'
|
||||||
const forras = 'for'
|
const forras = 'for'
|
||||||
const megoldas = 'meg'
|
const megoldas = 'meg'
|
||||||
const shortev = ev!.slice(-2)
|
const shortev = ev!.slice(-2)
|
||||||
|
|
||||||
let pdfUrl, zipUrl
|
let flPdfUrl, utPdfUrl, flZipUrl, utZipUrl, ZipUrl
|
||||||
switch (vizsgatargy) {
|
switch (vizsgatargy) {
|
||||||
case 'inf':
|
case 'inf':
|
||||||
case 'infoism':
|
case 'infoism':
|
||||||
switch (file) {
|
switch (ZipUrl) {
|
||||||
case 'forras':
|
case ZipUrl:
|
||||||
switch (tipus) {
|
flZipUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}${forras}_${shortev}${honap}_${feladat}.zip`
|
||||||
case 'fl':
|
flPdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${utmutato}.pdf`
|
||||||
zipUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}${forras}_${shortev}${honap}_${tipus}.zip`
|
utZipUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}${megoldas}_${shortev}${honap}_${utmutato}.zip`
|
||||||
pdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${tipus}.pdf`
|
utPdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${utmutato}.pdf`
|
||||||
break
|
|
||||||
case 'ut':
|
|
||||||
zipUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}${forras}_${shortev}${honap}_fl.zip`
|
|
||||||
pdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${tipus}.pdf`
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
return res.status(400).json({ error: 'Érvénytelen fájl' })
|
|
||||||
}
|
|
||||||
break
|
|
||||||
case 'megoldas':
|
|
||||||
switch (tipus) {
|
|
||||||
case 'ut':
|
|
||||||
zipUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}${megoldas}_${shortev}${honap}_${tipus}.zip`
|
|
||||||
pdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${tipus}.pdf`
|
|
||||||
break
|
|
||||||
case 'fl':
|
|
||||||
zipUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}${megoldas}_${shortev}${honap}_ut.zip`
|
|
||||||
pdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${tipus}.pdf`
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
return res.status(400).json({ error: 'Érvénytelen fájl' })
|
|
||||||
}
|
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
return res.status(400).json({ error: 'Érvénytelen fájl' })
|
return res.status(400).json({ error: 'Érvénytelen fájl' })
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
pdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${tipus}.pdf`
|
flPdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${feladat}.pdf`
|
||||||
|
utPdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${utmutato}.pdf`
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
res.status(200).json({ pdfUrl, zipUrl })
|
res.status(200).json({ flPdfUrl, utPdfUrl, flZipUrl, utZipUrl })
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +1,44 @@
|
||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
|
import { useAvailableYears } from '@/utils/years'
|
||||||
import { subjects } from '@/utils/subjects'
|
import { subjects } from '@/utils/subjects'
|
||||||
import Link from 'next/link'
|
import Footer from '@/components/Footer'
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
const [pdfLink, setPdfLink] = useState<string>('')
|
const [flPdfLink, setflPdfLink] = useState<string>('')
|
||||||
const [zipLink, setZipLink] = useState<string>('')
|
const [utPdfLink, setutPdfLink] = useState<string>('')
|
||||||
|
const [flZipLink, setflZipLink] = useState<string>('')
|
||||||
|
const [utZipLink, setutZipLink] = useState<string>('')
|
||||||
const [selectedSubject, setSelectedSubject] = useState<string>('')
|
const [selectedSubject, setSelectedSubject] = useState<string>('')
|
||||||
const [selectedYear, setSelectedYear] = useState<string>('')
|
const [selectedYear, setSelectedYear] = useState<string>('')
|
||||||
const [selectedPeriod, setSelectedPeriod] = useState<string>('')
|
const [selectedPeriod, setSelectedPeriod] = useState<string>('')
|
||||||
const [selectedLevel, setSelectedLevel] = useState<string>('')
|
const [selectedLevel, setSelectedLevel] = useState<string>('')
|
||||||
const [selectedType, setSelectedType] = useState<string>('')
|
|
||||||
const [selectedFile, setSelectedFile] = useState<string>('')
|
|
||||||
const [years, setYears] = useState<string[]>([])
|
const [years, setYears] = useState<string[]>([])
|
||||||
|
|
||||||
useEffect(() => {
|
useAvailableYears(setYears)
|
||||||
const currentYear = new Date().getFullYear()
|
|
||||||
const availableYears: string[] = []
|
|
||||||
for (let year = currentYear; year >= 2013; year--) {
|
|
||||||
availableYears.push(year.toString())
|
|
||||||
}
|
|
||||||
setYears(availableYears)
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchData = async () => {
|
const fetchData = async () => {
|
||||||
try {
|
try {
|
||||||
let url = `/api/erettsegi?vizsgatargy=${selectedSubject}&ev=${selectedYear}&idoszak=${selectedPeriod}&szint=${selectedLevel}&tipus=${selectedType}`
|
let url = `/api/erettsegi?vizsgatargy=${selectedSubject}&ev=${selectedYear}&idoszak=${selectedPeriod}&szint=${selectedLevel}`
|
||||||
|
|
||||||
switch (selectedSubject) {
|
|
||||||
case 'inf':
|
|
||||||
case 'infoism':
|
|
||||||
url += `&file=${selectedFile}`
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await fetch(url)
|
const response = await fetch(url)
|
||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
const data = await response.json()
|
const data = await response.json()
|
||||||
|
|
||||||
if (data.pdfUrl) {
|
if (data.utZipUrl && data.flZipUrl) {
|
||||||
setPdfLink(data.pdfUrl)
|
setflZipLink(data.flZipUrl)
|
||||||
} else {
|
setutZipLink(data.utZipUrl)
|
||||||
console.error('Nincs érvényes PDF link a válaszban.')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.zipUrl) {
|
|
||||||
setZipLink(data.zipUrl)
|
|
||||||
} else {
|
} else {
|
||||||
console.error('Nincs érvényes ZIP link a válaszban.')
|
console.error('Nincs érvényes ZIP link a válaszban.')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.utPdfUrl && data.flPdfUrl) {
|
||||||
|
setflPdfLink(data.flPdfUrl)
|
||||||
|
setutPdfLink(data.utPdfUrl)
|
||||||
|
} else {
|
||||||
|
console.error('Nincs érvényes PDF link a válaszban.')
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
console.error('Hiba történt az API hívás során.')
|
console.error('Hiba történt az API hívás során.')
|
||||||
}
|
}
|
||||||
|
@ -65,8 +52,10 @@ export default function Home() {
|
||||||
selectedYear,
|
selectedYear,
|
||||||
selectedPeriod,
|
selectedPeriod,
|
||||||
selectedLevel,
|
selectedLevel,
|
||||||
selectedType,
|
setflPdfLink,
|
||||||
selectedFile,
|
setutPdfLink,
|
||||||
|
setflZipLink,
|
||||||
|
setutZipLink,
|
||||||
])
|
])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -77,7 +66,7 @@ export default function Home() {
|
||||||
<select
|
<select
|
||||||
value={selectedSubject}
|
value={selectedSubject}
|
||||||
onChange={(e) => setSelectedSubject(e.target.value)}
|
onChange={(e) => setSelectedSubject(e.target.value)}
|
||||||
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none"
|
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none hover:bg-[#3C4143] transition-colors duration-150"
|
||||||
>
|
>
|
||||||
<option value="">Tárgy</option>
|
<option value="">Tárgy</option>
|
||||||
{subjects.map((subject) => (
|
{subjects.map((subject) => (
|
||||||
|
@ -91,7 +80,7 @@ export default function Home() {
|
||||||
<select
|
<select
|
||||||
value={selectedYear}
|
value={selectedYear}
|
||||||
onChange={(e) => setSelectedYear(e.target.value)}
|
onChange={(e) => setSelectedYear(e.target.value)}
|
||||||
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none"
|
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none hover:bg-[#3C4143] transition-colors duration-150"
|
||||||
>
|
>
|
||||||
<option value="">Év</option>
|
<option value="">Év</option>
|
||||||
{years.map((year) => (
|
{years.map((year) => (
|
||||||
|
@ -105,7 +94,7 @@ export default function Home() {
|
||||||
<select
|
<select
|
||||||
value={selectedPeriod}
|
value={selectedPeriod}
|
||||||
onChange={(e) => setSelectedPeriod(e.target.value)}
|
onChange={(e) => setSelectedPeriod(e.target.value)}
|
||||||
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none"
|
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none hover:bg-[#3C4143] transition-colors duration-150"
|
||||||
>
|
>
|
||||||
<option value="">Időszak</option>
|
<option value="">Időszak</option>
|
||||||
<option value="tavasz">Tavasz</option>
|
<option value="tavasz">Tavasz</option>
|
||||||
|
@ -116,71 +105,48 @@ export default function Home() {
|
||||||
<select
|
<select
|
||||||
value={selectedLevel}
|
value={selectedLevel}
|
||||||
onChange={(e) => setSelectedLevel(e.target.value)}
|
onChange={(e) => setSelectedLevel(e.target.value)}
|
||||||
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none"
|
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none hover:bg-[#3C4143] transition-colors duration-150"
|
||||||
>
|
>
|
||||||
<option value="">Szint</option>
|
<option value="">Szint</option>
|
||||||
<option value="kozep">Közép</option>
|
<option value="kozep">Közép</option>
|
||||||
<option value="emelt">Emelt</option>
|
<option value="emelt">Emelt</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
|
||||||
<select
|
<div className="space-x-3">
|
||||||
value={selectedType}
|
|
||||||
onChange={(e) => setSelectedType(e.target.value)}
|
|
||||||
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none"
|
|
||||||
>
|
|
||||||
<option value="">Típus</option>
|
|
||||||
<option value="fl">Feladatlap</option>
|
|
||||||
<option value="ut">Útmutató</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
{selectedSubject === 'inf' || selectedSubject === 'infoism' ? (
|
|
||||||
<div className="mb-3">
|
|
||||||
<select
|
|
||||||
value={selectedFile}
|
|
||||||
onChange={(e) => setSelectedFile(e.target.value)}
|
|
||||||
className="bg-[#181a1b] text-[#efefef] w-56 max-w-lg h-10 px-4 text-sm border border-[#3C4143] rounded-lg focus:outline-none"
|
|
||||||
>
|
|
||||||
<option value="">Fájl</option>
|
|
||||||
<option value="forras">Forrás</option>
|
|
||||||
<option value="megoldas">Megoldás</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
) : null}
|
|
||||||
<button
|
|
||||||
className="mt-3 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
|
|
||||||
onClick={pdfLink ? () => window.open(pdfLink) : () => {}}
|
|
||||||
>
|
|
||||||
Megnyitás
|
|
||||||
</button>
|
|
||||||
{selectedSubject === 'inf' || selectedSubject === 'infoism' ? (
|
|
||||||
<button
|
<button
|
||||||
className="mt-3 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
|
className="w-28 mt-3 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
|
||||||
onClick={zipLink ? () => window.open(zipLink) : () => {}}
|
onClick={flPdfLink ? () => window.open(flPdfLink) : () => {}}
|
||||||
>
|
>
|
||||||
Letöltés
|
Feladatlap
|
||||||
</button>
|
</button>
|
||||||
) : null}
|
<button
|
||||||
</div>
|
className="w-28 mt-3 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
|
||||||
<div className="fixed bottom-5 left-0 right-0 text-center py-4">
|
onClick={utPdfLink ? () => window.open(utPdfLink) : () => {}}
|
||||||
<p className="text-sm text-gray-400">
|
|
||||||
<Link
|
|
||||||
href="https://albert.lol"
|
|
||||||
target="_blank"
|
|
||||||
className="text-blue-500 hover:text-blue-700"
|
|
||||||
>
|
>
|
||||||
albert
|
Útmutató
|
||||||
</Link>
|
</button>
|
||||||
{' | '}
|
</div>
|
||||||
<Link
|
<div className="space-x-3">
|
||||||
href="https://github.com/skidoodle/erettsegi-browser"
|
{selectedSubject === 'inf' || selectedSubject === 'infoism' ? (
|
||||||
target="_blank"
|
<button
|
||||||
className="text-blue-500 hover:text-blue-700"
|
className="w-28 mt-3 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
|
||||||
>
|
onClick={flZipLink ? () => window.open(flZipLink) : () => {}}
|
||||||
github
|
>
|
||||||
</Link>
|
Forrás
|
||||||
</p>
|
</button>
|
||||||
|
) : null}
|
||||||
|
{selectedSubject === 'inf' || selectedSubject === 'infoism' ? (
|
||||||
|
<button
|
||||||
|
className="w-28 mt-3 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
|
||||||
|
onClick={utZipLink ? () => window.open(utZipLink) : () => {}}
|
||||||
|
>
|
||||||
|
Megoldás
|
||||||
|
</button>
|
||||||
|
) : null}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
)
|
)
|
||||||
|
|
14
src/utils/years.tsx
Normal file
14
src/utils/years.tsx
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import { useEffect } from 'react'
|
||||||
|
|
||||||
|
export function useAvailableYears(
|
||||||
|
setYears: React.Dispatch<React.SetStateAction<string[]>>
|
||||||
|
) {
|
||||||
|
useEffect(() => {
|
||||||
|
const currentYear = new Date().getFullYear()
|
||||||
|
const availableYears: string[] = []
|
||||||
|
for (let year = currentYear; year >= 2013; year--) {
|
||||||
|
availableYears.push(year.toString())
|
||||||
|
}
|
||||||
|
setYears(availableYears)
|
||||||
|
}, [])
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue