SubscribeButton.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. if (subscriptionData == null) {
  19. return <></>;
  20. }
  21. let isSubscribing;
  22. if (subscriptionData.status) {
  23. isSubscribing = true;
  24. }
  25. const buttonClass = `${isSubscribing ? 'active' : ''} ${appContainer.isGuestUser ? 'disabled' : ''}`;
  26. const iconClass = isSubscribing || isSubscribing == null ? 'fa fa-eye' : 'fa fa-eye-slash';
  27. const handleClick = async() => {
  28. if (appContainer.isGuestUser) {
  29. return;
  30. }
  31. try {
  32. console.log('subscriptionData_handleclick', subscriptionData.status);
  33. const res = await appContainer.apiv3Put('page/subscribe', { pageId, status: !isSubscribing });
  34. if (res) {
  35. mutate();
  36. }
  37. }
  38. catch (err) {
  39. toastError(err);
  40. }
  41. };
  42. return (
  43. <>
  44. <button
  45. type="button"
  46. id="subscribe-button"
  47. onClick={handleClick}
  48. className={`btn btn-subscribe border-0 ${buttonClass}`}
  49. >
  50. <i className={iconClass}></i>
  51. </button>
  52. {appContainer.isGuestUser && (
  53. <UncontrolledTooltip placement="top" target="subscribe-button" fade={false}>
  54. {t('Not available for guest')}
  55. </UncontrolledTooltip>
  56. )}
  57. </>
  58. );
  59. };
  60. /**
  61. * Wrapper component for using unstated
  62. */
  63. const SubscribeButtonWrapper = withUnstatedContainers(SubscribeButton, [AppContainer, PageContainer]);
  64. export default SubscribeButtonWrapper;