diff --git a/src/pages/ContributorProfilePage.jsx b/src/pages/ContributorProfilePage.jsx index 55153b4..c7da5ea 100644 --- a/src/pages/ContributorProfilePage.jsx +++ b/src/pages/ContributorProfilePage.jsx @@ -1,6 +1,6 @@ import React, { useState, useEffect, useMemo } from 'react' import { useParams, useNavigate } from 'react-router-dom' -import { FiArrowLeft, FiDownload, FiExternalLink, FiCalendar, FiBriefcase, FiAlertTriangle } from 'react-icons/fi' +import { FiArrowLeft, FiDownload, FiExternalLink, FiCalendar, FiBriefcase, FiAlertTriangle, FiGithub } from 'react-icons/fi' import { useApp } from '../context/AppContext' import { C, PageTitle, Spinner, StatCard } from '../components/UI' import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts' @@ -102,13 +102,14 @@ const getFullRepoFromUrl = (url) => { export default function ContributorProfilePage() { const { username } = useParams() const navigate = useNavigate() - const { orgs, pat, pullsData } = useApp() + const { orgs, pat, pullsData, model } = useApp() const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [rawContributions, setRawContributions] = useState([]) const [mergedPRKeys, setMergedPRKeys] = useState(new Set()) const [tab, setTab] = useState('prs') + const [avatarFailed, setAvatarFailed] = useState(false) // Date Range Filters (Defaults to Last 1 Year) const [startDate, setStartDate] = useState(() => { @@ -327,6 +328,16 @@ export default function ContributorProfilePage() { return Object.values(monthlyBuckets).sort((a, b) => a.yyyymm.localeCompare(b.yyyymm)) }, [filteredContribs]) + const contributorAvatar = model?.contributors?.find( + contributor => contributor.login.toLowerCase() === username.toLowerCase() + )?.avatar_url + const contributionAvatar = rawContributions.find(item => item.user?.avatar_url)?.user.avatar_url + const avatarUrl = contributorAvatar || contributionAvatar + + useEffect(() => { + setAvatarFailed(false) + }, [avatarUrl, username]) + // Export to Markdown Report with pipe & newline escaping const exportMarkdown = () => { const dateStr = new Date().toLocaleDateString() @@ -405,23 +416,63 @@ export default function ContributorProfilePage() { {/* Back navigation & page header */}