2020-12-09 09:15:55 +01:00
|
|
|
import React, { useState, useEffect } from 'react';
|
|
|
|
|
import * as BS from 'react-bootstrap'
|
2020-12-12 19:19:22 +01:00
|
|
|
import { useForm } from "react-hook-form";
|
2020-12-11 16:35:25 +01:00
|
|
|
import autosize from 'autosize';
|
|
|
|
|
import moment from 'moment';
|
|
|
|
|
import 'moment-timezone';
|
|
|
|
|
|
|
|
|
|
import API_URL from "../Constants/constants.js";
|
2020-12-09 09:15:55 +01:00
|
|
|
|
|
|
|
|
import defaultAvatar from '../default_discord_avatar.png'
|
2020-12-11 16:35:25 +01:00
|
|
|
import { FaAddressCard } from "react-icons/fa";
|
2020-12-09 09:15:55 +01:00
|
|
|
|
|
|
|
|
export default function System(props) {
|
|
|
|
|
|
2020-12-12 19:19:22 +01:00
|
|
|
const {
|
|
|
|
|
register: registerEdit,
|
|
|
|
|
handleSubmit: handleSubmitEdit
|
|
|
|
|
} = useForm();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
register: registerPrivacy,
|
|
|
|
|
handleSubmit: handleSubmitPrivacy
|
|
|
|
|
} = useForm();
|
2020-12-11 16:35:25 +01:00
|
|
|
|
|
|
|
|
const [ user, setUser ] = useState(JSON.parse(localStorage.getItem('user')));
|
|
|
|
|
|
|
|
|
|
const [ tag, setTag ] = useState("");
|
|
|
|
|
const [ timezone, setTimezone ] = useState("");
|
|
|
|
|
const [ avatar, setAvatar ] = useState("");
|
2020-12-09 09:15:55 +01:00
|
|
|
const [ desc, setDesc ] = useState("");
|
2020-12-11 16:35:25 +01:00
|
|
|
const [ editDesc, setEditDesc ] = useState("");
|
|
|
|
|
|
|
|
|
|
const [ editMode, setEditMode ] = useState(false);
|
|
|
|
|
const [ privacyMode, setPrivacyMode ] = useState(false);
|
|
|
|
|
const [ privacyView, setPrivacyView ] = useState(false);
|
|
|
|
|
|
|
|
|
|
const [ invalidTimezone, setInvalidTimezone ] = useState(false);
|
|
|
|
|
const [ errorAlert, setErrorAlert ] = useState(false);
|
|
|
|
|
|
2020-12-09 09:15:55 +01:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
2020-12-11 00:53:43 +01:00
|
|
|
const { toHTML } = require('../Functions/discord-parser.js');
|
2020-12-11 16:35:25 +01:00
|
|
|
|
|
|
|
|
if (user.tag) {
|
|
|
|
|
setTag(user.tag);
|
|
|
|
|
} else setTag('');
|
|
|
|
|
|
|
|
|
|
if (user.tz) {
|
|
|
|
|
setTimezone(user.tz);
|
|
|
|
|
} else setTimezone('');
|
|
|
|
|
|
|
|
|
|
if (user.avatar_url) {
|
|
|
|
|
setAvatar(user.avatar_url)
|
|
|
|
|
} else setAvatar('')
|
2020-12-11 00:53:43 +01:00
|
|
|
|
2020-12-09 09:15:55 +01:00
|
|
|
if (user.description) {
|
|
|
|
|
setDesc(toHTML(user.description));
|
2020-12-11 16:35:25 +01:00
|
|
|
setEditDesc(user.description);
|
|
|
|
|
} else { setDesc("(no description)");
|
|
|
|
|
setEditDesc("");
|
|
|
|
|
}}, [user.description, user.tag, user.avatar_url, user.tz]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
autosize(document.querySelector('textarea'));
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const submitEdit = data => {
|
|
|
|
|
if (data.tz) {
|
|
|
|
|
if (!moment.tz.zone(data.tz)) {
|
|
|
|
|
setInvalidTimezone(true);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fetch(`${API_URL}s`,{
|
|
|
|
|
method: 'PATCH',
|
|
|
|
|
body: JSON.stringify(data),
|
|
|
|
|
headers: {
|
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
'Authorization': JSON.stringify(localStorage.getItem("token")).slice(1, -1)
|
|
|
|
|
}}).then (res => res.json()
|
2020-12-12 21:04:10 +01:00
|
|
|
).then ( () => { setUser(prevState => {return {...prevState, ...data}}); localStorage.setItem('user', JSON.stringify(user)); setEditMode(false)}
|
2020-12-11 16:35:25 +01:00
|
|
|
).catch (error => {
|
|
|
|
|
console.error(error);
|
|
|
|
|
setErrorAlert(true);
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const submitPrivacy = data => {
|
|
|
|
|
fetch(`${API_URL}s`,{
|
|
|
|
|
method: 'PATCH',
|
|
|
|
|
body: JSON.stringify(data),
|
|
|
|
|
headers: {
|
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
'Authorization': JSON.stringify(localStorage.getItem("token")).slice(1, -1)
|
|
|
|
|
}}).then (res => res.json()
|
|
|
|
|
).then (data => { setUser(prevState => {return {...prevState, ...data}}); localStorage.setItem('user', JSON.stringify(user)); setPrivacyMode(false)}
|
|
|
|
|
).catch (error => {
|
|
|
|
|
console.error(error);
|
|
|
|
|
setErrorAlert(true);
|
|
|
|
|
})
|
|
|
|
|
}
|
2020-12-09 09:15:55 +01:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<BS.Card className="mb-3 mt-3 w-100" >
|
|
|
|
|
<BS.Card.Header className="d-flex align-items-center justify-content-between">
|
|
|
|
|
<BS.Card.Title className="float-left"><FaAddressCard className="mr-3" /> {user.name}</BS.Card.Title>
|
|
|
|
|
{ user.avatar_url ? <BS.Image src={`${user.avatar_url}`} style={{width: 50, height: 50}} className="float-right" roundedCircle /> :
|
|
|
|
|
<BS.Image src={defaultAvatar} style={{width: 50, height: 50}} className="float-right" roundedCircle />}
|
|
|
|
|
</BS.Card.Header>
|
|
|
|
|
<BS.Card.Body>
|
2020-12-11 16:35:25 +01:00
|
|
|
{ errorAlert ? <BS.Alert variant="danger">Something went wrong, please try logging in and out again.</BS.Alert> : "" }
|
|
|
|
|
{ editMode ?
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form onSubmit={handleSubmitEdit(submitEdit)}>
|
2020-12-12 21:04:10 +01:00
|
|
|
<BS.Form.Text className='mb-4'><b>Note:</b> if you refresh the page, the old data might show up again, this is due to the bot caching data.<br/>
|
|
|
|
|
Try editing a member to clear the cache, or wait a few minutes before refreshing.</BS.Form.Text>
|
2020-12-11 16:35:25 +01:00
|
|
|
<BS.Form.Row>
|
|
|
|
|
<BS.Col className="mb-lg-2" xs={12} lg={3}>
|
|
|
|
|
<BS.Form.Label>Name:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control name="name" ref={registerEdit} defaultValue={user.name}/>
|
2020-12-11 16:35:25 +01:00
|
|
|
</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-2" xs={12} lg={3}>
|
|
|
|
|
<BS.Form.Label>Tag:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control name="tag" ref={registerEdit} defaultValue={tag}/>
|
2020-12-11 16:35:25 +01:00
|
|
|
</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-2" xs={12} lg={3}>
|
|
|
|
|
<BS.Form.Label>Timezone:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control name="tz" ref={registerEdit} defaultValue={timezone}/>
|
2020-12-11 16:35:25 +01:00
|
|
|
{ invalidTimezone ? <BS.Form.Text>Please enter a valid <a href='https://xske.github.io/tz/' rel="noreferrer" target="_blank">timezone</a></BS.Form.Text> : "" }
|
|
|
|
|
</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-2" xs={12} lg={3}>
|
|
|
|
|
<BS.Form.Label>Avatar url:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control name="avatar_url" ref={registerEdit} defaultValue={avatar}/>
|
2020-12-11 16:35:25 +01:00
|
|
|
</BS.Col>
|
|
|
|
|
</BS.Form.Row>
|
|
|
|
|
<BS.Form.Group className="mt-3">
|
|
|
|
|
<BS.Form.Label>Description:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control maxLength="1000" as="textarea" name="description" ref={registerEdit} defaultValue={editDesc}/>
|
2020-12-11 16:35:25 +01:00
|
|
|
</BS.Form.Group>
|
|
|
|
|
<BS.Button variant="light" onClick={() => setEditMode(false)}>Cancel</BS.Button> <BS.Button variant="primary" type="submit">Submit</BS.Button>
|
|
|
|
|
</BS.Form> :
|
|
|
|
|
<><BS.Row>
|
2020-12-09 17:45:11 +01:00
|
|
|
<BS.Col className="mb-lg-3" xs={12} lg={3}><b>ID:</b> {user.id}</BS.Col>
|
2020-12-11 16:35:25 +01:00
|
|
|
<BS.Col className="mb-lg-3" xs={12} lg={3}><b>Tag:</b> {tag}</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-3" xs={12} lg={3}><b>Timezone:</b> {timezone}</BS.Col>
|
|
|
|
|
{ privacyView ? "" : <BS.Col className="mb-lg-3" xs={12} lg={3}><b>Privacy:</b> <BS.Button variant="light" size="sm" onClick={() => setPrivacyView(true)}>View</BS.Button></BS.Col> }
|
2020-12-09 09:15:55 +01:00
|
|
|
</BS.Row>
|
2020-12-12 19:19:22 +01:00
|
|
|
{ privacyMode ? <BS.Form onSubmit={handleSubmitPrivacy(submitPrivacy)}>
|
2020-12-11 16:35:25 +01:00
|
|
|
<hr/>
|
|
|
|
|
<h5>Editing privacy settings</h5>
|
|
|
|
|
<BS.Form.Row>
|
|
|
|
|
<BS.Col className="mb-lg-2" xs={12} lg={3}>
|
|
|
|
|
<BS.Form.Label>Description:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control name="description_privacy" as="select" ref={registerPrivacy}>
|
2020-12-11 16:35:25 +01:00
|
|
|
<option>public</option>
|
|
|
|
|
<option>private</option>
|
|
|
|
|
</BS.Form.Control>
|
|
|
|
|
</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-2" xs={12} lg={3}>
|
|
|
|
|
<BS.Form.Label>Member list:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control name="member_list_privacy" as="select" ref={registerPrivacy}>
|
2020-12-11 16:35:25 +01:00
|
|
|
<option>public</option>
|
|
|
|
|
<option>private</option>
|
|
|
|
|
</BS.Form.Control>
|
|
|
|
|
</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-2" xs={12} lg={3}>
|
|
|
|
|
<BS.Form.Label>Front:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control name="front_privacy" as="select" ref={registerPrivacy}>
|
2020-12-11 16:35:25 +01:00
|
|
|
<option>public</option>
|
|
|
|
|
<option>private</option>
|
|
|
|
|
</BS.Form.Control>
|
|
|
|
|
</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-2" xs={12} lg={3}>
|
|
|
|
|
<BS.Form.Label>Front history:</BS.Form.Label>
|
2020-12-12 19:19:22 +01:00
|
|
|
<BS.Form.Control name="front_history_privacy" as="select" ref={registerPrivacy}>
|
2020-12-11 16:35:25 +01:00
|
|
|
<option>public</option>
|
|
|
|
|
<option>private</option>
|
|
|
|
|
</BS.Form.Control>
|
|
|
|
|
</BS.Col>
|
|
|
|
|
</BS.Form.Row>
|
|
|
|
|
<BS.Button variant="light" onClick={() => setPrivacyMode(false)}>Cancel</BS.Button> <BS.Button variant="primary" type="submit">Submit</BS.Button>
|
|
|
|
|
<hr/>
|
|
|
|
|
</BS.Form> : privacyView ? <><hr/>
|
|
|
|
|
<h5>Viewing privacy settings</h5>
|
|
|
|
|
<BS.Row>
|
|
|
|
|
<BS.Col className="mb-lg-3" xs={12} lg={3}><b>Description:</b> {user.description_privacy}</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-3" xs={12} lg={3}><b>Member list: </b>{user.member_list_privacy}</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-3" xs={12} lg={3}><b>Front:</b> {user.front_privacy}</BS.Col>
|
|
|
|
|
<BS.Col className="mb-lg-3" xs={12} lg={3}><b>Front history:</b> {user.front_history_privacy}</BS.Col>
|
|
|
|
|
</BS.Row>
|
|
|
|
|
<BS.Button variant="light" onClick={() => setPrivacyView(false)}>Exit</BS.Button> <BS.Button variant="primary" onClick={() => setPrivacyMode(true)}>Edit</BS.Button>
|
|
|
|
|
<hr/></> : "" }
|
2020-12-09 09:15:55 +01:00
|
|
|
<p><b>Description:</b></p>
|
|
|
|
|
<p dangerouslySetInnerHTML={{__html: desc}}></p>
|
2020-12-11 16:35:25 +01:00
|
|
|
{ privacyMode ? "" : privacyView ? "" : <BS.Button variant="light" onClick={() => setEditMode(true)}>Edit</BS.Button>}</> }
|
2020-12-09 09:15:55 +01:00
|
|
|
</BS.Card.Body>
|
|
|
|
|
</BS.Card>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|