Changed lotsa stuff

This commit is contained in:
mrfry 2021-03-23 15:34:26 +01:00
parent 91eb5cd839
commit 7bb7b919ae
18 changed files with 457 additions and 447 deletions

View file

@ -0,0 +1,22 @@
import React from 'react'
export default function ExternalLinkIcon({ size }) {
return (
<span style={{ margin: '4px', display: 'inline-block' }}>
<svg
width={size}
height={size}
viewBox={`0 0 24 24`}
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
<polyline points="15 3 21 3 21 9"></polyline>
<line x1="10" y1="14" x2="21" y2="3"></line>
</svg>
</span>
)
}

View file

@ -15,6 +15,51 @@ const renderSnow = () => {
return date.getMonth() === 11 && date.getDate() > 5 return date.getMonth() === 11 && date.getDate() > 5
} }
function MessageButton({
userSpecificMotd,
setShowMotdModal,
refetchGlobalData,
}) {
return (
<div className="msgs">
<div
onClick={() => {
if (!userSpecificMotd) {
return
}
setShowMotdModal(true)
if (userSpecificMotd.seen) {
return
}
fetch(constants.apiUrl + 'infos', {
method: 'POST',
credentials: 'include',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
userSpecificMotdSeen: true,
}),
})
.then((resp) => {
return resp.json()
})
.then(() => {
refetchGlobalData()
})
}}
style={{ cursor: userSpecificMotd ? 'pointer' : 'default' }}
title={
userSpecificMotd && !userSpecificMotd.seen ? "You've got Mail!" : ''
}
>
{userSpecificMotd && !userSpecificMotd.seen ? '📬' : '📭'}
</div>
</div>
)
}
export default function Layout({ export default function Layout({
children, children,
route, route,
@ -25,6 +70,7 @@ export default function Layout({
const [sidebarOpen, setSidebarOpen] = useState(true) const [sidebarOpen, setSidebarOpen] = useState(true)
const [windowSize, setWindowSize] = useState([100, 200]) const [windowSize, setWindowSize] = useState([100, 200])
const [showMotdModal, setShowMotdModal] = useState(false) const [showMotdModal, setShowMotdModal] = useState(false)
const [donateShowing, setDonateShowing] = useState(false)
const [showNewMsgModal, setShowNewMsgModal] = useState(true) const [showNewMsgModal, setShowNewMsgModal] = useState(true)
const userId = globalData.userId const userId = globalData.userId
@ -109,55 +155,22 @@ export default function Layout({
) )
})} })}
<a <a
href={`/donate`} onClick={() => {
className="donate" console.log('AAAAAAAAA')
onClick={closeSideBar} closeSideBar()
target="_blank" setDonateShowing(true)
rel="noreferrer" }}
> >
Donate Donate
</a> </a>
</div> </div>
<div className="userStatus"> <div className="userStatus">
<div className="msgs"> <MessageButton
<div userSpecificMotd={userSpecificMotd}
onClick={() => { setShowMotdModal={setShowMotdModal}
if (!userSpecificMotd) { refetchGlobalData={refetchGlobalData}
return />
}
setShowMotdModal(true)
if (userSpecificMotd.seen) {
return
}
fetch(constants.apiUrl + 'infos', {
method: 'POST',
credentials: 'include',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
userSpecificMotdSeen: true,
}),
})
.then((resp) => {
return resp.json()
})
.then(() => {
refetchGlobalData()
})
}}
style={{ cursor: userSpecificMotd ? 'pointer' : 'default' }}
title={
userSpecificMotd && !userSpecificMotd.seen
? "You've got Mail!"
: ''
}
>
{userSpecificMotd && !userSpecificMotd.seen ? '📬' : '📭'}
</div>
<div title="User ID">UID: {userId || '...'}</div> <div title="User ID">UID: {userId || '...'}</div>
</div>
<div <div
className="logout" className="logout"
onClick={() => { onClick={() => {
@ -175,6 +188,18 @@ export default function Layout({
Logout Logout
</div> </div>
</div> </div>
</>
) : null}
</div>
{donateShowing ? (
<Layout
closeClick={() => {
setDonateShowing(false)
}}
>
<div>hi</div>
</Layout>
) : null}
{showMotdModal ? ( {showMotdModal ? (
<Modal <Modal
closeClick={() => { closeClick={() => {
@ -182,14 +207,9 @@ export default function Layout({
}} }}
> >
<div style={{ textAlign: 'center' }}>Üzenet admintól:</div> <div style={{ textAlign: 'center' }}>Üzenet admintól:</div>
<div <div dangerouslySetInnerHTML={{ __html: userSpecificMotd.msg }} />
dangerouslySetInnerHTML={{ __html: userSpecificMotd.msg }}
/>
</Modal> </Modal>
) : null} ) : null}
</>
) : null}
</div>
<div className="content">{children}</div> <div className="content">{children}</div>
{userSpecificMotd && !userSpecificMotd.seen && showNewMsgModal ? ( {userSpecificMotd && !userSpecificMotd.seen && showNewMsgModal ? (
<Modal <Modal

View file

@ -1,22 +0,0 @@
{
"install": {
"href": "/install",
"text": "Install"
},
"allqr": {
"href": "/allqr.txt",
"text": "Összes kérdés TXT"
},
"data": {
"href": "/data.json",
"text": "Összes kérdés JSON"
},
"irc": {
"href": "/irc?index",
"text": "IRC chat"
},
"dataeditor": {
"href": "/dataeditor?index",
"text": "Dataeditor"
}
}

View file

@ -3,14 +3,14 @@
"href": "/", "href": "/",
"text": "Főoldal" "text": "Főoldal"
}, },
"script": {
"href": "/script",
"text": "Script"
},
"allQuestions": { "allQuestions": {
"href": "/allQuestions", "href": "/allQuestions",
"text": "Kérdések és tárgyak" "text": "Kérdések és tárgyak"
}, },
"pwRequest": {
"href": "/pwRequest",
"text": "Jelszó generálás"
},
"contribute": { "contribute": {
"href": "/contribute", "href": "/contribute",
"text": "Teendők" "text": "Teendők"
@ -18,5 +18,17 @@
"ranklist": { "ranklist": {
"href": "/ranklist", "href": "/ranklist",
"text": "Ranklista" "text": "Ranklista"
},
"pwRequest": {
"href": "/pwRequest",
"text": "Jelszó generálás"
},
"faq": {
"href": "/faq",
"text": "GYIK"
},
"contact": {
"href": "/contact",
"text": "Kapcsolat"
} }
} }

View file

@ -184,6 +184,7 @@ input {
} }
.rtfmImage { .rtfmImage {
text-align: center;
display: flex; display: flex;
justify-content: center; justify-content: center;
border: 2px solid white; border: 2px solid white;
@ -263,6 +264,7 @@ input {
} }
.rtfmImage { .rtfmImage {
text-align: center;
justify-content: center; justify-content: center;
margin: 0px 10px; margin: 0px 10px;
} }
@ -377,3 +379,50 @@ select:hover {
.actions > span:hover { .actions > span:hover {
background-color: var(--hoover-color); background-color: var(--hoover-color);
} }
.buttonContainer {
display: flex;
align-content: center;
justify-content: center;
margin: 10px 0px;
height: 50px;
display: flex;
}
.buttonContainer > * {
display: flex;
align-items: center;
justify-content: center;
flex: 1;
background-color: #f2cb05;
border: none;
color: black;
padding: 5px 10px;
font-weight: bold;
font-size: 15px;
margin: 8px 2px 2px 2px;
cursor: pointer;
text-shadow: 1px 1px 8px black;
transition: width 0.5s, height 0.5s, ease-in 0.5s;
user-select: none;
cursor: pointer;
text-align: center;
text-decoration: none;
}
.buttonContainer > *:active {
transform: translateY(2.5px);
}
.buttonContainer > *:hover {
text-shadow: 2px 2px 8px black;
transition: width 0.5s, height 0.5s, ease-out 0.5s;
background-color: #a38c1a;
}
.buttonContainer > .activeButton {
color: var(--text-color);
}

View file

@ -74,6 +74,7 @@ export default function AllQuestions({ router }) {
const [searchTerm, setSearchTerm] = useState('') const [searchTerm, setSearchTerm] = useState('')
const [activeSubjName, setActiveSubjName] = useState('') const [activeSubjName, setActiveSubjName] = useState('')
const [dbs, setDbs] = useState(null) const [dbs, setDbs] = useState(null)
const [selectedDb, setSelectedDb] = useState('')
const [data, setData] = useState(null) const [data, setData] = useState(null)
const [fetchingData, setFetchingData] = useState(false) const [fetchingData, setFetchingData] = useState(false)
const subjectCount = data ? data.length : 0 const subjectCount = data ? data.length : 0
@ -106,11 +107,13 @@ export default function AllQuestions({ router }) {
setData(null) setData(null)
setFetchingData(true) setFetchingData(true)
if (key === 'all') { if (key === 'all') {
setSelectedDb(key)
fetchAllData(dbs).then((res) => { fetchAllData(dbs).then((res) => {
setData(mergeData(res)) setData(mergeData(res))
setFetchingData(false) setFetchingData(false)
}) })
} else { } else {
setSelectedDb(dbs[key].name)
fetchData(dbs[key]).then((res) => { fetchData(dbs[key]).then((res) => {
setData(res.data) setData(res.data)
setFetchingData(false) setFetchingData(false)
@ -238,11 +241,11 @@ export default function AllQuestions({ router }) {
return ( return (
<div> <div>
{dbs ? ( {dbs ? <>{renderDbSelector()}</> : <LoadingIndicator />}
{dbs && data ? (
<> <>
{renderDbSelector()} {`${questionCount} kérdés, ${subjectCount} tárgy`}
{data && `${questionCount} kérdés, ${subjectCount} tárgy`} <div className={'buttonContainer'}>
<div className={styles.typeSelector}>
<div <div
className={!subjectsShowing ? styles.activeTypeSelector : ''} className={!subjectsShowing ? styles.activeTypeSelector : ''}
onClick={() => setSubjectsShowing(false)} onClick={() => setSubjectsShowing(false)}
@ -255,6 +258,23 @@ export default function AllQuestions({ router }) {
> >
Tárgyak Tárgyak
</div> </div>
<div>
<a
onClick={() => {
if (selectedDb === 'all') {
window.open(`${constants.apiUrl}allqr.txt`, '_blank')
} else {
window.open(
`${constants.apiUrl}allqr.txt?db=${selectedDb}`,
'_blank'
)
}
}}
className={styles.button}
>
{'Kérdések letöltése'}
</a>
</div>
</div> </div>
{fetchingData ? ( {fetchingData ? (
<LoadingIndicator /> <LoadingIndicator />
@ -266,9 +286,7 @@ export default function AllQuestions({ router }) {
</div> </div>
)} )}
</> </>
) : ( ) : null}
<LoadingIndicator />
)}
</div> </div>
) )
} }

View file

@ -12,27 +12,6 @@
border: none; border: none;
} }
.typeSelector {
margin: 10px 0px;
height: 50px;
display: flex;
}
.typeSelector div {
display: flex;
align-items: center;
justify-content: center;
flex: 1;
font-size: 18px;
color: #fff;
cursor: pointer;
}
.typeSelector div:hover {
background-color: #333;
}
.activeTypeSelector { .activeTypeSelector {
background-color: #444; background-color: #444;
} }

View file

@ -1,7 +1,8 @@
import React from 'react' import React, { useState } from 'react'
import Head from 'next/head' import Head from 'next/head'
import styles from './contact.module.css' import styles from './contact.module.css'
import constants from '../constants.json'
const contactMethods = { const contactMethods = {
irc: { irc: {
@ -20,12 +21,74 @@ const contactMethods = {
}, },
} }
function submitFeedback(msg) {
return new Promise((resolve) => {
fetch(constants.apiUrl + 'postfeedback', {
method: 'POST',
credentials: 'include',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
newTask: msg,
from: 'contribute',
}),
})
.then((resp) => {
return resp.json()
})
.then((resp) => {
if (resp.success) {
resolve()
} else {
alert('Hiba küldés közben')
}
})
.catch((err) => {
alert('Hiba küldés közben')
console.error(err)
})
})
}
export default function Contact() { export default function Contact() {
const [feedback, setFeedback] = useState('')
const feedbackArea = () => {
return (
<div className={styles.inputArea}>
<textarea
onChange={(event) => setFeedback(event.target.value)}
value={feedback}
className={styles.feedback}
/>
<div className={'buttonContainer'}>
<div
onClick={() => {
if (feedback) {
submitFeedback(feedback).then(() => {
alert('Elküldve')
setFeedback('')
})
} else {
alert('Adj meg valami üzenetet ...')
}
}}
>
Küldés
</div>
</div>
</div>
)
}
return ( return (
<div> <div>
<Head> <Head>
<title>Kapcsolat - Qmining | Frylabs.net</title> <title>Kapcsolat - Qmining | Frylabs.net</title>
</Head> </Head>
{feedbackArea()}
<div className={styles.contactsContainer}> <div className={styles.contactsContainer}>
<div>Itt vannak hogy hogy lehet kontaktolni</div> <div>Itt vannak hogy hogy lehet kontaktolni</div>
{Object.keys(contactMethods).map((key) => { {Object.keys(contactMethods).map((key) => {

View file

@ -23,3 +23,16 @@
.contactsContainer > div > div:nth-child(2) { .contactsContainer > div > div:nth-child(2) {
flex: 1; flex: 1;
} }
.feedback {
color: var(--text-color);
background-color: var(--background-color);
font-size: 14px;
width: 100%;
box-sizing: border-box;
height: 60px;
}
.inputArea {
display: flex;
}

View file

@ -1,4 +1,4 @@
import React, { useState } from 'react' import React from 'react'
import Head from 'next/head' import Head from 'next/head'
import Sleep from '../components/sleep' import Sleep from '../components/sleep'
@ -9,57 +9,6 @@ import styles from './contribute.module.css'
import repos from '../data/repos.json' import repos from '../data/repos.json'
export default function contribute() { export default function contribute() {
const [newTask, setNewTask] = useState('')
const submitNewTask = async () => {
if (!newTask) {
return
}
fetch(constants.apiUrl + 'postfeedback', {
method: 'POST',
credentials: 'include',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
newTask: newTask,
from: 'contribute',
}),
})
.then((resp) => {
return resp.json()
})
.then((resp) => {
if (resp.success) {
alert('Elküldve')
setNewTask('')
} else {
alert('Hiba küldés közben')
}
})
.catch((err) => {
alert('Hiba küldés közben')
console.error(err)
})
}
const renderNewTaskArea = () => {
return (
<div className={styles.inputArea}>
<textarea
onChange={(event) => setNewTask(event.target.value)}
value={newTask || ''}
className={styles.feedback}
/>
<button className={styles.button} onClick={submitNewTask}>
Küldés
</button>
</div>
)
}
return ( return (
<div> <div>
<Head> <Head>
@ -88,7 +37,6 @@ export default function contribute() {
Itt írhatsz új todo-ra ötleteket, vagy jelezhetsz hogy egyikben Itt írhatsz új todo-ra ötleteket, vagy jelezhetsz hogy egyikben
segítenél segítenél
</div> </div>
{renderNewTaskArea()}
<hr /> <hr />
<Todos /> <Todos />
<Sleep /> <Sleep />

View file

@ -12,28 +12,6 @@
text-align: center; text-align: center;
} }
.feedback {
color: var(--text-color);
background-color: var(--background-color);
font-size: 14px;
width: 100%;
box-sizing: border-box;
height: 60px;
}
.button {
background-color: var(--text-color);
border: none;
padding: 5px 15px;
margin: 5px;
color: white;
width: 200px;
}
.inputArea {
display: flex;
}
.title { .title {
color: var(--text-color); color: var(--text-color);
font-size: 30px; font-size: 30px;

View file

@ -1,116 +1,11 @@
import React from 'react' import React, { useState } from 'react'
import Sleep from '../components/sleep' import Sleep from '../components/sleep'
import Head from 'next/head' import Head from 'next/head'
export default function Manual() { function PasswordSection() {
return <div>{renderMaual()}</div>
}
function renderMaual() {
return ( return (
<div> <>
<Head>
<title>Manual - Qmining | Frylabs.net</title>
</Head>
<center>
<div className={'pageHeader'}>
<h1>Manual</h1>
</div>
<h3 className={'warning'}>
Ha az oldalt vagy a scriptet használod: akármikor észrevehetik,
leállhat a szerver, és rossz lehet az összes válasz!
</h3>
<p id="manualWarn">
Valószínűleg semmi baj nem lesz, de én szóltam. Ha emiatt aggódsz,
olvasd el a <a href="#risk">kockázatok részt</a>.
</p>
</center>
<Sleep />
<center></center>
<hr />
<center>
<h2 className={'subtitle'}>A userscript használata</h2>
</center>
<div className={'manualUsage manualBody'}>
<div>
<p>
Ez a userscript Moodle/Elearnig/KMOOC tesztek megoldása során
segítséget jelenít meg.
</p>
<ul>
<li>
Tölts le egy userscript futtató kiegészítőt a böngésződhöz: pl. a{' '}
<a
href="https://www.tampermonkey.net/"
target="_blank"
rel="noreferrer"
>
Tampermonkey
</a>
-t.
</li>
<li>
<a
href="http://qmining.frylabs.net/install?man"
target="_blank"
rel="noreferrer"
>
Kattints ide hogy felrakd a scriptet
</a>{' '}
</li>
<li>
A script ezt követően udvariasan megkér, hogy hadd beszélgessen a
szerverrel, mert mással nem tud, ezért ezt engedélyezd neki.
</li>
<li>
A kitöltendő teszt oldalán a kérdésre a választ kell látnod felül
egy lebegő ablakban.
</li>
<li>
Teszt ellenőrzés oldalon a script beküldi a szervernek a helyes
válaszokat, az lementi az új kérdéseket, amik ezután azonnal
elérhetők lesznek (neked, és másoknak is)
</li>
</ul>
Egyéb fontos tudnivalók:
<ul>
<li>
Ezt ments sokszor akár minden nap:{' '}
<a
href="http://qmining.frylabs.net/allqr.txt?man"
target="_blank"
rel="noreferrer"
>
{' '}
Összes kérdés TXT
</a>{' '}
(az összes összegyűjtött kérdés, ha elszállna a szerver)
</li>
<li>
Az{' '}
<a href="/allQuestions" rel="noreferrer">
összes kérdés oldal
</a>{' '}
az oldal, ahol manuálisan tudsz keresni, ha valami gáz lenne a
scripttel.
</li>
</ul>
</div>
<div className={'rtfmImage'}>
<img
style={{ maxWidth: '100%', minWidth: '200px' }}
src="img/rtfm.jpg"
alt="img"
/>
</div>
</div>
<hr />
<center>
<h2 id="pw" className={'subtitle'}>
Jelszavak
</h2>
</center>
<div className={'manualBody'}> <div className={'manualBody'}>
<p> <p>
Ha ezt olvasod valszeg már neked is van. Azért lett bevezetve, hogy Ha ezt olvasod valszeg már neked is van. Azért lett bevezetve, hogy
@ -161,9 +56,13 @@ function renderMaual() {
</ul> </ul>
</div> </div>
<hr /> <hr />
<center> </>
<h2 className={'subtitle'}>Gyakran Ismételt Kérdések</h2> )
</center> }
function FAQSection() {
return (
<>
<div className={'manualBody'}> <div className={'manualBody'}>
<ul> <ul>
<li> <li>
@ -204,12 +103,13 @@ function renderMaual() {
</li> </li>
</ul> </ul>
</div> </div>
<hr /> </>
<center> )
<h2 id="risk" className={'subtitle'}> }
Kockázatok
</h2> function RiskSection() {
</center> return (
<>
<ul> <ul>
<li> <li>
<b>Bármikor észrevehetik hogy használod a scriptet</b> <b>Bármikor észrevehetik hogy használod a scriptet</b>
@ -248,9 +148,13 @@ function renderMaual() {
</li> </li>
</ul> </ul>
<hr /> <hr />
<h2 id="sitesave" className={'subtitle'}> </>
Weboldal lementése )
</h2> }
function WebsiteSaveSection() {
return (
<>
<p> <p>
Ha hibát észlesz, kérlek jelents. Hogy a hibákat a saját gépemen Ha hibát észlesz, kérlek jelents. Hogy a hibákat a saját gépemen
reprodukálni tudjam, és könnyen ki bírjam javítani, sokszor jól jön, ha reprodukálni tudjam, és könnyen ki bírjam javítani, sokszor jól jön, ha
@ -274,10 +178,13 @@ function renderMaual() {
hatékonyan tesztelni a scriptet. Ezért hatalmas segítség ha feltöltöd hatékonyan tesztelni a scriptet. Ezért hatalmas segítség ha feltöltöd
azt az oldalt amin hibával találkozol. azt az oldalt amin hibával találkozol.
</p> </p>
<hr /> </>
<h2 id="scriptreinstall" className={'subtitle'}> )
Script újratelepítése }
</h2>
function ScriptReinstallSection() {
return (
<>
<p> <p>
Jelenleg két helyről lehet telepíteni a scriptet: greasyforkról és a Jelenleg két helyről lehet telepíteni a scriptet: greasyforkról és a
weboldalról. A greasyforkos telepítési lehetőség meg fog szűnni, így ha weboldalról. A greasyforkos telepítési lehetőség meg fog szűnni, így ha
@ -313,6 +220,55 @@ function renderMaual() {
</ul> </ul>
Ezzel semmi adat nem vész el, régi jelszó ugyanolyan marad (csak ne Ezzel semmi adat nem vész el, régi jelszó ugyanolyan marad (csak ne
felejtsd azt el) felejtsd azt el)
</>
)
}
const pages = {
faq: { name: 'GYIK', component: FAQSection },
pw: { name: 'Jelszavak', component: PasswordSection },
risk: { name: 'Kockázatok', component: RiskSection },
websitedl: { name: 'Weboldal letöltése', component: WebsiteSaveSection },
reinstall: {
name: 'Script újratelepítése',
component: ScriptReinstallSection,
},
}
export default function FAQ() {
const [currPage, setCurrPage] = useState(pages.faq)
const renderCurrPage = (page) => {
if (page) {
return <page.component />
} else {
return null
}
}
return (
<div>
<Head>
<title>GYIK - Qmining | Frylabs.net</title>
</Head>
<div className={'buttonContainer'}>
{Object.keys(pages).map((key) => {
const page = pages[key]
return (
<div
className={`${page === currPage && 'activeButton'}`}
key={key}
onClick={() => {
setCurrPage(page)
}}
>
{page.name}
</div>
)
})}
</div>
{renderCurrPage(currPage)}
<Sleep />
<p className={'endofpage'} /> <p className={'endofpage'} />
</div> </div>
) )

View file

@ -1,36 +1,15 @@
import React, { useState, useEffect } from 'react' import React, { useState, useEffect } from 'react'
import fetch from 'unfetch' import fetch from 'unfetch'
import Head from 'next/head' import Head from 'next/head'
import Link from 'next/link'
import LoadingIndicator from '../components/LoadingIndicator' import LoadingIndicator from '../components/LoadingIndicator'
import Sleep from '../components/sleep' import Sleep from '../components/sleep'
import NewsEntry from '../components/newsEntry' import NewsEntry from '../components/newsEntry'
import Composer from '../components/composer' import Composer from '../components/composer'
import DbSelector from '../components/dbSelector.js'
import styles from './index.module.css' import styles from './index.module.css'
import constants from '../constants.json' import constants from '../constants.json'
const links = {
install: {
href: '/install',
text: 'Install',
},
manual: {
href: '/manual',
text: 'A script használata',
},
post: {
href: '/',
text: 'Bejegyzés írása...',
},
dataeditor: {
href: '/dataeditor',
text: 'Kérdés szerkesztő',
},
}
function fetchNews() { function fetchNews() {
return new Promise((resolve) => { return new Promise((resolve) => {
fetch(`${constants.apiUrl}news.json`, { fetch(`${constants.apiUrl}news.json`, {
@ -115,7 +94,6 @@ export default function Index({ globalData }) {
const userId = globalData.userId const userId = globalData.userId
const motd = globalData.motd const motd = globalData.motd
const [news, setNews] = useState(null) const [news, setNews] = useState(null)
const [allQrSelector, setAllQrSelector] = useState(null)
// const userSpecificMotd = props.globalData.userSpecificMotd // const userSpecificMotd = props.globalData.userSpecificMotd
useEffect(() => { useEffect(() => {
@ -299,66 +277,15 @@ export default function Index({ globalData }) {
) )
} }
const renderDbSelector = () => {
if (allQrSelector) {
return (
<DbSelector
text={`Válaszd ki melyik adatbázist szeretnéd letölteni!`}
showAll={allQrSelector === 'txt'}
closeClick={() => {
setAllQrSelector(null)
}}
onDbSelect={(selectedDb) => {
if (allQrSelector === 'txt') {
if (selectedDb === 'all') {
window.open(`${constants.apiUrl}allqr.txt`, '_blank')
} else {
window.open(
`${constants.apiUrl}allqr.txt?db=${selectedDb.name}`,
'_blank'
)
}
} else if (allQrSelector === 'json') {
window.open(`${constants.apiUrl}${selectedDb.path}`, '_blank')
}
}}
/>
)
} else {
return null
}
}
return ( return (
<div> <div>
<Head> <Head>
<title>Qmining | Frylabs.net</title> <title>Qmining | Frylabs.net</title>
</Head> </Head>
<div className={styles.buttonContainer}>
{Object.keys(links).map((key) => {
let link = links[key]
return (
<Link key={key} href={link.href}>
<a className={styles.button} target="_blank">
{link.text}
</a>
</Link>
)
})}
<a
onClick={() => {
setAllQrSelector('txt')
}}
className={styles.button}
>
{'Összes kérdés TXT'}
</a>
</div>
{renderMotd()} {renderMotd()}
{/*{userSpecificMotd && renderUserSpecificMotd()} */} {/*{userSpecificMotd && renderUserSpecificMotd()} */}
<Sleep /> <Sleep />
{renderNews()} {renderNews()}
{renderDbSelector()}
</div> </div>
) )
} }

View file

@ -1,33 +1,3 @@
.buttonContainer {
display: flex;
}
.button {
color: white;
background-color: #313131;
margin: 0px 4px;
padding: 15px 4px;
max-width: 100%;
text-align: center;
font-size: 16px;
cursor: pointer;
word-wrap: break-word;
text-decoration: none;
transition: width 0.5s, height 0.5s, ease-in 0.5s;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
user-select: none;
}
.button:hover {
background-color: #555;
color: var(--text-color);
transition: width 0.5s, height 0.5s, ease-out 0.5s;
text-shadow: 2px 1.5px 8px black;
}
.hr { .hr {
width: 100%; width: 100%;
} }

View file

@ -131,10 +131,8 @@ export default function PwRequest(props) {
<br /> <br />
<br /> <br />
</div> </div>
<div className={styles.buttonContainer}> <div className={'buttonContainer'}>
<div onClick={handleSubmit} className={styles.button}> <div onClick={handleSubmit}>Jelszó kérése</div>
Jelszó kérése
</div>
</div> </div>
{result ? ( {result ? (
<div className={styles.pwContainer}> <div className={styles.pwContainer}>

View file

@ -1,33 +1,3 @@
.buttonContainer {
padding: 10px;
display: flex;
align-items: center;
justify-content: center;
}
.button {
background-color: #f2cb05;
border: none;
color: black;
padding: 15px 30px;
font-weight: bold;
font-size: 15px;
margin: 8px 2px 2px 2px;
cursor: pointer;
text-shadow: 1px 1px 8px black;
transition: width 0.5s, height 0.5s, ease-in 0.5s;
}
.button:active {
transform: translateY(2.5px);
}
.button:hover {
text-shadow: 2px 2px 8px black;
transition: width 0.5s, height 0.5s, ease-out 0.5s;
background-color: #a38c1a;
}
.text { .text {
text-align: center; text-align: center;
font-size: 18px; font-size: 18px;

109
src/pages/script.js Normal file
View file

@ -0,0 +1,109 @@
import React from 'react'
import Sleep from '../components/sleep'
import Head from 'next/head'
import ExternalLinkIcon from '../components/externalLinkIcon'
export default function Script() {
return (
<div>
<Head>
<title>Manual - Qmining | Frylabs.net</title>
</Head>
<div className={'buttonContainer'}>
<a href="https://www.tampermonkey.net/">
Ajánlott userscript bővítmény
<ExternalLinkIcon size={20} />
</a>
<a href="/install">
Script telepítése
<ExternalLinkIcon size={20} />
</a>
</div>
<Sleep />
{renderManual()}
</div>
)
}
function renderManual() {
return (
<>
<center>
<h2 className={'subtitle'}>A userscript használata</h2>
</center>
<div>
<p>
Ez a userscript Moodle/Elearnig/KMOOC tesztek megoldása során
segítséget jelenít meg.
</p>
<ul>
<li>
Tölts le egy userscript futtató kiegészítőt a böngésződhöz: pl. a{' '}
<a
href="https://www.tampermonkey.net/"
target="_blank"
rel="noreferrer"
>
Tampermonkey
</a>
-t.
</li>
<li>
<a
href="http://qmining.frylabs.net/install?man"
target="_blank"
rel="noreferrer"
>
Kattints ide hogy felrakd a scriptet
</a>{' '}
</li>
<li>
A script ezt követően udvariasan megkér, hogy hadd beszélgessen a
szerverrel, mert mással nem tud, ezért ezt engedélyezd neki.
</li>
<li>
A kitöltendő teszt oldalán a kérdésre a választ kell látnod felül
egy lebegő ablakban.
</li>
<li>
Teszt ellenőrzés oldalon a script beküldi a szervernek a helyes
válaszokat, az lementi az új kérdéseket, amik ezután azonnal
elérhetők lesznek (neked, és másoknak is)
</li>
</ul>
Egyéb fontos tudnivalók:
<ul>
<li>
Ezt ments sokszor akár minden nap:{' '}
<a
href="http://qmining.frylabs.net/allqr.txt?man"
target="_blank"
rel="noreferrer"
>
{' '}
Összes kérdés TXT
</a>{' '}
(az összes összegyűjtött kérdés, ha elszállna a szerver)
</li>
<li>
Az{' '}
<a href="/allQuestions" rel="noreferrer">
összes kérdés oldal
</a>{' '}
az oldal, ahol manuálisan tudsz keresni, ha valami gáz lenne a
scripttel.
</li>
</ul>
</div>
<div className={'rtfmImage'}>
<img
style={{ maxWidth: '100%', minWidth: '200px' }}
src="img/rtfm.jpg"
alt="img"
/>
</div>
</>
)
}

View file