import { getUrlParams } from '../lib/browser'; import { useEffect, useState } from 'preact/hooks'; import type { TeamDocument } from './CreateTeam/CreateTeamForm'; import type { TeamResourceConfig } from './CreateTeam/RoadmapSelector'; import { httpGet, httpPut } from '../lib/http'; import { pageProgressMessage } from '../stores/page'; import ExternalLinkIcon from '../icons/external-link.svg'; import RoadmapIcon from '../icons/roadmap.svg'; import PlusIcon from '../icons/plus.svg'; import type { PageType } from './CommandMenu/CommandMenu'; import { UpdateTeamResourceModal } from './CreateTeam/UpdateTeamResourceModal'; import { useStore } from '@nanostores/preact'; import { $canManageCurrentTeam } from '../stores/team'; import { useToast } from '../hooks/use-toast'; import { SelectRoadmapModal } from './CreateTeam/SelectRoadmapModal'; export function TeamRoadmaps() { const { t: teamId } = getUrlParams(); const canManageCurrentTeam = useStore($canManageCurrentTeam); const toast = useToast(); const [isLoading, setIsLoading] = useState(true); const [removingRoadmapId, setRemovingRoadmapId] = useState(''); const [isAddingRoadmap, setIsAddingRoadmap] = useState(false); const [changingRoadmapId, setChangingRoadmapId] = useState(''); const [team, setTeam] = useState(); const [resourceConfigs, setResourceConfigs] = useState( [] ); const [allRoadmaps, setAllRoadmaps] = useState([]); async function loadAllRoadmaps() { const { error, response } = await httpGet(`/pages.json`); if (error) { toast.error(error.message || 'Something went wrong'); return; } if (!response) { return []; } const allRoadmaps = response .filter((page) => page.group === 'Roadmaps') .sort((a, b) => { if (a.title === 'Android') return 1; return a.title.localeCompare(b.title); }); setAllRoadmaps(allRoadmaps); return response; } async function loadTeam(teamIdToFetch: string) { const { response, error } = await httpGet( `${import.meta.env.PUBLIC_API_URL}/v1-get-team/${teamIdToFetch}` ); if (error || !response) { toast.error('Error loading team'); window.location.href = '/account'; return; } setTeam(response); } async function loadTeamResourceConfig(teamId: string) { const { error, response } = await httpGet( `${import.meta.env.PUBLIC_API_URL}/v1-get-team-resource-config/${teamId}` ); if (error || !Array.isArray(response)) { console.error(error); return; } setResourceConfigs(response); } useEffect(() => { if (!teamId) { return; } setIsLoading(true); Promise.all([ loadTeam(teamId), loadTeamResourceConfig(teamId), loadAllRoadmaps(), ]).finally(() => { pageProgressMessage.set(''); setIsLoading(false); }); }, [teamId]); async function deleteResource(roadmapId: string) { if (!team?._id) { return; } toast.loading('Deleting roadmap'); pageProgressMessage.set(`Deleting roadmap from team`); const { error, response } = await httpPut( `${import.meta.env.PUBLIC_API_URL}/v1-delete-team-resource-config/${ team._id }`, { resourceId: roadmapId, resourceType: 'roadmap', } ); if (error || !response) { toast.error(error?.message || 'Something went wrong'); return; } toast.success('Roadmap removed'); setResourceConfigs(response); } async function onAdd(roadmapId: string) { if (!teamId) { return; } toast.loading('Adding roadmap'); pageProgressMessage.set('Adding roadmap'); setIsLoading(true); const { error, response } = await httpPut( `${ import.meta.env.PUBLIC_API_URL }/v1-update-team-resource-config/${teamId}`, { teamId: teamId, resourceId: roadmapId, resourceType: 'roadmap', removed: [], } ); if (error || !response) { toast.error(error?.message || 'Error adding roadmap'); return; } setResourceConfigs(response); toast.success('Roadmap added'); } async function onRemove(resourceId: string) { pageProgressMessage.set('Removing roadmap'); deleteResource(resourceId).finally(() => { pageProgressMessage.set(''); }); } if (!team) { return null; } const addRoadmapModal = isAddingRoadmap && ( setIsAddingRoadmap(false)} teamResourceConfig={resourceConfigs} allRoadmaps={allRoadmaps} teamId={teamId} onRoadmapAdd={(roadmapId) => { onAdd(roadmapId).finally(() => { pageProgressMessage.set(''); }); }} onRoadmapRemove={(roadmapId) => { if (confirm('Are you sure you want to remove this roadmap?')) { onRemove(roadmapId).finally(() => {}); } }} /> ); if (resourceConfigs.length === 0 && !isLoading) { return (
{addRoadmapModal} roadmap

No roadmaps

{canManageCurrentTeam ? 'Add a roadmap to start tracking your team' : 'Ask your team admin to add some roadmaps'}

{canManageCurrentTeam && ( )}
); } return (
{addRoadmapModal}
{resourceConfigs.length} roadmap(s) selected {canManageCurrentTeam && ( )}
{changingRoadmapId && ( setChangingRoadmapId('')} resourceId={changingRoadmapId} resourceType={'roadmap'} teamId={team?._id!} setTeamResourceConfig={setResourceConfigs} defaultRemovedItems={ resourceConfigs.find((c) => c.resourceId === changingRoadmapId) ?.removed || [] } /> )} {resourceConfigs.map((resourceConfig) => { const { resourceId, removed: removedTopics } = resourceConfig; const roadmapTitle = allRoadmaps.find((roadmap) => roadmap.id === resourceId)?.title || '...'; return (
{roadmapTitle} {'link'} {removedTopics.length > 0 ? ( {removedTopics.length} topic {removedTopics.length > 1 ? 's' : ''} removed ) : ( No changes made .. )}
{canManageCurrentTeam && (
{removingRoadmapId !== resourceId && ( )} {removingRoadmapId === resourceId && ( Are you sure?{' '} {' '} )}
)}
); })} {canManageCurrentTeam && ( )}
); }