From 37ce88e74475555bb411a9fe6b3085264785822a Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 20 Dec 2024 14:38:15 -0800 Subject: [PATCH] refac: floating buttons --- src/app.css | 4 + src/lib/apis/openai/index.ts | 32 ++ .../ContentRenderer/FloatingButtons.svelte | 303 ++++++++++++++++++ .../chat/Messages/ContentRenderer.svelte | 135 ++------ .../chat/Messages/ResponseMessage.svelte | 1 + .../components/chat/Messages/Skeleton.svelte | 32 +- 6 files changed, 386 insertions(+), 121 deletions(-) create mode 100644 src/lib/components/chat/ContentRenderer/FloatingButtons.svelte diff --git a/src/app.css b/src/app.css index cf0afea4f..334cae1a7 100644 --- a/src/app.css +++ b/src/app.css @@ -56,6 +56,10 @@ math { @apply prose dark:prose-invert prose-headings:font-semibold prose-hr:my-4 prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line; } +.markdown-prose-xs { + @apply text-xs prose dark:prose-invert prose-headings:font-semibold prose-hr:my-0 prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line; +} + .markdown a { @apply underline; } diff --git a/src/lib/apis/openai/index.ts b/src/lib/apis/openai/index.ts index f6d05babf..ce55f359a 100644 --- a/src/lib/apis/openai/index.ts +++ b/src/lib/apis/openai/index.ts @@ -273,6 +273,38 @@ export const verifyOpenAIConnection = async ( return res; }; + +export const chatCompletion = async ( + token: string = '', + body: object, + url: string = OPENAI_API_BASE_URL +): Promise<[Response | null, AbortController]> => { + const controller = new AbortController(); + let error = null; + + const res = await fetch(`${url}/chat/completions`, { + signal: controller.signal, + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify(body) + }).catch((err) => { + console.log(err); + error = err; + return null; + }); + + if (error) { + throw error; + } + + return [res, controller]; +}; + + + export const generateOpenAIChatCompletion = async ( token: string = '', body: object, diff --git a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte new file mode 100644 index 000000000..62458f889 --- /dev/null +++ b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte @@ -0,0 +1,303 @@ + + + diff --git a/src/lib/components/chat/Messages/ContentRenderer.svelte b/src/lib/components/chat/Messages/ContentRenderer.svelte index d77a9b6ef..cb3fe6db2 100644 --- a/src/lib/components/chat/Messages/ContentRenderer.svelte +++ b/src/lib/components/chat/Messages/ContentRenderer.svelte @@ -4,13 +4,13 @@ const dispatch = createEventDispatcher(); import Markdown from './Markdown.svelte'; - import LightBlub from '$lib/components/icons/LightBlub.svelte'; import { chatId, mobile, showArtifacts, showControls, showOverview } from '$lib/stores'; - import ChatBubble from '$lib/components/icons/ChatBubble.svelte'; - import { stringify } from 'postcss'; + import FloatingButtons from '../ContentRenderer/FloatingButtons.svelte'; + import { createMessagesList } from '$lib/utils'; export let id; export let content; + export let history; export let model = null; export let sources = null; @@ -19,13 +19,11 @@ export let onSourceClick = () => {}; let contentContainerElement; - let buttonsContainerElement; - let selectedText = ''; - let floatingInput = false; - let floatingInputValue = ''; + let floatingButtonsElement; const updateButtonPosition = (event) => { + const buttonsContainerElement = document.getElementById(`floating-buttons-${id}`); if ( !contentContainerElement?.contains(event.target) && !buttonsContainerElement?.contains(event.target) @@ -42,7 +40,6 @@ let selection = window.getSelection(); if (selection.toString().trim().length > 0) { - floatingInput = false; const range = selection.getRangeAt(0); const rect = range.getBoundingClientRect(); @@ -56,11 +53,10 @@ buttonsContainerElement.style.display = 'block'; // Calculate space available on the right - const spaceOnRight = parentRect.width - (left + buttonsContainerElement.offsetWidth); + const spaceOnRight = parentRect.width - left; + let halfScreenWidth = window.innerWidth / 2; - let thirdScreenWidth = window.innerWidth / 3; - - if (spaceOnRight < thirdScreenWidth) { + if (spaceOnRight < halfScreenWidth) { const right = parentRect.right - rect.right; buttonsContainerElement.style.right = `${right}px`; buttonsContainerElement.style.left = 'auto'; // Reset left @@ -69,7 +65,6 @@ buttonsContainerElement.style.left = `${left}px`; buttonsContainerElement.style.right = 'auto'; // Reset right } - buttonsContainerElement.style.top = `${top + 5}px`; // +5 to add some spacing } } else { @@ -79,28 +74,14 @@ }; const closeFloatingButtons = () => { + const buttonsContainerElement = document.getElementById(`floating-buttons-${id}`); if (buttonsContainerElement) { buttonsContainerElement.style.display = 'none'; - selectedText = ''; - floatingInput = false; - floatingInputValue = ''; } - }; - const selectAskHandler = () => { - dispatch('select', { - type: 'ask', - content: selectedText, - input: floatingInputValue - }); - - floatingInput = false; - floatingInputValue = ''; - selectedText = ''; - - // Clear selection - window.getSelection().removeAllRanges(); - buttonsContainerElement.style.display = 'none'; + if (floatingButtonsElement) { + floatingButtonsElement.closeHandler(); + } }; const keydownHandler = (e) => { @@ -176,86 +157,14 @@ /> -{#if floatingButtons} - +{#if floatingButtons && model} + { + closeFloatingButtons(); + }} + /> {/if} diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 76210f68c..79092bc23 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -620,6 +620,7 @@ + export let size = 'md'; + +
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
+