From 21fec8239e7cafa6047620e776b476f5648210ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Tue, 23 May 2023 20:03:17 +1200 Subject: [PATCH] mock login --- .../apps/auth/src/auth-legacy.context.ts | 2 +- .../apps/auth/src/auth-new.context.ts | 17 +++++- .../apps/auth/src/login.element.ts | 58 +++++++++++++------ .../apps/auth/src/types.ts | 2 +- 4 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-legacy.context.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/auth-legacy.context.ts index 827d12d316..bb74714396 100644 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-legacy.context.ts +++ b/src/Umbraco.Web.UI.Client/apps/auth/src/auth-legacy.context.ts @@ -9,7 +9,7 @@ export class UmbAuthLegacyContext implements UmbAuthContext { this.authUrl = authUrl; } - login(data: LoginRequestModel): Promise { + login(data: LoginRequestModel): Promise<{ error?: string | undefined }> { throw new Error('Method not implemented.'); } } diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-new.context.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/auth-new.context.ts index 3b8b7de839..6699fc84e4 100644 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-new.context.ts +++ b/src/Umbraco.Web.UI.Client/apps/auth/src/auth-new.context.ts @@ -9,7 +9,20 @@ export class UmbAuthNewContext implements UmbAuthContext { this.authUrl = authUrl; } - login(data: LoginRequestModel): Promise { - throw new Error('Method not implemented.'); + async login(data: LoginRequestModel) { + //TODO: call authUrl with data + const { error } = await UmbMockAPI.login(data, true); + + //TODO Should the redirect be done here? or in the login element? + + return { error }; + } +} + +class UmbMockAPI { + static async login(data: LoginRequestModel, shouldFail = false) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + + return shouldFail ? { error: 'Invalid credentials' } : {}; } } diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts index 1a16e00a8e..79f6128e6f 100644 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts +++ b/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts @@ -4,6 +4,7 @@ import { customElement, property, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import './auth-layout.element'; +import { UUIButtonState } from '@umbraco-ui/uui'; import { UmbAuthContext } from './types'; import { UmbAuthLegacyContext } from './auth-legacy.context'; import { UmbAuthNewContext } from './auth-new.context'; @@ -21,6 +22,12 @@ export default class UmbLoginElement extends LitElement { @property({ type: Boolean }) isLegacy = false; + @state() + private _loginState: UUIButtonState = undefined; + + @state() + private _loginError = ''; + constructor() { super(); if (this.isLegacy) { @@ -30,10 +37,7 @@ export default class UmbLoginElement extends LitElement { } } - @state() - private _loggingIn = false; - - private _handleSubmit = (e: SubmitEvent) => { + #handleSubmit = async (e: SubmitEvent) => { e.preventDefault(); const form = e.target as HTMLFormElement; @@ -48,21 +52,28 @@ export default class UmbLoginElement extends LitElement { const password = formData.get('password') as string; const persist = formData.has('persist'); - this.#authContext.login({ username, password, persist }); + this._loginState = 'waiting'; + + const { error } = await this.#authContext.login({ username, password, persist }); + + this._loginError = error || ''; + this._loginState = error ? 'failed' : 'success'; }; - private _greetings: Array = [ - 'Happy super Sunday', - 'Happy marvelous Monday', - 'Happy tubular Tuesday', - 'Happy wonderful Wednesday', - 'Happy thunderous Thursday', - 'Happy funky Friday', - 'Happy Saturday', - ]; - @state() - private _greeting: string = this._greetings[new Date().getDay()]; + private _greeting: string = this.#greeting; + + get #greeting() { + return [ + 'Happy super Sunday', + 'Happy marvelous Monday', + 'Happy tubular Tuesday', + 'Happy wonderful Wednesday', + 'Happy thunderous Thursday', + 'Happy funky Friday', + 'Happy Saturday', + ][new Date().getDay()]; + } render() { return html` @@ -70,7 +81,7 @@ export default class UmbLoginElement extends LitElement {

${this._greeting}

-
+ Email Remember me + ${this.#renderErrorMessage()} + + state=${this._loginState}>
@@ -107,6 +120,12 @@ export default class UmbLoginElement extends LitElement { `; } + #renderErrorMessage() { + if (!this._loginError || this._loginState !== 'failed') return; + + return html`

${this._loginError}

`; + } + static styles: CSSResultGroup = [ UUITextStyles, css` @@ -114,6 +133,9 @@ export default class UmbLoginElement extends LitElement { #password { width: 100%; } + .text-danger { + color: var(--uui-color-danger-standalone); + } `, ]; } diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/types.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/types.ts index c8e43942ab..64965d0462 100644 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/types.ts +++ b/src/Umbraco.Web.UI.Client/apps/auth/src/types.ts @@ -7,5 +7,5 @@ export type LoginRequestModel = { export interface UmbAuthContext { returnUrl: string; authUrl: string; - login(data: LoginRequestModel): Promise; + login(data: LoginRequestModel): Promise<{ error?: string }>; }