From c415e68bfc853e34b318d0479963fba6727095ef Mon Sep 17 00:00:00 2001
From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com>
Date: Fri, 17 Jul 2026 09:41:29 +0530
Subject: [PATCH] refactor(chat): remove loading component and enhance footer
visibility logic in ChatViewport
---
.../[workspace_id]/new-chat/loading.tsx | 62 -------------------
.../components/assistant-ui/chat-viewport.tsx | 14 ++++-
.../components/assistant-ui/thread.tsx | 5 +-
3 files changed, 15 insertions(+), 66 deletions(-)
delete mode 100644 surfsense_web/app/dashboard/[workspace_id]/new-chat/loading.tsx
diff --git a/surfsense_web/app/dashboard/[workspace_id]/new-chat/loading.tsx b/surfsense_web/app/dashboard/[workspace_id]/new-chat/loading.tsx
deleted file mode 100644
index 108671662..000000000
--- a/surfsense_web/app/dashboard/[workspace_id]/new-chat/loading.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { Skeleton } from "@/components/ui/skeleton";
-
-export default function Loading() {
- return (
-
-
-
-
- {/* User message */}
-
-
-
-
- {/* Assistant message */}
-
-
-
-
-
-
- {/* User message */}
-
-
-
-
- {/* Assistant message */}
-
-
-
-
-
-
- {/* User message */}
-
-
-
-
-
- {/* Input bar */}
-
-
-
- );
-}
diff --git a/surfsense_web/components/assistant-ui/chat-viewport.tsx b/surfsense_web/components/assistant-ui/chat-viewport.tsx
index 83308b642..cb0c57442 100644
--- a/surfsense_web/components/assistant-ui/chat-viewport.tsx
+++ b/surfsense_web/components/assistant-ui/chat-viewport.tsx
@@ -22,9 +22,19 @@ const ChatScrollToBottom: FC = () => (
export interface ChatViewportProps {
children: ReactNode;
footer?: ReactNode;
+ /**
+ * Keep the footer (composer) pinned even when the thread has no messages —
+ * needed while an existing thread's messages are still loading, so the
+ * bottom composer stays visible above the loading skeleton.
+ */
+ footerAlwaysVisible?: boolean;
}
-export const ChatViewport: FC = ({ children, footer }) => (
+export const ChatViewport: FC = ({
+ children,
+ footer,
+ footerAlwaysVisible = false,
+}) => (
= ({ children, footer }) => (
/>
{children}
{footer ? (
- !thread.isEmpty}>
+ footerAlwaysVisible || !thread.isEmpty}>
= ({
}}
>
hasActiveThread || !thread.isEmpty}>
+ <>
-
+ >
}
>
!hasActiveThread && thread.isEmpty}>