InAppNotificationSubstance.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import React, { type JSX } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import InAppNotificationList from '~/client/components/InAppNotification/InAppNotificationList';
  4. import { InAppNotificationStatuses } from '~/interfaces/in-app-notification';
  5. import { useSWRxInAppNotifications } from '~/stores/in-app-notification';
  6. type InAppNotificationFormsProps = {
  7. isUnopendNotificationsVisible: boolean;
  8. onChangeUnopendNotificationsVisible: () => void;
  9. };
  10. export const InAppNotificationForms = (
  11. props: InAppNotificationFormsProps,
  12. ): JSX.Element => {
  13. const { isUnopendNotificationsVisible, onChangeUnopendNotificationsVisible } =
  14. props;
  15. const { t } = useTranslation('commons');
  16. return (
  17. <div className="my-2">
  18. <div className="form-check form-switch">
  19. <label className="form-check-label" htmlFor="flexSwitchCheckDefault">
  20. {t('in_app_notification.only_unread')}
  21. </label>
  22. <input
  23. id="flexSwitchCheckDefault"
  24. className="form-check-input"
  25. type="checkbox"
  26. role="switch"
  27. aria-checked={isUnopendNotificationsVisible}
  28. checked={isUnopendNotificationsVisible}
  29. onChange={onChangeUnopendNotificationsVisible}
  30. />
  31. </div>
  32. </div>
  33. );
  34. };
  35. type InAppNotificationContentProps = {
  36. isUnopendNotificationsVisible: boolean;
  37. };
  38. export const InAppNotificationContent = (
  39. props: InAppNotificationContentProps,
  40. ): JSX.Element => {
  41. const { isUnopendNotificationsVisible } = props;
  42. const { t } = useTranslation('commons');
  43. // TODO: Infinite scroll implemented (https://redmine.weseek.co.jp/issues/138057)
  44. const { data: inAppNotificationData, mutate: mutateInAppNotificationData } =
  45. useSWRxInAppNotifications(
  46. 6,
  47. undefined,
  48. isUnopendNotificationsVisible
  49. ? InAppNotificationStatuses.STATUS_UNOPENED
  50. : undefined,
  51. { keepPreviousData: true },
  52. );
  53. return (
  54. <>
  55. {inAppNotificationData != null &&
  56. inAppNotificationData.docs.length === 0 ? (
  57. // no items
  58. t('in_app_notification.no_notification')
  59. ) : (
  60. // render list-group
  61. <InAppNotificationList
  62. inAppNotificationData={inAppNotificationData}
  63. onUnopenedNotificationOpend={mutateInAppNotificationData}
  64. />
  65. )}
  66. </>
  67. );
  68. };