"minor" changes

This commit is contained in:
skidoodle 2023-09-18 19:20:20 +02:00
parent f858856b5e
commit ac0a47faf2
4 changed files with 111 additions and 131 deletions

28
src/components/Footer.tsx Normal file
View 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

View file

@ -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 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:
return res.status(400).json({ error: 'Érvénytelen fájl' }) flPdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${feladat}.pdf`
} utPdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${utmutato}.pdf`
break
default:
pdfUrl = `${baseUrl}${ev}${idoszak}_${szint}/${prefix}_${shortev}${honap}_${tipus}.pdf`
break break
} }
res.status(200).json({ pdfUrl, zipUrl }) res.status(200).json({ flPdfUrl, utPdfUrl, flZipUrl, utZipUrl })
} }

View file

@ -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 <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={pdfLink ? () => window.open(pdfLink) : () => {}} onClick={flPdfLink ? () => window.open(flPdfLink) : () => {}}
> >
Megnyitás Feladatlap
</button> </button>
<button
className="w-28 mt-3 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
onClick={utPdfLink ? () => window.open(utPdfLink) : () => {}}
>
Útmutató
</button>
</div>
<div className="space-x-3">
{selectedSubject === 'inf' || selectedSubject === 'infoism' ? ( {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={flZipLink ? () => window.open(flZipLink) : () => {}}
> >
Letöltés Forrás
</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> </button>
) : null} ) : null}
</div> </div>
<div className="fixed bottom-5 left-0 right-0 text-center py-4">
<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> </div>
<Footer />
</div> </div>
</main> </main>
) )

14
src/utils/years.tsx Normal file
View 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)
}, [])
}