import { useQuery } from '@tanstack/react-query'; import { roadmapTreeMappingOptions } from '../../queries/roadmap-tree'; import { queryClient } from '../../stores/query-client'; import { Fragment, useMemo } from 'react'; import { ChevronRightIcon } from 'lucide-react'; type TopicListType = { topicId: string; }; function parseTopicList(content: string): TopicListType[] { const items: TopicListType[] = []; const topicListRegex = /.*?<\/topic-id>/gs; const topicListItems = content.match(topicListRegex); if (!topicListItems) { return items; } for (const topicListItem of topicListItems) { const topicIdRegex = /(.*?)<\/topic-id>/; const topicId = topicListItem.match(topicIdRegex)?.[1]?.trim(); if (!topicId) { continue; } items.push({ topicId, }); } return items; } type RoadmapTopicListProps = { roadmapId: string; content: string; onTopicClick?: (topicId: string, topicTitle: string) => void; }; export function RoadmapTopicList(props: RoadmapTopicListProps) { const { roadmapId, content, onTopicClick } = props; const topicListItems = parseTopicList(content); const { data: roadmapTreeData } = useQuery( roadmapTreeMappingOptions(roadmapId), queryClient, ); const progressItemWithText = useMemo(() => { return topicListItems.map((item) => { const roadmapTreeItem = roadmapTreeData?.find( (mapping) => mapping.nodeId === item.topicId, ); return { ...item, text: (roadmapTreeItem?.text || item.topicId) ?.split(' > ') .slice(1) .join(' > '), }; }); }, [topicListItems, roadmapTreeData]); return (
{progressItemWithText.map((item) => { const labelParts = item.text.split(' > ').slice(-2); const labelPartCount = labelParts.length; return ( ); })}
); }