Fix UI issues and add embedding feature

This commit is contained in:
n4ze3m 2024-02-03 11:18:15 +05:30
parent 84f4205b56
commit 4c17d2f52c
5 changed files with 27 additions and 6 deletions

View File

@ -123,7 +123,7 @@ export const EmptySidePanel = () => {
className="before:content[''] peer relative h-5 w-5 cursor-pointer appearance-none rounded-md border border-blue-gray-200 transition-all before:absolute before:top-2/4 before:left-2/4 before:block before:h-12 before:w-12 before:-translate-y-2/4 before:-translate-x-2/4 before:rounded-full before:bg-blue-gray-500 before:opacity-0 before:transition-opacity" className="before:content[''] peer relative h-5 w-5 cursor-pointer appearance-none rounded-md border border-blue-gray-200 transition-all before:absolute before:top-2/4 before:left-2/4 before:block before:h-12 before:w-12 before:-translate-y-2/4 before:-translate-x-2/4 before:rounded-full before:bg-blue-gray-500 before:opacity-0 before:transition-opacity"
id="check" id="check"
/> />
<span className="absolute text-white transition-opacity opacity-0 pointer-events-none top-2/4 left-2/4 -translate-y-2/4 -translate-x-2/4 peer-checked:opacity-100 dark:text-gray-400"> <span className="absolute text-white transition-opacity opacity-0 pointer-events-none top-2/4 left-2/4 -translate-y-2/4 -translate-x-2/4 peer-checked:opacity-100 ">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
className="h-3.5 w-3.5" className="h-3.5 w-3.5"

View File

@ -47,7 +47,6 @@ export const SidepanelForm = () => {
className="shrink-0 flex-grow flex items-center "> className="shrink-0 flex-grow flex items-center ">
<div className="flex items-center p-2 rounded-2xl border bg-gray-100 w-full dark:bg-black dark:border-gray-800"> <div className="flex items-center p-2 rounded-2xl border bg-gray-100 w-full dark:bg-black dark:border-gray-800">
<textarea <textarea
disabled={isSending}
onKeyDown={(e) => { onKeyDown={(e) => {
if (e.key === "Enter" && !e.shiftKey && !isSending) { if (e.key === "Enter" && !e.shiftKey && !isSending) {
e.preventDefault() e.preventDefault()

View File

@ -1,10 +1,12 @@
import logoImage from "data-base64:~assets/icon.png" import logoImage from "data-base64:~assets/icon.png"
import CogIcon from "@heroicons/react/24/outline/CogIcon" import CogIcon from "@heroicons/react/24/outline/CogIcon"
import Squares2X2Icon from "@heroicons/react/24/outline/Squares2X2Icon"
import { ArrowPathIcon } from "@heroicons/react/24/outline" import { ArrowPathIcon } from "@heroicons/react/24/outline"
import { useMessage } from "~hooks/useMessage" import { useMessage } from "~hooks/useMessage"
import { Link } from "react-router-dom" import { Link } from "react-router-dom"
import { Tooltip } from "antd"
export const SidepanelHeader = () => { export const SidepanelHeader = () => {
const { clearChat } = useMessage() const { clearChat, isEmbedding } = useMessage()
return ( return (
<div className="flex px-3 justify-between bg-white dark:bg-black border-b border-gray-200 dark:border-gray-800 py-4 items-center"> <div className="flex px-3 justify-between bg-white dark:bg-black border-b border-gray-200 dark:border-gray-800 py-4 items-center">
<div className="focus:outline-none focus-visible:ring-2 focus-visible:ring-pink-700 flex items-center dark:text-white"> <div className="focus:outline-none focus-visible:ring-2 focus-visible:ring-pink-700 flex items-center dark:text-white">
@ -13,6 +15,14 @@ export const SidepanelHeader = () => {
</div> </div>
<div className="flex items-center space-x-3"> <div className="flex items-center space-x-3">
{isEmbedding ? (
<Tooltip
title="It may take a few minutes to embed the page. Please wait..."
>
<Squares2X2Icon className="h-5 w-5 text-gray-500 dark:text-gray-400 animate-bounce animate-infinite" />
</Tooltip>
) : null}
<button <button
onClick={() => { onClick={() => {
clearChat() clearChat()

View File

@ -74,7 +74,9 @@ export const useMessage = () => {
selectedModel, selectedModel,
setSelectedModel, setSelectedModel,
chatMode, chatMode,
setChatMode setChatMode,
setIsEmbedding,
isEmbedding
} = useStoreMessage() } = useStoreMessage()
const abortControllerRef = React.useRef<AbortController | null>(null) const abortControllerRef = React.useRef<AbortController | null>(null)
@ -89,6 +91,9 @@ export const useMessage = () => {
setHistory([]) setHistory([])
setHistoryId(null) setHistoryId(null)
setIsFirstMessage(true) setIsFirstMessage(true)
setIsLoading(false)
setIsProcessing(false)
setStreaming(false)
} }
const memoryEmbedding = async ( const memoryEmbedding = async (
@ -110,12 +115,14 @@ export const useMessage = () => {
const store = new MemoryVectorStore(ollamaEmbedding) const store = new MemoryVectorStore(ollamaEmbedding)
await store.addDocuments(chunks) setIsEmbedding(true)
await store.addDocuments(chunks)
setKeepTrackOfEmbedding({ setKeepTrackOfEmbedding({
...keepTrackOfEmbedding, ...keepTrackOfEmbedding,
[url]: store [url]: store
}) })
setIsEmbedding(false)
return store return store
} }
@ -368,6 +375,7 @@ export const useMessage = () => {
selectedModel, selectedModel,
setSelectedModel, setSelectedModel,
chatMode, chatMode,
setChatMode setChatMode,
isEmbedding
} }
} }

View File

@ -31,6 +31,8 @@ type State = {
setSelectedModel: (selectedModel: string) => void setSelectedModel: (selectedModel: string) => void
chatMode: "normal" | "rag" chatMode: "normal" | "rag"
setChatMode: (chatMode: "normal" | "rag") => void setChatMode: (chatMode: "normal" | "rag") => void
isEmbedding: boolean
setIsEmbedding: (isEmbedding: boolean) => void
} }
export const useStoreMessage = create<State>((set) => ({ export const useStoreMessage = create<State>((set) => ({
@ -53,4 +55,6 @@ export const useStoreMessage = create<State>((set) => ({
setSelectedModel: (selectedModel) => set({ selectedModel }), setSelectedModel: (selectedModel) => set({ selectedModel }),
chatMode: "normal", chatMode: "normal",
setChatMode: (chatMode) => set({ chatMode }), setChatMode: (chatMode) => set({ chatMode }),
isEmbedding: false,
setIsEmbedding: (isEmbedding) => set({ isEmbedding }),
})) }))