import { useEffect, useState } from 'react'; import { httpGet, httpPut } from '../../lib/http'; import type { PageType } from '../CommandMenu/CommandMenu'; import { pageProgressMessage } from '../../stores/page'; import { UpdateTeamResourceModal } from './UpdateTeamResourceModal'; import { SelectRoadmapModal } from './SelectRoadmapModal'; import { Map, Shapes } from 'lucide-react'; import type { AllowedRoadmapVisibility, RoadmapDocument, } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal'; import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal'; import { useToast } from '../../hooks/use-toast'; export type TeamResourceConfig = { isCustomResource: boolean; roadmapSlug?: string; title: string; description?: string; visibility?: AllowedRoadmapVisibility; resourceId: string; resourceType: string; removed: string[]; topics?: number; sharedTeamMemberIds: string[]; sharedFriendIds: string[]; defaultRoadmapId?: string; }[]; type RoadmapSelectorProps = { teamId: string; teamResources: TeamResourceConfig; setTeamResources: (config: TeamResourceConfig) => void; }; export function RoadmapSelector(props: RoadmapSelectorProps) { const { teamId, teamResources = [], setTeamResources } = props; const toast = useToast(); const [removingRoadmapId, setRemovingRoadmapId] = useState(''); const [showSelectRoadmapModal, setShowSelectRoadmapModal] = useState(false); const [allRoadmaps, setAllRoadmaps] = useState([]); const [changingRoadmapId, setChangingRoadmapId] = useState(''); const [isCreatingRoadmap, setIsCreatingRoadmap] = useState(false); const [error, setError] = useState(''); async function loadAllRoadmaps() { const { error, response } = await httpGet(`/pages.json`); if (error) { toast.error(error.message || 'Something went wrong. Please try again!'); setError(error.message || 'Something went wrong. Please try again!'); 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 deleteResource(roadmapId: string) { if (!teamId) { return; } pageProgressMessage.set(`Deleting resource`); const { error, response } = await httpPut( `${ import.meta.env.PUBLIC_API_URL }/v1-delete-team-resource-config/${teamId}`, { resourceId: roadmapId, resourceType: 'roadmap', }, ); if (error || !response) { setError(error?.message || 'Error deleting roadmap'); return; } setTeamResources(response); } async function onRemove(resourceId: string) { pageProgressMessage.set('Removing roadmap'); deleteResource(resourceId).finally(() => { pageProgressMessage.set(''); }); } async function addTeamResource(roadmapId: string) { if (!teamId) { return; } pageProgressMessage.set(`Adding roadmap to team`); const renderer = allRoadmaps.find((r) => r.id === roadmapId)?.renderer; const { error, response } = await httpPut( `${ import.meta.env.PUBLIC_API_URL }/v1-update-team-resource-config/${teamId}`, { teamId: teamId, resourceId: roadmapId, resourceType: 'roadmap', removed: [], renderer: renderer || 'balsamiq', }, ); if (error || !response) { setError(error?.message || 'Error adding roadmap'); return; } setTeamResources(response); if (renderer === 'editor') { setShowSelectRoadmapModal(false); } } useEffect(() => { loadAllRoadmaps().finally(() => {}); }, []); function handleCustomRoadmapCreated(roadmap: RoadmapDocument) { const { _id: roadmapId } = roadmap; if (!roadmapId) { return; } loadAllRoadmaps().finally(() => {}); addTeamResource(roadmapId).finally(() => { pageProgressMessage.set(''); }); } return (
{changingRoadmapId && ( setChangingRoadmapId('')} resourceId={changingRoadmapId} resourceType={'roadmap'} teamId={teamId} setTeamResourceConfig={setTeamResources} defaultRemovedItems={ teamResources.find((c) => c.resourceId === changingRoadmapId) ?.removed || [] } /> )} {showSelectRoadmapModal && ( setShowSelectRoadmapModal(false)} teamResourceConfig={teamResources.map((r) => r.resourceId)} allRoadmaps={allRoadmaps.filter((r) => r.renderer === 'editor')} teamId={teamId} onRoadmapAdd={(roadmapId) => { addTeamResource(roadmapId).finally(() => { pageProgressMessage.set(''); }); }} onRoadmapRemove={(roadmapId) => { onRemove(roadmapId).finally(() => {}); }} /> )}
{isCreatingRoadmap && ( setIsCreatingRoadmap(false)} onCreated={(roadmap: RoadmapDocument) => { handleCustomRoadmapCreated(roadmap); setIsCreatingRoadmap(false); }} /> )} or
{!teamResources.length && (

No roadmaps selected.

Pick from{' '} setShowSelectRoadmapModal(true)} className="cursor-pointer underline" > our roadmaps {' '} or{' '} { setIsCreatingRoadmap(true); }} className="cursor-pointer underline" > create a new one .

)} {teamResources.length > 0 && (
{teamResources.map( ({ isCustomResource, title: roadmapTitle, resourceId, removed: removedTopics, topics, }) => { return (
{roadmapTitle} {removedTopics.length > 0 || (topics && topics > 0) ? ( {isCustomResource ? ( <> Custom · {topics} topic {topics && topics > 1 ? 's' : ''} ) : ( <> {removedTopics.length} topic {removedTopics.length > 1 ? 's' : ''} removed )} ) : ( {isCustomResource ? 'Placeholder roadmap.' : 'No changes made ..'} )}
{removingRoadmapId === resourceId && (
Are you sure?{' '} {' '}
)} {(!removingRoadmapId || removingRoadmapId !== resourceId) && (
)}
); }, )}
)}
); }