import axios from 'axios'; import { useContext, useEffect, useState } from 'react'; import { userGames, userGameTotals, userInfo } from '../api/api'; import { Footer } from '../components/footer'; import { SocketContext } from '../components/socketContext'; import { AccountAvatar } from '../components/account'; import { IssueList } from '../components/issues'; import { NavBar } from '../components/navbar'; import { CenteredPage, PageTitle } from '../components/page'; import RecentGames from '../components/recentGames'; import { Button, Vierkant } from '../components/ui'; import ExtensionIcon from '@material-ui/icons/Extension'; import VideogameAssetIcon from '@material-ui/icons/VideogameAsset'; import { mdiRobotExcited } from '@mdi/js'; import Icon from '@mdi/react'; import { ArticleMeta, getStaticProps as getBlogPage, RenderedArticle } from './blog/[post]'; // edit this to change the post displayed on the home page var posts = ['beta']; function LoginOrRegisterBox() { return <div className='inner'> <span className='registerMessage posabs h0 t0'> Log in of maak een account aan om toegang tot meer functies te krijgen </span> <div className='sidebyside posabs h0 b0'> <Button href='/register' text='Registreren' className='register' /> <Button href='/login' text='Inloggen' className='login' /> </div> </div>; } function AccountBox(props: { info: userInfo; sumGameInfo: userGameTotals; }) { return <div className='inner profile'> <div className='picture posabs l0 t0'> <AccountAvatar size={90} /> </div> <div className='info posabs t0'> <h2 className='username truncate'>{props.info?.username}</h2> <p className='score'>Score: {props.info?.rating}</p> <p className='games posabs b0 l0'> <span className='outcome win'>{props.sumGameInfo?.win} W</span> <span className='divider'>/</span> <span className='outcome lose'>{props.sumGameInfo?.lose} V</span> <span className='divider'>/</span> <span className='outcome draw'>{props.sumGameInfo?.draw} G</span> </p> </div> </div>; } export default function HomePage(props: { posts: Array<{ props: { content: string; meta: ArticleMeta; }; }>; }) { var server = typeof window === 'undefined'; var loggedIn = !server && document.cookie.includes('token'); var { io } = useContext(SocketContext); useEffect(() => { io.on('connect', () => { console.log('gert'); }); }, []); var [userInfo, setUserInfo] = useState<userInfo>(); var [gameInfo, setGameInfo] = useState<userGames>(); useEffect(() => { (async () => { if (!loggedIn) return; var userInfoReq = await axios.request<userInfo>({ method: 'get', url: `/api/user/info`, headers: { 'content-type': 'application/json' }, }); setUserInfo(userInfoReq.data); })(); }, []); useEffect(() => { (async () => { if (!loggedIn) return; var userGamesReq = await axios.request<userGames>({ method: 'get', url: `/api/user/games`, headers: { 'content-type': 'application/json' }, }); setGameInfo(userGamesReq.data); })(); }, []); return <div> <NavBar /> <CenteredPage width={802}> <PageTitle>4 op een rij</PageTitle> <div className='topbar'> <Vierkant className='gamemode bg-800' href='/game'> <VideogameAssetIcon className='icon' /> <span className='text'>Nieuw spel</span> </Vierkant> {false && <Vierkant className='gamemode bg-800' href='/'> <ExtensionIcon className='icon' /> <span className='text'>Puzzels</span> </Vierkant>} {false && <Vierkant className='gamemode bg-800' href='/'> <Icon path={mdiRobotExcited} className='icon' /> <span className='text'>Tegen computer</span> </Vierkant>} <Vierkant className='loginOrRegisterBox pad-l valigntop bg-800'> {loggedIn ? <AccountBox info={userInfo} sumGameInfo={gameInfo?.totals} /> : <LoginOrRegisterBox />} </Vierkant> </div> {loggedIn && <Vierkant className='w100m2m pad-l bg-800'> <RecentGames games={gameInfo?.games} /> </Vierkant>} <div> {props.posts.map(post => { return <RenderedArticle content={post.props.content} meta={post.props.meta} />; })} </div> <Vierkant className='w100m2m pad-l bg-800'> <h2>Github Issues</h2> <IssueList /> </Vierkant> </CenteredPage> <Footer /> </div>; } export function getStaticProps() { var postsContent = []; posts.forEach(post => { postsContent.push(getBlogPage({ params: { post } })); }); var staticProps = { props: { posts: postsContent } }; return staticProps; }