import { useEffect, useRef, useState } from 'react'; import { cn } from '../../lib/classname.ts'; import { Filter, X } from 'lucide-react'; import { CategoryFilterButton } from './CategoryFilterButton.tsx'; import { useOutsideClick } from '../../hooks/use-outside-click.ts'; const groupNames = [ 'Absolute Beginners', 'Web Development', 'Languages / Platforms', 'Frameworks', 'Mobile Development', 'Databases', 'Computer Science', 'Machine Learning', 'Game Development', 'Design', 'DevOps', 'Blockchain', 'Cyber Security', ]; type AllowGroupNames = (typeof groupNames)[number]; type GroupType = { group: AllowGroupNames; roadmaps: { title: string; link: string; type: 'role' | 'skill'; otherGroups?: AllowGroupNames[]; }[]; }; const groups: GroupType[] = [ { group: 'Absolute Beginners', roadmaps: [ { title: 'Frontend Beginner', link: '/frontend?r=frontend-beginner', type: 'role', otherGroups: ['Web Development'], }, { title: 'Backend Beginner', link: '/backend?r=backend-beginner', type: 'role', otherGroups: ['Web Development'], }, { title: 'DevOps Beginner', link: '/devops?r=devops-beginner', type: 'role', otherGroups: ['Web Development'], }, ], }, { group: 'Web Development', roadmaps: [ { title: 'Frontend', link: '/frontend', type: 'role', otherGroups: ['Web Development'], }, { title: 'Backend', link: '/backend', type: 'role', otherGroups: ['Web Development'], }, { title: 'Full Stack', link: '/full-stack', type: 'role', otherGroups: ['Web Development', 'Absolute Beginners'], }, { title: 'QA', link: '/qa', type: 'role', }, { title: 'GraphQL', link: '/graphql', type: 'skill', otherGroups: ['Web Development'], }, ], }, { group: 'Frameworks', roadmaps: [ { title: 'React', link: '/react', type: 'skill', otherGroups: ['Web Development'], }, { title: 'Vue', link: '/vue', type: 'skill', otherGroups: ['Web Development'], }, { title: 'Angular', link: '/angular', type: 'skill', otherGroups: ['Web Development'], }, { title: 'Spring Boot', link: '/spring-boot', type: 'skill', otherGroups: ['Web Development'], }, { title: 'ASP.NET Core', link: '/aspnet-core', type: 'skill', otherGroups: ['Web Development'], }, ], }, { group: 'Languages / Platforms', roadmaps: [ { title: 'JavaScript', link: '/javascript', type: 'skill', otherGroups: ['Web Development', 'DevOps', 'Mobile Development'], }, { title: 'TypeScript', link: '/typescript', type: 'skill', otherGroups: ['Web Development', 'Mobile Development'], }, { title: 'Node.js', link: '/nodejs', type: 'skill', otherGroups: ['Web Development', 'DevOps'], }, { title: 'C++', link: '/cpp', type: 'skill', }, { title: 'Go', link: '/golang', type: 'skill', otherGroups: ['Web Development', 'DevOps'], }, { title: 'Rust', link: '/rust', type: 'skill', otherGroups: ['Web Development', 'DevOps'], }, { title: 'Python', link: '/python', type: 'skill', otherGroups: ['Web Development', 'DevOps'], }, { title: 'Java', link: '/java', type: 'skill', otherGroups: ['Web Development'], }, { title: 'SQL', link: '/sql', type: 'skill', otherGroups: ['Web Development', 'Databases', 'DevOps'], }, ], }, { group: 'DevOps', roadmaps: [ { title: 'DevOps', link: '/devops', type: 'role', otherGroups: ['Web Development'], }, { title: 'Docker', link: '/docker', type: 'skill', otherGroups: ['Web Development'], }, { title: 'Kubernetes', link: '/kubernetes', type: 'skill', otherGroups: ['Web Development'], }, { title: 'AWS', link: '/aws', type: 'skill', otherGroups: ['Web Development'], }, ], }, { group: 'Mobile Development', roadmaps: [ { title: 'Android', link: '/android', type: 'role', }, { title: 'React Native', link: '/react-native', type: 'role', }, { title: 'Flutter', link: '/flutter', type: 'role', }, ], }, { group: 'Databases', roadmaps: [ { title: 'PostgreSQL', link: '/postgresql-dba', type: 'role', otherGroups: ['Web Development'], }, { title: 'MongoDB', link: '/mongodb', type: 'skill', otherGroups: ['Web Development'], }, ], }, { group: 'Computer Science', roadmaps: [ { title: 'Computer Science', link: '/computer-science', type: 'skill', otherGroups: ['Web Development'], }, { title: 'Data Structures', link: '/datastructures-and-algorithms', type: 'skill', otherGroups: ['Web Development'], }, { title: 'System Design', link: '/system-design', type: 'skill', otherGroups: ['Web Development'], }, { title: 'Design and Architecture', link: '/software-design-architecture', type: 'skill', otherGroups: ['Web Development'], }, { title: 'Software Architect', link: '/software-architect', type: 'role', otherGroups: ['Web Development'], }, { title: 'Code Review', link: '/code-review', type: 'skill', otherGroups: ['Web Development'], }, { title: 'Technical Writer', link: '/technical-writer', type: 'role', }, ], }, { group: 'Machine Learning', roadmaps: [ { title: 'AI and Data Scientist', link: '/ai-data-scientist', type: 'role', }, { title: 'MLOps', link: '/mlops', type: 'role', }, { title: 'Prompt Engineering', link: '/prompt-engineering', type: 'skill', }, ], }, { group: 'Game Development', roadmaps: [ { title: 'Client Side Game Dev.', link: '/game-developer', type: 'role', }, { title: 'Server Side Game Dev.', link: '/server-side-game-developer', type: 'role', }, ], }, { group: 'Design', roadmaps: [ { title: 'UX Design', link: '/ux-design', type: 'role', }, { title: 'Design System', link: '/design-system', type: 'skill', otherGroups: ['Web Development'], }, ], }, { group: 'Blockchain', roadmaps: [ { title: 'Blockchain', link: '/blockchain', type: 'role', }, ], }, { group: 'Cyber Security', roadmaps: [ { title: 'Cyber Security', link: '/cyber-security', type: 'role', }, ], }, ]; const roleRoadmaps = groups.flatMap((group) => group.roadmaps.filter((roadmap) => roadmap.type === 'role'), ); const skillRoadmaps = groups.flatMap((group) => group.roadmaps.filter((roadmap) => roadmap.type === 'skill'), ); const allGroups = [ { group: 'Role Based Roadmaps', roadmaps: roleRoadmaps, }, { group: 'Skill Based Roadmaps', roadmaps: skillRoadmaps, }, ]; export function RoadmapsPage() { const [activeGroup, setActiveGroup] = useState(''); const [visibleGroups, setVisibleGroups] = useState(allGroups); const [isFilterOpen, setIsFilterOpen] = useState(false); useEffect(() => { if (!activeGroup) { setVisibleGroups(allGroups); return; } const group = groups.find((group) => group.group === activeGroup); if (!group) { return; } // other groups that have a roadmap that is in the same group const otherGroups = groups.filter((g) => { return ( g.group !== group.group && g.roadmaps.some((roadmap) => { return roadmap.otherGroups?.includes(group.group); }) ); }); setVisibleGroups([ group, ...otherGroups.map((g) => ({ ...g, roadmaps: g.roadmaps.filter((roadmap) => roadmap.otherGroups?.includes(group.group), ), })), ]); }, [activeGroup]); return (
{ setActiveGroup(''); setIsFilterOpen(false); }} category={'All Roadmaps'} selected={activeGroup === ''} /> {groups.map((group) => ( { setActiveGroup(group.group); setIsFilterOpen(false); document?.getElementById('filter-button')?.scrollIntoView(); }} category={group.group} selected={activeGroup === group.group} /> ))}
{visibleGroups.map((group) => (

{group.group}

{group.roadmaps.map((roadmap) => ( {roadmap.title} ))}
))}
); }