const { kFormatter, isValidHexColor } = require("../src/utils"); const createTextNode = ({ icon, label, value, lineHeight, id }) => { const classname = icon === "★" && "star-icon"; const kValue = kFormatter(value); return ` ${icon} ${label}: ${kValue} `; }; const renderStatsCard = (stats = {}, options = { hide: [] }) => { const { name, totalStars, totalCommits, totalIssues, totalPRs, contributedTo, rank, } = stats; const { hide = [], show_icons = false, hide_border = false, hide_rank = false, line_height = 25, title_color, icon_color, text_color, bg_color, } = options; const lheight = parseInt(line_height); const titleColor = (isValidHexColor(title_color) && `#${title_color}`) || "#2f80ed"; const iconColor = (isValidHexColor(icon_color) && `#${icon_color}`) || "#4c71f2"; const textColor = (isValidHexColor(text_color) && `#${text_color}`) || "#333"; const bgColor = (isValidHexColor(bg_color) && `#${bg_color}`) || "#FFFEFE"; const STAT_MAP = { stars: createTextNode({ icon: "★", label: "Total Stars", value: totalStars, lineHeight: lheight, id: "stars", }), commits: createTextNode({ icon: "🕗", label: "Total Commits", value: totalCommits, lineHeight: lheight, id: "commits", }), prs: createTextNode({ icon: "🔀", label: "Total PRs", value: totalPRs, lineHeight: lheight, id: "prs", }), issues: createTextNode({ icon: "ⓘ", label: "Total Issues", value: totalIssues, lineHeight: lheight, id: "issues", }), contribs: createTextNode({ icon: "📕", label: "Contributed to", value: contributedTo, lineHeight: lheight, id: "contribs", }), }; const statItems = Object.keys(STAT_MAP) .filter((key) => !hide.includes(key)) .map((key) => STAT_MAP[key]); // Calculate the card height depending on how many items there are // but if rank circle is visible clamp the minimum height to `150` const height = Math.max( 45 + (statItems.length + 1) * lheight, hide_rank ? 0 : 150 ); const border = ` `; const rankProgress = 180 + rank.score * 0.8; const rankCircle = hide_rank ? "" : ` ${rank.level} `; return ` ${hide_border ? "" : border} ${rankCircle} ${name}'s GitHub Stats ${statItems.toString().replace(/\,/gm, "")} `; }; module.exports = renderStatsCard;