"use client" import { usePathname } from "next/navigation" 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 pathname = usePathname() // 获取当前路径 // 提取当前路径中的 locale 部分 const locale = pathname.split("/")[1] || "en" 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) { // 跳转到带有 locale 的登录页面 return router.push(`/${locale}/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 } return {children} }