Spaces:
Runtime error
Runtime error
File size: 8,212 Bytes
faca43f d54ea4b faca43f d54ea4b faca43f d54ea4b faca43f d54ea4b faca43f d54ea4b faca43f d54ea4b faca43f 5528541 faca43f d54ea4b faca43f 5528541 faca43f 5528541 faca43f 5528541 faca43f d54ea4b faca43f d54ea4b faca43f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
<script lang="ts">
import type { Message } from "$lib/types/Message";
import { createEventDispatcher } from "svelte";
import Help from "$lib/components/icons/Help.svelte"
import CarbonSendAltFilled from "~icons/carbon/send-alt-filled";
import CarbonStopFilledAlt from "~icons/carbon/stop-filled-alt";
import EosIconsLoading from "~icons/eos-icons/loading";
import CarbonClose from "~icons/carbon/close";
import { helpMenu } from "../../../routes/LayoutWritable";
import ChatMessages from "./ChatMessages.svelte";
import ChatInput from "./ChatInput.svelte";
import StopGeneratingBtn from "../StopGeneratingBtn.svelte";
import type { Model } from "$lib/types/Model";
import type { LayoutData } from "../../../routes/$types";
import WebSearchToggle from "../WebSearchToggle.svelte";
import type { WebSearchMessage } from "$lib/types/WebSearch";
export let messages: Message[] = [];
let isHelpMenuOpen: boolean = false;
let isPrivacyBannerOpen: boolean = true;
export let loading = false;
export let pending = false;
export let shared = false;
export let currentModel: Model;
export let models: Model[];
export let settings: LayoutData["settings"];
export let webSearchMessages: WebSearchMessage[] = [];
export let searches: Record<string, WebSearchMessage[]> = {};
export let loginRequired = false;
$: isReadOnly = !models.some((model) => model.id === currentModel.id);
let loginModalOpen = false;
let message: string;
helpMenu.subscribe((val) => {
isHelpMenuOpen = val;
})
function closeHelpMenu() {
helpMenu.set(false);
}
function closePrivacyBanner() {
isPrivacyBannerOpen = false;
}
function toggleHelpMenu() {
helpMenu.set(!isHelpMenuOpen);
console.log($helpMenu);
}
function handleKeyDown(event: { key: string; }) {
if (event.key === 'Enter') {
toggleHelpMenu();
}
}
const dispatch = createEventDispatcher<{
message: string;
share: void;
stop: void;
retry: { id: Message["id"]; content: string };
}>();
const handleSubmit = () => {
if (loading) return;
dispatch("message", message);
message = "";
};
</script>
<div class="bg-chat relative min-h-0 min-w-0">
<!-- {#if isPrivacyBannerOpen}
<script type="text/javascript">
document.getElementById("PrivacyBanner").style.display = "block";
</script> -->
<!-- <div class="bg-chat" id="privacy-banner">
<div class="border-b border-gray-600 flex justify-between px-4">
<div class="justify-center items-center text-center flex-1">
<p class="px-4 py-3 text-black/white text-xs lg:text-base">
🔒 Prompts are end-to-end protected.<br>
Not even Mithril Security can read or train on them. Learn more
<a
href="https://www.mithrilsecurity.io/privacy-policy#new-pp"
target="_blank"
rel="noopener noreferrer"
style="text-decoration: underline; color: #f0b92d;">here</a
>.</p>
</div>
<button type="button" class="pt-2" style="align-self: flex-start;" on:click={closePrivacyBanner}>
<CarbonClose class="text-white" />
</button>
</div>
</div> -->
<!-- {/if} -->
<ChatMessages
{loading}
{pending}
{settings}
{currentModel}
{models}
{messages}
readOnly={isReadOnly}
isAuthor={!shared}
{webSearchMessages}
{searches}
on:message
on:vote
on:retry={(ev) => {
if (!loading) dispatch("retry", ev.detail);
}}
/>
<!-- chat input background bg-gradient-to-t from-white via-white/80 to-white/0 -->
<div
class="dark:bg-chat border-0 pointer-events-none absolute inset-x-0 bottom-0 z-0 mx-auto flex w-full max-w-3xl flex-col items-center justify-center px-3.5 py-2 sm:px-5 md:pb-6 md:pt-4 xl:max-w-4xl [&>*]:pointer-events-auto"
>
<div class="flex w-full pb-3 max-md:justify-between">
{#if settings?.searchEnabled}
<WebSearchToggle />
{/if}
{#if loading}
<StopGeneratingBtn
classNames={settings?.searchEnabled ? "md:-translate-x-1/2 md:mx-auto" : "mx-auto"}
on:click={() => dispatch("stop")}
/>
{/if}
</div>
<form
on:submit|preventDefault={handleSubmit}
class="relative flex w-full max-w-4xl flex-1 items-center rounded-xl border bg-gray-100 focus-within:border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:focus-within:border-gray-500
{isReadOnly ? 'opacity-30' : ''}"
>
<div class="flex w-full flex-1 border-none bg-transparent">
<ChatInput
placeholder="Type here"
bind:value={message}
on:submit={handleSubmit}
on:keypress={() => {
if (loginRequired) loginModalOpen = true;
}}
maxRows={4}
disabled={isReadOnly}
/>
{#if loading}
<button
class="btn mx-1 my-1 inline-block h-[2.4rem] self-end rounded-lg bg-transparent p-1 px-[0.7rem] text-gray-400 enabled:hover:text-gray-700 disabled:opacity-60 enabled:dark:hover:text-gray-100 dark:disabled:opacity-40 md:hidden"
on:click={() => dispatch("stop")}
>
<CarbonStopFilledAlt />
</button>
<div
class="mx-1 my-1 hidden h-[2.4rem] items-center p-1 px-[0.7rem] text-gray-400 enabled:hover:text-gray-700 disabled:opacity-60 enabled:dark:hover:text-gray-100 dark:disabled:opacity-40 md:flex"
>
<EosIconsLoading />
</div>
{:else}
<button
class="btn mx-1 my-1 h-[2.4rem] self-end rounded-lg bg-transparent p-1 px-[0.7rem] text-gray-400 enabled:hover:text-gray-700 disabled:opacity-60 enabled:dark:hover:text-gray-100 dark:disabled:opacity-40"
disabled={!message || isReadOnly}
type="submit"
>
<CarbonSendAltFilled />
</button>
{/if}
</div>
<div class="mt-2 flex justify-end self-stretch text-xs text-gray-400/90 max-sm:gap-2">
<div
class="pb-2 pr-2 rounded-2xl text-center flex items-center justify-end group h-11 -lg font-semibold text-gray-400 hover:bg-gray-700"
on:click={toggleHelpMenu}
on:keydown={handleKeyDown}
>
<Help/>
</div>
</div>
</form>
{#if messages.length}
<script type="text/javascript">
document.getElementById("banner").style.display = "block";
</script>
{:else}
<script type="text/javascript">
document.getElementById("banner").style.display = "none";
</script>
{/if}
<!-- {#if messages.length}
<button
class="flex flex-none items-center hover:text-gray-400 hover:underline max-sm:rounded-lg max-sm:bg-gray-50 max-sm:px-2.5 dark:max-sm:bg-gray-800"
type="button"
on:click={() => dispatch("share")}
>
<CarbonExport class="text-[.6rem] sm:mr-1.5 sm:text-primary-500" />
<div class="max-sm:hidden">Share this conversation</div>
</button>
{/if} -->
{#if isHelpMenuOpen}
<script type="text/javascript">
document.getElementById("helpMenu").style.display = "block";
</script>
<div id="helpMenu" class="bottom-[80%] right-[0%] md:bottom-[45%] md:right-[0%] xl:bottom-[50%] xl:right-[-22%] p-2 border border-gray-600 flex justify-center items-center rounded-2xl bg-[#0d1830] {isHelpMenuOpen ? 'open' : ''}" style="position: absolute;">
<div>
<div class="justify-center items-center text-center flex-1">
<div class="flex justify-between px-2">
<a href="https://www.mithrilsecurity.io/contact" target="_blank" rel="noopener noreferrer" class="rounded-2xl px-8 block py-3 text-center h-11 text-white hover:bg-gray-600" style="width: 100%;">
Help ⤵️
</a>
<button type="button" class="pt-2" style="align-self: flex-start;" on:click={closeHelpMenu}>
<CarbonClose class="text-white" />
</button>
</div>
</div>
<!-- <a href="https://1qdag6eehid.typeform.com/to/EFrGfL1u" target="_blank" rel="noopener noreferrer" class="rounded-2xl px-8 block text-center h-11 py-3 text-white hover:bg-gray-600" style="width: 100%;">
Give Feedback ⤵️
</a> -->
<a href="https://www.mithrilsecurity.io/faq" target="_blank" rel="noopener noreferrer" class="rounded-xl block text-center h-11 py-3 text-white hover:bg-gray-600" style="width: 100%;">
FAQ ⤵️
</a>
<a href="https://github.com/mithril-security/blind_chat/issues" target="_blank" rel="noopener noreferrer" class="rounded-2xl block text-center h-11 pt-3 text-white hover:bg-gray-600" style="width: 100%;">
Report an issue ⤵️
</a>
</div>
</div>
{/if}
</div>
</div>
|