PageStatusAlert.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import React, { useCallback, type JSX } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { useIsGuestUser, useIsReadOnlyUser } from '~/stores-universal/context';
  4. import { useEditorMode } from '~/stores-universal/ui';
  5. import { usePageStatusAlert } from '~/stores/alert';
  6. import { useSWRxCurrentPage } from '~/stores/page';
  7. import { useRemoteRevisionId, useRemoteRevisionLastUpdateUser } from '~/stores/remote-latest-page';
  8. import { Username } from '../../components/User/Username';
  9. import styles from './PageStatusAlert.module.scss';
  10. export const PageStatusAlert = (): JSX.Element => {
  11. const { t } = useTranslation();
  12. const { data: editorMode } = useEditorMode();
  13. const { data: isGuestUser } = useIsGuestUser();
  14. const { data: isReadOnlyUser } = useIsReadOnlyUser();
  15. const { data: pageStatusAlertData } = usePageStatusAlert();
  16. const { data: remoteRevisionId } = useRemoteRevisionId();
  17. const { data: remoteRevisionLastUpdateUser } = useRemoteRevisionLastUpdateUser();
  18. const { data: pageData } = useSWRxCurrentPage();
  19. const onClickRefreshPage = useCallback(() => {
  20. pageStatusAlertData?.onRefleshPage?.();
  21. }, [pageStatusAlertData]);
  22. const onClickResolveConflict = useCallback(() => {
  23. pageStatusAlertData?.onResolveConflict?.();
  24. }, [pageStatusAlertData]);
  25. const hasResolveConflictHandler = pageStatusAlertData?.onResolveConflict != null;
  26. const hasRefreshPageHandler = pageStatusAlertData?.onRefleshPage != null;
  27. const currentRevisionId = pageData?.revision?._id;
  28. const isRevisionOutdated = (currentRevisionId != null || remoteRevisionId != null) && currentRevisionId !== remoteRevisionId;
  29. if (!pageStatusAlertData?.isOpen || !!isGuestUser || !!isReadOnlyUser || !isRevisionOutdated) {
  30. return <></>;
  31. }
  32. if (editorMode === pageStatusAlertData?.hideEditorMode) {
  33. return <></>;
  34. }
  35. return (
  36. <div className={`${styles['grw-page-status-alert']} card fixed-bottom animated fadeInUp faster text-bg-warning`}>
  37. <div className="card-body">
  38. <p className="card-text grw-card-label-container">
  39. { hasResolveConflictHandler
  40. ? <>{t('modal_resolve_conflict.file_conflicting_with_newer_remote')}</>
  41. : <><Username user={remoteRevisionLastUpdateUser} /> {t('edited this page')}</>
  42. }
  43. </p>
  44. <p className="card-text grw-card-btn-container">
  45. {hasRefreshPageHandler && (
  46. <button type="button" onClick={onClickRefreshPage} className="btn btn-outline-white">
  47. <span className="material-symbols-outlined">refresh</span>{t('Load latest')}
  48. </button>
  49. )}
  50. {hasResolveConflictHandler && (
  51. <button type="button" onClick={onClickResolveConflict} className="btn btn-outline-white">
  52. <span className="material-symbols-outlined">description</span>{t('modal_resolve_conflict.resolve_conflict')}
  53. </button>
  54. )}
  55. </p>
  56. </div>
  57. </div>
  58. );
  59. };