SubscribeButton.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import React, { FC, useState } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { UncontrolledTooltip } from 'reactstrap';
  4. import { withUnstatedContainers } from './UnstatedUtils';
  5. import { toastError } from '~/client/util/apiNotification';
  6. import AppContainer from '~/client/services/AppContainer';
  7. import PageContainer from '~/client/services/PageContainer';
  8. type Props = {
  9. appContainer: AppContainer,
  10. pageContainer: PageContainer,
  11. pageId: string,
  12. };
  13. const SubscribeButton: FC<Props> = (props: Props) => {
  14. const { t } = useTranslation();
  15. const { appContainer, pageId } = props;
  16. const [isSubscribing, setIsSubscribing] = useState(false);
  17. const handleClick = async() => {
  18. if (appContainer.isGuestUser) {
  19. return;
  20. }
  21. try {
  22. const res = await appContainer.apiv3Put('page/subscribe', { pageId, status: !isSubscribing });
  23. if (res) {
  24. const { subscription } = res.data;
  25. setIsSubscribing(subscription.status === 'SUBSCRIBE');
  26. }
  27. }
  28. catch (err) {
  29. toastError(err);
  30. }
  31. };
  32. return (
  33. <>
  34. <button
  35. type="button"
  36. id="subscribe-button"
  37. onClick={handleClick}
  38. className={`btn btn-subscribe border-0 ${isSubscribing ? 'active' : ''} ${appContainer.isGuestUser ? 'disabled' : ''}`}
  39. >
  40. <i className={isSubscribing ? 'fa fa-eye' : 'fa fa-eye-slash'}></i>
  41. </button>
  42. {appContainer.isGuestUser && (
  43. <UncontrolledTooltip placement="top" target="subscribe-button" fade={false}>
  44. {t('Not available for guest')}
  45. </UncontrolledTooltip>
  46. )}
  47. </>
  48. );
  49. };
  50. /**
  51. * Wrapper component for using unstated
  52. */
  53. const SubscribeButtonWrapper = withUnstatedContainers(SubscribeButton, [AppContainer, PageContainer]);
  54. export default SubscribeButtonWrapper;