InAppNotificationPage.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import React, { FC, useState, useEffect } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import PropTypes from 'prop-types';
  4. import AppContainer from '~/client/services/AppContainer';
  5. import { withUnstatedContainers } from '../UnstatedUtils';
  6. import InAppNotificationList from './InAppNotificationList';
  7. import { useSWRxInAppNotifications, useSWRxInAppNotificationStatus } from '../../stores/in-app-notification';
  8. import PaginationWrapper from '../PaginationWrapper';
  9. import CustomNavAndContents from '../CustomNavigation/CustomNavAndContents';
  10. import { InAppNotificationStatuses } from '~/interfaces/in-app-notification';
  11. import { apiv3Put, apiv3Post } from '~/client/util/apiv3-client';
  12. type Props = {
  13. appContainer: AppContainer
  14. }
  15. const InAppNotificationPageBody: FC<Props> = (props) => {
  16. const { appContainer } = props;
  17. const limit = appContainer.config.pageLimitationXL;
  18. const { t } = useTranslation();
  19. const { mutate: mutateInAppNotificationStatusData } = useSWRxInAppNotificationStatus();
  20. const updateNotificationStatus = async() => {
  21. try {
  22. await apiv3Post('/in-app-notification/read');
  23. mutateInAppNotificationStatusData();
  24. }
  25. catch (err) {
  26. // logger.error(err);
  27. }
  28. };
  29. useEffect(() => {
  30. updateNotificationStatus();
  31. }, []);
  32. const InAppNotificationCategoryByStatus = (status?: InAppNotificationStatuses) => {
  33. const [activePage, setActivePage] = useState(1);
  34. const offset = (activePage - 1) * limit;
  35. let categoryStatus;
  36. switch (status) {
  37. case InAppNotificationStatuses.STATUS_UNOPENED:
  38. categoryStatus = InAppNotificationStatuses.STATUS_UNOPENED;
  39. break;
  40. default:
  41. }
  42. const { data: notificationData, mutate } = useSWRxInAppNotifications(limit, offset, categoryStatus);
  43. const setAllNotificationPageNumber = (selectedPageNumber): void => {
  44. setActivePage(selectedPageNumber);
  45. };
  46. if (notificationData == null) {
  47. return (
  48. <div className="wiki">
  49. <div className="text-muted text-center">
  50. <i className="fa fa-2x fa-spinner fa-pulse mr-1"></i>
  51. </div>
  52. </div>
  53. );
  54. }
  55. const updateUnopendNotificationStatusesToOpened = async() => {
  56. await apiv3Put('/in-app-notification/all-statuses-open');
  57. mutate();
  58. };
  59. return (
  60. <>
  61. {(status === InAppNotificationStatuses.STATUS_UNOPENED && notificationData.totalDocs > 0)
  62. && (
  63. <div className="mb-2 d-flex justify-content-end">
  64. <button
  65. type="button"
  66. className="btn btn-outline-primary"
  67. onClick={updateUnopendNotificationStatusesToOpened}
  68. >
  69. {t('in_app_notification.mark_all_as_read')}
  70. </button>
  71. </div>
  72. )}
  73. <InAppNotificationList inAppNotificationData={notificationData} />
  74. {notificationData.totalDocs > 0
  75. && (
  76. <PaginationWrapper
  77. activePage={activePage}
  78. changePage={setAllNotificationPageNumber}
  79. totalItemsCount={notificationData.totalDocs}
  80. pagingLimit={notificationData.limit}
  81. align="center"
  82. size="sm"
  83. />
  84. )
  85. }
  86. </>
  87. );
  88. };
  89. const navTabMapping = {
  90. user_infomation: {
  91. Icon: () => <></>,
  92. Content: () => InAppNotificationCategoryByStatus(),
  93. i18n: t('in_app_notification.all'),
  94. index: 0,
  95. },
  96. external_accounts: {
  97. Icon: () => <></>,
  98. Content: () => InAppNotificationCategoryByStatus(InAppNotificationStatuses.STATUS_UNOPENED),
  99. i18n: t('in_app_notification.unopend'),
  100. index: 1,
  101. },
  102. };
  103. return (
  104. <CustomNavAndContents navTabMapping={navTabMapping} />
  105. );
  106. };
  107. const InAppNotificationPage = withUnstatedContainers(InAppNotificationPageBody, [AppContainer]);
  108. export default InAppNotificationPage;
  109. InAppNotificationPageBody.propTypes = {
  110. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  111. };