aboutsummaryrefslogtreecommitdiffstats
path: root/src/react/SVGIcon.js
blob: 8a5b1ae5177ac8d571e4391d549eb2f9e7c683d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import React from 'react';
import PropTypes from 'prop-types';

import iconMap from './utils/iconMap.js';

const SVGIcon = ({name, onClick, label, className, iconClassName, labelClassName, labelPosition, color, disabled, ...other}) => {

	let colorClass = (color !== '') ? '__' + color : '';
	let classes = `svg-icon-wrapper ${iconClassName} ${className} ${colorClass} ${onClick ? 'clickable' : ''} ${labelPosition}`;
	let camelCasedName = name.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });
	let IconComponent = iconMap[camelCasedName];
	if (!IconComponent) {
		console.error('Icon by the name ' + camelCasedName + ' is missing.');
	}

	return (
		<div {...other} onClick={onClick} className={classes} disabled={disabled}>
			{ IconComponent && <IconComponent className={`svg-icon __${name}`} /> }
			{ !IconComponent && <span className='svg-icon-missing'>Missing Icon</span> }
			{label && <span className={`svg-icon-label ${labelClassName}`}>{label}</span>}
		</div>
	);

};

SVGIcon.propTypes = {
	name: PropTypes.string.isRequired,
	onClick: PropTypes.func,
	label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
	labelPosition: PropTypes.string,
	className: PropTypes.string,
	iconClassName: PropTypes.string,
	labelClassName: PropTypes.string,
	color: PropTypes.string
};

SVGIcon.defaultProps = {
	name: '',
	label: '',
	className: '',
	iconClassName: '',
	labelClassName: '',
	labelPosition: 'bottom',
	color: ''
};

export default SVGIcon;