Details.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import React from 'react';
  2. import { useNavigate } from 'react-router-dom';
  3. import {
  4. ClusterSubjectParam,
  5. clusterSchemaEditPageRelativePath,
  6. clusterSchemaSchemaComparePageRelativePath,
  7. } from 'lib/paths';
  8. import ClusterContext from 'components/contexts/ClusterContext';
  9. import ConfirmationModal from 'components/common/ConfirmationModal/ConfirmationModal';
  10. import PageLoader from 'components/common/PageLoader/PageLoader';
  11. import PageHeading from 'components/common/PageHeading/PageHeading';
  12. import { Button } from 'components/common/Button/Button';
  13. import Dropdown from 'components/common/Dropdown/Dropdown';
  14. import DropdownItem from 'components/common/Dropdown/DropdownItem';
  15. import VerticalElipsisIcon from 'components/common/Icons/VerticalElipsisIcon';
  16. import { Table } from 'components/common/table/Table/Table.styled';
  17. import TableHeaderCell from 'components/common/table/TableHeaderCell/TableHeaderCell';
  18. import { useAppDispatch, useAppSelector } from 'lib/hooks/redux';
  19. import {
  20. fetchLatestSchema,
  21. fetchSchemaVersions,
  22. getAreSchemaLatestFulfilled,
  23. getAreSchemaVersionsFulfilled,
  24. SCHEMAS_VERSIONS_FETCH_ACTION,
  25. SCHEMA_LATEST_FETCH_ACTION,
  26. selectAllSchemaVersions,
  27. getSchemaLatest,
  28. } from 'redux/reducers/schemas/schemasSlice';
  29. import { serverErrorAlertAdded } from 'redux/reducers/alerts/alertsSlice';
  30. import { getResponse } from 'lib/errorHandling';
  31. import { resetLoaderById } from 'redux/reducers/loader/loaderSlice';
  32. import { TableTitle } from 'components/common/table/TableTitle/TableTitle.styled';
  33. import useAppParams from 'lib/hooks/useAppParams';
  34. import { schemasApiClient } from 'lib/api';
  35. import LatestVersionItem from './LatestVersion/LatestVersionItem';
  36. import SchemaVersion from './SchemaVersion/SchemaVersion';
  37. const Details: React.FC = () => {
  38. const navigate = useNavigate();
  39. const dispatch = useAppDispatch();
  40. const { isReadOnly } = React.useContext(ClusterContext);
  41. const { clusterName, subject } = useAppParams<ClusterSubjectParam>();
  42. const [
  43. isDeleteSchemaConfirmationVisible,
  44. setDeleteSchemaConfirmationVisible,
  45. ] = React.useState(false);
  46. React.useEffect(() => {
  47. dispatch(fetchLatestSchema({ clusterName, subject }));
  48. return () => {
  49. dispatch(resetLoaderById(SCHEMA_LATEST_FETCH_ACTION));
  50. };
  51. }, [clusterName, dispatch, subject]);
  52. React.useEffect(() => {
  53. dispatch(fetchSchemaVersions({ clusterName, subject }));
  54. return () => {
  55. dispatch(resetLoaderById(SCHEMAS_VERSIONS_FETCH_ACTION));
  56. };
  57. }, [clusterName, dispatch, subject]);
  58. const versions = useAppSelector((state) => selectAllSchemaVersions(state));
  59. const schema = useAppSelector(getSchemaLatest);
  60. const isFetched = useAppSelector(getAreSchemaLatestFulfilled);
  61. const areVersionsFetched = useAppSelector(getAreSchemaVersionsFulfilled);
  62. const onDelete = async () => {
  63. try {
  64. await schemasApiClient.deleteSchema({
  65. clusterName,
  66. subject,
  67. });
  68. navigate('../');
  69. } catch (e) {
  70. const err = await getResponse(e as Response);
  71. dispatch(serverErrorAlertAdded(err));
  72. }
  73. };
  74. if (!isFetched || !schema) {
  75. return <PageLoader />;
  76. }
  77. return (
  78. <>
  79. <PageHeading text={schema.subject}>
  80. {!isReadOnly && (
  81. <>
  82. <Button
  83. buttonSize="M"
  84. buttonType="primary"
  85. to={{
  86. pathname: clusterSchemaSchemaComparePageRelativePath,
  87. search: `leftVersion=${versions[0]?.version}&rightVersion=${versions[0]?.version}`,
  88. }}
  89. >
  90. Compare Versions
  91. </Button>
  92. <Button
  93. buttonSize="M"
  94. buttonType="primary"
  95. to={clusterSchemaEditPageRelativePath}
  96. >
  97. Edit Schema
  98. </Button>
  99. <Dropdown label={<VerticalElipsisIcon />} right>
  100. <DropdownItem
  101. onClick={() => setDeleteSchemaConfirmationVisible(true)}
  102. danger
  103. >
  104. Remove schema
  105. </DropdownItem>
  106. </Dropdown>
  107. <ConfirmationModal
  108. isOpen={isDeleteSchemaConfirmationVisible}
  109. onCancel={() => setDeleteSchemaConfirmationVisible(false)}
  110. onConfirm={onDelete}
  111. >
  112. Are you sure want to remove <b>{subject}</b> schema?
  113. </ConfirmationModal>
  114. </>
  115. )}
  116. </PageHeading>
  117. <LatestVersionItem schema={schema} />
  118. <TableTitle>Old versions</TableTitle>
  119. {areVersionsFetched ? (
  120. <Table isFullwidth>
  121. <thead>
  122. <tr>
  123. <TableHeaderCell />
  124. <TableHeaderCell title="Version" />
  125. <TableHeaderCell title="ID" />
  126. </tr>
  127. </thead>
  128. <tbody>
  129. {versions.map((version) => (
  130. <SchemaVersion key={version.id} version={version} />
  131. ))}
  132. {versions.length === 0 && (
  133. <tr>
  134. <td colSpan={10}>No active Schema</td>
  135. </tr>
  136. )}
  137. </tbody>
  138. </Table>
  139. ) : (
  140. <PageLoader />
  141. )}
  142. </>
  143. );
  144. };
  145. export default Details;