diff options
| author | 2025-10-23 01:15:26 +0700 | |
|---|---|---|
| committer | 2025-10-23 01:15:26 +0700 | |
| commit | 0d261d2f7d080b610f50102576073e334a89e8cb (patch) | |
| tree | 3f86877a48cdb02486d6b5cb771a420c82c7eacf /views/pages | |
| parent | 695889f42896c1e3f1290a588ac1c5483d0124f0 (diff) | |
| download | web-0d261d2f7d080b610f50102576073e334a89e8cb.tar.gz web-0d261d2f7d080b610f50102576073e334a89e8cb.zip | |
feat: email linking
Diffstat (limited to 'views/pages')
| -rw-r--r-- | views/pages/global-map.html | 7 | ||||
| -rw-r--r-- | views/pages/user-page.html | 96 |
2 files changed, 101 insertions, 2 deletions
diff --git a/views/pages/global-map.html b/views/pages/global-map.html index d0433e9..8be99bf 100644 --- a/views/pages/global-map.html +++ b/views/pages/global-map.html @@ -44,6 +44,9 @@ <div id="sidebar" class="bg-sidebar block fixed shadow-[0_0_0.4rem_black] z-1001 w-[5rem] h-auto"> <div class="text-[3rem] text-stroke-(--sidebar-stroke-color) text-stroke-[0.1dvw] flex flex-col gap-0 relative z-1001"> + <a href="./" class="w-[5rem] h-[5rem]"> + <i class="fas fa-circle-left flex w-full h-full content-center text-center text-sidebar hover:bg-background-dark transition-colors duration-300 rounded-lg"></i> + </a> <a href="/{{ .Lang }}" class="w-[5rem] h-[5rem]"> <i class="fas fa-home flex w-full h-full content-center text-center text-sidebar hover:bg-background-dark transition-colors duration-300 rounded-lg"></i> </a> @@ -54,8 +57,8 @@ <i class="fas fa-map flex w-full h-full content-center text-center text-sidebar hover:bg-background-dark transition-colors duration-300 rounded-lg"></i> </a> <i onclick="toggleThemeWheel();" id="theme-button" class="fas fa-swatchbook flex w-[5rem] h-[5rem] content-center text-center text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 rounded-lg"></i> - <a href="./" class="w-[5rem] h-[5rem]"> - <i class="fas fa-circle-left flex w-full h-full content-center text-center text-sidebar hover:bg-background-dark transition-colors duration-300 rounded-lg"></i> + <a href="/{{ .Lang }}/user" id="sidebar-user-button" class="w-[5rem] h-[5rem]"> + <i onclick="return changeUrl('/{{ .Lang }}/user');" class="fas fa-user flex w-full h-full content-center text-center text-sidebar hover:bg-background-dark transition-colors duration-300 rounded-lg"></i> </a> </div> <div class="theme-wheel" id="theme-wheel"> diff --git a/views/pages/user-page.html b/views/pages/user-page.html new file mode 100644 index 0000000..1632670 --- /dev/null +++ b/views/pages/user-page.html @@ -0,0 +1,96 @@ +{{ define "body" }} +<div class="bg-background-light flex flex-col inset-shadow-[0_0_0.4rem_black] px-8 py-4 overflow-y-auto"> + <form id="email-form" class="w-full mb-2 flex flex-col relative" + hx-get="/api/v1/email/is-in-verification" hx-target="#email-message" hx-swap="outerHTML" hx-trigger="load" hx-indicator="this"> + <div class="flex flex-row w-full mb-4 z-21"> + <div class="flex flex-col flex-3/5 grow-0"> + <label class="block text-main-medium font-bold mb-1 z-22"> + {{ .L.UserProfile.EmailHeader }} + </label> + <input class="bg-(--background-medium-color) appearance-none border-(--background-medium-color) rounded ml-6 mr-4 py-2 px-4 text-main-medium leading-tight inset-shadow-[0_0_0.4rem_black] focus:outline-none focus:bg-(--background-light-color) focus:text-main-hard z-22" + id="email-input" name="email" type="text" value="{{ .Email }}" placeholder="{{ .L.UserProfile.TypeEmail }}" maxlength="64" + data-validated-email="{{ .Email }}" onchange="checkIfValidated(this);"> + </div> + </div> + <button class="w-1/3 mx-auto bg-(--main-hard-color) hover:bg-(--main-medium-color) active:bg-(--main-soft-color) active:inset-shadow-[0.2em_0.2em_0.2rem_black] transition-colors transition-300 text-(--background-light-color) font-bold py-2 px-4 rounded z-22" + hx-post="/api/v1/email/send-verification-code" hx-target="#email-message" hx-swap="outerHTML" hx-indicator="#email-form"> + {{ .L.UserProfile.SendCodeButton }} + </button> + </form> + <div id="email-message"></div> + <hr class="my-2 border-t-4 border-dotted border-main-hard"> + <form id="email-verification-form" class="w-full mb-2 flex flex-col relative hidden" + {{ if .EmailCode }}hx-post="/api/v1/email/verify" hx-target="#verification-message" hx-swap="outerHTML" hx-trigger="load" hx-indicator="this"{{ end }}> + <div class="flex flex-row w-full mb-4 z-21"> + <div class="flex flex-col flex-2/5 grow-0"> + <label class="block text-main-medium font-bold ml-1 z-22"> + {{ .L.UserProfile.VerificationCodeHeader }} + </label> + <input class="bg-(--background-medium-color) appearance-none border-(--background-medium-color) rounded ml-6 mr-4 py-2 px-4 text-main-medium leading-tight inset-shadow-[0_0_0.4rem_black] focus:outline-none focus:bg-(--background-light-color) focus:text-main-hard z-22" + name="email_code" type="text" value="{{ .EmailCode }}" placeholder="0123456789ABCDEF" maxlength="16"> + </div> + </div> + <button class="w-1/3 mx-auto bg-(--main-hard-color) hover:bg-(--main-medium-color) active:bg-(--main-soft-color) active:inset-shadow-[0.2em_0.2em_0.2rem_black] transition-colors transition-300 text-(--background-light-color) font-bold py-2 px-4 rounded z-22" + hx-post="/api/v1/email/verify" hx-target="#verification-message" hx-swap="outerHTML" hx-indicator="#email-verification-form"> + {{ .L.UserProfile.VerifyButton }} + </button> + </form> + <div id="verification-message"></div> +</div> + +<script> +htmx.on("htmx:beforeSwap", (e) => { + if (e.detail.xhr.status === 422) { + e.detail.shouldSwap = true; + e.detail.isError = false; + } +}); + +var formAllowTimeout; +var verificationHideTimeout; + +var url = new URL(window.location.href); +url.searchParams.delete('email_code'); +window.history.pushState({}, '', url.toString()); + +htmx.on("htmx:afterSwap", (e) => { + emailMessage = htmx.find("#email-message"); + verificationMessage = htmx.find("#verification-message"); + emailForm = htmx.find("#email-form"); + emailVerificationForm = htmx.find("#email-verification-form"); + tryAgainTimeDiff = parseInt(emailMessage.dataset.strikedEndTime || "0") - new Date().getTime(); + verificationWaitingTimeDiff = parseInt(emailMessage.dataset.codeExpiryTime || "0") - new Date().getTime(); + + if (tryAgainTimeDiff > 0) { + emailForm.classList.add("disabled"); + formAllowTimeout = setTimeout(() => { + emailForm.classList.remove("disabled"); + emailMessage.classList.add("hidden"); + }, tryAgainTimeDiff); + } else { + emailForm.classList.remove("disabled"); + } + + if (verificationWaitingTimeDiff > 0) { + verificationHideTimeout = setTimeout(() => emailVerificationForm.classList.add("hidden"), verificationWaitingTimeDiff); + emailVerificationForm.classList.remove("hidden"); + } else { + emailVerificationForm.classList.add("hidden"); + } + + if ((verificationMessage.dataset.hideVerificationPanel || "false") == "true") { + emailVerificationForm.classList.add("hidden"); + } +}); + +function checkIfValidated(elem) { + if ((elem.dataset.validatedEmail != "") && (elem.value == elem.dataset.validatedEmail)) { + elem.classList.add("!bg-green-300/20"); + } else { + elem.classList.remove("!bg-green-300/20"); + } +} + +checkIfValidated(htmx.find("#email-input")); +</script> +{{ end }}
\ No newline at end of file |