import React, { useState, useEffect } from 'react'; import { ProgressBar } from 'primereact/progressbar'; import { Accordion, AccordionTab } from 'primereact/accordion'; import { useSession, signIn, getSession } from 'next-auth/react'; import { useRouter } from 'next/router'; import { useBadge } from '@/hooks/badges/useBadge'; import GenericButton from '@/components/buttons/GenericButton'; import UserProgressFlow from './UserProgressFlow'; import { Tooltip } from 'primereact/tooltip'; import RepoSelector from '@/components/profile/RepoSelector'; import MoreInfo from '@/components/MoreInfo'; const allTasks = [ { status: 'Connect GitHub', completed: false, tier: 'Pleb', courseId: null, subTasks: [ { status: 'Connect your GitHub account', completed: false }, ] }, { status: 'PlebDevs Starter', completed: false, tier: 'Plebdev', courseId: "f538f5c5-1a72-4804-8eb1-3f05cea64874", courseNAddress: "naddr1qvzqqqr4xspzpueu32tp0jc47uzlcuxdgcw06m40ytu7ynpna2adnqty3e0vda6pqy88wumn8ghj7mn0wvhxcmmv9uq32amnwvaz7tmjv4kxz7fwv3sk6atn9e5k7tcpr9mhxue69uhhyetvv9ujuumwdae8gtnnda3kjctv9uq3wamnwvaz7tmjv4kxz7fwdehhxarj9e3xzmny9uq36amnwvaz7tmjv4kxz7fwd46hg6tw09mkzmrvv46zucm0d5hsz9mhwden5te0wfjkccte9ec8y6tdv9kzumn9wshszynhwden5te0dehhxarjxgcjucm0d5hszynhwden5te0dehhxarjw4jjucm0d5hsz9nhwden5te0wp6hyurvv4ex2mrp0yhxxmmd9uq3wamnwvaz7tmjv4kxz7fwv3jhvueww3hk7mrn9uqzge34xvuxvdtrx5knzcfhxgkngwpsxsknsetzxyknxe3sx43k2cfkxsurwdq68epwa", subTasks: [ { status: 'Complete the course', completed: false }, ] }, { status: 'Frontend Course', completed: false, tier: 'Frontend Dev', courseId: 'f73c37f4-df2e-4f7d-a838-dce568c76136', courseNAddress: "naddr1qvzqqqr4xspzpueu32tp0jc47uzlcuxdgcw06m40ytu7ynpna2adnqty3e0vda6pqy88wumn8ghj7mn0wvhxcmmv9uq32amnwvaz7tmjv4kxz7fwv3sk6atn9e5k7tcpr9mhxue69uhhyetvv9ujuumwdae8gtnnda3kjctv9uq3wamnwvaz7tmjv4kxz7fwdehhxarj9e3xzmny9uq36amnwvaz7tmjv4kxz7fwd46hg6tw09mkzmrvv46zucm0d5hsz9mhwden5te0wfjkccte9ec8y6tdv9kzumn9wshszynhwden5te0dehhxarjxgcjucm0d5hszynhwden5te0dehhxarjw4jjucm0d5hsz9nhwden5te0wp6hyurvv4ex2mrp0yhxxmmd9uq3wamnwvaz7tmjv4kxz7fwv3jhvueww3hk7mrn9uqzge3hxd3nxdmxxskkge3jv5knge3hvskkzwpn8qkkgcm9x5mrscehxccnxdsc53n8w", subTasks: [ { status: 'Complete the course', completed: false }, { status: 'Submit your project repository', completed: false }, ] }, { status: 'Backend Course', completed: false, tier: 'Backend Dev', courseId: 'f6825391-831c-44da-904a-9ac3d149b7be', courseNAddress: "naddr1qvzqqqr4xspzpueu32tp0jc47uzlcuxdgcw06m40ytu7ynpna2adnqty3e0vda6pqy88wumn8ghj7mn0wvhxcmmv9uq32amnwvaz7tmjv4kxz7fwv3sk6atn9e5k7tcpr9mhxue69uhhyetvv9ujuumwdae8gtnnda3kjctv9uq3wamnwvaz7tmjv4kxz7fwdehhxarj9e3xzmny9uq36amnwvaz7tmjv4kxz7fwd46hg6tw09mkzmrvv46zucm0d5hsz9mhwden5te0wfjkccte9ec8y6tdv9kzumn9wshszynhwden5te0dehhxarjxgcjucm0d5hszynhwden5te0dehhxarjw4jjucm0d5hsz9nhwden5te0wp6hyurvv4ex2mrp0yhxxmmd9uq3wamnwvaz7tmjv4kxz7fwv3jhvueww3hk7mrn9uqzge3k8qer2veexyknsve3vvkngdryvyknjvp5vyknjctrxdjrzdpevgmkyegqyn0ns", subTasks: [ { status: 'Complete the course', completed: false }, { status: 'Submit your project repository', completed: false }, ] }, ]; const UserProgress = () => { const [progress, setProgress] = useState(0); const [currentTier, setCurrentTier] = useState(null); const [expandedItems, setExpandedItems] = useState({}); const [completedCourses, setCompletedCourses] = useState([]); const [tasks, setTasks] = useState([]); const [isLoading, setIsLoading] = useState(true); const router = useRouter(); const { data: session, update } = useSession(); useBadge(); useEffect(() => { if (session?.user) { setIsLoading(true); const user = session.user; const ids = user?.userCourses?.map(course => course?.completed ? course.courseId : null).filter(id => id !== null); if (ids && ids.length > 0) { setCompletedCourses(ids); generateTasks(ids); calculateProgress(ids); calculateCurrentTier(ids); } else { generateTasks([]); calculateProgress([]); calculateCurrentTier([]); } setIsLoading(false); } }, [session]); const generateTasks = (completedCourseIds) => { const updatedTasks = allTasks.map(task => { if (task.status === 'Connect GitHub') { return { ...task, completed: session?.account?.provider === 'github' ? true : false, subTasks: task.subTasks.map(subTask => ({ ...subTask, completed: session?.account?.provider === 'github' ? true : false })) }; } const userCourse = session?.user?.userCourses?.find(uc => uc.courseId === task.courseId); const courseCompleted = completedCourseIds.includes(task.courseId); const repoSubmitted = userCourse?.submittedRepoLink ? true : false; return { ...task, completed: courseCompleted && (task.courseId === null || repoSubmitted), subTasks: task.subTasks.map(subTask => ({ ...subTask, completed: subTask.status.includes('Complete') ? courseCompleted : subTask.status.includes('repository') ? repoSubmitted : false })) }; }); setTasks(updatedTasks); }; const calculateProgress = (completedCourseIds) => { let progressValue = 0; if (session?.account?.provider === 'github') { progressValue += 25; } const remainingTasks = allTasks.slice(1); remainingTasks.forEach(task => { if (completedCourseIds.includes(task.courseId)) { progressValue += 25; } }); setProgress(progressValue); }; const calculateCurrentTier = (completedCourseIds) => { let tier = null; if (completedCourseIds.includes("f6825391-831c-44da-904a-9ac3d149b7be")) { tier = 'Backend Dev'; } else if (completedCourseIds.includes("f73c37f4-df2e-4f7d-a838-dce568c76136")) { tier = 'Frontend Dev'; } else if (completedCourseIds.includes("f6daa88a-53d6-4901-8dbd-d2203a05b7ab")) { tier = 'Plebdev'; } else if (session?.account?.provider === 'github') { tier = 'Pleb'; } setCurrentTier(tier); }; const handleAccordionChange = (index, isExpanded) => { setExpandedItems(prev => ({ ...prev, [index]: isExpanded })); }; const handleGitHubLink = async () => { try { // If user is already signed in, we'll link the accounts if (session?.user) { const result = await signIn("github", { redirect: false, // Pass existing user data for linking userId: session?.user?.id, pubkey: session?.user?.pubkey, privkey: session?.user?.privkey || null }); if (result?.ok) { // Wait for session update await new Promise(resolve => setTimeout(resolve, 1000)); const updatedSession = await getSession(); if (updatedSession?.account?.provider === 'github') { router.push('/profile'); // Accounts linked successfully } } } else { // Normal GitHub sign in await signIn("github"); } } catch (error) { console.error("GitHub sign in error:", error); } }; return (
Track your progress through the courses, showcase your GitHub contributions, submit projects, and earn badges!