| | <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> |
| |
|