import Icon from '@mdi/react';
import axios from 'axios';
import { Children, ReactNode, useContext, useEffect, useState } from 'react';
import { userGames, userInfo } from '../api/api';
import { AccountAvatar } from '../components/account';
import { Footer } from '../components/footer';
import { NavBar } from '../components/navbar';
import { CenteredPage, PageTitle } from '../components/page';
import RecentGames from '../components/recentGames';
import { SocketContext } from '../components/socketContext';
import { ToastContext } from '../components/toast';
import { IconLabelButton, Vierkant } from '../components/ui';
import ArrowDownwardOutlinedIcon from '@material-ui/icons/ArrowDownwardOutlined';
import ArrowUpwardOutlinedIcon from '@material-ui/icons/ArrowUpwardOutlined';
import AssignmentIndOutlinedIcon from '@material-ui/icons/AssignmentIndOutlined';
import DoneOutlinedIcon from '@material-ui/icons/DoneOutlined';
import EditOutlinedIcon from '@material-ui/icons/EditOutlined';
import PeopleOutlineOutlinedIcon from '@material-ui/icons/PeopleOutlineOutlined';
import PersonAddOutlinedIcon from '@material-ui/icons/PersonAddOutlined';
import SettingsOutlinedIcon from '@material-ui/icons/SettingsOutlined';
import {
mdiAccountCancelOutline,
mdiAccountMinusOutline,
mdiAccountRemoveOutline,
mdiCheckboxBlankCircle,
mdiClipboardTextOutline,
mdiEarth,
mdiEqual,
mdiGamepadSquareOutline,
} from '@mdi/js';
function InfoModule(props: {
label: string;
icon: ReactNode;
}) {
return
{props.icon}
{props.label}
;
}
function InfoSection(props: { children: ReactNode; }) {
return
{props.children}
;
}
export default function AccountPage() {
var server = typeof window === 'undefined';
var loggedIn = !server && document.cookie.includes('token');
var pageID = server ? '' : new URLSearchParams(window.location.search).get('id');
if (!loggedIn && !pageID) !server && window.history.go(-1);
var reqData = loggedIn && pageID ? { 'id': pageID } : undefined;
var [user, setUser] = useState();
var [gameInfo, setGameInfo] = useState();
var [editingStatus, setEditingStatus] = useState(false);
var [relation, setRelation] = useState('none');
var [ownPage, setOwnPage] = useState(loggedIn && !pageID);
var { toast } = useContext(ToastContext);
var { io } = useContext(SocketContext);
async function getUserData(): Promise {
var userReq = await axios.request({
method: 'post',
url: `/api/user/info`,
headers: { 'content-type': 'application/json' },
data: reqData,
});
setUser(userReq.data);
return userReq.data;
}
async function getRelationTo(user: userInfo) {
var user = await getUserData();
setRelation(user.relation || 'none');
}
function setIOListeners(user: userInfo) {
io.on('changedRelation', (data: { id: string; }) => {
if (data.id != user.id) return;
getRelationTo(user);
});
io.on('incomingFriendRequest', getRelationTo);
}
useEffect(() => {
(async () => {
var user = await getUserData();
getRelationTo(user);
setIOListeners(user);
})();
}, []);
useEffect(() => {
(async () => {
var userReq = await axios.request({
method: 'post',
url: `/api/user/info`,
headers: { 'content-type': 'application/json' },
});
setOwnPage(ownPage || userReq.data.id == pageID);
})();
}, []);
// Get recent games
useEffect(() => {
(async () => {
var userGamesReq = await axios.request({
method: 'post',
url: `/api/user/games`,
headers: { 'content-type': 'application/json' },
data: reqData,
});
setGameInfo(userGamesReq.data);
})();
}, []);
return
Profiel
{user?.username}
{user?.status}
{loggedIn &&
{ownPage
?
} href='/settings' text='Instellingen' />
{!editingStatus
? }
text='Status bewerken'
onclick={() => setEditingStatus(true)}
/>
: }
text='Status opslaan'
onclick={() => {
setEditingStatus(false);
axios.request({
method: 'post',
url: `/api/user/status`,
headers: { 'content-type': 'application/json' },
data: { 'status': document.getElementById('status').innerText },
});
}}
/>}
:
{(() => {
var icon = {
'blocked':
,
}[relation] ||
;
var text = {
'blocked': 'Deblokkeren',
}[relation] || 'Blokkeren';
return
{
var nextRelation = {
'blocked': {
'endpoint': '/api/social/unblock',
'action': `${user.username} gedeblokkeerd`,
'relation': 'none',
'icon': ,
},
}[relation] || {
'endpoint': '/api/social/block',
'action': `${user.username} geblokkeerd`,
'relation': 'blocked',
'icon': ,
};
axios.request({
method: 'post',
url: nextRelation.endpoint,
headers: { 'content-type': 'application/json' },
data: { 'id': user?.id },
})
.then(() => {
toast({
message: nextRelation.action,
type: 'confirmation',
icon: nextRelation.icon,
});
setRelation(nextRelation.relation);
});
}}
/>;
})()}
{(() => {
var icon = {
'friends': ,
'outgoing': ,
'incoming': ,
}[relation] || ;
var text = {
'friends': 'Vriend verwijderen',
'outgoing': 'Vriendschapsverzoek annuleren',
'incoming': 'Vriendschapsverzoek accepteren',
}[relation] || 'Vriendschapsverzoek sturen';
return {
var nextRelation = {
'friends': {
'endpoint': '/api/social/remove',
'action': `${user.username} succesvol verwijderd als vriend`,
'relation': 'none',
'icon': ,
},
'outgoing': {
'endpoint': '/api/social/remove',
'action': `Vriendschapsverzoek naar ${user.username} geannuleerd`,
'relation': 'none',
'icon': ,
},
'incoming': {
'endpoint': '/api/social/accept',
'action': `Vriendschapsverzoek van ${user.username} geaccepteerd`,
'relation': 'friends',
'icon': ,
},
}[relation] || {
'endpoint': '/api/social/request',
'action': `Vriendschapsverzoek gestuurd naar ${user.username}`,
'relation': 'outgoing',
'icon': ,
};
axios.request({
method: 'post',
url: nextRelation.endpoint,
headers: { 'content-type': 'application/json' },
data: { 'id': user?.id },
})
.then(() => {
toast({
message: nextRelation.action,
type: 'confirmation',
icon: nextRelation.icon,
});
setRelation(nextRelation.relation);
});
}}
/>;
})()}
}
}
}
label='Online'
/>
}
label={(() => {
var memberSince = 'Lid sinds';
var registered = new Date(user?.registered);
memberSince += ' ' + registered.toLocaleString('nl-nl', { month: 'long', day: 'numeric' });
var currentYear = new Date().getFullYear();
var memberYear = registered.getFullYear();
if (currentYear != memberYear) memberSince += ' ' + memberYear;
return memberSince;
})()}
/>
}
label={(() => {
var label = user?.friends.toString() + ' ';
label += user?.friends == 1 ? 'vriend' : 'vrienden';
return label;
})()}
/>
} label='Nederland' />
}
label={gameInfo?.totals.win + ' keer gewonnen'}
/>
}
label={gameInfo?.totals.draw + ' keer gelijkspel'}
/>
}
label={gameInfo?.totals.lose + ' keer verloren'}
/>
} label={'Score: ' + user?.rating} />
}
label={(() => {
var label = gameInfo?.totals.games.toString() + ' ';
label += gameInfo?.totals.games == 1 ? 'potje' : 'potjes';
return label;
})()}
/>
;
}