184 lines
5.2 KiB
TypeScript
184 lines
5.2 KiB
TypeScript
"use client"
|
|
|
|
import { Dashboard } from "@/components/ui/dashboard"
|
|
import { ChatbotUIContext } from "@/context/context"
|
|
import { getAssistantWorkspacesByWorkspaceId } from "@/db/assistants"
|
|
import { getChatsByWorkspaceId } from "@/db/chats"
|
|
import { getCollectionWorkspacesByWorkspaceId } from "@/db/collections"
|
|
import { getFileWorkspacesByWorkspaceId } from "@/db/files"
|
|
import { getFoldersByWorkspaceId } from "@/db/folders"
|
|
import { getModelWorkspacesByWorkspaceId } from "@/db/models"
|
|
import { getPresetWorkspacesByWorkspaceId } from "@/db/presets"
|
|
import { getPromptWorkspacesByWorkspaceId } from "@/db/prompts"
|
|
import { getAssistantImageFromStorage } from "@/db/storage/assistant-images"
|
|
import { getToolWorkspacesByWorkspaceId } from "@/db/tools"
|
|
import { getWorkspaceById } from "@/db/workspaces"
|
|
import { convertBlobToBase64 } from "@/lib/blob-to-b64"
|
|
import { supabase } from "@/lib/supabase/browser-client"
|
|
import { LLMID } from "@/types"
|
|
import { useParams, useRouter, useSearchParams } from "next/navigation"
|
|
import { ReactNode, useContext, useEffect, useState } from "react"
|
|
import Loading from "../loading"
|
|
|
|
interface WorkspaceLayoutProps {
|
|
children: ReactNode
|
|
}
|
|
|
|
export default function WorkspaceLayout({ children }: WorkspaceLayoutProps) {
|
|
const router = useRouter()
|
|
|
|
const params = useParams()
|
|
const searchParams = useSearchParams()
|
|
const workspaceId = params.workspaceid as string
|
|
|
|
const {
|
|
setChatSettings,
|
|
setAssistants,
|
|
setAssistantImages,
|
|
setChats,
|
|
setCollections,
|
|
setFolders,
|
|
setFiles,
|
|
setPresets,
|
|
setPrompts,
|
|
setTools,
|
|
setModels,
|
|
selectedWorkspace,
|
|
setSelectedWorkspace,
|
|
setSelectedChat,
|
|
setChatMessages,
|
|
setUserInput,
|
|
setIsGenerating,
|
|
setFirstTokenReceived,
|
|
setChatFiles,
|
|
setChatImages,
|
|
setNewMessageFiles,
|
|
setNewMessageImages,
|
|
setShowFilesDisplay
|
|
} = useContext(ChatbotUIContext)
|
|
|
|
const [loading, setLoading] = useState(true)
|
|
|
|
useEffect(() => {
|
|
;(async () => {
|
|
const session = (await supabase.auth.getSession()).data.session
|
|
|
|
if (!session) {
|
|
return router.push("/login")
|
|
} else {
|
|
await fetchWorkspaceData(workspaceId)
|
|
}
|
|
})()
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
;(async () => await fetchWorkspaceData(workspaceId))()
|
|
|
|
setUserInput("")
|
|
setChatMessages([])
|
|
setSelectedChat(null)
|
|
|
|
setIsGenerating(false)
|
|
setFirstTokenReceived(false)
|
|
|
|
setChatFiles([])
|
|
setChatImages([])
|
|
setNewMessageFiles([])
|
|
setNewMessageImages([])
|
|
setShowFilesDisplay(false)
|
|
}, [workspaceId])
|
|
|
|
const fetchWorkspaceData = async (workspaceId: string) => {
|
|
setLoading(true)
|
|
|
|
const workspace = await getWorkspaceById(workspaceId)
|
|
setSelectedWorkspace(workspace)
|
|
|
|
const assistantData = await getAssistantWorkspacesByWorkspaceId(workspaceId)
|
|
setAssistants(assistantData.assistants)
|
|
|
|
for (const assistant of assistantData.assistants) {
|
|
let url = ""
|
|
|
|
if (assistant.image_path) {
|
|
url = (await getAssistantImageFromStorage(assistant.image_path)) || ""
|
|
}
|
|
|
|
if (url) {
|
|
const response = await fetch(url)
|
|
const blob = await response.blob()
|
|
const base64 = await convertBlobToBase64(blob)
|
|
|
|
setAssistantImages(prev => [
|
|
...prev,
|
|
{
|
|
assistantId: assistant.id,
|
|
path: assistant.image_path,
|
|
base64,
|
|
url
|
|
}
|
|
])
|
|
} else {
|
|
setAssistantImages(prev => [
|
|
...prev,
|
|
{
|
|
assistantId: assistant.id,
|
|
path: assistant.image_path,
|
|
base64: "",
|
|
url
|
|
}
|
|
])
|
|
}
|
|
}
|
|
|
|
const chats = await getChatsByWorkspaceId(workspaceId)
|
|
setChats(chats)
|
|
|
|
const collectionData =
|
|
await getCollectionWorkspacesByWorkspaceId(workspaceId)
|
|
setCollections(collectionData.collections)
|
|
|
|
const folders = await getFoldersByWorkspaceId(workspaceId)
|
|
setFolders(folders)
|
|
|
|
const fileData = await getFileWorkspacesByWorkspaceId(workspaceId)
|
|
setFiles(fileData.files)
|
|
|
|
const presetData = await getPresetWorkspacesByWorkspaceId(workspaceId)
|
|
setPresets(presetData.presets)
|
|
|
|
const promptData = await getPromptWorkspacesByWorkspaceId(workspaceId)
|
|
setPrompts(promptData.prompts)
|
|
|
|
const toolData = await getToolWorkspacesByWorkspaceId(workspaceId)
|
|
setTools(toolData.tools)
|
|
|
|
const modelData = await getModelWorkspacesByWorkspaceId(workspaceId)
|
|
setModels(modelData.models)
|
|
|
|
setChatSettings({
|
|
model: (searchParams.get("model") ||
|
|
workspace?.default_model ||
|
|
"gpt-4-1106-preview") as LLMID,
|
|
prompt:
|
|
workspace?.default_prompt ||
|
|
"You are a friendly, helpful AI assistant.",
|
|
temperature: workspace?.default_temperature || 0.5,
|
|
contextLength: workspace?.default_context_length || 4096,
|
|
includeProfileContext: workspace?.include_profile_context || true,
|
|
includeWorkspaceInstructions:
|
|
workspace?.include_workspace_instructions || true,
|
|
embeddingsProvider:
|
|
(workspace?.embeddings_provider as "openai" | "local") || "openai"
|
|
})
|
|
|
|
setLoading(false)
|
|
}
|
|
|
|
if (loading) {
|
|
return <Loading />
|
|
}
|
|
|
|
return <Dashboard>{children}</Dashboard>
|
|
}
|