diff --git a/surfsense_backend/app/tasks/chat/stream_new_chat.py b/surfsense_backend/app/tasks/chat/stream_new_chat.py index 5f8cd638b..85a524108 100644 --- a/surfsense_backend/app/tasks/chat/stream_new_chat.py +++ b/surfsense_backend/app/tasks/chat/stream_new_chat.py @@ -423,9 +423,9 @@ async def stream_new_chat( title = title[:27] + "..." doc_names.append(title) if len(doc_names) == 1: - processing_parts.append(f"[📖 {doc_names[0]}]") + processing_parts.append(f"[{doc_names[0]}]") else: - processing_parts.append(f"[📖 {len(doc_names)} docs]") + processing_parts.append(f"[{len(doc_names)} docs]") last_active_step_items = [f"{action_verb}: {' '.join(processing_parts)}"] diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx index 9f844ba2b..d8e0d55b9 100644 --- a/surfsense_web/components/assistant-ui/thread.tsx +++ b/surfsense_web/components/assistant-ui/thread.tsx @@ -124,14 +124,23 @@ const ThreadScrollToBottom: FC = () => { ); }; -const getTimeBasedGreeting = (userEmail?: string): string => { +const getTimeBasedGreeting = (user?: { display_name?: string | null; email?: string }): string => { const hour = new Date().getHours(); - // Extract first name from email if available - const firstName = userEmail - ? userEmail.split("@")[0].split(".")[0].charAt(0).toUpperCase() + - userEmail.split("@")[0].split(".")[0].slice(1) - : null; + // Extract first name: prefer display_name, fall back to email extraction + let firstName: string | null = null; + + if (user?.display_name?.trim()) { + // Use display_name if available and not empty + // Extract first name from display_name (take first word) + const nameParts = user.display_name.trim().split(/\s+/); + firstName = nameParts[0].charAt(0).toUpperCase() + nameParts[0].slice(1).toLowerCase(); + } else if (user?.email) { + // Fall back to email extraction if display_name is not available + firstName = + user.email.split("@")[0].split(".")[0].charAt(0).toUpperCase() + + user.email.split("@")[0].split(".")[0].slice(1); + } // Array of greeting variations for each time period const morningGreetings = ["Good morning", "Fresh start today", "Morning", "Hey there"]; @@ -172,7 +181,7 @@ const ThreadWelcome: FC = () => { const { data: user } = useAtomValue(currentUserAtom); // Memoize greeting so it doesn't change on re-renders (only on user change) - const greeting = useMemo(() => getTimeBasedGreeting(user?.email), [user?.email]); + const greeting = useMemo(() => getTimeBasedGreeting(user), [user]); return (
diff --git a/surfsense_web/components/new-chat/chat-share-button.tsx b/surfsense_web/components/new-chat/chat-share-button.tsx index 28a149f95..56187bff5 100644 --- a/surfsense_web/components/new-chat/chat-share-button.tsx +++ b/surfsense_web/components/new-chat/chat-share-button.tsx @@ -1,7 +1,7 @@ "use client"; import { useQueryClient } from "@tanstack/react-query"; -import { Globe, Loader2, Lock, Share2, Users } from "lucide-react"; +import { Loader2, Lock, Share2, Users } from "lucide-react"; import { useCallback, useState } from "react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; @@ -92,8 +92,7 @@ export function ChatShareButton({ thread, onVisibilityChange, className }: ChatS variant="ghost" size="sm" className={cn( - "h-7 md:h-9 gap-1.5 md:gap-2 px-2 md:px-3 rounded-lg md:rounded-xl", - "border border-border/80 bg-background/50 backdrop-blur-sm", + "h-7 md:h-9 gap-1 md:gap-2 px-2 md:px-3 rounded-lg md:rounded-xl border border-border/80 bg-background/50 backdrop-blur-sm", "hover:bg-muted/80 hover:border-border/30 transition-all duration-200", "text-xs md:text-sm font-medium text-foreground", "focus-visible:ring-0 focus-visible:ring-offset-0", @@ -104,7 +103,6 @@ export function ChatShareButton({ thread, onVisibilityChange, className }: ChatS {currentVisibility === "PRIVATE" ? "Private" : "Shared"} - @@ -113,9 +111,8 @@ export function ChatShareButton({ thread, onVisibilityChange, className }: ChatS align="end" sideOffset={8} > -
+
-

Share Chat

@@ -149,8 +146,8 @@ export function ChatShareButton({ thread, onVisibilityChange, className }: ChatS className={cn( "w-full flex items-start gap-2.5 px-2.5 py-2 rounded-md transition-all", "hover:bg-accent/50 cursor-pointer", - "focus:outline-none focus:ring-2 focus:ring-primary/20", - isSelected && "bg-accent/80 ring-1 ring-primary/20" + "focus:outline-none", + isSelected && "bg-accent/80" )} >

- - {/* Info footer */} -
-
- -

- {currentVisibility === "PRIVATE" - ? "This chat is private. Only you can view and interact with it." - : "This chat is shared. All search space members can view, continue the conversation, and delete it."} -

-
-
); diff --git a/surfsense_web/content/docs/how-to/electric-sql.mdx b/surfsense_web/content/docs/how-to/electric-sql.mdx index 8e6f4dee5..599267595 100644 --- a/surfsense_web/content/docs/how-to/electric-sql.mdx +++ b/surfsense_web/content/docs/how-to/electric-sql.mdx @@ -1,5 +1,5 @@ --- -title: Electric SQL Setup +title: Electric SQL description: Setting up Electric SQL for real-time data synchronization in SurfSense ---