From e08c43687061f6240005e0823bf9846fba29726a Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Mon, 9 Jun 2025 18:25:53 +0100 Subject: [PATCH] Add floating chat --- .../EditorRoadmap/EditorRoadmap.tsx | 4 +- .../FrameRenderer/RoadmapFloatingChat.tsx | 95 +++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 src/components/FrameRenderer/RoadmapFloatingChat.tsx diff --git a/src/components/EditorRoadmap/EditorRoadmap.tsx b/src/components/EditorRoadmap/EditorRoadmap.tsx index 1a0df65a9..4f91be514 100644 --- a/src/components/EditorRoadmap/EditorRoadmap.tsx +++ b/src/components/EditorRoadmap/EditorRoadmap.tsx @@ -9,8 +9,8 @@ import { type ResourceType, } from '../../lib/resource-progress'; import { httpGet } from '../../lib/http'; -import { ProgressNudge } from '../FrameRenderer/ProgressNudge'; import { getUrlParams } from '../../lib/browser.ts'; +import { RoadmapFloatingChat } from '../FrameRenderer/RoadmapFloatingChat.tsx'; type EditorRoadmapProps = { resourceId: string; @@ -99,7 +99,7 @@ export function EditorRoadmap(props: EditorRoadmapProps) { dimensions={dimensions} resourceId={resourceId} /> - + ); } diff --git a/src/components/FrameRenderer/RoadmapFloatingChat.tsx b/src/components/FrameRenderer/RoadmapFloatingChat.tsx new file mode 100644 index 000000000..00c87139c --- /dev/null +++ b/src/components/FrameRenderer/RoadmapFloatingChat.tsx @@ -0,0 +1,95 @@ +import { Wand2 } from 'lucide-react'; +import { useEffect, useState } from 'react'; +import { roadmapJSONOptions } from '../../queries/roadmap'; +import { queryClient } from '../../stores/query-client'; +import { useQuery } from '@tanstack/react-query'; +import { RoadmapAIChatCard } from '../RoadmapAIChat/RoadmapAIChatCard'; +import { lockBodyScroll } from '../../lib/dom'; +import { useKeydown } from '../../hooks/use-keydown'; + +type RoadmapChatProps = { + roadmapId: string; +}; + +export function RoadmapFloatingChat(props: RoadmapChatProps) { + const { roadmapId } = props; + const [isOpen, setIsOpen] = useState(false); + + const { data: roadmapDetail, isLoading: isRoadmapDetailLoading } = useQuery( + roadmapJSONOptions(roadmapId), + queryClient, + ); + + useEffect(() => { + lockBodyScroll(isOpen); + }, [isOpen]); + + useKeydown('Escape', () => { + setIsOpen(false); + }); + + return ( + <> + {isOpen && ( +
{ + setIsOpen(false); + }} + className="fixed inset-0 bg-black opacity-50" + >
+ )} + +
+ {isOpen && ( +
+ {/* Messages area - scrollable */} +
+
+ + Hey, how can I help you? + + } + /> +
+
+ + {/* Input area - sticky at bottom */} +
+ +
+
+ )} + + {!isOpen && ( + + )} +
+ + ); +}