clientjs/packages/dashboard-components/src/ui/DefinitionBlock.jsx
author ymh <ymh.work@gmail.com>
Mon, 17 Sep 2018 15:32:33 +0200
changeset 6 819a7ab4e3fb
parent 0 5f4fcbc80b37
permissions -rw-r--r--
aborted async loading test, better split dashboard-components

import React from 'react';
import PropTypes from 'prop-types';

import ReactMarkdown from 'react-markdown';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';

import AnnotationQuote from './AnnotationQuote';

import './DefinitionBlock.scss';

const DefinitionHeaderIcon = ({ annotation }) => {
  const annotationText = annotation.text || '';
  let faIconName;

  if (annotationText) {
    faIconName = 'user';
  } else if (/^https?:\/\/.+\.wikipedia\.org/.test(annotation.uri)) {
    faIconName = ['fab', 'wikipedia-w'];
  } else {
    faIconName = 'globe';
  }

  return <FontAwesomeIcon icon={faIconName} className="annotation-card-definition-icon" />;
};

DefinitionHeaderIcon.propTypes = {
  annotation: PropTypes.object.isRequired,
};

const DefinitionUser = ({ annotation }) => {
  const [userName] = annotation.user.replace('acct:', '').split('@');

  return (
    <strong>
      { userName }
      {/* <span className="text-muted">@{ instanceName }</span> */}
    </strong>
  );
};

DefinitionUser.propTypes = {
  annotation: PropTypes.object.isRequired,
};

const DefinitionBody = ({ annotation, metacategories }) => {
  if (annotation.text) {
    return <ReactMarkdown source={annotation.text} />;
  }
  return <AnnotationQuote annotation={annotation} metacategories={metacategories} />;
};

DefinitionBody.propTypes = {
  annotation: PropTypes.object.isRequired,
  metacategories: PropTypes.arrayOf(PropTypes.object).isRequired,
};


const DefinitionBlock = ({ annotation, metacategories }) => {
  const { document } = annotation;

  return (
    <div className="card definition-card">
      <div className="card-header">
        <DefinitionHeaderIcon annotation={annotation} />
      </div>
      <div className="card-body small">
        <DefinitionBody annotation={annotation} metacategories={metacategories} />
      </div>
      <div className="card-footer">
        <a href={annotation.links.incontext} target="_blank" rel="noopener noreferrer">{ document.title }</a>
        <div>
          <DefinitionUser annotation={annotation} />
        </div>
      </div>
    </div>
  );
};

DefinitionBlock.propTypes = {
  annotation: PropTypes.object.isRequired,
  metacategories: PropTypes.arrayOf(PropTypes.object).isRequired,
};

export default DefinitionBlock;