Actions.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import React from 'react';
  2. import { useHistory, useParams } from 'react-router-dom';
  3. import { ConnectorState, ConnectorAction } from 'generated-sources';
  4. import { ClusterName, ConnectName, ConnectorName } from 'redux/interfaces';
  5. import {
  6. clusterConnectConnectorEditPath,
  7. clusterConnectorsPath,
  8. } from 'lib/paths';
  9. import ConfirmationModal from 'components/common/ConfirmationModal/ConfirmationModal';
  10. import styled from 'styled-components';
  11. import { Button } from 'components/common/Button/Button';
  12. interface RouterParams {
  13. clusterName: ClusterName;
  14. connectName: ConnectName;
  15. connectorName: ConnectorName;
  16. }
  17. const ConnectorActionsWrapperStyled = styled.div`
  18. display: flex;
  19. gap: 8px;
  20. `;
  21. export interface ActionsProps {
  22. deleteConnector(payload: {
  23. clusterName: ClusterName;
  24. connectName: ConnectName;
  25. connectorName: ConnectorName;
  26. }): Promise<unknown>;
  27. isConnectorDeleting: boolean;
  28. connectorStatus?: ConnectorState;
  29. restartConnector(payload: {
  30. clusterName: ClusterName;
  31. connectName: ConnectName;
  32. connectorName: ConnectorName;
  33. }): void;
  34. restartTasks(payload: {
  35. clusterName: ClusterName;
  36. connectName: ConnectName;
  37. connectorName: ConnectorName;
  38. action: ConnectorAction;
  39. }): void;
  40. pauseConnector(payload: {
  41. clusterName: ClusterName;
  42. connectName: ConnectName;
  43. connectorName: ConnectorName;
  44. }): void;
  45. resumeConnector(payload: {
  46. clusterName: ClusterName;
  47. connectName: ConnectName;
  48. connectorName: ConnectorName;
  49. }): void;
  50. isConnectorActionRunning: boolean;
  51. }
  52. const Actions: React.FC<ActionsProps> = ({
  53. deleteConnector,
  54. isConnectorDeleting,
  55. connectorStatus,
  56. restartConnector,
  57. restartTasks,
  58. pauseConnector,
  59. resumeConnector,
  60. isConnectorActionRunning,
  61. }) => {
  62. const { clusterName, connectName, connectorName } = useParams<RouterParams>();
  63. const history = useHistory();
  64. const [
  65. isDeleteConnectorConfirmationVisible,
  66. setIsDeleteConnectorConfirmationVisible,
  67. ] = React.useState(false);
  68. const deleteConnectorHandler = React.useCallback(async () => {
  69. try {
  70. await deleteConnector({ clusterName, connectName, connectorName });
  71. history.push(clusterConnectorsPath(clusterName));
  72. } catch {
  73. // do not redirect
  74. }
  75. }, [deleteConnector, clusterName, connectName, connectorName, history]);
  76. const restartConnectorHandler = React.useCallback(() => {
  77. restartConnector({ clusterName, connectName, connectorName });
  78. }, [restartConnector, clusterName, connectName, connectorName]);
  79. const restartTasksHandler = React.useCallback(
  80. (actionType) => {
  81. restartTasks({
  82. clusterName,
  83. connectName,
  84. connectorName,
  85. action: actionType,
  86. });
  87. },
  88. [restartTasks, clusterName, connectName, connectorName]
  89. );
  90. const pauseConnectorHandler = React.useCallback(() => {
  91. pauseConnector({ clusterName, connectName, connectorName });
  92. }, [pauseConnector, clusterName, connectName, connectorName]);
  93. const resumeConnectorHandler = React.useCallback(() => {
  94. resumeConnector({ clusterName, connectName, connectorName });
  95. }, [resumeConnector, clusterName, connectName, connectorName]);
  96. return (
  97. <ConnectorActionsWrapperStyled>
  98. {connectorStatus === ConnectorState.RUNNING && (
  99. <Button
  100. buttonSize="M"
  101. buttonType="primary"
  102. type="button"
  103. onClick={pauseConnectorHandler}
  104. disabled={isConnectorActionRunning}
  105. >
  106. <span>
  107. <i className="fas fa-pause" />
  108. </span>
  109. <span>Pause</span>
  110. </Button>
  111. )}
  112. {connectorStatus === ConnectorState.PAUSED && (
  113. <Button
  114. buttonSize="M"
  115. buttonType="primary"
  116. type="button"
  117. onClick={resumeConnectorHandler}
  118. disabled={isConnectorActionRunning}
  119. >
  120. <span>
  121. <i className="fas fa-play" />
  122. </span>
  123. <span>Resume</span>
  124. </Button>
  125. )}
  126. <Button
  127. buttonSize="M"
  128. buttonType="primary"
  129. type="button"
  130. onClick={restartConnectorHandler}
  131. disabled={isConnectorActionRunning}
  132. >
  133. <span>
  134. <i className="fas fa-sync-alt" />
  135. </span>
  136. <span>Restart Connector</span>
  137. </Button>
  138. <Button
  139. buttonSize="M"
  140. buttonType="primary"
  141. type="button"
  142. onClick={() => restartTasksHandler(ConnectorAction.RESTART_ALL_TASKS)}
  143. disabled={isConnectorActionRunning}
  144. >
  145. <span>
  146. <i className="fas fa-sync-alt" />
  147. </span>
  148. <span>Restart All Tasks</span>
  149. </Button>
  150. <Button
  151. buttonSize="M"
  152. buttonType="primary"
  153. type="button"
  154. onClick={() =>
  155. restartTasksHandler(ConnectorAction.RESTART_FAILED_TASKS)
  156. }
  157. disabled={isConnectorActionRunning}
  158. >
  159. <span>
  160. <i className="fas fa-sync-alt" />
  161. </span>
  162. <span>Restart Failed Tasks</span>
  163. </Button>
  164. <Button
  165. buttonSize="M"
  166. buttonType="primary"
  167. type="button"
  168. isLink
  169. disabled={isConnectorActionRunning}
  170. to={clusterConnectConnectorEditPath(
  171. clusterName,
  172. connectName,
  173. connectorName
  174. )}
  175. >
  176. <span>
  177. <i className="fas fa-pencil-alt" />
  178. </span>
  179. <span>Edit Config</span>
  180. </Button>
  181. <Button
  182. buttonSize="M"
  183. buttonType="secondary"
  184. type="button"
  185. onClick={() => setIsDeleteConnectorConfirmationVisible(true)}
  186. disabled={isConnectorActionRunning}
  187. >
  188. <span>
  189. <i className="far fa-trash-alt" />
  190. </span>
  191. <span>Delete</span>
  192. </Button>
  193. <ConfirmationModal
  194. isOpen={isDeleteConnectorConfirmationVisible}
  195. onCancel={() => setIsDeleteConnectorConfirmationVisible(false)}
  196. onConfirm={deleteConnectorHandler}
  197. isConfirming={isConnectorDeleting}
  198. >
  199. Are you sure you want to remove <b>{connectorName}</b> connector?
  200. </ConfirmationModal>
  201. </ConnectorActionsWrapperStyled>
  202. );
  203. };
  204. export default Actions;