| <script lang="ts"> |
| import { createEventDispatcher } from "svelte"; |
| import { PUBLIC_APP_ASSETS, PUBLIC_ORIGIN } from "$env/static/public"; |
| import { page } from "$app/stores"; |
| import TextModal from "$lib/components/TextModal.svelte"; |
| import { Checkbox } from "svelte-mui"; |
| import Modal from "$lib/components/BigModal.svelte"; |
| import { api_key_writable, email_addr_writable, is_logged_writable, is_magic_writable } from "../../routes/LayoutWritable"; |
| import { goto } from "$app/navigation"; |
| import { base } from "$app/paths"; |
| import { getApiKey } from "../../routes/tools"; |
| |
| let email = ""; |
| let email2 = ""; |
| let password = ""; |
| let showPassword = false; |
| let magicSuccess = false; |
| let loginFail = false; |
| let magicFail = false; |
| let magicView = false; |
| let subscribeNewsletter = true; |
| let error; |
| let hasAccount = true; |
| |
| const dispatch = createEventDispatcher<{ close: void }>(); |
| |
| function toggleAccountStatus() { |
| hasAccount = !hasAccount; |
| magicView = false; |
| } |
| |
| function setMagicView() { |
| hasAccount = !hasAccount; |
| magicView = true; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| async function sendMagicLink(event: { preventDefault: () => void }) { |
| event.preventDefault(); |
| |
| const data = { |
| email: email2, |
| subscribeNewsletter, |
| }; |
| |
| try { |
| const response = await fetch("https://cloud.mithrilsecurity.io/api/auth/blindChatRegister", { |
| method: "POST", |
| credentials: "include", |
| headers: { |
| "Content-Type": "application/json", |
| }, |
| body: JSON.stringify(data), |
| }); |
| dataLayer.push({'event': 'signup-start'}); |
| if (response.ok) { |
| magicSuccess = true; |
| } else { |
| magicFail = true; |
| } |
| } catch (error) { |
| console.error("Network error", error); |
| } |
| } |
| |
| async function apiCallLogin(arg: { email: string; password: string; }) { |
| const data = { |
| email, |
| password, |
| }; |
| let result = { |
| success:true, |
| error:"", |
| } |
| console.log("logging in...") |
| try { |
| const response = await fetch('https://cloud.mithrilsecurity.io/api/auth/login', { |
| method: 'POST', |
| credentials: "include", |
| headers: { |
| 'Content-Type': 'application/json' |
| }, |
| body: JSON.stringify(data) |
| }); |
| if (response.ok) |
| { |
| console.log(await response.text()) |
| is_logged_writable.set(true) |
| api_key_writable.set(await getApiKey()); |
| isLogged() |
| result.success = true; |
| } |
| else { |
| loginFail = true; |
| console.error("Login failed"); |
| result.error = "Login failed"; |
| } |
| } catch (error) { |
| console.error("Network error", error); |
| result.error = "Login failed"; |
| } |
| return result; |
| } |
| |
| async function registerUser(arg: { email: string; }) { |
| const data = { |
| email, |
| }; |
| console.log("registering user") |
| try { |
| const response = await fetch('https://cloud.mithrilsecurity.io/api/auth/blindChatRegister', { |
| method: 'POST', |
| headers: { |
| 'Content-Type': 'application/json' |
| }, |
| body: JSON.stringify(data) |
| }); |
| dataLayer.push({'event': 'signup-start'}); |
| if (response.ok) |
| { |
| magicSuccess = true; |
| api_key_writable.set(await getApiKey()); |
| } |
| else { |
| magicFail = true; |
| } |
| } catch (error) { |
| console.error("Network error", error); |
| } |
| } |
| |
| function reloadSession() { |
| |
| } |
| |
| function submitForm() { |
| if(email && password) { |
| apiCallLogin({email, password}) |
| .then(result => { |
| console.log(result) |
| if(result.success) { |
| reloadSession(); |
| goto(`${base}/`, { invalidateAll: true }); |
| } else { |
| error = result.error; |
| } |
| }); |
| } |
| } |
| |
| |
| function handleClickShowPassword() { |
| showPassword = !showPassword; |
| } |
| |
| </script> |
|
|
| <Modal on:close> |
| <script> |
| let overlayComp |
| <Overlay bind:this={overlayComp} /> |
| overlayComp.setTheme(); |
| </script> |
| <div class="border rounded-2xl border-mithril-border pt-4 px-12 pb-12 bg-login text-white md:min-w-[450px]"> |
| <div class = "pb-4 flex justify-end"> |
| <div> |
| |
| <button type="button" class="underline" on:click={toggleAccountStatus}> |
| {#if hasAccount} |
| I don't have an account |
| {:else if magicView} |
| Return |
| {:else} |
| I have an account |
| {/if} |
| </button> |
| </div> |
| </div> |
| <div class="flex justify-center"> |
| |
| <div class="font-bold text-3xl text-mithril-yellow"> |
| {#if hasAccount} |
| Sign in |
| {:else if magicView} |
| Sign in |
| {:else} |
| Sign up |
| {/if} |
| </div> |
| </div> |
| |
| {#if hasAccount} |
| <script> |
| document.getElementById("login").style.display = "block"; |
| </script> |
| <div id="login" class="py-4" style="max-width: 350px"> |
| <form on:submit={submitForm}> |
| <div class="pt-4 flex justify-between items-center flex-wrap gap-2.5 border-1 border-gray"> |
| |
| <input id="email1" |
| class="bg-login rounded-2xl text-white border border-mithril-border p-2 w-full" |
| type="email" bind:value={email} placeholder="Email" /> |
| </div> |
| <div class="py-4 flex justify-between items-center flex-wrap gap-2.5 border-1 border-gray relative"> |
| |
| <input |
| type="text" |
| class="bg-login rounded-2xl text-white border border-mithril-border p-2 w-full" |
| bind:value={password} |
| placeholder="Password" |
| class:hidden={!showPassword} |
| /> |
| |
| <input |
| class="bg-login rounded-2xl text-white border border-mithril-border p-2 w-full" |
| type="password" |
| bind:value={password} |
| placeholder="Password" |
| class:hidden={showPassword} |
| /> |
| {#if !showPassword} |
| |
| <img |
| class="css-vubbuv toggle-visibility-icon absolute right-3 top-1/2 transform -translate-y-1/2 cursor-pointer" |
| alt="show password button" |
| src="{PUBLIC_ORIGIN || $page.url.origin}{base}/{PUBLIC_APP_ASSETS}/show-password.png" |
| title="show password button" |
| width="20" |
| height="20" |
| on:click={handleClickShowPassword} |
| /> |
| {:else} |
| |
| <img |
| class="css-vubbuv toggle-visibility-icon absolute right-3 top-1/2 transform -translate-y-1/2 cursor-pointer" |
| alt="help password button" |
| src="{PUBLIC_ORIGIN || $page.url.origin}{base}/{PUBLIC_APP_ASSETS}/hide-password.png" |
| title="hide password button" |
| width="20" |
| height="20" |
| on:click={handleClickShowPassword} |
| /> |
| {/if} |
| </div> |
| |
| <div class="py-3 flex justify-center items-center flex-wrap gap-2.5 border-1 border-gray"> |
| <button class="p-3 flex justify-right content-center bg-mithril-yellow text-black rounded-lg min-w-36 py-2 px-3 text-center" |
| type="submit"> |
| Sign in |
| </button> |
| </div> |
| {#if loginFail} |
| <TextModal title="Login failed" text="Please check your credentials try again" on:close={() => (loginFail = false)}/> |
| {/if} |
| <div class="p-3 underline justify-right text-right"> |
| |
| |
| |
| </div> |
| </form> |
| <div class="flex items-center justify-center relative"> |
| <div class="absolute top-1/2 left-0 right-0 h-px bg-gray-300"></div> |
| <span class="MuiDivider-wrapper css-c1ovea relative z-10 px-4 bg-login">OR</span> |
| </div> |
| |
| <div class="pt-4 pb-0 flex justify-center items-center flex-wrap gap-2.5"> |
| <button class="bg-login rounded-2xl text-white border border-mithril-yellow p-2 w-full" |
| on:click={setMagicView}>Sign in with magic link ✨</button> |
| </div> |
| </div> |
| |
| {:else if magicView} |
| <script> |
| document.getElementById("login").style.display = "none"; |
| </script> |
| <div class="relative flex flex-col space-y-4 pt-4" style="max-width: 350px"> |
| <div class="py-3 flex justify-between items-center flex-wrap gap-2.5 border-1 border-gray"> |
| <input |
| class="bg-login rounded-2xl text-white border border-mithril-border p-2 w-full" |
| type="email" bind:value={email2} placeholder="Email" /> |
| </div> |
| <div class="flex justify-center items-center flex-wrap gap-2.5 border-1 order-gray"> |
| <button class="p-3 flex content-center bg-yellow-500 text-black rounded-lg min-w-36 py-2 px-3 text-center" |
| on:click={sendMagicLink}>Sign in with magic link ✉️ </button> |
| {#if magicSuccess} |
| <TextModal title="Magic link sent" text="✅ Check your emails for your magic login link" on:close={() => (magicSuccess = false)}/> |
| {:else if magicFail} |
| <TextModal title="Error" text="Please check your email address is valid and try again" on:close={() => (magicFail = false)}/> |
| {/if} |
| <p class="pt-5"> |
| By using our services, you agree to the{' '}<a class="text-mithril-yellow" href="https://www.mithrilsecurity.io/privacy-policy" target="_blank">Terms of Service</a>. |
| </p> |
| </div> |
| </div> |
| |
| {:else if !hasAccount && !magicView} |
| |
| <script> |
| document.getElementById("login").style.display = "none"; |
| </script> |
| <div class="relative flex flex-col space-y-4 pt-4" style="max-width: 350px"> |
| |
| <div class="pt-4 flex justify-between items-center flex-wrap gap-2.5 border-1 border-gray"> |
| <input id="email1" |
| class="bg-login rounded-2xl text-white border border-mithril-border p-2 w-full" |
| type="email" bind:value={email} placeholder="Email" /> |
| </div> |
| <div class="flex justify-center items-center flex-wrap gap-2.5 border-1 order-gray"> |
| <button class="p-3 flex content-center bg-yellow-500 text-black rounded-lg min-w-36 py-2 px-3 text-center" |
| on:click={registerUser}>Sign up</button> |
| {#if magicSuccess} |
| <TextModal title="Thank you" text="✅ Please click on the magic link we have sent you to access your account" on:close={() => (magicSuccess = false)}/> |
| {:else if magicFail} |
| <TextModal title="Error" text="Please check your email address is valid and try again" on:close={() => (magicFail = false)}/> |
| {/if} |
| <p class="pt-5"> |
| By signing up, you agree to the{' '}<a class="text-mithril-yellow" href="https://www.mithrilsecurity.io/privacy-policy" target="_blank">Terms of Service</a>. |
| </p> |
| </div> |
| </div> |
| {/if} |
| </div> |
| </Modal> |
|
|