import { useState, useEffect, useRef } from 'react'; import type { TeamDocument } from '../CreateTeam/CreateTeamForm'; import type { TeamResourceConfig } from '../CreateTeam/RoadmapSelector'; import { httpGet } from '../../lib/http'; // import DropdownIcon from '../../icons/dropdown.svg'; import { clearResourceProgress, refreshProgressCounters, renderTopicProgress, } from '../../lib/resource-progress'; import { renderResourceProgress } from '../../lib/resource-progress'; import { deleteUrlParam, getUrlParams, setUrlParams } from '../../lib/browser'; import { useOutsideClick } from '../../hooks/use-outside-click'; import { useKeydown } from '../../hooks/use-keydown'; import { isLoggedIn } from '../../lib/jwt'; import { useAuth } from '../../hooks/use-auth'; import { useToast } from '../../hooks/use-toast'; import { DropdownIcon } from '../ReactIcons/DropdownIcon'; type TeamVersionsProps = { resourceId: string; resourceType: 'roadmap' | 'best-practice'; }; type TeamVersionsResponse = { team: TeamDocument; config: TeamResourceConfig[0]; }[]; export function TeamVersions(props: TeamVersionsProps) { const { t: teamId } = getUrlParams(); if (!isLoggedIn()) { return; } const { resourceId, resourceType } = props; const user = useAuth(); const toast = useToast(); const teamDropdownRef = useRef(null); const [isPreparing, setIsPreparing] = useState(true); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const [containerOpacity, setContainerOpacity] = useState(0); const [teamVersions, setTeamVersions] = useState([]); const [selectedTeamVersion, setSelectedTeamVersion] = useState< TeamVersionsResponse[0] | null >(null); let shouldShowAvatar: boolean; const selectedAvatar = selectedTeamVersion ? selectedTeamVersion.team.avatar : user?.avatar; const selectedLabel = selectedTeamVersion ? selectedTeamVersion.team.name : user?.name; // Show avatar if team has one, or if user has one otherwise use first letter of name if (selectedTeamVersion?.team.avatar) { shouldShowAvatar = true; } else { shouldShowAvatar = !!(!selectedTeamVersion && user?.avatar); } useOutsideClick(teamDropdownRef, () => { setIsDropdownOpen(false); }); useKeydown('Escape', () => { setIsDropdownOpen(false); }); async function loadTeamVersions() { const { response, error } = await httpGet( `${ import.meta.env.PUBLIC_API_URL }/v1-get-team-versions?${new URLSearchParams({ resourceId, resourceType, })}`, ); if (error || !response) { toast.error(error?.message || 'Failed to load team versions.'); return; } setTeamVersions(response); if (teamId) { const foundVersion = response.find((v) => v.team._id === teamId) || null; setSelectedTeamVersion(foundVersion); } setTimeout(() => { setIsPreparing(false); setTimeout(() => { setContainerOpacity(100); }, 50); }, 0); } useEffect(() => { loadTeamVersions().finally(() => { // }); }, []); useEffect(() => { clearResourceProgress(); // teams have customizations. Assigning #customized-roadmap to roadmapSvgWrap // makes those customizations visible and removes extra boxes const roadmapSvgWrap: HTMLElement = document.getElementById('resource-svg-wrap')?.parentElement || document.createElement('div'); if (!selectedTeamVersion) { deleteUrlParam('t'); renderResourceProgress(resourceType, resourceId).then(); roadmapSvgWrap.id = ''; } else { setUrlParams({ t: selectedTeamVersion.team._id! }); renderResourceProgress(resourceType, resourceId).then(() => { selectedTeamVersion.config?.removed?.forEach((topic) => { renderTopicProgress(topic, 'removed'); }); refreshProgressCounters(); roadmapSvgWrap.id = 'customized-roadmap'; }); } }, [selectedTeamVersion]); if (isPreparing) { return null; } if (!teamVersions.length) { return null; } return (
{isDropdownOpen && ( <> ); }