From 64bd5c429e9088575bb127b9df1b9f7e17805a03 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Wed, 22 Apr 2026 21:05:53 +0200 Subject: [PATCH] logged out chat modal, call to action --- .codex | 0 .../(.)assistant/_components/ChatModal.tsx | 12 ++---- src/app/@modal/(.)assistant/page.tsx | 10 +---- src/app/_components/ChatFAB.tsx | 17 ++++---- src/app/_providers/MessagesProvider.tsx | 42 +++++++++++++++---- src/app/chat/_components/ChatInterface.tsx | 30 +++++++++++-- src/app/chat/page.tsx | 9 ++-- 7 files changed, 75 insertions(+), 45 deletions(-) create mode 100644 .codex diff --git a/.codex b/.codex new file mode 100644 index 0000000..e69de29 diff --git a/src/app/@modal/(.)assistant/_components/ChatModal.tsx b/src/app/@modal/(.)assistant/_components/ChatModal.tsx index eb19864..820100c 100644 --- a/src/app/@modal/(.)assistant/_components/ChatModal.tsx +++ b/src/app/@modal/(.)assistant/_components/ChatModal.tsx @@ -5,15 +5,9 @@ import ChatInterface from '~/app/chat/_components/ChatInterface' import { useMessages } from '~/app/_providers/MessagesProvider'; import { Spinner } from '~/components/ui/spinner'; -type DBMessage = { - id: string - role: 'user' | 'assistant' - content: string -} - export default function ChatModal() { const router = useRouter() - const {messages,session,clearChat,clearingChat,isLoading,error,refetchMessages} = useMessages() + const {messages,session,isLoading,error} = useMessages() return ( router.back()}> @@ -21,8 +15,8 @@ export default function ChatModal() { Talk To My AI-Assistant
- {messages && session?.id && - + {!isLoading && + } {isLoading && <> Loading Messages... diff --git a/src/app/@modal/(.)assistant/page.tsx b/src/app/@modal/(.)assistant/page.tsx index 6dc86fe..a0b0235 100644 --- a/src/app/@modal/(.)assistant/page.tsx +++ b/src/app/@modal/(.)assistant/page.tsx @@ -1,16 +1,8 @@ 'use client' -import { Skeleton } from '~/components/ui/skeleton'; import ChatModal from './_components/ChatModal' -import { trpc } from '~/app/_trpc/Client' -import { useTimeLine } from '~/app/_providers/GsapProvicer'; export default function AssistantModalPage() { - const { data: session, error, isLoading } = trpc.chat.getSession.useQuery(); return ( - <> - - {error &&
{error.message}
} - {isLoading && } - + ) } diff --git a/src/app/_components/ChatFAB.tsx b/src/app/_components/ChatFAB.tsx index 290c502..b080507 100644 --- a/src/app/_components/ChatFAB.tsx +++ b/src/app/_components/ChatFAB.tsx @@ -1,7 +1,6 @@ 'use client' import Link from 'next/link' import { MessageCircle } from 'lucide-react' -import { Show } from '@clerk/nextjs' import { Button } from '~/components/ui/button' import { usePathname } from 'next/navigation' export default function ChatFAB() { @@ -10,15 +9,13 @@ export default function ChatFAB() { return ( <> {!isChat && - -
- -
-
+
+ +
} ) diff --git a/src/app/_providers/MessagesProvider.tsx b/src/app/_providers/MessagesProvider.tsx index e179dfe..d5b9cec 100644 --- a/src/app/_providers/MessagesProvider.tsx +++ b/src/app/_providers/MessagesProvider.tsx @@ -1,5 +1,6 @@ 'use client' import type { inferRouterOutputs } from '@trpc/server'; +import { useUser } from '@clerk/nextjs' import { createContext, useContext, useEffect, useState, type ReactNode } from 'react' import { trpc } from '~/app/_trpc/Client' import { type ChatRouter } from '~/server/routers/chat' @@ -26,15 +27,29 @@ export const useMessages = () => useContext(MessageContext) export const MessagesProvider = ({children}:{children:ReactNode}) => { const [error,setError] = useState(null) const [isLoading,setIsLoading] = useState(true) - const { data: session,error:sessionError,isLoading:sessionLoading} = trpc.chat.getSession.useQuery() - const { data: messages, refetch, error:messageError, isLoading:messagesLoading } = trpc.chat.getMessages.useQuery(session?.id ? session.id : "") + const { isLoaded, isSignedIn } = useUser() + const { data: session,error:sessionError,isLoading:sessionLoading} = trpc.chat.getSession.useQuery(undefined, { + enabled: isSignedIn === true, + }) + const { data: messages, refetch, error:messageError, isLoading:messagesLoading } = trpc.chat.getMessages.useQuery(session?.id ? session.id : "", { + enabled: isSignedIn === true && session?.id != undefined, + }) const { mutate ,isPending:clearingChat,isSuccess:clearedChat } = trpc.chat.clearChat.useMutation() const utils = trpc.useUtils() const refetchMessages = () => { + if (!isSignedIn) { + return; + } utils.chat.getMessages.invalidate() refetch() } const clearChat = (callback?: () => void) => { + if (!isSignedIn) { + if (callback) { + callback() + } + return; + } mutate(undefined,{onSuccess: () => { if (callback) { callback() @@ -43,18 +58,29 @@ export const MessagesProvider = ({children}:{children:ReactNode}) => { }}) } useEffect(() => { + if (isSignedIn !== true) { + setError(null) + return; + } messageError && setError(messageError.message) sessionError && setError(sessionError.message) - },[messageError,sessionError]) + },[messageError,sessionError,isSignedIn]) useEffect(() => { - !sessionLoading && !messagesLoading && setIsLoading(false) - sessionLoading || messagesLoading && setIsLoading(true) - },[sessionLoading,messagesLoading]) + if (!isLoaded) { + setIsLoading(true) + return; + } + if (isSignedIn !== true) { + setIsLoading(false) + return; + } + setIsLoading(sessionLoading || messagesLoading) + },[isLoaded,isSignedIn,sessionLoading,messagesLoading]) return ( +
+

Sign in to use the chat

+

+ You need to be signed in before you can talk to Gregor's AI assistant. +

+
+ + + +
+ ) +} + function toUIMessages(dbMessages: DBMessage[]): UIMessage[] { return dbMessages.map((m) => ({ id: m.id, @@ -43,7 +60,7 @@ function addInitMessage(messageArray: UIMessage[]) { } } -export default function ChatInterface({ dbMessages, sessionId }: ChatInterfaceProps) { +function AuthenticatedChatInterface({ dbMessages, sessionId }: ChatInterfaceProps & { sessionId: string }) { const [input, setInput] = useState('') const { clearingChat, clearChat, refetchMessages } = useMessages(); const initialMessages = toUIMessages(dbMessages) @@ -115,7 +132,7 @@ export default function ChatInterface({ dbMessages, sessionId }: ChatInterfacePr
@@ -140,3 +157,10 @@ export default function ChatInterface({ dbMessages, sessionId }: ChatInterfacePr
) } + +export default function ChatInterface({ dbMessages, sessionId }: ChatInterfaceProps) { + if (sessionId == undefined) { + return + } + return +} diff --git a/src/app/chat/page.tsx b/src/app/chat/page.tsx index 1b66031..5ec4966 100644 --- a/src/app/chat/page.tsx +++ b/src/app/chat/page.tsx @@ -1,15 +1,12 @@ 'use client' import ChatInterface from './_components/ChatInterface' -import { trpc } from '../_trpc/Client'; -import { Skeleton } from '~/components/ui/skeleton'; import AnimatedPageTitle from '../_components/Animated/AnimatedPageTitle'; import { useTimeLine } from '../_providers/GsapProvicer'; import { useMessages } from '../_providers/MessagesProvider'; import { Spinner } from '~/components/ui/spinner'; -import { useEffect } from 'react'; export default function ChatPage() { - const {messages,session,clearChat,clearingChat,isLoading,error,refetchMessages} = useMessages() + const {messages,session,isLoading,error} = useMessages() useTimeLine(messages) return (
@@ -17,8 +14,8 @@ export default function ChatPage() { Talk To My AI-Assistant
- {messages && session?.id && - + {!isLoading && + } {isLoading && <> Loading Messages...