| | <script lang="ts"> |
| | import { base } from "$app/paths"; |
| | import { createEventDispatcher } from "svelte"; |
| | import Login from "$lib/components/Login.svelte"; |
| | import Logo from "$lib/components/icons/Logo.svelte"; |
| | import { page } from "$app/stores"; |
| | import { PUBLIC_APP_NAME, PUBLIC_ORIGIN, PUBLIC_APP_ASSETS } from "$env/static/public"; |
| | import NavConversationItem from "./NavConversationItem.svelte"; |
| | import type { LayoutData } from "../../routes/$types"; |
| | import { api_key_writable, is_logged_writable, is_magic_writable, email_addr_writable } from "../../routes/LayoutWritable"; |
| |
|
| | const dispatch = createEventDispatcher<{ |
| | shareConversation: { id: string; title: string }; |
| | clickSettings: void; |
| | clickLogout: void; |
| | }>(); |
| |
|
| | export let conversations: Array<{ |
| | id: string; |
| | title: string; |
| | }> = []; |
| |
|
| |
|
| | export let canLogin: boolean; |
| | export let signedIn: boolean; |
| | export let user: LayoutData["user"]; |
| |
|
| | export let loginModalVisible; |
| |
|
| | let isSubMenuOpen: boolean = false; |
| | let magic = false; |
| | let isLogged = false; |
| |
|
| | is_magic_writable.subscribe((val) => { |
| | magic = val; |
| | }) |
| |
|
| | is_logged_writable.subscribe((val) => { |
| | isLogged = val; |
| | }) |
| |
|
| | let email_addr = "" |
| |
|
| | email_addr_writable.subscribe((val) => { |
| | email_addr = val |
| | }) |
| |
|
| | function toggleSubMenu() { |
| | isSubMenuOpen = !isSubMenuOpen; |
| | } |
| |
|
| | async function logoutSubmit(event: { preventDefault: () => void }) { |
| | event.preventDefault(); |
| |
|
| | try { |
| | const response = await fetch("https://cloud.mithrilsecurity.io/api/auth/logout", { |
| | method: "POST", |
| | credentials: "include", |
| | headers: { |
| | "Content-Type": "application/json", |
| | }, |
| | }); |
| | if (response.ok) { |
| | |
| | console.log("Logout successful"); |
| | signedIn = false; |
| | is_logged_writable.set(false); |
| | api_key_writable.set(""); |
| | email_addr_writable.set(""); |
| | } else { |
| | |
| | console.error("Logout failed"); |
| | } |
| | } catch (error) { |
| | |
| | console.error("Network error", error); |
| | } |
| | } |
| |
|
| | function handleKeyDown(event: { key: string; }) { |
| | if (event.key === 'Enter') { |
| | toggleSubMenu(); |
| | } |
| | } |
| |
|
| | function handleTempClick() { |
| | loginModalVisible = true; |
| | is_magic_writable.set(false); |
| | } |
| | </script> |
| | <!-- top left corner - remove from class bg-[#141c2a] --> |
| | <div class="bg-[#142343] sticky top-0 flex flex-none items-center justify-between px-3 py-5 max-sm:pt-0"> |
| | <a class="flex items-center rounded-xl text-lg font-semibold" href="{PUBLIC_ORIGIN}{base}/"> |
| | <Logo classNames="mr-1" /> |
| | <div class = "pl-2 text-white"> {PUBLIC_APP_NAME} </div> |
| | </a> |
| | <a |
| | href={`${base}/`} |
| | class="flex rounded-lg border bg-white px-2 py-0.5 text-center shadow-sm hover:shadow-none dark:border-mithril-border dark:bg-sidebar" |
| | > |
| | New Chat |
| | </a> |
| | </div> |
| | <!-- left side bar |
| | style = "background-color: #141c2a !important;" |
| | --> |
| | <div |
| | class="bg-[#142343] scrollbar-custom flex flex-col gap-1 overflow-y-auto px-3 pb-3 pt-2 dark:from-gray-800/30" |
| | |
| | > |
| | {#each conversations as conv (conv.id)} |
| | <div class="py-1"> |
| | <NavConversationItem on:editConversationTitle on:deleteConversation {conv}/> |
| | </div> |
| | {/each} |
| | </div> |
| | <!-- <div class="display position relative inline-block bg-[#142343] flex justify-center items-center pb-4"> |
| | <div |
| | class="rounded-2xl text-center bg-[#0d1830] flex items-center justify-center group h-11 -lg text-white w-[96%] hover:bg-gray-600 font-semibold" |
| | on:click={toggleSubMenu} |
| | on:keydown={handleKeyDown} |
| | > |
| | {email_addr.length > 0 ? email_addr : "Not logged in"} |
| | </div> |
| | |
| | {#if isSubMenuOpen} |
| | <script type="text/javascript"> |
| | document.getElementById("submenu").style.display = "block"; |
| | </script> |
| | <div class="justify-center items-center rounded-2xl {isSubMenuOpen ? 'open' : ''}" style="position: absolute; bottom: 100%; width: 96%; background-color: #0d1830 !important;"> |
| | <div> |
| | <button |
| | on:click={() => dispatch("clickSettings")} |
| | type="button" |
| | class="px-8 block py-3 text-center h-11 text-white hover:bg-gray-600 rounded-2xl" style="width: 100%;" |
| | > |
| | Settings |
| | </button> |
| | <div class="flex justify-center" style="position: relative;"> |
| | <a href="https://1qdag6eehid.typeform.com/to/EFrGfL1u" target="_blank" rel="noopener noreferrer" |
| | class="px-8 block py-3 text-center h-11 text-white hover:bg-gray-600 rounded-2xl w-[100%]"> |
| | Give Feedback |
| | </a> |
| | <img |
| | class="absolute max-w-[3%] md:max-w-[6%] bottom-[32%] right-[35%] md:right-[20%]" |
| | alt="redirect to page in new tab icon" |
| | src="{PUBLIC_ORIGIN || $page.url.origin}{base}/{PUBLIC_APP_ASSETS}/link.png" |
| | title="link to open new page" |
| | /> |
| | </div> |
| | <div class="justify flex items-center justify-center"> |
| | <p class="border-t border-mithril-border w-[80%]"></p> |
| | </div> |
| | <button |
| | on:click={logoutSubmit} |
| | type="button" |
| | class="px-8 py-3 text-center h-11 text-white hover:bg-gray-600 rounded-2xl" |
| | style="width: 100%;" |
| | > |
| | <p class="">Log out</p> |
| | </button> |
| | </div> |
| | </div> |
| | {/if} --> |
| | --> |