OurBigBook
web/front/LikeArticleButton.tsx
import React from 'react'
import Router from 'next/router'

import { webApi } from 'front/api'
import { cant } from 'front/cant'
import { buttonActiveClass } from 'front/config'
import routes from 'front/routes'
import { LikeIcon } from 'front'

const LikeArticleButton = ({
  article,
  isIssue,
  issueArticle=undefined,
  loggedInUser,
  showText,
}) => {
  const ret = {}
  const cantLike = cant.likeArticle(loggedInUser, article, ret)
  const [liked, setLiked] = React.useState(article.liked)
  const [score, setScore] = React.useState(article.score)
  let buttonText;
  let buttonTextMaybe;
  if (liked) {
    buttonTextMaybe = 'Unlike'
  } else {
    buttonTextMaybe = 'Like'
  }
  if (showText) {
    buttonText = <>{' '}{buttonTextMaybe}</>
  } else {
    buttonText = ''
  }
  const handleClickLike = async (e) => {
    e.preventDefault();
    if (loggedInUser) {
      if (cantLike) return
    } else {
      Router.push(routes.userNew());
      return;
    }
    setScore((score) => score + (liked ? - 1 : 1))
    setLiked((liked) => !liked)
    let ret
    if (liked) {
      if (isIssue) {
        ret = await webApi.issueUnlike(issueArticle.slug, article.number)
      } else {
        ret = await webApi.articleUnlike(article.slug)
      }
    } else {
      if (isIssue) {
        ret = await webApi.issueLike(issueArticle.slug, article.number)
      } else {
        ret = await webApi.articleLike(article.slug)
      }
    }
    const { data, status } = ret
    if (status !== 200) {
      alert(`error: ${status} ${JSON.stringify(data)}`)
      setLiked((liked) => !liked)
      setScore((score) => score + (liked ? 1 : -1))
    }
  };
  let count = score;
  if (showText) {
    count = (<span className="counter">({count})</span>)
  }
  let buttonClassNames = ['modal']
  let title;
  if (loggedInUser && cantLike) {
    buttonClassNames.push('disabled')
    title = cantLike
  } else {
    if (liked) {
      buttonClassNames.push(buttonActiveClass)
    }
    title = buttonTextMaybe + ` this ${isIssue ? 'discussion' : 'article' }`
  }
  return (
    <button
      className={buttonClassNames.join(' ')}
      onClick={handleClickLike}
      title={title}
    >
      <LikeIcon />{showText ? ' ' : ''}{buttonText}
      {' '}{count}
    </button>
  )
}

export default LikeArticleButton;