const { kFormatter, isValidHexColor } = require("../src/utils"); const getStyles = require("./getStyles"); const createTextNode = ({ icon, label, value, id, index, lineHeight }) => { const classname = icon === "★" && "star-icon"; const kValue = kFormatter(value); const staggerDelay = (index + 3) * 150; // manually calculating lineHeight based on index instead of using // to fix firefox layout bug const lheight = lineHeight * (index + 1); 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 STATS = { stars: { icon: "★", label: "Total Stars", value: totalStars, id: "stars", }, commits: { icon: "🕗", label: "Total Commits", value: totalCommits, id: "commits", }, prs: { icon: "🔀", label: "Total PRs", value: totalPRs, id: "prs", }, issues: { icon: "ⓘ", label: "Total Issues", value: totalIssues, id: "issues", }, contribs: { icon: "📕", label: "Contributed to", value: contributedTo, id: "contribs", }, }; const statItems = Object.keys(STATS) .filter((key) => !hide.includes(key)) .map((key, index) => // create the text nodes, and pass index so that we can calculate the line spacing createTextNode({ ...STATS[key], index, lineHeight: lheight }) ); // 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 rankCircle = hide_rank ? "" : ` ${rank.level} `; // re-adjust circle progressbar's value until the ranking algo is improved let progress = rank.score; if (rank.score > 86) { progress = (40 + rank.score) * 0.6; } if (rank.score < 40) { progress = 40 + rank.score; } const styles = getStyles({ titleColor, textColor, iconColor, show_icons, progress, }); return ` ${hide_border ? "" : border} ${rankCircle} ${name}'s GitHub Stats ${statItems.toString().replace(/\,/gm, "")} `; }; module.exports = renderStatsCard;