diff --git a/app/terms.tsx b/app/terms.tsx index 2922ae7fe..f1040798c 100644 --- a/app/terms.tsx +++ b/app/terms.tsx @@ -24,6 +24,8 @@ function Terms() { const handleAcceptTerms = useCallback(() => { console.log('Accepting terms...'); acceptTerms(); + // After accepting terms, show the onboarding walkthrough + // The onboarding will show automatically when navigating to projects view router.navigate('/'); }, [acceptTerms, router]); diff --git a/components/AppHeader.tsx b/components/AppHeader.tsx index ac9053c97..65fc7125e 100644 --- a/components/AppHeader.tsx +++ b/components/AppHeader.tsx @@ -11,6 +11,7 @@ import { AlertTriangle, ChevronRight, CloudOff, + HelpCircle, Menu, RefreshCw } from 'lucide-react-native'; @@ -29,11 +30,13 @@ import { Button } from './ui/button'; export default function AppHeader({ drawerToggleCallback, isCloudLoading = false, - isNavigating = false + isNavigating = false, + onOnboardingPress }: { drawerToggleCallback: () => void; isCloudLoading?: boolean; isNavigating?: boolean; + onOnboardingPress?: () => void; }) { const { breadcrumbs, @@ -231,6 +234,19 @@ export default function AppHeader({ : null} + {/* Help/Onboarding Button */} + {onOnboardingPress && ( + + )} + {/* Menu Button with Indicators */} + - - - - {/* Arrow and option to view all projects */} - - - {t('orBrowseAllProjects') || 'Or browse all public projects'} - - - - - ) : ( - <> - {/* Search and filter */} - - - ) : undefined - } - suffixStyling={false} - hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }} - /> - {currentUser && ( - setActiveTab('all')} + className="flex-row items-center gap-2" > - - - )} + {t('viewAllProjects') || 'View All Projects'} + + + - - )} - - - {/* Show project list only if not showing login invitation */} - {!isAuthenticated && activeTab === 'my' ? null : isLoading || - (isFetchingProjects && searchQuery && data.length === 0) ? ( - - ) : ( - 768 && data.length > 1 ? 2 : 1} - keyExtractor={(item) => item.id} - recycleItems - estimatedItemSize={175} - maintainVisibleContentPosition - renderItem={({ item }) => ( - 768 && 'h-[212px]')} - /> - )} - onEndReached={() => { - if (allProjects.hasNextPage && !allProjects.isFetchingNextPage) { - allProjects.fetchNextPage(); - } - }} - onEndReachedThreshold={0.5} - ListFooterComponent={() => - allProjects.isFetchingNextPage && ( - - + {/* Search and filter */} + + + ) : undefined + } + suffixStyling={false} + hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }} /> - - ) - } - ListEmptyComponent={() => ( - - - - {searchQuery - ? 'No projects found' - : activeTab === 'my' - ? 'No projects yet' - : 'No projects available'} - - {activeTab === 'my' && !searchQuery && ( - + + )} - + )} - /> - )} - - - -
- - {t('newProject')} - - - ( - - - + + {/* Show project list only if not showing login invitation */} + {!isAuthenticated && activeTab === 'my' ? null : isLoading || + (isFetchingProjects && searchQuery && data.length === 0) ? ( + + ) : ( + 768 && data.length > 1 ? 2 : 1} + keyExtractor={(item) => item.id} + recycleItems + estimatedItemSize={175} + maintainVisibleContentPosition + renderItem={({ item }) => ( + 768 && 'h-[212px]')} + /> + )} + onEndReached={() => { + if ( + allProjects.hasNextPage && + !allProjects.isFetchingNextPage + ) { + allProjects.fetchNextPage(); + } + }} + onEndReachedThreshold={0.5} + ListFooterComponent={() => + allProjects.isFetchingNextPage && ( + + - - - + + ) + } + ListEmptyComponent={() => ( + + + + {searchQuery + ? 'No projects found' + : activeTab === 'my' + ? 'No projects yet' + : 'No projects available'} + + {activeTab === 'my' && !searchQuery && ( + + )} + + )} /> + )} + - { - return ( + + + + {t('newProject')} + + + ( - field.onChange(lang.id)} + - ); - }} - /> + )} + /> - ( - - -