aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/App.js40
-rw-r--r--components/Form.js74
-rw-r--r--components/Header.js73
-rw-r--r--components/Layout.js20
-rw-r--r--components/Popup.js9
-rw-r--r--components/Splash.js8
-rw-r--r--components/index.js12
7 files changed, 115 insertions, 121 deletions
diff --git a/components/App.js b/components/App.js
index c539e72..84268cb 100644
--- a/components/App.js
+++ b/components/App.js
@@ -1,53 +1,53 @@
-import React, {useEffect, useRef} from 'react'
+import { useEffect, useRef } from 'react'
import useSettings from 'hooks/useSettings'
import useMediaQuery from 'hooks/useMediaQuery'
-import {close, toggleMin, toggleMax, move, focus} from 'helpers/windowActions'
-import {faArrowUp, faExpandAlt, faTimes, faCompressAlt} from '@fortawesome/free-solid-svg-icons'
-import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'
+import { close, toggleMin, toggleMax, move, focus } from 'helpers/windowActions'
+import { faArrowUp, faExpandAlt, faTimes, faCompressAlt } from '@fortawesome/free-solid-svg-icons'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-const App = ({children, app, setApps}) => {
- const {t} = useSettings()
- const winRef = useRef(null);
- const forceMax = useMediaQuery(`(max-width: ${app.width}), (max-height: ${app.height})`);
+const App = ({ children, app, setApps }) => {
+ const { t } = useSettings()
+ const winRef = useRef(null)
+ const forceMax = useMediaQuery(`(max-width: ${app.width}), (max-height: ${app.height})`)
useEffect(() => {
move(app, winRef, setApps)
- }, [])
+ }, [app, setApps])
return (
<div
ref={winRef}
- onClick={() => {focus(app.name, setApps)}}
+ onClick={() => { focus(app.name, setApps) }}
className={
- 'window'
- + (app.min ? ' hidden' : '')
- + (app.max || forceMax ? ' maximized' : '')
+ 'window' +
+ (app.min ? ' hidden' : '') +
+ (app.max || forceMax ? ' maximized' : '')
}
style={{
height: app.height,
width: app.width,
...app.pos.length
- ? {top: app.pos[1], left: app.pos[0]}
+ ? { top: app.pos[1], left: app.pos[0] }
: {
top: `calc((( 100vh - ${app.height} ) / 2) + 2em)`,
- left: `calc(( 100vw - ${app.width} ) / 2)`,
- }
+ left: `calc(( 100vw - ${app.width} ) / 2)`
+ }
}}
>
<h2 className='window__title'>{t(app.name)}</h2>
<div className='window__content'>{children}</div>
<div className='window__title-buttons'>
- { app.buttons.includes('min') && (
+ {app.buttons.includes('min') && (
<span onClick={() => toggleMin(app.name, setApps)}>
<FontAwesomeIcon icon={faArrowUp} />
</span>
)}
- { app.buttons.includes('max') && !forceMax && (
+ {app.buttons.includes('max') && !forceMax && (
<span onClick={() => toggleMax(app.name, setApps)}>
<FontAwesomeIcon icon={app.max ? faCompressAlt : faExpandAlt} />
</span>
)}
- { app.buttons.includes('close') && (
+ {app.buttons.includes('close') && (
<span onClick={() => close(app.name, setApps)}>
<FontAwesomeIcon icon={faTimes} />
</span>
@@ -57,4 +57,4 @@ const App = ({children, app, setApps}) => {
)
}
-export default App;
+export default App
diff --git a/components/Form.js b/components/Form.js
index 9a17660..681f13a 100644
--- a/components/Form.js
+++ b/components/Form.js
@@ -3,65 +3,65 @@ import React from 'react'
import PropTypes from 'prop-types'
import useSettings from 'hooks/useSettings'
-const Form = ({errorMessage, onSubmit, isLogin}) => {
- const {settings, setSettings, t} = useSettings()
+const Form = ({ errorMessage, onSubmit, isLogin }) => {
+ const { settings, setSettings, t } = useSettings()
const themeChange = c => {
- setSettings(prev => ({...prev, theme: c}))
+ setSettings(prev => ({ ...prev, theme: c }))
}
const languageChange = l => {
- setSettings(prev => ({...prev, language: l}))
+ setSettings(prev => ({ ...prev, language: l }))
}
return (
<form className={`window window--popup ${styles.userForm}`} onSubmit={onSubmit}>
- <div className="window__content--popup">
+ <div className='window__content--popup'>
{isLogin ? t('log_in') : t('register_user')}
</div>
- <input type="email" name="email" placeholder="email" required />
- <input type="password" name="password" minLength="6" placeholder={t('password')} required />
+ <input type='email' name='email' placeholder='email' required />
+ <input type='password' name='password' minLength='6' placeholder={t('password')} required />
{!isLogin && (
<>
- <input type="password" name="password_confirm" placeholder={t('confirm_password')} required />
+ <input type='password' name='password_confirm' placeholder={t('confirm_password')} required />
<legend>{t('language')}</legend>
<fieldset>
- {['en', 'pl', 'es', 'de'].map(l => (
- <fieldset key={l}>
- <input
- id={`language_${l}`}
- type="radio"
- name="language"
- value={l}
- defaultChecked={settings.language === l}
- onChange={() => languageChange(l)}
- />
- <label htmlFor={`language_${l}`}>{l.toUpperCase()}</label>
- </fieldset>
- ))}
+ {['en', 'pl', 'es', 'de'].map(l => (
+ <fieldset key={l}>
+ <input
+ id={`language_${l}`}
+ type='radio'
+ name='language'
+ value={l}
+ defaultChecked={settings.language === l}
+ onChange={() => languageChange(l)}
+ />
+ <label htmlFor={`language_${l}`}>{l.toUpperCase()}</label>
+ </fieldset>
+ ))}
</fieldset>
<legend>{t('color_theme')}</legend>
<fieldset>
- {['green', 'blue', 'black'].map(c => (
- <fieldset key={c}>
- <input
- id={`theme_${c}`}
- type="radio"
- name="theme"
- value={c}
- defaultChecked={settings.theme === c}
- onChange={() => themeChange(c)}
- />
- <label htmlFor={`theme_${c}`} />
- </fieldset>
- ))}
+ {['green', 'blue', 'black'].map(c => (
+ <fieldset key={c}>
+ <input
+ id={`theme_${c}`}
+ type='radio'
+ name='theme'
+ value={c}
+ defaultChecked={settings.theme === c}
+ onChange={() => themeChange(c)}
+ />
+ <label htmlFor={`theme_${c}`} />
+ </fieldset>
+ ))}
</fieldset>
</>
)}
- <input className='window__button' type="submit" value={isLogin ? t('login') : t('register')} />
+ <input className='window__button' type='submit' value={isLogin ? t('login') : t('register')} />
- {errorMessage && <p className="error">{t(errorMessage)}</p>}
+ {errorMessage && <p className='error'>{t(errorMessage)}</p>}
</form>
)
}
@@ -70,5 +70,5 @@ export default Form
Form.propTypes = {
errorMessage: PropTypes.string,
- onSubmit: PropTypes.func,
+ onSubmit: PropTypes.func
}
diff --git a/components/Header.js b/components/Header.js
index 83f0ff9..32ec977 100644
--- a/components/Header.js
+++ b/components/Header.js
@@ -1,27 +1,26 @@
import styles from 'styles/Main.module.scss'
-import React, {useState} from 'react'
-import {useRouter} from 'next/router'
+import React, { useState } from 'react'
+import { useRouter } from 'next/router'
import Link from 'next/link'
import useUser from 'hooks/useUser'
import fetchJson from 'helpers/fetchJson'
-import {focus, toggleMin} from 'helpers/windowActions'
-import {open, close} from 'helpers/windowActions'
+import { focus, toggleMin, open, close } from 'helpers/windowActions'
import appList from 'configs/appList'
import useSettings from 'hooks/useSettings'
-import {faTimes} from '@fortawesome/free-solid-svg-icons'
-import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'
+import { faTimes } from '@fortawesome/free-solid-svg-icons'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-const Header = ({apps, setApps}) => {
+const Header = ({ apps, setApps }) => {
const [userMenu, setUserMenu] = useState(false)
const [showApps, setShowApps] = useState(false)
- const {user, mutateUser} = useUser()
- const {t} = useSettings()
+ const { user, mutateUser } = useUser()
+ const { t } = useSettings()
const router = useRouter()
const handleLogout = async (e) => {
e.preventDefault()
mutateUser(
- await fetchJson('/api/logout', {method: 'POST'}),
+ await fetchJson('/api/logout', { method: 'POST' }),
false
)
router.push('/login')
@@ -39,13 +38,13 @@ const Header = ({apps, setApps}) => {
<nav>
<div>
<span onClick={() => setShowApps(s => !s)} className='mobile-only'>
- {apps && apps.length > 0 && apps[apps.length-1]?.name}
+ {apps && apps.length > 0 && apps[apps.length - 1]?.name}
{apps && apps.length > 1 ? (' (' + (apps.length) + ')') : ''}
</span>
<ul className={showApps ? styles.showMobileAppList : 'desktop-only'}>
- <li className="mobile-only">{t('open_apps')}</li>
+ <li className='mobile-only'>{t('open_apps')}</li>
{
- apps && [...apps].sort((a,b) => a.name > b.name ? 1 : -1).map(app => {
+ apps && [...apps].sort((a, b) => a.name > b.name ? 1 : -1).map(app => {
if (!app) return null
return (
<li
@@ -54,8 +53,8 @@ const Header = ({apps, setApps}) => {
>
<span
style={{
- ...apps.findIndex(a => a.name === app.name) === apps.length - 1 ? {fontWeight: 600} : {},
- ...app.min ? {color: '#888'} : {}
+ ...apps.findIndex(a => a.name === app.name) === apps.length - 1 ? { fontWeight: 600 } : {},
+ ...app.min ? { color: '#888' } : {}
}}
>
{t(app.name)}
@@ -67,7 +66,7 @@ const Header = ({apps, setApps}) => {
)
})
}
- <li className="mobile-only">
+ <li className='mobile-only'>
<span onClick={() => setShowApps(false)} className='window__button'>{t('close')}</span>
</li>
</ul>
@@ -75,14 +74,14 @@ const Header = ({apps, setApps}) => {
<ul>
{!user?.isLoggedIn && (
<li>
- <Link href="/register">
+ <Link href='/register'>
<a>{t('register')}</a>
</Link>
</li>
)}
{!user?.isLoggedIn && (
<li>
- <Link href="/login">
+ <Link href='/login'>
<a>{t('login')}</a>
</Link>
</li>
@@ -92,30 +91,32 @@ const Header = ({apps, setApps}) => {
<p
className={styles.user}
onClick={() => setUserMenu(!userMenu)}
- >{user?.email}</p>
+ >{user?.email}
+ </p>
{
userMenu && (
- <>
- <div className={styles.headerOverlay} onClick={() => setUserMenu(false)} />
- <ul className={styles.submenu}>
- {user.isVerified && (
+ <>
+ <div className={styles.headerOverlay} onClick={() => setUserMenu(false)} />
+ <ul className={styles.submenu}>
+ {user.isVerified && (
+ <li>
+ <span onClick={() => {
+ open({ appName: 'Settings', ...appList.Settings }, setApps)
+ setUserMenu()
+ }}
+ >
+ {t('Settings')}
+ </span>
+ </li>
+ )}
<li>
- <span onClick={() => {
- open({appName: 'Settings', ...appList.Settings}, setApps)
- setUserMenu()
- }}>
- {t('Settings')}
+ <span onClick={handleLogout}>
+ {t('logout')}
</span>
</li>
- )}
- <li>
- <a href="/api/logout" onClick={handleLogout}>
- {t('logout')}
- </a>
- </li>
- </ul>
- </>
+ </ul>
+ </>
)
}
</li>
diff --git a/components/Layout.js b/components/Layout.js
index ac9534f..c4cc553 100644
--- a/components/Layout.js
+++ b/components/Layout.js
@@ -1,31 +1,25 @@
import styles from 'styles/Main.module.scss'
import React from 'react'
-import Head from 'next/head'
-import {Header, Popup, Splash} from 'components'
+import { Header, Popup, Splash } from 'components'
import useSettings from 'hooks/useSettings'
import PropTypes from 'prop-types'
const Layout = ({
children,
apps,
- setApps,
+ setApps
}) => {
- const {settings} = useSettings()
+ const { settings } = useSettings()
if (!settings || !settings.theme || !settings.language) return <Splash fixed />
return (
- <section className={styles.layout +' '+ settings.theme}>
- <Head>
- <title>My Apps</title>
- <meta name="viewport"
- content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
- </Head>
+ <section className={styles.layout + ' ' + settings.theme}>
<main>
- <div className="container">{children}</div>
+ <div className='container'>{children}</div>
</main>
<Header apps={apps} setApps={setApps} />
- <Popup/>
+ <Popup />
</section>
)
}
@@ -33,5 +27,5 @@ const Layout = ({
export default Layout
Layout.propTypes = {
- children: PropTypes.node,
+ children: PropTypes.node
}
diff --git a/components/Popup.js b/components/Popup.js
index 3df11c5..3e5ab1f 100644
--- a/components/Popup.js
+++ b/components/Popup.js
@@ -2,17 +2,17 @@ import React from 'react'
import usePopup from 'hooks/usePopup'
const Popup = () => {
- const {popupData: p} = usePopup()
+ const { popupData: p } = usePopup()
if (!p || !p.content) return null
return (
<div className={`window window--popup${p.error ? ' window--error' : ''}`}>
- <div className="window__content--popup">{p.content}</div>
+ <div className='window__content--popup'>{p.content}</div>
{
(p.yes || p.no) && (
- <div className="window__buttons--popup">
- {[p.no, p.yes].map(a => a && <input key={a.label} className='window__button' type="button" onClick={async () => a.action()} value={a.label} />)}
+ <div className='window__buttons--popup'>
+ {[p.no, p.yes].map(a => a && <input key={a.label} className='window__button' type='button' onClick={async () => a.action()} value={a.label} />)}
</div>
)
}
@@ -21,4 +21,3 @@ const Popup = () => {
}
export default Popup
-
diff --git a/components/Splash.js b/components/Splash.js
index f807202..93ef3ee 100644
--- a/components/Splash.js
+++ b/components/Splash.js
@@ -1,11 +1,11 @@
import styles from 'styles/Main.module.scss'
import React from 'react'
import useSettings from 'hooks/useSettings'
-import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'
-import {faBan, faSpinner} from '@fortawesome/free-solid-svg-icons'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faBan, faSpinner } from '@fortawesome/free-solid-svg-icons'
-const Splash = ({type, fixed = false}) => {
- const {t} = useSettings()
+const Splash = ({ type, fixed = false }) => {
+ const { t } = useSettings()
return (
<div className={`${type === 'connection' ? styles.connection : styles.loader} ${fixed ? styles.fixed : ''}`}>
diff --git a/components/index.js b/components/index.js
index 19d8173..2e65f87 100644
--- a/components/index.js
+++ b/components/index.js
@@ -1,6 +1,6 @@
-export {default as Form} from './Form'
-export {default as Header} from './Header'
-export {default as Layout} from './Layout'
-export {default as App} from './App'
-export {default as Popup} from './Popup'
-export {default as Splash} from './Splash'
+export { default as Form } from './Form'
+export { default as Header } from './Header'
+export { default as Layout } from './Layout'
+export { default as App } from './App'
+export { default as Popup } from './Popup'
+export { default as Splash } from './Splash'