From b02584b1289614e1ec67b4c12884086456fe7e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Fra=C3=9F?= Date: Tue, 30 Apr 2024 14:05:40 +0200 Subject: [PATCH] [mod] page:register --- source/data/localization/deu.loc.json | 12 ++++++++ source/logic/backend.ts | 25 +++++++++++++--- source/pages/register/logic.ts | 41 ++++++++++++++++++++++----- 3 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 source/data/localization/deu.loc.json diff --git a/source/data/localization/deu.loc.json b/source/data/localization/deu.loc.json new file mode 100644 index 0000000..2ab3566 --- /dev/null +++ b/source/data/localization/deu.loc.json @@ -0,0 +1,12 @@ +{ + "meta": { + "identifier": "deu" + }, + "tree": { + "register.flaw.password_too_short": "das Passwort muss mindestens {{minimum_length}} Zeichen haben", + "register.flaw.password_too_long": "das Passwort darf höchstens {{maximum_length}} Zeichen haben", + "register.flaw.password_lacks_letter": "das Passwort muss einen Buchstaben beinhalten", + "register.flaw.password_lacks_number": "das Passwort muss ein Zahl beinhalten", + "register.flaw.password_lacks_special_character": "das Passwort muss ein Sonderzeichen beinhalten" + } +} diff --git a/source/logic/backend.ts b/source/logic/backend.ts index e2fea5e..4f2170a 100644 --- a/source/logic/backend.ts +++ b/source/logic/backend.ts @@ -44,12 +44,14 @@ namespace _espe.backend path : string, options : { data ?: type_input; + custom_response_handlers ?: Record Promise)>; } = {} ) : Promise { options = Object.assign( { "data": null, + "custom_response_handlers": [], }, options ); @@ -91,11 +93,16 @@ namespace _espe.backend ) .then( x => { - if ((x.status >= 200) && (x.status < 300)) { - return x.json(); + if (x.status in options.custom_response_handlers) { + return x.json().then(output_data_raw => options.custom_response_handlers[x.status](output_data_raw)); } else { - return Promise.reject(new Error("unexpected response status code")); + if ((x.status >= 200) && (x.status < 300)) { + return x.json(); + } + else { + return Promise.reject(new Error("irregular response status code")); + } } } ) @@ -327,7 +334,14 @@ namespace _espe.backend email_redirect_to_private_address : boolean; password : (null | string); } - ) : Promise + ) : Promise< + Array< + { + incident : string; + details : Record; + } + > + > { return ( abstract_call( @@ -341,6 +355,9 @@ namespace _espe.backend ), { "data": data, + "custom_response_handlers": { + 409: (output_data_raw) => output_data_raw, + }, } ) ); diff --git a/source/pages/register/logic.ts b/source/pages/register/logic.ts index 1ba0fe2..0a8ae70 100644 --- a/source/pages/register/logic.ts +++ b/source/pages/register/logic.ts @@ -3,11 +3,20 @@ lib_plankton.zoo_page.register( async (parameters, target_element) => { function set_state( state : ("load" | "fill" | "wait" | "done"), - message : (null | string) = null + messages : Array = [] ) : void { target_element.querySelector(".register").setAttribute("rel", state); - target_element.querySelector(".register-message").textContent = (message ?? ""); + target_element.querySelector(".register-message").textContent = ""; + let dom_list = document.createElement("ul"); + messages.forEach( + message => { + let dom_message = document.createElement("li"); + dom_message.textContent = message; + dom_list.appendChild(dom_message); + } + ); + target_element.querySelector(".register-message").appendChild(dom_list); } const id : int = parseInt(parameters["id"]); @@ -113,13 +122,13 @@ lib_plankton.zoo_page.register( password_confirmation : string; } = await input.read(); if (value.password_value !== value.password_confirmation) { - alert("Die Passwörter stimmen nicht überein"); - set_state("fill"); + set_state("fill", ["Die Passwörter stimmen nicht überein"]); } else { set_state("wait"); + let flaws : Array<{incident : string; details : Record;}>; try { - await _espe.backend.member_register( + flaws = await _espe.backend.member_register( id, verification, { @@ -131,9 +140,27 @@ lib_plankton.zoo_page.register( ); } catch (error) { - set_state("fill", "Da ist etwas schief gelaufen :/"); + flaws = [ + {"incident": "unhandled_error", "details": {}}, + ]; + } + if (flaws.length > 0) { + set_state( + "fill", + flaws.map( + flaw => lib_plankton.string.coin( + "{{incident}} | {{details}}", + { + "incident": flaw.incident, + "details": JSON.stringify(flaw.details), + } + ) + ) + ); + } + else { + set_state("done", ["Danke!"]); } - set_state("done", "Danke!"); } } );