ahbeng/NUSMods

View on GitHub
website/src/views/components/disqus/CommentCount.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import * as React from 'react';
import { useEffect } from 'react';
import { connect } from 'react-redux';

import { MessageSquare } from 'react-feather';
import config from 'config';
import insertScript from 'utils/insertScript';
import { getScriptErrorHandler } from 'utils/error';

import type { State as StoreState } from 'types/state';
import type { DisqusConfig } from 'types/views';

import styles from './CommentCount.scss';

type Props = DisqusConfig & {
  loadDisqusManually: boolean;
};

const SCRIPT_ID = 'dsq-count-scr';

function loadInstance() {
  if (window.document.getElementById(SCRIPT_ID)) {
    if (window.DISQUSWIDGETS) {
      window.DISQUSWIDGETS.getCount({
        reset: true,
      });
    }
  } else {
    insertScript(`https://${config.disqusShortname}.disqus.com/count.js`, {
      id: SCRIPT_ID,
      async: true,
    }).catch(getScriptErrorHandler('Disqus comment count'));
  }
}

export const CommentCountComponent: React.FC<Props> = ({ identifier, url, loadDisqusManually }) => {
  useEffect(() => {
    if (!loadDisqusManually) {
      loadInstance();
    }
  }, [loadDisqusManually]);

  if (loadDisqusManually) return null;

  return (
    <span className={styles.comment}>
      <span className={styles.icon}>
        <MessageSquare aria-label="Comment count" />
      </span>
      <span
        className="disqus-comment-count"
        data-disqus-identifier={identifier}
        data-disqus-url={url}
      />
    </span>
  );
};

const CommentCount = connect((state: StoreState) => ({
  loadDisqusManually: state.settings.loadDisqusManually,
}))(CommentCountComponent);

export default CommentCount;