diff --git a/src/components/moderation/DetailedViewCollapsible.tsx b/src/components/moderation/DetailedViewCollapsible.tsx new file mode 100644 index 00000000..1be331ce --- /dev/null +++ b/src/components/moderation/DetailedViewCollapsible.tsx @@ -0,0 +1,54 @@ +import { ChevronDown, ChevronUp } from 'lucide-react'; +import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '@/components/ui/collapsible'; +import { Button } from '@/components/ui/button'; +import { cn } from '@/lib/utils'; + +interface DetailedViewCollapsibleProps { + isCollapsed: boolean; + onToggle: () => void; + children: React.ReactNode; + className?: string; +} + +/** + * Collapsible wrapper for detailed field-by-field view sections + * Provides expand/collapse functionality with visual indicators + */ +export function DetailedViewCollapsible({ + isCollapsed, + onToggle, + children, + className +}: DetailedViewCollapsibleProps) { + return ( + onToggle()}> +
+ + + + + + {children} + +
+
+ ); +} diff --git a/src/hooks/useDetailedViewState.ts b/src/hooks/useDetailedViewState.ts new file mode 100644 index 00000000..922d3f93 --- /dev/null +++ b/src/hooks/useDetailedViewState.ts @@ -0,0 +1,48 @@ +import { useState, useEffect } from 'react'; +import { logger } from '@/lib/logger'; + +const STORAGE_KEY = 'detailed-view-collapsed'; + +interface UseDetailedViewStateReturn { + isCollapsed: boolean; + toggle: () => void; + setCollapsed: (value: boolean) => void; +} + +/** + * Hook to manage detailed view collapsed/expanded state + * Syncs with localStorage for persistence across sessions + * Defaults to collapsed to reduce visual clutter + */ +export function useDetailedViewState(): UseDetailedViewStateReturn { + const [isCollapsed, setIsCollapsed] = useState(() => { + // Initialize from localStorage on mount + try { + const stored = localStorage.getItem(STORAGE_KEY); + // Default to collapsed (true) to reduce visual clutter + return stored ? JSON.parse(stored) : true; + } catch (error) { + logger.warn('Error reading detailed view state from localStorage', { error }); + return true; + } + }); + + // Sync to localStorage when state changes + useEffect(() => { + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(isCollapsed)); + } catch (error) { + logger.warn('Error saving detailed view state to localStorage', { error }); + } + }, [isCollapsed]); + + const toggle = () => setIsCollapsed(prev => !prev); + + const setCollapsed = (value: boolean) => setIsCollapsed(value); + + return { + isCollapsed, + toggle, + setCollapsed, + }; +}