Skip to content
Snippets Groups Projects
Commit c355e9fa authored by Planoetscher Daniel (Student Com20)'s avatar Planoetscher Daniel (Student Com20)
Browse files

registration added new fields, started implementing routes

parent cb7fe034
No related branches found
No related tags found
No related merge requests found
...@@ -46,7 +46,7 @@ async function extendAccessToken() { ...@@ -46,7 +46,7 @@ async function extendAccessToken() {
} }
} }
export async function register(username: string, password: string): Promise<boolean> { export async function register(username: string, password: string, realname: string | null, email: string | null): Promise<boolean> {
try { try {
const response = await fetch(`${apiRoot}/auth/register`, { const response = await fetch(`${apiRoot}/auth/register`, {
method: 'POST', method: 'POST',
...@@ -54,8 +54,10 @@ export async function register(username: string, password: string): Promise<bool ...@@ -54,8 +54,10 @@ export async function register(username: string, password: string): Promise<bool
'Content-Type': 'application/json' 'Content-Type': 'application/json'
}, },
body: JSON.stringify({ body: JSON.stringify({
username: username, username,
password: password, password,
realname,
email,
}), }),
}); });
if (response.ok) { if (response.ok) {
......
...@@ -33,20 +33,25 @@ function validateRepeatPassword(password: string, password2: string) { ...@@ -33,20 +33,25 @@ function validateRepeatPassword(password: string, password2: string) {
} }
} }
interface Props { interface Props {
onSubmit?: (username: string, password: string) => void onSubmit?: (username: string, password: string, realname?: string, email?: string) => void;
setError?: Function;
} }
export default function RegisterForm({ onSubmit }: Props) { export default function RegisterForm({ onSubmit, setError }: Props) {
const [username, setUsername] = useState<string>(''); const [username, setUsername] = useState<string>('');
const [password, setPassword] = useState<string>(''); const [password, setPassword] = useState<string>('');
const [repeatedPassword, setRepeatedPassword] = useState<string>(''); const [repeatedPassword, setRepeatedPassword] = useState<string>('');
const [realName, setRealName] = useState<string | undefined>();
const [email, setEmail] = useState<string | undefined>();
const handleSubmit = useCallback(async (e: FormEvent) => { const handleSubmit = useCallback(async (e: FormEvent) => {
e.preventDefault(); e.preventDefault();
if (await validateUsername(username) === null && validatePassword(password) === null && validateRepeatPassword(repeatedPassword, password) === null) { if (await validateUsername(username) === null && validatePassword(password) === null && validateRepeatPassword(repeatedPassword, password) === null) {
onSubmit?.(username, password); onSubmit?.(username, password, realName, email);
} else if(setError) {
setError('Please fill out the mandatory fields.');
} }
}, [onSubmit, password, username, repeatedPassword]); }, [onSubmit, password, username, repeatedPassword, setError, realName, email]);
return ( return (
<form className="register-form" onSubmit={handleSubmit}> <form className="register-form" onSubmit={handleSubmit}>
...@@ -56,6 +61,16 @@ export default function RegisterForm({ onSubmit }: Props) { ...@@ -56,6 +61,16 @@ export default function RegisterForm({ onSubmit }: Props) {
onChange={setUsername} onChange={setUsername}
validation={validateUsername} validation={validateUsername}
/> />
<TextInput
label="First- and Lastname"
name="realname"
onChange={setRealName}
/>
<TextInput
label="Email"
name="email"
onChange={setEmail}
/>
<TextInput <TextInput
label="Password" label="Password"
name="password" name="password"
......
...@@ -4,6 +4,8 @@ import LineGraph from 'components/graphs/LineGraph'; ...@@ -4,6 +4,8 @@ import LineGraph from 'components/graphs/LineGraph';
import { NavLink, useHistory } from 'react-router-dom'; import { NavLink, useHistory } from 'react-router-dom';
import { clearToken } from 'adapters/auth'; import { clearToken } from 'adapters/auth';
import './sidebar.scss'; import './sidebar.scss';
import { useEffect, useState } from 'react';
import { getCurrentUser, getUserImageUri, User } from 'adapters/user';
interface Props { interface Props {
mobileShown: boolean; mobileShown: boolean;
...@@ -11,6 +13,13 @@ interface Props { ...@@ -11,6 +13,13 @@ interface Props {
} }
export default function Sidebar({ mobileShown, setMobileShown }: Props) { export default function Sidebar({ mobileShown, setMobileShown }: Props) {
const [user, setUser] = useState<User>();
useEffect(() => {
getCurrentUser().then((user) => {
setUser(user);
}).catch(() => { });
}, [])
const history = useHistory(); const history = useHistory();
...@@ -24,10 +33,10 @@ export default function Sidebar({ mobileShown, setMobileShown }: Props) { ...@@ -24,10 +33,10 @@ export default function Sidebar({ mobileShown, setMobileShown }: Props) {
<div className="top"> <div className="top">
<div className="profile"> <div className="profile">
<div className="avatar"> <div className="avatar">
<img src={avatar} alt="Profile" /> <img src={user && getUserImageUri(user.id)} alt="Profile" />
</div> </div>
<span className="name">Daniel Planötscher</span> <span className="name">{user?.realname ?? user?.username}</span>
<span className="team">ryoko</span> {user?.realname && <span className="username">{user?.username}</span>}
</div> </div>
<Navigation /> <Navigation />
<nav className="secondary-nav"> <nav className="secondary-nav">
......
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
display: block; display: block;
} }
.team { .username {
font-size: fn.toRem(14); font-size: fn.toRem(14);
} }
} }
......
...@@ -26,7 +26,7 @@ export default function TextInput({ label, name, type, onChange, validation, com ...@@ -26,7 +26,7 @@ export default function TextInput({ label, name, type, onChange, validation, com
return ( return (
<div className={'input-element' + (type === 'textarea' ? ' textarea' : '')}> <div className={'input-element' + (type === 'textarea' ? ' textarea' : '')}>
<div className="input-field"> <div className={'input-field' + (validation ? ' mandatory' : '')}>
<label htmlFor={name}>{label}</label> <label htmlFor={name}>{label}</label>
{ {
type === 'textarea' ? type === 'textarea' ?
......
...@@ -15,6 +15,14 @@ ...@@ -15,6 +15,14 @@
position: relative; position: relative;
padding: 0 5px; padding: 0 5px;
width: 100%; width: 100%;
&.mandatory {
label {
&:after {
content: ' *';
color: s.$primary;
}
}
}
label { label {
font-size: 16px; font-size: 16px;
......
import { useCallback } from 'react'; import { useCallback, useState } from 'react';
import { Link, useHistory } from 'react-router-dom'; import { Link, useHistory } from 'react-router-dom';
import Page from 'components/layout/Page'; import Page from 'components/layout/Page';
import RegisterForm from 'components/forms/RegisterForm'; import RegisterForm from 'components/forms/RegisterForm';
import { register } from 'adapters/auth'; import { register } from 'adapters/auth';
import Callout from 'components/ui/Callout';
import './register.scss'; import './register.scss';
export default function Register() { export default function Register() {
const history = useHistory(); const history = useHistory();
const [error, setError] = useState('');
const handleSubmit = useCallback(async (username: string, password: string) => { const handleSubmit = useCallback(async (username: string, password: string, realname?: string, email?: string) => {
try { try {
if (await register(username, password)) { if (await register(username, password, realname ?? null, email ?? null)) {
history.push('/tasks'); history.push('/tasks');
} else {
setError('There was an error with your registration. Please try again!');
} }
} catch (e) { } } catch (e) { }
}, [history]); }, [history]);
...@@ -24,7 +28,8 @@ export default function Register() { ...@@ -24,7 +28,8 @@ export default function Register() {
<Page className="register-page"> <Page className="register-page">
<div className="content-container"> <div className="content-container">
<h1 className="underlined">Register</h1> <h1 className="underlined">Register</h1>
<RegisterForm onSubmit={handleSubmit} /> {error && <Callout message={error} />}
<RegisterForm onSubmit={handleSubmit} setError={setError} />
<Link className="link" to="/login">You already have an account?</Link> <Link className="link" to="/login">You already have an account?</Link>
</div> </div>
</Page> </Page>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment