From a54f16fcc53a8b1ef2420e8a1305ae1cf6ba394c Mon Sep 17 00:00:00 2001 From: alejandrobailo Date: Thu, 25 Jun 2026 19:51:12 +0200 Subject: [PATCH] refactor(ui): componentize Lighthouse v2 chat and config pages --- .../lighthouse/_components/chat/composer.tsx | 134 +++ .../_components/chat/empty-state.tsx | 105 ++ .../chat/lighthouse-v2-chat-page.test.tsx | 8 + .../chat/lighthouse-v2-chat-page.tsx | 589 +---------- .../_components/chat/message-bubble.tsx | 134 +++ .../_components/chat/message-markdown.tsx | 32 + .../_components/chat/streaming-message.tsx | 103 ++ .../_components/config/configuration-form.tsx | 394 +++++++ .../config/configuration-section.tsx | 32 + .../config/connection-status-panel.tsx | 44 + .../_components/config/credential-fields.tsx | 116 +++ .../_components/config/empty-state.tsx | 32 + .../_components/config/feedback-alert.tsx | 47 + .../config/lighthouse-v2-config-page.test.tsx | 5 +- .../config/lighthouse-v2-config-page.tsx | 970 +----------------- .../_components/config/model-details.tsx | 51 + .../_components/config/provider-icon.tsx | 23 + .../_components/config/provider-rail.tsx | 83 ++ .../_components/config/status-badge.tsx | 34 + .../lighthouse-v2-session-history.test.tsx | 41 - .../history/lighthouse-v2-session-history.tsx | 139 +-- ui/app/(prowler)/lighthouse/_lib/config.ts | 188 ++++ ui/app/(prowler)/lighthouse/_lib/format.ts | 34 + ui/app/(prowler)/lighthouse/_lib/messages.ts | 55 + .../lighthouse/_lib/stream-event-parser.ts | 70 ++ 25 files changed, 1803 insertions(+), 1660 deletions(-) create mode 100644 ui/app/(prowler)/lighthouse/_components/chat/composer.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/chat/empty-state.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/chat/message-bubble.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/chat/message-markdown.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/chat/streaming-message.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/configuration-form.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/configuration-section.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/connection-status-panel.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/credential-fields.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/empty-state.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/feedback-alert.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/model-details.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/provider-icon.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/provider-rail.tsx create mode 100644 ui/app/(prowler)/lighthouse/_components/config/status-badge.tsx create mode 100644 ui/app/(prowler)/lighthouse/_lib/config.ts create mode 100644 ui/app/(prowler)/lighthouse/_lib/format.ts create mode 100644 ui/app/(prowler)/lighthouse/_lib/messages.ts create mode 100644 ui/app/(prowler)/lighthouse/_lib/stream-event-parser.ts diff --git a/ui/app/(prowler)/lighthouse/_components/chat/composer.tsx b/ui/app/(prowler)/lighthouse/_components/chat/composer.tsx new file mode 100644 index 0000000000..4f24f2f103 --- /dev/null +++ b/ui/app/(prowler)/lighthouse/_components/chat/composer.tsx @@ -0,0 +1,134 @@ +"use client"; + +import { ArrowRight, Square } from "lucide-react"; +import { type FormEvent } from "react"; + +import { Button } from "@/components/shadcn/button/button"; +import { Textarea } from "@/components/shadcn/textarea/textarea"; + +interface ChatComposerPanelProps { + feedback: string | null; + canRetry: boolean; + onRetry: () => void; + canSend: boolean; + input: string; + isStreaming: boolean; + selectedConfigurationConnected: boolean; + onInputChange: (value: string) => void; + onStop: () => void; + onSubmit: (event: FormEvent) => void; + onSubmitText: (text: string) => Promise; +} + +// Feedback banner + input, shared by the empty and active chat layouts so the +// two branches can't drift apart. +export function ChatComposerPanel({ + feedback, + canRetry, + onRetry, + ...composerProps +}: ChatComposerPanelProps) { + return ( + <> + + + + ); +} + +function ChatFeedbackBar({ + feedback, + canRetry, + onRetry, +}: { + feedback: string | null; + canRetry: boolean; + onRetry: () => void; +}) { + if (!feedback) return null; + + return ( +
+ {feedback} + {canRetry && ( + + )} +
+ ); +} + +interface ChatComposerProps { + canSend: boolean; + input: string; + isStreaming: boolean; + selectedConfigurationConnected: boolean; + onInputChange: (value: string) => void; + onStop: () => void; + onSubmit: (event: FormEvent) => void; + onSubmitText: (text: string) => Promise; +} + +function ChatComposer({ + canSend, + input, + isStreaming, + selectedConfigurationConnected, + onInputChange, + onStop, + onSubmit, + onSubmitText, +}: ChatComposerProps) { + return ( +
+