From 32b415a97f9430d27673da87611a26c426458ab2 Mon Sep 17 00:00:00 2001 From: ersaayan Date: Sat, 22 Nov 2025 18:10:16 +0300 Subject: [PATCH] feat: smart package recommendations with UX improvements - Added smart recommendations section with category-based filtering - Implemented onboarding flow with 3-step wizard (categories, OS, experience level) - Added 'Select All/Deselect All' for recommendations - Added 'Preferences' button in header to reopen onboarding - Fixed script generation for recommendation-based packages (auto-detect platform) - Fixed onboarding completion bug (removed duplicate save) - Added comprehensive debug logging - Enhanced ScriptPreview to work with auto-generated platform info - Optimized recommendation API with proper validation and error handling - Added localStorage profile management with version control --- src/app/api/recommendations/route.ts | 3 +- src/components/Header.tsx | 21 +++++- src/components/OnboardingModal.tsx | 27 ++++--- src/components/RecommendationsSection.tsx | 35 ++++++++- src/components/RepoHubApp.tsx | 87 +++++++++++++++++++++-- src/contexts/LocaleContext.tsx | 14 ++-- src/hooks/useRecommendationProfile.ts | 16 ++++- src/services/recommendationService.ts | 8 ++- 8 files changed, 182 insertions(+), 29 deletions(-) diff --git a/src/app/api/recommendations/route.ts b/src/app/api/recommendations/route.ts index d42d807..8892b71 100644 --- a/src/app/api/recommendations/route.ts +++ b/src/app/api/recommendations/route.ts @@ -71,7 +71,8 @@ export async function POST(request: NextRequest) { { status: 400 } ); } - const limit = body.limit && body.limit > 0 && body.limit <= 50 ? body.limit : 20; + const limit = + body.limit && body.limit > 0 && body.limit <= 50 ? body.limit : 20; // Generate recommendations const recommendations = await RecommendationService.generateRecommendations( diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 659ce93..c56bbef 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -5,14 +5,16 @@ import { Button } from '@/components/ui/button' import { useTheme } from '@/hooks/useTheme' import { useLocale } from '@/contexts/LocaleContext' import { SupportModal } from '@/components/SupportModal' -import { Sun, Moon, Monitor, Globe, Heart, Github } from 'lucide-react' +import { Sun, Moon, Monitor, Globe, Heart, Github, Settings } from 'lucide-react' import Image from 'next/image' export interface HeaderProps { cryptomusEnabled: boolean + onResetPreferences?: () => void + hasProfile?: boolean } -export function Header({ cryptomusEnabled }: HeaderProps) { +export function Header({ cryptomusEnabled, onResetPreferences, hasProfile }: HeaderProps) { const { theme, isDark, toggleTheme } = useTheme() const { locale, toggleLocale, t } = useLocale() const [isSupportModalOpen, setIsSupportModalOpen] = useState(false) @@ -58,6 +60,21 @@ export function Header({ cryptomusEnabled }: HeaderProps) {
+ {/* Preferences Button - Show when profile exists */} + {hasProfile && onResetPreferences && ( + + )} + {/* Support Button - Only show when Cryptomus is enabled */} {cryptomusEnabled && (
+