You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.5 KiB

  1. import PureRenderMixin from 'react-addons-pure-render-mixin';
  2. import ImmutablePropTypes from 'react-immutable-proptypes';
  3. const contentStyle = {
  4. flex: '1 1 auto',
  5. padding: '8px',
  6. paddingLeft: '14px',
  7. overflow: 'hidden'
  8. };
  9. const imageStyle = {
  10. display: 'block',
  11. width: '100%',
  12. height: 'auto',
  13. margin: '0',
  14. borderRadius: '4px 0 0 4px'
  15. };
  16. const hostStyle = {
  17. display: 'block',
  18. marginTop: '5px',
  19. fontSize: '13px'
  20. };
  21. const getHostname = url => {
  22. const parser = document.createElement('a');
  23. parser.href = url;
  24. return parser.hostname;
  25. };
  26. const Card = React.createClass({
  27. propTypes: {
  28. card: ImmutablePropTypes.map
  29. },
  30. mixins: [PureRenderMixin],
  31. render () {
  32. const { card } = this.props;
  33. if (card === null) {
  34. return null;
  35. }
  36. let image = '';
  37. if (card.get('image')) {
  38. image = (
  39. <div className='status-card__image'>
  40. <img src={card.get('image')} alt={card.get('title')} style={imageStyle} />
  41. </div>
  42. );
  43. }
  44. return (
  45. <a href={card.get('url')} className='status-card'>
  46. {image}
  47. <div className='status-card__content' style={contentStyle}>
  48. <strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong>
  49. <p className='status-card__description'>{card.get('description').substring(0, 50)}</p>
  50. <span className='status-card__host' style={hostStyle}>{getHostname(card.get('url'))}</span>
  51. </div>
  52. </a>
  53. );
  54. }
  55. });
  56. export default Card;