"use client" import * as React from "react" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { ScrollArea } from "@/components/ui/scroll-area" import { FileText, Search, MessageSquare, ChevronLeft, ChevronRight, Network, Copy, Check, ArrowLeft } from "lucide-react" import { ModeToggle } from "@/components/mode-toggle" import { Input } from "@/components/ui/input" interface SidebarProps extends React.HTMLAttributes { activeSection: string onSectionChange: (section: string) => void connectionUri?: string isReadOnlyUri?: boolean onUriChange?: (uri: string) => void isCollapsed?: boolean setIsCollapsed?: (collapsed: boolean) => void onBackClick?: () => void } export function Sidebar({ className, activeSection, onSectionChange, connectionUri, isReadOnlyUri = false, onUriChange, isCollapsed: externalIsCollapsed, setIsCollapsed: externalSetIsCollapsed, onBackClick, ...props }: SidebarProps) { // Use internal state that syncs with external state if provided const [internalIsCollapsed, setInternalIsCollapsed] = React.useState(false) const [editableUri, setEditableUri] = React.useState('') const [isEditingUri, setIsEditingUri] = React.useState(false) // Determine if sidebar is collapsed based on props or internal state const isCollapsed = externalIsCollapsed !== undefined ? externalIsCollapsed : internalIsCollapsed // Toggle function that updates both internal and external state if provided const toggleCollapsed = () => { if (externalSetIsCollapsed) { externalSetIsCollapsed(!isCollapsed) } setInternalIsCollapsed(!isCollapsed) } // Initialize from localStorage or props React.useEffect(() => { // For development/testing - check if we have a stored URI const storedUri = typeof window !== 'undefined' ? localStorage.getItem('morphik_uri') : null; if (storedUri) { setEditableUri(storedUri); // Note: we're removing the auto-notification to avoid refresh loops } else if (connectionUri) { setEditableUri(connectionUri); } }, [connectionUri]) // Update editable URI when connectionUri changes React.useEffect(() => { if (connectionUri && connectionUri !== editableUri) { setEditableUri(connectionUri); } }, [connectionUri, editableUri]) // Extract connection details if URI is provided const isConnected = !!connectionUri; let connectionHost = null; try { if (connectionUri) { // Try to extract host from morphik:// format const match = connectionUri.match(/^morphik:\/\/[^@]+@(.+)/); if (match && match[1]) { connectionHost = match[1]; // If it includes a protocol, remove it to get just the host if (connectionHost.includes('://')) { connectionHost = new URL(connectionHost).host; } } } } catch (error) { console.error('Error parsing connection URI:', error); connectionHost = 'localhost'; } // Handle saving the connection URI const handleSaveUri = () => { // Store the URI in localStorage for persistence if (typeof window !== 'undefined') { if (editableUri.trim() === '') { // If URI is empty, remove from localStorage to default to local localStorage.removeItem('morphik_uri'); } else { localStorage.setItem('morphik_uri', editableUri); } } // Call the onUriChange callback if provided if (onUriChange) { // Pass empty string to trigger default localhost connection onUriChange(editableUri.trim()); } else { // Fallback for demo purposes if no callback is provided console.log('New URI:', editableUri || '(empty - using localhost)'); } // Close editing mode setIsEditingUri(false); } return (
{!isCollapsed &&

Morphik

}
{/* Display connection information when not collapsed */} {!isCollapsed && (
{isConnected ? "Connected to:" : "Connection Status:"}
{isConnected && connectionHost && !connectionHost.includes('localhost') && !connectionHost.includes('local') ? {connectionHost} : Local Connection (localhost:8000) }
{/* Connection URI Section */}
Connection URI:
{isConnected && !isEditingUri && ( )} {/* Add Edit button if not editing and not in read-only mode */} {!isReadOnlyUri && !isEditingUri && ( )}
{/* URI Display or Editing Area */} {isReadOnlyUri ? ( // Read-only display for production/cloud environments
{connectionUri ? // Show first and last characters with asterisks in between `${connectionUri.substring(0, 12)}...${connectionUri.substring(connectionUri.length - 12)}` : 'No URI configured' }
) : isEditingUri ? ( // Editing mode (only available when not read-only)
setEditableUri(e.target.value)} placeholder="morphik://token@host (empty for localhost)" className="h-7 text-xs font-mono" />
Format: morphik://your_token@your_api_host
) : ( // Display current URI (or placeholder)
{connectionUri || "Using localhost by default - click Edit to change"}
)}
)}
{!isCollapsed && onBackClick && ( )}
) }