import React, { useState, useEffect } from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import Icon from './icon' import Link from './link' import classes from '../styles/code.module.sass' import Code from './codeDynamic' const defaultErrorMsg = `Can't fetch code example from GitHub :( Please use the link below to view the example. If you've come across a broken link, we always appreciate a pull request to the repository, or a report on the issue tracker. Thanks!` const GitHubCode = ({ url, lang, errorMsg = defaultErrorMsg, className }) => { const [initialized, setInitialized] = useState(false) const [code, setCode] = useState(errorMsg) const codeClassNames = classNames(classes.code, classes['max-height'], className) const rawUrl = url .replace('github.com', 'raw.githubusercontent.com') .replace('/blob', '') .replace('/tree', '') useEffect(() => { if (!initialized) { setCode(null) fetch(rawUrl) .then((res) => res.text().then((text) => ({ text, ok: res.ok }))) .then(({ text, ok }) => { setCode(ok ? text : errorMsg) }) .catch((err) => { setCode(errorMsg) console.error(err) }) setInitialized(true) } }, [initialized, rawUrl, errorMsg]) return ( <>
{rawUrl.split('.com/')[1]}
{code && ( {code} )} ) } GitHubCode.propTypes = { url: PropTypes.string.isRequired, lang: PropTypes.string, errorMsg: PropTypes.string, className: PropTypes.string, } export default React.memo(GitHubCode)