diff options
Diffstat (limited to 'ufund-ui/src/app/components')
3 files changed, 141 insertions, 0 deletions
diff --git a/ufund-ui/src/app/components/signup/signup.component.css b/ufund-ui/src/app/components/signup/signup.component.css new file mode 100644 index 0000000..2a10016 --- /dev/null +++ b/ufund-ui/src/app/components/signup/signup.component.css @@ -0,0 +1,16 @@ +:host, .border { +    display: flex; +    flex-direction: column; +    max-width: 300px; +    gap: 5px +} + +.border { +    border-style: solid; +    border-width: 1px; +    padding: 10px; +    margin: 10px; +    position: absolute; +    background-color: white; +    box-shadow: 0 0 10px 10px black; +} diff --git a/ufund-ui/src/app/components/signup/signup.component.html b/ufund-ui/src/app/components/signup/signup.component.html new file mode 100644 index 0000000..742b8cf --- /dev/null +++ b/ufund-ui/src/app/components/signup/signup.component.html @@ -0,0 +1,7 @@ +<p>Signup:</p> +<input placeholder="Username" type="text" #username> +<input placeholder="Password" type="password" (input)="checkPasswordStrength(password.value)" #password> +<button type="button" (click)="signup(username.value, password.value)">Create Account</button> +<span *ngIf="statusText">{{statusText | async}}</span> +<span *ngIf="strength">{{strength | async}}</span> +<span *ngIf="showSuccessMessage | async">Account created <a routerLink="/login">Proceed to login</a></span> diff --git a/ufund-ui/src/app/components/signup/signup.component.ts b/ufund-ui/src/app/components/signup/signup.component.ts new file mode 100644 index 0000000..48c6387 --- /dev/null +++ b/ufund-ui/src/app/components/signup/signup.component.ts @@ -0,0 +1,118 @@ +import { Component } from '@angular/core'; +import {UsersService} from '../../services/users.service'; +import {Router} from '@angular/router'; +import {BehaviorSubject} from 'rxjs'; + +@Component({ +  selector: 'app-signup', +  standalone: false, +  templateUrl: './signup.component.html', +  styleUrl: './signup.component.css' +}) +export class SignupComponent { + +    protected statusText = new BehaviorSubject("") +    protected showSuccessMessage = new BehaviorSubject(false) +    protected passwordStrength = new BehaviorSubject("") +    protected strength = new BehaviorSubject(0) + +    constructor( +        protected usersService: UsersService, +        protected router: Router, +    ) {} + +    signup(username: string | null, password: string | null) { +        console.log(`attempting to sign up with ${username} ${password}`) +        if (!username || !password) { +            return; +        } + +        this.usersService.createUser(username, password).then(() => { +            this.showSuccessMessage.next(true); +        }).catch(ex => { +            this.statusText.next("Unable to create account: " + friendlyHttpStatus[ex.status]) +            console.log(ex) +        }) +    } + +    checkPasswordStrength(password: string) { +        this.statusText.next("") +        if (password.match(/[^!-~]/g)) { +            this.statusText.next("Invalid characters") +            return +        } + +        let strength = 0; +        if (password.length > 6) { +            strength++ +            console.log("Long") +        } +        if (password.length > 12) { +            strength++ +            console.log("Longer") +        } +        if (password.match(/[a-z]/g)) { +            strength++ +            console.log("a") +        } +        if (password.match(/[0-9]/g)) { +            strength++ +            console.log("0") +        } +        if (password.match(/[A-Z]/g)) { +            strength++ +            console.log("A") +        } +        if (password.match(/[!-/]/g)) { +            strength++ +            console.log("!") +        } + +        this.strength.next(strength) +    } + +} + +let friendlyHttpStatus: {[key: number]: string} = { +    200: 'OK', +    201: 'Created', +    202: 'Accepted', +    203: 'Non-Authoritative Information', +    204: 'No Content', +    205: 'Reset Content', +    206: 'Partial Content', +    300: 'Multiple Choices', +    301: 'Moved Permanently', +    302: 'Found', +    303: 'See Other', +    304: 'Not Modified', +    305: 'Use Proxy', +    306: 'Unused', +    307: 'Temporary Redirect', +    400: 'Bad Request', +    401: 'Unauthorized', +    402: 'Payment Required', +    403: 'Forbidden', +    404: 'Not Found', +    405: 'Method Not Allowed', +    406: 'Not Acceptable', +    407: 'Proxy Authentication Required', +    408: 'Request Timeout', +    409: 'Conflict', +    410: 'Gone', +    411: 'Length Required', +    412: 'Precondition Required', +    413: 'Request Entry Too Large', +    414: 'Request-URI Too Long', +    415: 'Unsupported Media Type', +    416: 'Requested Range Not Satisfiable', +    417: 'Expectation Failed', +    418: 'I\'m a teapot', +    429: 'Too Many Requests', +    500: 'Internal Server Error', +    501: 'Not Implemented', +    502: 'Bad Gateway', +    503: 'Service Unavailable', +    504: 'Gateway Timeout', +    505: 'HTTP Version Not Supported', +};  | 
