@@ -54,5 +106,5 @@ export default function ChatPage() {
)}
>
- )
+ );
}
diff --git a/app/[locale]/[workspaceid]/game/[gametype]/page.tsx b/app/[locale]/[workspaceid]/game/[gametype]/page.tsx
new file mode 100644
index 0000000000..bbc5c065d8
--- /dev/null
+++ b/app/[locale]/[workspaceid]/game/[gametype]/page.tsx
@@ -0,0 +1,7 @@
+'use client';
+
+import { GameResult } from '@/components/game/game-result';
+
+export default function GameResultPage() {
+ return
;
+}
diff --git a/app/[locale]/[workspaceid]/game/page.tsx b/app/[locale]/[workspaceid]/game/page.tsx
new file mode 100644
index 0000000000..b436ae4734
--- /dev/null
+++ b/app/[locale]/[workspaceid]/game/page.tsx
@@ -0,0 +1,33 @@
+'use client';
+
+import { ChatHelp } from '@/components/chat/chat-help';
+import { useChatHandler } from '@/components/chat/chat-hooks/use-chat-handler';
+import { ChatInput } from '@/components/chat/chat-input';
+import { ChatSettings } from '@/components/chat/chat-settings';
+import { ChatUI } from '@/components/chat/chat-ui';
+import { QuickSettings } from '@/components/chat/quick-settings';
+import { Brand } from '@/components/ui/brand';
+import { ChatbotUIContext } from '@/context/context';
+import useHotkey from '@/lib/hooks/use-hotkey';
+import { useTheme } from 'next-themes';
+import { useContext } from 'react';
+import GameResultPage from '@/app/[locale]/[workspaceid]/game/[gametype]/page';
+
+export default function ChatPage() {
+ useHotkey('o', () => handleNewChat());
+ useHotkey('l', () => {
+ handleFocusChatInput();
+ });
+
+ const { chatMessages } = useContext(ChatbotUIContext);
+
+ const { handleNewChat, handleFocusChatInput } = useChatHandler();
+
+ const { theme } = useTheme();
+
+ return (
+
+
+
+ );
+}
diff --git a/app/[locale]/[workspaceid]/layout.tsx b/app/[locale]/[workspaceid]/layout.tsx
index 227a6e7903..05f1600c19 100644
--- a/app/[locale]/[workspaceid]/layout.tsx
+++ b/app/[locale]/[workspaceid]/layout.tsx
@@ -1,35 +1,36 @@
-"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"
+'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';
+import { getGameResultByUserID, getGameResults } from '@/db/games';
interface WorkspaceLayoutProps {
- children: ReactNode
+ children: ReactNode;
}
export default function WorkspaceLayout({ children }: WorkspaceLayoutProps) {
- const router = useRouter()
+ const router = useRouter();
- const params = useParams()
- const searchParams = useSearchParams()
- const workspaceId = params.workspaceid as string
+ const params = useParams();
+ const searchParams = useSearchParams();
+ const workspaceId = params.workspaceid as string;
const {
setChatSettings,
@@ -54,60 +55,62 @@ export default function WorkspaceLayout({ children }: WorkspaceLayoutProps) {
setChatImages,
setNewMessageFiles,
setNewMessageImages,
- setShowFilesDisplay
- } = useContext(ChatbotUIContext)
+ setShowFilesDisplay,
+ setGameResults
+ } = useContext(ChatbotUIContext);
- const [loading, setLoading] = useState(true)
+ const [loading, setLoading] = useState(true);
useEffect(() => {
- ;(async () => {
- const session = (await supabase.auth.getSession()).data.session
+ (async () => {
+ const session = (await supabase.auth.getSession()).data.session;
if (!session) {
- return router.push("/login")
+ return router.push('/login');
} else {
- await fetchWorkspaceData(workspaceId)
+ await fetchWorkspaceData(workspaceId);
}
- })()
- }, [])
+ })();
+ }, []);
useEffect(() => {
- ;(async () => await fetchWorkspaceData(workspaceId))()
+ (async () => await fetchWorkspaceData(workspaceId))();
- setUserInput("")
- setChatMessages([])
- setSelectedChat(null)
+ setUserInput('');
+ setChatMessages([]);
+ setSelectedChat(null);
- setIsGenerating(false)
- setFirstTokenReceived(false)
+ setIsGenerating(false);
+ setFirstTokenReceived(false);
- setChatFiles([])
- setChatImages([])
- setNewMessageFiles([])
- setNewMessageImages([])
- setShowFilesDisplay(false)
- }, [workspaceId])
+ setChatFiles([]);
+ setChatImages([]);
+ setNewMessageFiles([]);
+ setNewMessageImages([]);
+ setShowFilesDisplay(false);
+ }, [workspaceId]);
const fetchWorkspaceData = async (workspaceId: string) => {
- setLoading(true)
+ setLoading(true);
- const workspace = await getWorkspaceById(workspaceId)
- setSelectedWorkspace(workspace)
+ const workspace = await getWorkspaceById(workspaceId);
+ setSelectedWorkspace(workspace);
- const assistantData = await getAssistantWorkspacesByWorkspaceId(workspaceId)
- setAssistants(assistantData.assistants)
+ const assistantData =
+ await getAssistantWorkspacesByWorkspaceId(workspaceId);
+ setAssistants(assistantData.assistants);
for (const assistant of assistantData.assistants) {
- let url = ""
+ let url = '';
if (assistant.image_path) {
- url = (await getAssistantImageFromStorage(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)
+ const response = await fetch(url);
+ const blob = await response.blob();
+ const base64 = await convertBlobToBase64(blob);
setAssistantImages(prev => [
...prev,
@@ -117,67 +120,70 @@ export default function WorkspaceLayout({ children }: WorkspaceLayoutProps) {
base64,
url
}
- ])
+ ]);
} else {
setAssistantImages(prev => [
...prev,
{
assistantId: assistant.id,
path: assistant.image_path,
- base64: "",
+ base64: '',
url
}
- ])
+ ]);
}
}
- const chats = await getChatsByWorkspaceId(workspaceId)
- setChats(chats)
+ const chats = await getChatsByWorkspaceId(workspaceId);
+ setChats(chats);
const collectionData =
- await getCollectionWorkspacesByWorkspaceId(workspaceId)
- setCollections(collectionData.collections)
+ await getCollectionWorkspacesByWorkspaceId(workspaceId);
+ setCollections(collectionData.collections);
- const folders = await getFoldersByWorkspaceId(workspaceId)
- setFolders(folders)
+ const folders = await getFoldersByWorkspaceId(workspaceId);
+ setFolders(folders);
- const fileData = await getFileWorkspacesByWorkspaceId(workspaceId)
- setFiles(fileData.files)
+ const fileData = await getFileWorkspacesByWorkspaceId(workspaceId);
+ setFiles(fileData.files);
- const presetData = await getPresetWorkspacesByWorkspaceId(workspaceId)
- setPresets(presetData.presets)
+ const presetData = await getPresetWorkspacesByWorkspaceId(workspaceId);
+ setPresets(presetData.presets);
- const promptData = await getPromptWorkspacesByWorkspaceId(workspaceId)
- setPrompts(promptData.prompts)
+ const promptData = await getPromptWorkspacesByWorkspaceId(workspaceId);
+ setPrompts(promptData.prompts);
- const toolData = await getToolWorkspacesByWorkspaceId(workspaceId)
- setTools(toolData.tools)
+ const toolData = await getToolWorkspacesByWorkspaceId(workspaceId);
+ setTools(toolData.tools);
- const modelData = await getModelWorkspacesByWorkspaceId(workspaceId)
- setModels(modelData.models)
+ const modelData = await getModelWorkspacesByWorkspaceId(workspaceId);
+ setModels(modelData.models);
+
+ const gameResult = await getGameResults();
+ setGameResults(gameResult);
setChatSettings({
- model: (searchParams.get("model") ||
+ model: (searchParams.get('model') ||
workspace?.default_model ||
- "gpt-4-1106-preview") as LLMID,
+ 'gpt-4-1106-preview') as LLMID,
prompt:
workspace?.default_prompt ||
- "You are a friendly, helpful AI assistant.",
+ '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"
- })
+ (workspace?.embeddings_provider as 'openai' | 'local') || 'openai'
+ });
- setLoading(false)
- }
+ setLoading(false);
+ };
if (loading) {
- return
+ return
;
}
- return
{children}
+ return
{children};
}
diff --git a/app/[locale]/[workspaceid]/page.tsx b/app/[locale]/[workspaceid]/page.tsx
index b43e8d5eb8..7cd6051d40 100644
--- a/app/[locale]/[workspaceid]/page.tsx
+++ b/app/[locale]/[workspaceid]/page.tsx
@@ -1,14 +1,14 @@
-"use client"
+'use client';
-import { ChatbotUIContext } from "@/context/context"
-import { useContext } from "react"
+import { ChatbotUIContext } from '@/context/context';
+import { useContext } from 'react';
export default function WorkspacePage() {
- const { selectedWorkspace } = useContext(ChatbotUIContext)
+ const { selectedWorkspace } = useContext(ChatbotUIContext);
return (
{selectedWorkspace?.name}
- )
+ );
}
diff --git a/app/[locale]/help/page.tsx b/app/[locale]/help/page.tsx
index c1753f460b..1e48176a9f 100644
--- a/app/[locale]/help/page.tsx
+++ b/app/[locale]/help/page.tsx
@@ -3,5 +3,5 @@ export default function HelpPage() {
- )
+ );
}
diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx
index 474058a910..1bbe2dac59 100644
--- a/app/[locale]/layout.tsx
+++ b/app/[locale]/layout.tsx
@@ -1,27 +1,27 @@
-import { Toaster } from "@/components/ui/sonner"
-import { GlobalState } from "@/components/utility/global-state"
-import { Providers } from "@/components/utility/providers"
-import TranslationsProvider from "@/components/utility/translations-provider"
-import initTranslations from "@/lib/i18n"
-import { Database } from "@/supabase/types"
-import { createServerClient } from "@supabase/ssr"
-import { Metadata, Viewport } from "next"
-import { Inter } from "next/font/google"
-import { cookies } from "next/headers"
-import { ReactNode } from "react"
-import "./globals.css"
+import { Toaster } from '@/components/ui/sonner';
+import { GlobalState } from '@/components/utility/global-state';
+import { Providers } from '@/components/utility/providers';
+import TranslationsProvider from '@/components/utility/translations-provider';
+import initTranslations from '@/lib/i18n';
+import { Database } from '@/supabase/types';
+import { createServerClient } from '@supabase/ssr';
+import { Metadata, Viewport } from 'next';
+import { Inter } from 'next/font/google';
+import { cookies } from 'next/headers';
+import { ReactNode } from 'react';
+import './globals.css';
-const inter = Inter({ subsets: ["latin"] })
-const APP_NAME = "Chatbot UI"
-const APP_DEFAULT_TITLE = "Chatbot UI"
-const APP_TITLE_TEMPLATE = "%s - Chatbot UI"
-const APP_DESCRIPTION = "Chabot UI PWA!"
+const inter = Inter({ subsets: ['latin'] });
+const APP_NAME = 'Chatbot UI';
+const APP_DEFAULT_TITLE = 'Chatbot UI';
+const APP_TITLE_TEMPLATE = '%s - Chatbot UI';
+const APP_DESCRIPTION = 'Chabot UI PWA!';
interface RootLayoutProps {
- children: ReactNode
+ children: ReactNode;
params: {
- locale: string
- }
+ locale: string;
+ };
}
export const metadata: Metadata = {
@@ -31,10 +31,10 @@ export const metadata: Metadata = {
template: APP_TITLE_TEMPLATE
},
description: APP_DESCRIPTION,
- manifest: "/manifest.json",
+ manifest: '/manifest.json',
appleWebApp: {
capable: true,
- statusBarStyle: "black",
+ statusBarStyle: 'black',
title: APP_DEFAULT_TITLE
// startUpImage: [],
},
@@ -42,7 +42,7 @@ export const metadata: Metadata = {
telephone: false
},
openGraph: {
- type: "website",
+ type: 'website',
siteName: APP_NAME,
title: {
default: APP_DEFAULT_TITLE,
@@ -51,40 +51,40 @@ export const metadata: Metadata = {
description: APP_DESCRIPTION
},
twitter: {
- card: "summary",
+ card: 'summary',
title: {
default: APP_DEFAULT_TITLE,
template: APP_TITLE_TEMPLATE
},
description: APP_DESCRIPTION
}
-}
+};
export const viewport: Viewport = {
- themeColor: "#000000"
-}
+ themeColor: '#000000'
+};
-const i18nNamespaces = ["translation"]
+const i18nNamespaces = ['translation'];
export default async function RootLayout({
children,
params: { locale }
}: RootLayoutProps) {
- const cookieStore = cookies()
+ const cookieStore = cookies();
const supabase = createServerClient
(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
get(name: string) {
- return cookieStore.get(name)?.value
+ return cookieStore.get(name)?.value;
}
}
}
- )
- const session = (await supabase.auth.getSession()).data.session
+ );
+ const session = (await supabase.auth.getSession()).data.session;
- const { t, resources } = await initTranslations(locale, i18nNamespaces)
+ const { t, resources } = await initTranslations(locale, i18nNamespaces);
return (
@@ -103,5 +103,5 @@ export default async function RootLayout({