import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { withPrefix } from 'gatsby'; import { ToolsIcon, XCircleIcon } from '@primer/octicons-react'; import latestBlogs from '../utils/workflows'; import links from '../constants/page-links'; import { isMediumUsernameValid, isGitHubUsernameValid } from '../utils/validation'; const AddonsItem = (props) => { const { inputId, inputChecked, onInputChange, Options, children } = props; const [open, setOpen] = useState(false); const Icon = open ? XCircleIcon : ToolsIcon; return ( <>
{Options && ( )}
{Options && open && Options} ); }; AddonsItem.propTypes = { inputId: PropTypes.string.isRequired, inputChecked: PropTypes.bool.isRequired, onInputChange: PropTypes.func.isRequired, Options: PropTypes.element.isRequired, children: PropTypes.element.isRequired, }; const CustomizeOptions = ({ title, CustomizationOptions }) => (
{title}

{CustomizationOptions}
); CustomizeOptions.propTypes = { title: PropTypes.string.isRequired, CustomizationOptions: PropTypes.element.isRequired, }; const CustomizeBadge = ({ githubName, badgeOptions, onBadgeUpdate }) => ( <> Preview:  {isGitHubUsernameValid(githubName) ? ( profile-visitors-count ) : ( Invalid GitHub username )} ); CustomizeBadge.propTypes = { githubName: PropTypes.string.isRequired, badgeOptions: PropTypes.object.isRequired, onBadgeUpdate: PropTypes.func.isRequired, }; const CustomizeGithubStatsBase = ({ prefix, options, onUpdate }) => ( <> ); CustomizeGithubStatsBase.propTypes = { prefix: PropTypes.string.isRequired, options: PropTypes.object.isRequired, onUpdate: PropTypes.func.isRequired, }; const CustomizeStreakStats = ({ prefix, options, onUpdate }) => ( <> ); CustomizeStreakStats.propTypes = { prefix: PropTypes.string.isRequired, options: PropTypes.object.isRequired, onUpdate: PropTypes.func.isRequired, }; const Addons = (props) => { const { data, social, handleDataChange, handleCheckChange } = props; const [debounce, setDebounce] = useState(undefined); const [badgeOptions, setBadgeOptions] = useState({ badgeStyle: data.badgeStyle, badgeColor: data.badgeColor, badgeLabel: data.badgeLabel, }); useEffect(() => { setBadgeOptions({ badgeStyle: data.badgeStyle, badgeColor: data.badgeColor, badgeLabel: data.badgeLabel, }); }, [data.badgeStyle, data.badgeColor, data.badgeLabel]); const [githubStatsOptions, setGithubStatsOptions] = useState({ ...data.githubStatsOptions, }); useEffect(() => { setGithubStatsOptions({ ...data.githubStatsOptions, }); }, [data.githubStatsOptions]); const [topLanguagesOptions, setTopLanguagesOptions] = useState({ ...data.topLanguagesOptions, }); useEffect(() => { setTopLanguagesOptions({ ...data.topLanguagesOptions, }); }, [data.topLanguagesOptions]); const [streakStatsOptions, setStreakStatsOptions] = useState({ ...data.streakStatsOptions, }); useEffect(() => { setStreakStatsOptions({ ...data.streakStatsOptions, }); }, [data.streakStatsOptions]); const blogPostPorkflow = () => { const payload = { dev: { show: data.devDynamicBlogs, username: social.dev, }, medium: { show: data.mediumDynamicBlogs, username: social.medium, }, rssurl: { show: data.rssDynamicBlogs, username: social.rssurl, }, }; const actionContent = latestBlogs(payload); const tempElement = document.createElement('a'); tempElement.setAttribute('href', `data:text/yaml;charset=utf-8,${encodeURIComponent(actionContent)}`); tempElement.setAttribute('download', 'blog-post-workflow.yml'); tempElement.style.display = 'none'; document.body.appendChild(tempElement); tempElement.click(); document.body.removeChild(tempElement); }; const onBadgeUpdate = (option, value) => { const callback = () => { const newVal = option === 'badgeLabel' && value === '' ? 'Profile views' : value; setBadgeOptions({ ...badgeOptions, [option]: newVal }); handleDataChange(option, { target: { value: newVal } }); }; clearTimeout(debounce); setDebounce(setTimeout(callback, 300)); }; const onStatsUpdate = (option, value) => { const newStatsOptions = { ...githubStatsOptions, [option]: value }; setGithubStatsOptions(newStatsOptions); handleDataChange('githubStatsOptions', { target: { value: newStatsOptions }, }); }; const onTopLangUpdate = (option, value) => { const newLangOptions = { ...topLanguagesOptions, [option]: value }; setTopLanguagesOptions(newLangOptions); handleDataChange('topLanguagesOptions', { target: { value: newLangOptions }, }); }; const onStreakStatsUpdate = (option, value) => { const newStreakStatsOptions = { ...streakStatsOptions, [option]: value }; setStreakStatsOptions(newStreakStatsOptions); handleDataChange('streakStatsOptions', { target: { value: newStreakStatsOptions }, }); }; return (
Add-ons
handleCheckChange('visitorsBadge')} Options={ } /> } > display visitors count badge handleCheckChange('githubProfileTrophy')} > display github trophy handleCheckChange('githubStats')} Options={ } /> } > display github profile stats card handleCheckChange('topLanguages')} Options={ } /> } > display top skills handleCheckChange('streakStats')} Options={ } /> } > display github streak stats handleCheckChange('twitterBadge')} > display twitter badge handleCheckChange('devDynamicBlogs')} > display latest dev.to blogs dynamically (GitHub Action) handleCheckChange('mediumDynamicBlogs')} > display latest medium blogs dynamically (GitHub Action) handleCheckChange('rssDynamicBlogs')} > display latest blogs from your personal blog dynamically (GitHub Action) {(data.devDynamicBlogs && social.dev) || (data.rssDynamicBlogs && social.rssurl) || (data.mediumDynamicBlogs && social.medium && isMediumUsernameValid(social.medium)) ? (
download e.keyCode === 13 && blogPostPorkflow()} role="button" tabIndex="0" style={{ cursor: 'pointer', color: '#002ead' }} > {' '} blog-post-workflow.yml {' '} file(learn {' '} how to setup )
) : ( '' )}
); }; export default Addons; Addons.propTypes = { data: PropTypes.object.isRequired, social: PropTypes.object.isRequired, handleDataChange: PropTypes.func.isRequired, handleCheckChange: PropTypes.func.isRequired, };