SubscribeButton.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import React, { FC } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { UncontrolledTooltip } from 'reactstrap';
  4. import { useSWRxSubscriptionStatus } from '../stores/page';
  5. import { toastError } from '~/client/util/apiNotification';
  6. import { apiv3Put } from '~/client/util/apiv3-client';
  7. import { useIsGuestUser } from '~/stores/context';
  8. type Props = {
  9. pageId: string,
  10. };
  11. const SubscribeButton: FC<Props> = (props: Props) => {
  12. const { t } = useTranslation();
  13. const { pageId } = props;
  14. const { data: isGuestUser } = useIsGuestUser();
  15. const { data: subscriptionData, mutate } = useSWRxSubscriptionStatus(pageId);
  16. let isSubscribed;
  17. switch (subscriptionData?.status) {
  18. case true:
  19. isSubscribed = true;
  20. break;
  21. case false:
  22. isSubscribed = false;
  23. break;
  24. default:
  25. isSubscribed = null;
  26. }
  27. const buttonClass = `${isSubscribed ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`;
  28. const iconClass = isSubscribed || isSubscribed == null ? 'fa fa-eye' : 'fa fa-eye-slash';
  29. const handleClick = async() => {
  30. if (isGuestUser) {
  31. return;
  32. }
  33. try {
  34. const res = await apiv3Put('/page/subscribe', { pageId, status: !isSubscribed });
  35. if (res) {
  36. mutate();
  37. }
  38. }
  39. catch (err) {
  40. toastError(err);
  41. }
  42. };
  43. return (
  44. <>
  45. <button
  46. type="button"
  47. id="subscribe-button"
  48. onClick={handleClick}
  49. className={`btn btn-subscribe border-0 ${buttonClass}`}
  50. >
  51. <i className={iconClass}></i>
  52. </button>
  53. {isGuestUser && (
  54. <UncontrolledTooltip placement="top" target="subscribe-button" fade={false}>
  55. {t('Not available for guest')}
  56. </UncontrolledTooltip>
  57. )}
  58. </>
  59. );
  60. };
  61. export default SubscribeButton;