diff --git a/client/src/components/Conversations/ProjectsSection.tsx b/client/src/components/Conversations/ProjectsSection.tsx index 4d5e87d3af..fcb050ae9f 100644 --- a/client/src/components/Conversations/ProjectsSection.tsx +++ b/client/src/components/Conversations/ProjectsSection.tsx @@ -382,7 +382,11 @@ interface ProjectsSectionProps { const ProjectsSection = ({ toggleNav, isAuthenticated }: ProjectsSectionProps) => { const localize = useLocalize(); const navigate = useNavigate(); - const [isExpanded, setIsExpanded] = useLocalStorage('projectsSectionExpanded', true); + const [storedExpanded, setStoredExpanded] = useLocalStorage('projectsSectionExpanded', true); + const [hasToggledSection, setHasToggledSection] = useLocalStorage( + 'projectsSectionToggled', + false, + ); const [isCreateOpen, setIsCreateOpen] = useState(false); const conversation = useRecoilValue(store.conversationByIndex(0)); const activeProjectId = conversation?.chatProjectId ?? null; @@ -395,6 +399,14 @@ const ProjectsSection = ({ toggleNav, isAuthenticated }: ProjectsSectionProps) = const projects = useMemo(() => data?.pages.flatMap((page) => page.projects) ?? [], [data?.pages]); const hasMore = (data?.pages[data.pages.length - 1]?.nextCursor ?? null) != null; + /** + * Collapse the section by default for users with no projects who have never + * toggled it, to keep the sidebar compact. An explicit toggle — or a collapse + * set before this default existed (stored === false) — is always respected. + */ + const respectStoredExpanded = hasToggledSection || storedExpanded === false; + const isExpanded = respectStoredExpanded ? storedExpanded : isLoading || projects.length > 0; + const openProjects = useCallback(() => { navigate('/projects'); toggleNav(); @@ -455,7 +467,10 @@ const ProjectsSection = ({ toggleNav, isAuthenticated }: ProjectsSectionProps) =