ApiErrorMessage.jsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. const ApiErrorMessage = (props) => {
  5. const { t } = useTranslation();
  6. const {
  7. errorCode, errorMessage, targetPath,
  8. } = props;
  9. function reload() {
  10. window.location.reload();
  11. }
  12. function renderMessageByErrorCode() {
  13. switch (errorCode) {
  14. case 'already_exists':
  15. return (
  16. <>
  17. <strong><span className="material-symbols-outlined me-1">cancel</span>{ t('page_api_error.already_exists') }</strong>
  18. <small><a href={targetPath}>{targetPath} <span className="material-symbols-outlined me-1">login</span></a></small>
  19. </>
  20. );
  21. case 'notfound_or_forbidden':
  22. return (
  23. <strong><span className="material-symbols-outlined me-1">cancel</span>{ t('page_api_error.notfound_or_forbidden') }</strong>
  24. );
  25. case 'user_not_admin':
  26. return (
  27. <strong><span className="material-symbols-outlined me-1">cancel</span>{ t('page_api_error.user_not_admin') }</strong>
  28. );
  29. case 'complete_deletion_not_allowed_for_user':
  30. return (
  31. <strong><span className="material-symbols-outlined me-1">cancel</span>{ t('page_api_error.complete_deletion_not_allowed_for_user') }</strong>
  32. );
  33. case 'outdated':
  34. return (
  35. <>
  36. <strong><span className="material-symbols-outlined me-1">lightbulb</span> { t('page_api_error.outdated') }</strong>
  37. <a className="btn-link" onClick={reload}>
  38. <span className="material-symbols-outlined">keyboard_double_arrow_right</span> { t('Load latest') }
  39. </a>
  40. </>
  41. );
  42. case 'invalid_path':
  43. return (
  44. <strong><span className="material-symbols-outlined me-1">cancel</span> Invalid path</strong>
  45. );
  46. case 'single_deletion_empty_pages':
  47. return (
  48. <strong><span className="material-symbols-outlined me-1">cancel</span>{ t('page_api_error.single_deletion_empty_pages') }</strong>
  49. );
  50. default:
  51. return (
  52. <strong><span className="material-symbols-outlined me-1">cancel</span> Unknown error occured</strong>
  53. );
  54. }
  55. }
  56. if (errorCode != null) {
  57. return (
  58. <span className="text-danger">
  59. {renderMessageByErrorCode()}
  60. </span>
  61. );
  62. }
  63. if (errorMessage != null) {
  64. return (
  65. <span className="text-danger">
  66. {errorMessage}
  67. </span>
  68. );
  69. }
  70. // render null if no error has occurred
  71. return null;
  72. };
  73. ApiErrorMessage.propTypes = {
  74. errorCode: PropTypes.string,
  75. errorMessage: PropTypes.string,
  76. targetPath: PropTypes.string,
  77. };
  78. export default ApiErrorMessage;