mirror of
https://github.com/kamranahmedse/developer-roadmap.git
synced 2025-08-13 20:54:16 +02:00
fix: member progress (#8188)
* fix: member progress * fix: remove question check * refactor: resource meta
This commit is contained in:
@@ -18,6 +18,9 @@ import { pageProgressMessage } from '../../stores/page';
|
|||||||
import { MemberProgressModalHeader } from './MemberProgressModalHeader';
|
import { MemberProgressModalHeader } from './MemberProgressModalHeader';
|
||||||
import { replaceChildren } from '../../lib/dom.ts';
|
import { replaceChildren } from '../../lib/dom.ts';
|
||||||
import { XIcon } from 'lucide-react';
|
import { XIcon } from 'lucide-react';
|
||||||
|
import type { PageType } from '../CommandMenu/CommandMenu.tsx';
|
||||||
|
import { renderFlowJSON } from '../../../editor/renderer/renderer.ts';
|
||||||
|
import { getResourceMeta } from '../../lib/roadmap.ts';
|
||||||
|
|
||||||
export type ProgressMapProps = {
|
export type ProgressMapProps = {
|
||||||
member: TeamMember;
|
member: TeamMember;
|
||||||
@@ -88,14 +91,24 @@ export function MemberProgressModal(props: ProgressMapProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function renderResource(jsonUrl: string) {
|
async function renderResource(jsonUrl: string) {
|
||||||
|
const page = await getResourceMeta(resourceType, resourceId);
|
||||||
|
if (!page) {
|
||||||
|
toast.error('Resource not found');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const renderer = page.renderer || 'balsamiq';
|
||||||
|
|
||||||
const res = await fetch(jsonUrl, {});
|
const res = await fetch(jsonUrl, {});
|
||||||
const json = await res.json();
|
const json = await res.json();
|
||||||
const svg: SVGElement | null = await wireframeJSONToSVG(json, {
|
const svg =
|
||||||
fontURL: '/fonts/balsamiq.woff2',
|
renderer === 'editor'
|
||||||
});
|
? await renderFlowJSON(json as any)
|
||||||
|
: await wireframeJSONToSVG(json, {
|
||||||
|
fontURL: '/fonts/balsamiq.woff2',
|
||||||
|
});
|
||||||
|
|
||||||
replaceChildren(containerEl.current!, svg);
|
replaceChildren(containerEl.current!, svg);
|
||||||
// containerEl.current?.replaceChildren(svg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
useKeydown('Escape', () => {
|
useKeydown('Escape', () => {
|
||||||
@@ -136,10 +149,10 @@ export function MemberProgressModal(props: ProgressMapProps) {
|
|||||||
skipped = [],
|
skipped = [],
|
||||||
} = memberProgress;
|
} = memberProgress;
|
||||||
|
|
||||||
done.forEach((id: string) => renderTopicProgress(id, 'done'));
|
done.forEach((id) => renderTopicProgress(id, 'done'));
|
||||||
learning.forEach((id: string) => renderTopicProgress(id, 'learning'));
|
learning.forEach((id) => renderTopicProgress(id, 'learning'));
|
||||||
skipped.forEach((id: string) => renderTopicProgress(id, 'skipped'));
|
skipped.forEach((id) => renderTopicProgress(id, 'skipped'));
|
||||||
removed.forEach((id: string) => renderTopicProgress(id, 'removed'));
|
removed.forEach((id) => renderTopicProgress(id, 'removed'));
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
|
@@ -11,7 +11,6 @@ import { useAuth } from '../../hooks/use-auth';
|
|||||||
import { ModalLoader } from './ModalLoader.tsx';
|
import { ModalLoader } from './ModalLoader.tsx';
|
||||||
import { UserProgressModalHeader } from './UserProgressModalHeader';
|
import { UserProgressModalHeader } from './UserProgressModalHeader';
|
||||||
import { X } from 'lucide-react';
|
import { X } from 'lucide-react';
|
||||||
import type { PageType } from '../CommandMenu/CommandMenu.tsx';
|
|
||||||
import type { AllowedRoadmapRenderer } from '../../lib/roadmap.ts';
|
import type { AllowedRoadmapRenderer } from '../../lib/roadmap.ts';
|
||||||
import { renderFlowJSON } from '../../../editor/renderer/renderer.ts';
|
import { renderFlowJSON } from '../../../editor/renderer/renderer.ts';
|
||||||
|
|
||||||
|
@@ -1,4 +1,7 @@
|
|||||||
|
import type { PageType } from '../components/CommandMenu/CommandMenu';
|
||||||
import type { MarkdownFileType } from './file';
|
import type { MarkdownFileType } from './file';
|
||||||
|
import { httpGet } from './http';
|
||||||
|
import type { ResourceType } from './resource-progress';
|
||||||
|
|
||||||
export function resourceTitleFromId(id: string): string {
|
export function resourceTitleFromId(id: string): string {
|
||||||
if (id === 'devops') {
|
if (id === 'devops') {
|
||||||
@@ -150,3 +153,29 @@ export async function getRoadmapFaqsById(roadmapId: string): Promise<string[]> {
|
|||||||
|
|
||||||
return faqs || [];
|
return faqs || [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getResourceMeta(
|
||||||
|
resourceType: ResourceType,
|
||||||
|
resourceId: string,
|
||||||
|
) {
|
||||||
|
const { error, response } = await httpGet<PageType[]>(`/pages.json`);
|
||||||
|
if (error || !response) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const page = response.find((page) => {
|
||||||
|
if (resourceType === 'roadmap') {
|
||||||
|
return page.url === `/${resourceId}`;
|
||||||
|
} else if (resourceType === 'best-practice') {
|
||||||
|
return page.url === `/best-practices/${resourceId}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!page) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user