Files
shields/frontend/components/badge-examples.js
Paul Melnikow 1eedd458b8 Fix and refactor front-end URL generation (#1322)
- Fix issue in Firefox 57 when run from static build
- Fix color parameter in dynamic badge maker
- Correctly apply maxAge in usage badges
- Follow the WHATWG lead and begin to standardize on URL, not URI (https://url.spec.whatwg.org/#goals)
2017-12-04 10:08:54 -05:00

110 lines
2.9 KiB
JavaScript

import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import resolveBadgeUrl from '../lib/badge-url';
const Badge = ({ title, previewUri, exampleUri, documentation, baseUri, longCache, onClick }) => {
const handleClick = onClick ?
() => onClick({ title, previewUri, exampleUri, documentation })
: undefined;
const previewImage = previewUri
? (<img
className={classNames('badge-img', { clickable: onClick })}
onClick={handleClick}
src={resolveBadgeUrl(previewUri, baseUri, { longCache } )}
alt="" />
) : '\u00a0'; // non-breaking space
const resolvedExampleUri = resolveBadgeUrl(
exampleUri || previewUri,
baseUri,
{ longCache: false });
return (
<tr>
<th className={classNames({ clickable: onClick })} onClick={handleClick}>
{ title }:
</th>
<td>{ previewImage }</td>
<td>
<code className={classNames({ clickable: onClick })} onClick={handleClick}>
{ resolvedExampleUri }
</code>
</td>
</tr>
);
};
Badge.propTypes = {
title: PropTypes.string.isRequired,
previewUri: PropTypes.string,
exampleUri: PropTypes.string,
documentation: PropTypes.string,
baseUri: PropTypes.string,
longCache: PropTypes.bool.isRequired,
onClick: PropTypes.func.isRequired,
};
const Category = ({ category, examples, baseUri, longCache, onClick }) => (
<div>
<h3 id={category.id}>{ category.name }</h3>
<table className="badge">
<tbody>
{
examples.map((badgeData, i) => (
<Badge
key={i}
{...badgeData}
baseUri={baseUri}
longCache={longCache}
onClick={onClick} />
))
}
</tbody>
</table>
</div>
);
Category.propTypes = {
category: PropTypes.shape({
id: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
}).isRequired,
examples: PropTypes.arrayOf(PropTypes.shape({
title: PropTypes.string.isRequired,
previewUri: PropTypes.string,
exampleUri: PropTypes.string,
documentation: PropTypes.string,
})).isRequired,
baseUri: PropTypes.string,
longCache: PropTypes.bool.isRequired,
onClick: PropTypes.func.isRequired,
};
const BadgeExamples = ({ examples, baseUri, longCache, onClick }) => (
<div>
{
examples.map((categoryData, i) => (
<Category
key={i}
{...categoryData}
baseUri={baseUri}
longCache={longCache}
onClick={onClick} />
))
}
</div>
);
BadgeExamples.propTypes = {
examples: PropTypes.arrayOf(PropTypes.shape({
category: Category.propTypes.category,
examples: Category.propTypes.examples,
})),
baseUri: PropTypes.string,
longCache: PropTypes.bool.isRequired,
onClick: PropTypes.func.isRequired,
};
module.exports = {
Badge,
BadgeExamples,
};