import { useEffect, useRef, useState } from 'react'; import { useKeydown } from '../../hooks/use-keydown'; import { useOutsideClick } from '../../hooks/use-outside-click'; import type { PageType } from '../CommandMenu/CommandMenu'; import type { TeamResourceConfig } from './RoadmapSelector'; import { SelectRoadmapModalItem } from './SelectRoadmapModalItem'; import { XIcon } from 'lucide-react'; export type SelectRoadmapModalProps = { teamId: string; allRoadmaps: PageType[]; onClose: () => void; teamResourceConfig: string[]; onRoadmapAdd: (roadmapId: string) => void; onRoadmapRemove: (roadmapId: string) => void; }; export function SelectRoadmapModal(props: SelectRoadmapModalProps) { const { onClose, allRoadmaps, onRoadmapAdd, onRoadmapRemove, teamResourceConfig, } = props; const popupBodyEl = useRef(null); const searchInputEl = useRef(null); const [searchResults, setSearchResults] = useState(allRoadmaps); const [searchText, setSearchText] = useState(''); useKeydown('Escape', () => { onClose(); }); useOutsideClick(popupBodyEl, () => { onClose(); }); useEffect(() => { if (!searchInputEl.current) { return; } searchInputEl.current.focus(); }, [searchInputEl]); useEffect(() => { if (searchText.length === 0) { setSearchResults(allRoadmaps); return; } const searchResults = allRoadmaps.filter((roadmap) => { return ( roadmap.title.toLowerCase().includes(searchText.toLowerCase()) || roadmap.id.toLowerCase().includes(searchText.toLowerCase()) ); }); setSearchResults(searchResults); }, [searchText, allRoadmaps]); const roleBasedRoadmaps = searchResults.filter((roadmap) => roadmap?.metadata?.tags?.includes('role-roadmap'), ); const skillBasedRoadmaps = searchResults.filter((roadmap) => roadmap?.metadata?.tags?.includes('skill-roadmap'), ); return (
setSearchText((e.target as HTMLInputElement).value)} />
Role Based Roadmaps {roleBasedRoadmaps.length === 0 && (

)} {roleBasedRoadmaps.length > 0 && (
{roleBasedRoadmaps.map((roadmap) => { const isSelected = teamResourceConfig.includes(roadmap.id); return ( { if (isSelected) { onRoadmapRemove(roadmap.id); } else { onRoadmapAdd(roadmap.id); } }} /> ); })}
)} Skill Based Roadmaps
{skillBasedRoadmaps.map((roadmap) => { const isSelected = teamResourceConfig.includes(roadmap.id); return ( { if (isSelected) { onRoadmapRemove(roadmap.id); } else { onRoadmapAdd(roadmap.id); } }} /> ); })}

More Official Roadmaps Coming Soon

We are currently adding more of our official roadmaps to this list. If you don't see the roadmap you are looking for, please check back later.

); }