From 385a103982e16d40948c7d6d84d9e52323a2da1f Mon Sep 17 00:00:00 2001 From: "dayuan.jiang" Date: Sun, 23 Mar 2025 12:48:31 +0000 Subject: [PATCH] feat: remove unused SVG files and update layout metadata for Next-AI-Drawio --- app/favicon.ico | Bin 25931 -> 15406 bytes app/layout.tsx | 34 +++--- components/chatPanel.tsx | 229 ++++++++++++++++++++++++++------------- public/file.svg | 1 - public/globe.svg | 1 - public/next.svg | 1 - public/vercel.svg | 1 - public/window.svg | 1 - 8 files changed, 173 insertions(+), 95 deletions(-) delete mode 100644 public/file.svg delete mode 100644 public/globe.svg delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 public/window.svg diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..869186adee238dfd3a52a8c5818a3ff825913e98 100644 GIT binary patch literal 15406 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 Gf&T#l)P@!S literal 25931 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 LrJugUA?W`A8`#=m diff --git a/app/layout.tsx b/app/layout.tsx index f7fa87e..2b637a9 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -3,32 +3,32 @@ import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], + variable: "--font-geist-sans", + subsets: ["latin"], }); const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], + variable: "--font-geist-mono", + subsets: ["latin"], }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Next-AI-Drawio", + description: "An AI-powered drawing tool that integrates with draw.io", }; export default function RootLayout({ - children, + children, }: Readonly<{ - children: React.ReactNode; + children: React.ReactNode; }>) { - return ( - - - {children} - - - ); + return ( + + + {children} + + + ); } diff --git a/components/chatPanel.tsx b/components/chatPanel.tsx index 1388de0..e2795a4 100644 --- a/components/chatPanel.tsx +++ b/components/chatPanel.tsx @@ -1,28 +1,47 @@ -"use client" +"use client"; -import type React from "react" -import { useRef, useEffect, useState } from "react" -import Image from "next/image" +import type React from "react"; +import { useRef, useEffect, useState } from "react"; +import Image from "next/image"; -import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" -import { ScrollArea } from "@/components/ui/scroll-area" -import { Button } from "@/components/ui/button" -import { useChat } from '@ai-sdk/react'; -import { ChatInput } from "@/components/chat-input" -import { convertToLegalXml } from "@/lib/utils" +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Button } from "@/components/ui/button"; +import { useChat } from "@ai-sdk/react"; +import { ChatInput } from "@/components/chat-input"; +import { convertToLegalXml } from "@/lib/utils"; interface ChatPanelProps { onDisplayChart: (xml: string) => void; onFetchChart: () => Promise; } -export default function ChatPanel({ onDisplayChart, onFetchChart }: ChatPanelProps) { +export default function ChatPanel({ + onDisplayChart, + onFetchChart, +}: ChatPanelProps) { // Add a step counter to track updates const stepCounterRef = useRef(0); // Add state for file attachments const [files, setFiles] = useState(undefined); // Remove the currentXmlRef and related useEffect - const { messages, input, handleInputChange, handleSubmit, status, error, setInput, setMessages, data } = useChat({ + const { + messages, + input, + handleInputChange, + handleSubmit, + status, + error, + setInput, + setMessages, + data, + } = useChat({ maxSteps: 5, async onToolCall({ toolCall }) { console.log("Tool call:", toolCall); @@ -36,19 +55,19 @@ export default function ChatPanel({ onDisplayChart, onFetchChart }: ChatPanelPro }, onError: (error) => { console.error("Chat error:", error); - } - }) - const messagesEndRef = useRef(null) + }, + }); + const messagesEndRef = useRef(null); // Scroll to bottom when messages change useEffect(() => { if (messagesEndRef.current) { - messagesEndRef.current.scrollIntoView({ behavior: "smooth" }) + messagesEndRef.current.scrollIntoView({ behavior: "smooth" }); } console.log("Data updated:", data); - }, [messages]) + }, [messages]); const onFormSubmit = async (e: React.FormEvent) => { - e.preventDefault() + e.preventDefault(); if (input.trim() && status !== "streaming") { try { // Fetch chart data before setting input @@ -66,10 +85,10 @@ export default function ChatPanel({ onDisplayChart, onFetchChart }: ChatPanelPro ${input} """ ` - ) + ); handleSubmit(e, { experimental_attachments: files, - }) + }); // Clear files after submission setFiles(undefined); @@ -77,21 +96,21 @@ export default function ChatPanel({ onDisplayChart, onFetchChart }: ChatPanelPro console.error("Error fetching chart data:", error); } } - } + }; // Helper function to handle file changes const handleFileChange = (newFiles: FileList | undefined) => { setFiles(newFiles); - } + }; // Helper function to render tool invocations const renderToolInvocation = (toolInvocation: any) => { const callId = toolInvocation.toolCallId; switch (toolInvocation.toolName) { - case 'display_diagram': { + case "display_diagram": { switch (toolInvocation.state) { - case 'partial-call': { + case "partial-call": { const currentXml = toolInvocation.args?.xml || ""; // Increment the step counter @@ -100,12 +119,20 @@ export default function ChatPanel({ onDisplayChart, onFetchChart }: ChatPanelPro // Determine whether to show details based on a simple threshold // Rather than comparing lengths (which can cause re-renders) - if (stepCounterRef.current >= 20 && stepCounterRef.current % 20 === 0) { + if ( + stepCounterRef.current >= 20 && + stepCounterRef.current % 20 === 0 + ) { onDisplayChart(convertToLegalXml(currentXml)); } return ( -
-
Generating diagram...
+
+
+ Generating diagram... +
Tool: display_diagram
@@ -115,22 +142,37 @@ export default function ChatPanel({ onDisplayChart, onFetchChart }: ChatPanelPro
); } - case 'call': + case "call": return ( -
-
Displaying diagram...
+
+
+ Displaying diagram... +
Tool: display_diagram
- Args: {JSON.stringify(toolInvocation.args, null, 2)} + Args:{" "} + {JSON.stringify( + toolInvocation.args, + null, + 2 + )}
); - case 'result': + case "result": return ( -
-
Diagram generated
+
+
+ Diagram generated +
Result: {toolInvocation.result}
@@ -146,64 +188,105 @@ export default function ChatPanel({ onDisplayChart, onFetchChart }: ChatPanelPro return ( - - Chat with Diagram Generator + + Next-AI-Drawio {messages.length === 0 ? (
-

Start a conversation to generate or modify diagrams.

-

Try: "Create a flowchart for user authentication"

+

+ Start a conversation to generate or modify + diagrams. +

+

+ Try: "Create a flowchart for user + authentication" +

) : ( messages.map((message) => ( -
+
{/* Render message content based on parts if available */} - {message.parts ? ( - message.parts.map((part, index) => { - switch (part.type) { - case 'text': - return
{part.text}
; - case 'tool-invocation': - return renderToolInvocation(part.toolInvocation); - default: - return null; - } - }) - ) : ( - // Fallback to simple content for older format - message.content - )} + {message.parts + ? message.parts.map((part, index) => { + switch (part.type) { + case "text": + return ( +
+ {part.text} +
+ ); + case "tool-invocation": + return renderToolInvocation( + part.toolInvocation + ); + default: + return null; + } + }) + : // Fallback to simple content for older format + message.content}
{/* Display image attachments */} - {message?.experimental_attachments?.filter(attachment => - attachment?.contentType?.startsWith('image/') - ).map((attachment, index) => ( -
-
- {attachment.name + {message?.experimental_attachments + ?.filter((attachment) => + attachment?.contentType?.startsWith( + "image/" + ) + ) + .map((attachment, index) => ( +
+
+ { +
-
- ))} + ))} {/* Legacy support for function_call format */} {(message as any).function_call && (
- Using tool: {(message as any).function_call.name}... + Using tool:{" "} + { + (message as any).function_call + .name + } + ...
)} @@ -231,5 +314,5 @@ export default function ChatPanel({ onDisplayChart, onFetchChart }: ChatPanelPro /> - ) + ); } diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file