@ -18,6 +18,7 @@ import { HashLink as Link } from 'react-router-hash-link';
import TestHeader from './TestHeader' ; // Test Header!
import TestPanel from './TestPanel' ; // Dudley's Test Panel
import md5 from 'md5' ;
const axios = require ( 'axios' ) ;
const parse = require ( 'csv-parse/lib/sync' )
@ -570,11 +571,113 @@ function DamageCalculator(p) {
< / >
}
function FormField ( p ) {
return < > < label className = "formField" for = { p . field } > { p . label } < / l a b e l > {
p . type === "toggle" ? < > < Toggle id = { p . field } checked = { p . checked } onChange = { p . onChange } disabled = { p . loading } / > < label className = "formDescription" for = { p . field } > { p . checked ? < b > YES < / b > : < b > N O < / b > } < / l a b e l > < / > : < i n p u t t y p e = { p . t y p e ? ? " t e x t " } d i s a b l e d = { p . l o a d i n g } i d = { p . f i e l d } m a x l e n g t h = { p . m a x l e n g t h } v a l u e = { p . v a l u e } c h e c k e d = { p . c h e c k e d } o n C h a n g e = { p . o n C h a n g e } p l a c e h o l d e r = { p . p l a c e h o l d e r } / > } < l a b e l c l a s s N a m e = " f o r m D e s c r i p t i o n " f o r = { p . f i e l d } > { p . t o o l t i p } < / l a b e l > < / >
}
function LoginForm ( p ) {
const [ username , setUsername ] = useState ( "" )
const [ password , setPassword ] = useState ( "" )
const [ rememberMe , setRememberMe ] = useState ( false )
return < > < ExpandTooltip id = "tooltip-username" tooltip = "Enter a username (4-20 characters, alphanumeric characters only)" > < label className = "formField" for = "username" > Username : < /label><input id="username" value={username} onChange={(p)=>{setUsername(p.currentTarget.value)}} placeholder="Username"/ > < /ExpandTooltip></ >
const [ error , setError ] = useState ( "" )
const [ loading , setLoading ] = useState ( false )
function SubmitLogin ( ) {
setError ( "" )
setLoading ( true )
axios . post ( GetBackendURL ( p ) + "/login" , {
username : username ,
password : md5 ( password )
} )
. then ( ( data ) => {
if ( data . data . verified ) {
p . setLOGGEDINUSER ( username )
p . setLOGGEDINHASH ( md5 ( password ) )
setUsername ( "" )
setPassword ( "" )
setRememberMe ( false )
} else {
setError ( "Could not authenticate!" )
}
} )
. catch ( ( err ) => {
setError ( err ? . message ? ? err ) ;
} )
. then ( ( ) => {
setLoading ( false )
} )
}
return < >
< Box title = "Login Form" >
{ loading ?
< img src = { process . env . PUBLIC _URL + "/spinner.gif" } alt = "" style = { { background : "linear-gradient(white,#bca9f5)" , marginTop : "10px" } } / >
: < > < h3 className = "formError" > { error } < / h 3 >
< FormField field = "username" label = "Username: " value = { username } maxlength = { 20 } onChange = { ( p ) => { setUsername ( p . currentTarget . value ) } } placeholder = "Username" / > < br / >
< FormField field = "password" label = "Password: " type = "password" value = { password } onChange = { ( p ) => { setPassword ( p . currentTarget . value ) } } placeholder = "Password" / > < br / >
< FormField field = "rememberMe" label = "Remember Me " type = "toggle" checked = { rememberMe } onChange = { ( p ) => { setRememberMe ( p . currentTarget . checked ) } } / > < br / >
< button type = "submit" onClick = { SubmitLogin } > Login < /button></ >
}
< /Box></ >
}
function RegisterForm ( p ) {
const [ username , setUsername ] = useState ( "" )
const [ password , setPassword ] = useState ( "" )
const [ password2 , setPassword2 ] = useState ( "" )
const [ rememberMe , setRememberMe ] = useState ( false )
const [ error , setError ] = useState ( "" )
const [ loading , setLoading ] = useState ( false )
function SubmitRegister ( ) {
setError ( "" )
setLoading ( true )
try {
if ( username . length < 4 ) { throw "Username must be at least 4 characters in length." }
if ( username . length > 20 ) { throw "Username must be less than 21 characters in length." }
if ( password . length < 6 ) { throw "Password must contain at least 6 characters." }
if ( password !== password2 ) { throw "Password fields must match." }
} catch ( err ) {
setError ( err )
setLoading ( false )
return
}
axios . post ( GetBackendURL ( p ) + "/register" , {
username : username ,
password : md5 ( password )
} )
. then ( ( data ) => {
if ( data . data . verified ) {
p . setLOGGEDINUSER ( username )
p . setLOGGEDINHASH ( md5 ( password ) )
setUsername ( "" )
setPassword ( "" )
setRememberMe ( false )
} else {
setError ( "Could not authenticate!" )
}
} )
. catch ( ( err ) => {
setError ( err ? . message ? ? err ) ;
} )
. then ( ( ) => {
setLoading ( false )
} )
}
return < >
< Box title = "Registration Form" >
{ loading ?
< img src = { process . env . PUBLIC _URL + "/spinner.gif" } alt = "" style = { { background : "linear-gradient(white,#bca9f5)" , marginTop : "10px" } } / >
: < > < h3 className = "formError" > { error } < / h 3 >
< FormField field = "username" label = "Username: " value = { username } maxlength = { 20 } onChange = { ( p ) => { setUsername ( p . currentTarget . value ) } } placeholder = "Username" tooltip = "Enter a username (4-20 characters, alphanumeric only)" / > < br / >
< FormField field = "password" label = "Password: " type = "password" value = { password } onChange = { ( p ) => { setPassword ( p . currentTarget . value ) } } placeholder = "Password" tooltip = "Enter a password (6 or more characters)" / > < br / >
< FormField field = "password2" label = "Verify Password: " type = "password" value = { password2 } onChange = { ( p ) => { setPassword2 ( p . currentTarget . value ) } } placeholder = "Verify Password" tooltip = "Enter password again." / > < br / >
< FormField field = "rememberMe" label = "Remember Me " type = "toggle" checked = { rememberMe } onChange = { ( p ) => { setRememberMe ( p . currentTarget . checked ) } } / > < br / >
< button type = "submit" onClick = { SubmitRegister } > Login < /button></ >
}
< /Box></ >
}
@ -684,14 +787,14 @@ function App() {
< title > { APP _TITLE + " - Login" } < / t i t l e >
< / H e l m e t >
< TestHeader / >
< LoginForm LOGGEDINUSER = { LOGGEDINUSER } LOGGEDINHASH = { LOGGEDINHASH } setLOGGEDINHASH = { setLOGGEDINHASH } setLOGGEDINUSER = { setLOGGEDINUSER } / >
< LoginForm BACKENDURL = { BACKENDURL } TESTMODE = { TESTMODE } LOGGEDINUSER = { LOGGEDINUSER } LOGGEDINHASH = { LOGGEDINHASH } setLOGGEDINHASH = { setLOGGEDINHASH } setLOGGEDINUSER = { setLOGGEDINUSER } / >
< / R o u t e >
< Route path = { process . env . PUBLIC _URL + "/register" } >
< Helmet >
< title > { APP _TITLE + " - Register" } < / t i t l e >
< / H e l m e t >
< TestHeader / >
Register form here .
< RegisterForm BACKENDURL = { BACKENDURL } TESTMODE = { TESTMODE } LOGGEDINUSER = { LOGGEDINUSER } LOGGEDINHASH = { LOGGEDINHASH } setLOGGEDINHASH = { setLOGGEDINHASH } setLOGGEDINUSER = { setLOGGEDINUSER } / >
< / R o u t e >
< Route path = { process . env . PUBLIC _URL + "/formula" } >
< DamageCalculator / >