Details.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import React from 'react';
  2. import { useNavigate } from 'react-router-dom';
  3. import {
  4. ClusterSubjectParam,
  5. clusterSchemaEditPageRelativePath,
  6. clusterSchemaSchemaComparePageRelativePath,
  7. clusterSchemasPath,
  8. } from 'lib/paths';
  9. import ClusterContext from 'components/contexts/ClusterContext';
  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 { useAppDispatch, useAppSelector } from 'lib/hooks/redux';
  14. import {
  15. fetchLatestSchema,
  16. fetchSchemaVersions,
  17. getAreSchemaLatestFulfilled,
  18. getAreSchemaVersionsFulfilled,
  19. SCHEMAS_VERSIONS_FETCH_ACTION,
  20. SCHEMA_LATEST_FETCH_ACTION,
  21. selectAllSchemaVersions,
  22. getSchemaLatest,
  23. } from 'redux/reducers/schemas/schemasSlice';
  24. import { showServerError } from 'lib/errorHandling';
  25. import { resetLoaderById } from 'redux/reducers/loader/loaderSlice';
  26. import { TableTitle } from 'components/common/table/TableTitle/TableTitle.styled';
  27. import useAppParams from 'lib/hooks/useAppParams';
  28. import { schemasApiClient } from 'lib/api';
  29. import { Dropdown, DropdownItem } from 'components/common/Dropdown';
  30. import Table from 'components/common/NewTable';
  31. import LatestVersionItem from './LatestVersion/LatestVersionItem';
  32. import SchemaVersion from './SchemaVersion/SchemaVersion';
  33. const Details: React.FC = () => {
  34. const navigate = useNavigate();
  35. const dispatch = useAppDispatch();
  36. const { isReadOnly } = React.useContext(ClusterContext);
  37. const { clusterName, subject } = useAppParams<ClusterSubjectParam>();
  38. React.useEffect(() => {
  39. dispatch(fetchLatestSchema({ clusterName, subject }));
  40. return () => {
  41. dispatch(resetLoaderById(SCHEMA_LATEST_FETCH_ACTION));
  42. };
  43. }, [clusterName, dispatch, subject]);
  44. React.useEffect(() => {
  45. dispatch(fetchSchemaVersions({ clusterName, subject }));
  46. return () => {
  47. dispatch(resetLoaderById(SCHEMAS_VERSIONS_FETCH_ACTION));
  48. };
  49. }, [clusterName, dispatch, subject]);
  50. const versions = useAppSelector((state) => selectAllSchemaVersions(state));
  51. const schema = useAppSelector(getSchemaLatest);
  52. const isFetched = useAppSelector(getAreSchemaLatestFulfilled);
  53. const areVersionsFetched = useAppSelector(getAreSchemaVersionsFulfilled);
  54. const columns = React.useMemo(
  55. () => [
  56. { header: 'Version', accessorKey: 'version' },
  57. { header: 'ID', accessorKey: 'id' },
  58. { header: 'Type', accessorKey: 'schemaType' },
  59. ],
  60. []
  61. );
  62. const deleteHandler = async () => {
  63. try {
  64. await schemasApiClient.deleteSchema({
  65. clusterName,
  66. subject,
  67. });
  68. navigate('../');
  69. } catch (e) {
  70. showServerError(e as Response);
  71. }
  72. };
  73. if (!isFetched || !schema) {
  74. return <PageLoader />;
  75. }
  76. return (
  77. <>
  78. <PageHeading
  79. text={schema.subject}
  80. backText="Schema Registry"
  81. backTo={clusterSchemasPath(clusterName)}
  82. >
  83. {!isReadOnly && (
  84. <>
  85. <Button
  86. buttonSize="M"
  87. buttonType="primary"
  88. to={{
  89. pathname: clusterSchemaSchemaComparePageRelativePath,
  90. search: `leftVersion=${versions[0]?.version}&rightVersion=${versions[0]?.version}`,
  91. }}
  92. >
  93. Compare Versions
  94. </Button>
  95. <Button
  96. buttonSize="M"
  97. buttonType="primary"
  98. to={clusterSchemaEditPageRelativePath}
  99. >
  100. Edit Schema
  101. </Button>
  102. <Dropdown>
  103. <DropdownItem
  104. confirm={
  105. <>
  106. Are you sure want to remove <b>{subject}</b> schema?
  107. </>
  108. }
  109. onClick={deleteHandler}
  110. danger
  111. >
  112. Remove schema
  113. </DropdownItem>
  114. </Dropdown>
  115. </>
  116. )}
  117. </PageHeading>
  118. <LatestVersionItem schema={schema} />
  119. <TableTitle>Old versions</TableTitle>
  120. {areVersionsFetched ? (
  121. <Table
  122. columns={columns}
  123. data={versions}
  124. getRowCanExpand={() => true}
  125. renderSubComponent={SchemaVersion}
  126. enableSorting
  127. />
  128. ) : (
  129. <PageLoader />
  130. )}
  131. </>
  132. );
  133. };
  134. export default Details;