SubscribeButton.tsx 2.1 KB

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