|
| 1 | +import { createState } from "solid-js"; |
| 2 | +import NavLink from "../components/NavLink"; |
| 3 | +import ListErrors from "../components/ListErrors"; |
| 4 | +import { useStore } from "../store"; |
| 5 | + |
1 | 6 | export default () => { |
| 7 | + const [state, setState] = createState({ username: "", inProgress: false }), |
| 8 | + [, { register, login }] = useStore(), |
| 9 | + isLogin = location.hash.includes("login"), |
| 10 | + text = isLogin ? "Sign in" : "Sign up", |
| 11 | + link = isLogin ? ( |
| 12 | + <NavLink route="register">Need an account?</NavLink> |
| 13 | + ) : ( |
| 14 | + <NavLink route="login">Have an account?</NavLink> |
| 15 | + ), |
| 16 | + handleSubmit = e => { |
| 17 | + e.preventDefault(); |
| 18 | + setState({ inProgress: true }); |
| 19 | + const p = isLogin |
| 20 | + ? login(state.email, state.password) |
| 21 | + : register(state.username, state.email, state.password); |
| 22 | + p.then(() => (location.hash = "/")) |
| 23 | + .catch(errors => setState({ errors })) |
| 24 | + .finally(() => setState({ inProgress: false })); |
| 25 | + }; |
| 26 | + |
2 | 27 | return ( |
3 | 28 | <div class="auth-page"> |
4 | 29 | <div class="container page"> |
5 | 30 | <div class="row"> |
6 | 31 | <div class="col-md-6 offset-md-3 col-xs-12"> |
7 | | - <h1 class="text-xs-center">Sign up</h1> |
8 | | - <p class="text-xs-center"> |
9 | | - <a href="">Have an account?</a> |
10 | | - </p> |
11 | | - |
12 | | - <ul class="error-messages"> |
13 | | - <li>That email is already taken</li> |
14 | | - </ul> |
15 | | - |
16 | | - <form> |
17 | | - <fieldset class="form-group"> |
18 | | - <input |
19 | | - class="form-control form-control-lg" |
20 | | - type="text" |
21 | | - placeholder="Your Name" |
22 | | - /> |
23 | | - </fieldset> |
| 32 | + <h1 class="text-xs-center" textContent={text} /> |
| 33 | + <p class="text-xs-center">{link}</p> |
| 34 | + <ListErrors errors={state.errors} /> |
| 35 | + <form onSubmit={handleSubmit}> |
| 36 | + { !isLogin && ( |
| 37 | + <fieldset class="form-group"> |
| 38 | + <input |
| 39 | + class="form-control form-control-lg" |
| 40 | + type="text" |
| 41 | + placeholder="Username" |
| 42 | + value={state.username} |
| 43 | + onChange={e => setState({ username: e.target.value })} |
| 44 | + /> |
| 45 | + </fieldset> |
| 46 | + )} |
24 | 47 | <fieldset class="form-group"> |
25 | 48 | <input |
26 | 49 | class="form-control form-control-lg" |
27 | 50 | type="text" |
28 | 51 | placeholder="Email" |
| 52 | + value={state.email} |
| 53 | + onChange={e => setState({ email: e.target.value })} |
29 | 54 | /> |
30 | 55 | </fieldset> |
31 | 56 | <fieldset class="form-group"> |
32 | 57 | <input |
33 | 58 | class="form-control form-control-lg" |
34 | 59 | type="password" |
35 | 60 | placeholder="Password" |
| 61 | + value={state.password} |
| 62 | + onChange={e => setState({ password: e.target.value })} |
36 | 63 | /> |
37 | 64 | </fieldset> |
38 | | - <button class="btn btn-lg btn-primary pull-xs-right"> |
39 | | - Sign up |
40 | | - </button> |
| 65 | + <button |
| 66 | + class="btn btn-lg btn-primary pull-xs-right" |
| 67 | + type="submit" |
| 68 | + disabled={state.inProgress} |
| 69 | + textContent={text} |
| 70 | + /> |
41 | 71 | </form> |
42 | 72 | </div> |
43 | 73 | </div> |
|
0 commit comments