-
-
Notifications
You must be signed in to change notification settings - Fork 64
Issue 275 #279
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Issue 275 #279
Conversation
- Skill assessment quiz with 6 interactive questions - 5 professional learning paths (Full Stack, Data Science, iOS, DevOps, UI/UX) - Weekly milestone tracker with interactive timeline - Progress visualization with charts and analytics - Community recommendations with ratings and completion times - 200+ curated learning resources - Time-to-completion estimates for all paths - Dashboard integration with Quick Actions card - Navbar integration with Learning Paths link - TypeScript support with full type safety
|
@Ayaanshaikh12243 is attempting to deploy a commit to the Darshan Rajput's projects Team on Vercel. A member of the Team first needs to authorize it. |
|
@Darshan3690 done added in the dasboard ss add kiya hoo mene |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This pull request implements two major features addressing Issue #275: a Tech Stack Explorer and a Learning Path Recommender system. The implementation adds comprehensive educational tools to help developers choose technology stacks and follow structured learning paths.
Changes:
- Tech Stack Explorer with filtering, comparison, and detailed information for 9 popular tech stacks
- Learning Path Recommender with skill assessment, 5 curated learning paths, milestone tracking, and progress visualization
- Integration with dashboard and navigation for easy access to both features
Reviewed changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated 16 comments.
Show a summary per file
| File | Description |
|---|---|
| app/tech-stack-explorer/page.tsx | Main page with browse/comparison modes, stats dashboard, and decision helper |
| app/tech-stack-explorer/data/techstacks.ts | Data structure for 9 tech stacks with comprehensive details and utility functions |
| app/tech-stack-explorer/components/StackCard.tsx | Expandable cards displaying full stack details including pros/cons, salaries, and real-world projects |
| app/tech-stack-explorer/components/FilterBar.tsx | Filtering system by difficulty, job demand, and search with comparison selection |
| app/tech-stack-explorer/components/ComparisonTable.tsx | Side-by-side comparison table with visual metrics and salary comparison |
| app/learning-paths/page.tsx | Main page with 5 view modes: home, assessment, browse, tracking, and visualization |
| app/learning-paths/data/paths.ts | 5 learning paths with milestones, resources, projects, and community recommendations |
| app/learning-paths/components/SkillAssessment.tsx | Interactive 6-question quiz with progress tracking and score breakdown |
| app/learning-paths/components/ProgressVisualization.tsx | Charts showing weekly progress, skill development, and content distribution using recharts |
| app/learning-paths/components/MilestoneTracker.tsx | Interactive timeline with task checklists and progress statistics |
| app/learning-paths/components/LearningPathCard.tsx | Expandable cards with detailed path information, reviews, and resources |
| app/dashboard/page.tsx | Added two new quick action cards for Tech Stack Explorer and Learning Paths |
| app/components/Navbar.tsx | Added navigation links to both new features |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <div className={`text-sm font-bold mt-1 ${getDifficultyColor(stack.learningDifficulty).split(' ')[2]}`}> | ||
| {stack.learningDifficulty} | ||
| </div> |
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The getDifficultyColor function extracts only the third class from the result by using .split(' ')[2], which is fragile. If the order of classes in the getDifficultyColor function changes, this will break. Consider either returning just the color class from getDifficultyColor, or using a separate function specifically for getting the text color.
| // Mock data for visualization | ||
| const weeklyProgress = [ | ||
| { week: 1, completed: 1, target: 1, hours: 15 }, | ||
| { week: 2, completed: 2, target: 2, hours: 18 }, | ||
| { week: 3, completed: 2, target: 3, hours: 14 }, | ||
| { week: 4, completed: 3, target: 4, hours: 16 }, | ||
| { week: 5, completed: 4, target: 5, hours: 20 }, | ||
| ]; | ||
|
|
||
| const skillProgress = [ | ||
| { name: 'Frontend', progress: 75 }, | ||
| { name: 'Backend', progress: 60 }, | ||
| { name: 'Database', progress: 45 }, | ||
| { name: 'DevOps', progress: 30 }, | ||
| ]; | ||
|
|
||
| const categoryDistribution = [ | ||
| { name: 'Videos', value: 40 }, | ||
| { name: 'Documentation', value: 30 }, | ||
| { name: 'Projects', value: 20 }, | ||
| { name: 'Practice', value: 10 }, | ||
| ]; | ||
|
|
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ProgressVisualization component uses hardcoded mock data instead of actual progress data from the path. The weeklyProgress, skillProgress, and categoryDistribution arrays contain static values that don't reflect the user's actual progress. This makes the visualization misleading and not useful for tracking real progress. Consider either removing this component until real progress tracking is implemented, or clearly label it as "Sample Data" or "Demo Mode".
|
|
||
| {/* Tracking View */} | ||
| {viewMode === 'tracking' && selectedPath && ( | ||
| <MilestoneTracker path={selectedPath} currentWeek={1} /> |
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The currentWeek prop in MilestoneTracker is hardcoded to 1 when the component is called from the main page. This means the "current week" indicator will always show week 1, regardless of actual progress. The currentWeek should either be calculated based on time elapsed since starting the path, or removed if not being properly tracked.
| <MilestoneTracker path={selectedPath} currentWeek={1} /> | |
| <MilestoneTracker path={selectedPath} /> |
| const isCurrent = currentWeek === milestone.week; | ||
|
|
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the MilestoneTracker component, the isCurrent check compares currentWeek === milestone.week, but milestone.week values are not sequential (e.g., 1, 5, 10, 16, 20, 24). This means most weeks won't match any milestone, making the "current" indicator rarely show. The logic should be revised to determine which milestone is current based on whether it's the next incomplete milestone, rather than matching week numbers.
| const isCurrent = currentWeek === milestone.week; | |
| const isCurrent = (() => { | |
| // Determine the "current" milestone as the next incomplete one. | |
| const nextIncompleteForCurrentWeek = | |
| path.milestones.find( | |
| (m) => | |
| m.week >= currentWeek && | |
| !completedMilestones.includes(m.week), | |
| ) ?? | |
| path.milestones.find( | |
| (m) => !completedMilestones.includes(m.week), | |
| ); | |
| return nextIncompleteForCurrentWeek | |
| ? nextIncompleteForCurrentWeek.week === milestone.week | |
| : false; | |
| })(); |
| return learningPaths[3]; // DevOps (advanced) | ||
| } else { | ||
| return learningPaths[4]; // Design (specialized) |
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The getRecommendedPath function has a logical issue. When avgScore is greater than or equal to 0.8, it returns learningPaths[4] (UI/UX Design), which is a Beginner-level path. This doesn't make sense as users with high assessment scores (80%+) should be recommended more advanced paths, not a beginner path. The recommendation logic should be revised to recommend more challenging paths for users with higher scores.
| return learningPaths[3]; // DevOps (advanced) | |
| } else { | |
| return learningPaths[4]; // Design (specialized) | |
| return learningPaths[4]; // Design (specialized) | |
| } else { | |
| return learningPaths[3]; // DevOps (advanced) |
|
|
||
| import { LearningPath } from '../data/paths'; | ||
| import { useState } from 'react'; | ||
| import { CheckCircle, Circle, Lock } from 'lucide-react'; |
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused import Lock.
| import { CheckCircle, Circle, Lock } from 'lucide-react'; | |
| import { CheckCircle, Circle } from 'lucide-react'; |
| import LearningPathCard from './components/LearningPathCard'; | ||
| import MilestoneTracker from './components/MilestoneTracker'; | ||
| import ProgressVisualization from './components/ProgressVisualization'; | ||
| import { Zap, BookOpen, TrendingUp, Users, Clock, Target } from 'lucide-react'; |
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused import BookOpen.
| import { Zap, BookOpen, TrendingUp, Users, Clock, Target } from 'lucide-react'; | |
| import { Zap, TrendingUp, Users, Clock, Target } from 'lucide-react'; |
| const [assessmentScores, setAssessmentScores] = useState<Record<string, number> | null>(null); | ||
| const [recommendedPath, setRecommendedPath] = useState<LearningPath | null>(null); | ||
| const [selectedPath, setSelectedPath] = useState<LearningPath | null>(null); | ||
|
|
||
| const handleAssessmentComplete = (scores: Record<string, number>) => { | ||
| setAssessmentScores(scores); |
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused variable assessmentScores.
| const [assessmentScores, setAssessmentScores] = useState<Record<string, number> | null>(null); | |
| const [recommendedPath, setRecommendedPath] = useState<LearningPath | null>(null); | |
| const [selectedPath, setSelectedPath] = useState<LearningPath | null>(null); | |
| const handleAssessmentComplete = (scores: Record<string, number>) => { | |
| setAssessmentScores(scores); | |
| const [recommendedPath, setRecommendedPath] = useState<LearningPath | null>(null); | |
| const [selectedPath, setSelectedPath] = useState<LearningPath | null>(null); | |
| const handleAssessmentComplete = (scores: Record<string, number>) => { |
|
|
||
| import { useState } from 'react'; | ||
| import { TechStack } from '../data/techstacks'; | ||
| import { X } from 'lucide-react'; |
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused import X.
| import { X } from 'lucide-react'; |
| import StackCard from './components/StackCard'; | ||
| import FilterBar from './components/FilterBar'; | ||
| import ComparisonTable from './components/ComparisonTable'; | ||
| import { BarChart3, Zap, Users, TrendingUp } from 'lucide-react'; |
Copilot
AI
Jan 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused imports Users, Zap.
| import { BarChart3, Zap, Users, TrendingUp } from 'lucide-react'; | |
| import { BarChart3, TrendingUp } from 'lucide-react'; |
#275


