Skip to content

Commit cd16f25

Browse files
authored
[Alerting UI] Make connector reducer as generic type. (#86857) (#87727)
* - * fixed failing tests * fixed typescript checks * fixed typescript checks * fixed failing build * fixed typescript checks * removed typo cast * fixed failing test * fixed faling build
1 parent 965d775 commit cd16f25

File tree

7 files changed

+183
-62
lines changed

7 files changed

+183
-62
lines changed

x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ import {
1717
} from '@elastic/eui';
1818
import { i18n } from '@kbn/i18n';
1919
import { FormattedMessage } from '@kbn/i18n/react';
20-
import { ReducerAction } from './connector_reducer';
2120
import {
22-
ActionConnector,
2321
IErrorObject,
2422
ActionTypeRegistryContract,
2523
UserConfiguredActionConnector,
@@ -28,8 +26,11 @@ import {
2826
import { hasSaveActionsCapability } from '../../lib/capabilities';
2927
import { useKibana } from '../../../common/lib/kibana';
3028
import { SectionLoading } from '../../components/section_loading';
29+
import { ConnectorReducerAction } from './connector_reducer';
3130

32-
export function validateBaseProperties(actionObject: ActionConnector) {
31+
export function validateBaseProperties<ConnectorConfig, ConnectorSecrets>(
32+
actionObject: UserConfiguredActionConnector<ConnectorConfig, ConnectorSecrets>
33+
) {
3334
const validationResult = { errors: {} };
3435
const verrors = {
3536
name: new Array<string>(),
@@ -78,14 +79,14 @@ interface ActionConnectorProps<
7879
ConnectorSecrets = Record<string, any>
7980
> {
8081
connector: UserConfiguredActionConnector<ConnectorConfig, ConnectorSecrets>;
81-
dispatch: React.Dispatch<ReducerAction>;
82-
actionTypeName: string;
83-
serverError?: {
84-
body: { message: string; error: string };
85-
};
82+
dispatch: React.Dispatch<ConnectorReducerAction<ConnectorConfig, ConnectorSecrets>>;
8683
errors: IErrorObject;
8784
actionTypeRegistry: ActionTypeRegistryContract;
8885
consumer?: string;
86+
actionTypeName?: string;
87+
serverError?: {
88+
body: { message: string; error: string };
89+
};
8990
}
9091

9192
export const ActionConnectorForm = ({
@@ -103,15 +104,31 @@ export const ActionConnectorForm = ({
103104
} = useKibana().services;
104105
const canSave = hasSaveActionsCapability(capabilities);
105106

106-
const setActionProperty = (key: string, value: any) => {
107+
const setActionProperty = <
108+
Key extends keyof UserConfiguredActionConnector<
109+
Record<string, unknown>,
110+
Record<string, unknown>
111+
>
112+
>(
113+
key: Key,
114+
value:
115+
| UserConfiguredActionConnector<Record<string, unknown>, Record<string, unknown>>[Key]
116+
| null
117+
) => {
107118
dispatch({ command: { type: 'setProperty' }, payload: { key, value } });
108119
};
109120

110-
const setActionConfigProperty = (key: string, value: any) => {
121+
const setActionConfigProperty = <Key extends keyof Record<string, unknown>>(
122+
key: Key,
123+
value: Record<string, unknown>[Key]
124+
) => {
111125
dispatch({ command: { type: 'setConfigProperty' }, payload: { key, value } });
112126
};
113127

114-
const setActionSecretsProperty = (key: string, value: any) => {
128+
const setActionSecretsProperty = <Key extends keyof Record<string, unknown>>(
129+
key: Key,
130+
value: Record<string, unknown>[Key]
131+
) => {
115132
dispatch({ command: { type: 'setSecretsProperty' }, payload: { key, value } });
116133
};
117134

@@ -135,7 +152,7 @@ export const ActionConnectorForm = ({
135152
id="xpack.triggersActionsUI.sections.actionConnectorForm.actions.actionConfigurationWarningDescriptionText"
136153
defaultMessage="To create this connector, you must configure at least one {actionType} account. {docLink}"
137154
values={{
138-
actionType: actionTypeName,
155+
actionType: actionTypeName ?? connector.actionTypeId,
139156
docLink: (
140157
<EuiLink
141158
href={`${docLinks.ELASTIC_WEBSITE_URL}guide/en/kibana/${docLinks.DOC_LINK_VERSION}/action-types.html`}

x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.tsx

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,17 @@ import { HttpSetup } from 'kibana/public';
2424
import { i18n } from '@kbn/i18n';
2525
import { ActionTypeMenu } from './action_type_menu';
2626
import { ActionConnectorForm, getConnectorErrors } from './action_connector_form';
27-
import { ActionType, ActionConnector, ActionTypeRegistryContract } from '../../../types';
28-
import { connectorReducer } from './connector_reducer';
27+
import {
28+
ActionType,
29+
ActionConnector,
30+
ActionTypeRegistryContract,
31+
UserConfiguredActionConnector,
32+
} from '../../../types';
2933
import { hasSaveActionsCapability } from '../../lib/capabilities';
3034
import { createActionConnector } from '../../lib/action_connector_api';
3135
import { VIEW_LICENSE_OPTIONS_LINK } from '../../../common/constants';
3236
import { useKibana } from '../../../common/lib/kibana';
37+
import { createConnectorReducer, InitialConnector, ConnectorReducer } from './connector_reducer';
3338
import { getConnectorWithInvalidatedFields } from '../../lib/value_validators';
3439

3540
export interface ConnectorAddFlyoutProps {
@@ -59,15 +64,32 @@ const ConnectorAddFlyout: React.FunctionComponent<ConnectorAddFlyoutProps> = ({
5964
const [hasActionsUpgradeableByTrial, setHasActionsUpgradeableByTrial] = useState<boolean>(false);
6065

6166
// hooks
62-
const initialConnector = {
67+
const initialConnector: InitialConnector<Record<string, unknown>, Record<string, unknown>> = {
6368
actionTypeId: actionType?.id ?? '',
6469
config: {},
6570
secrets: {},
66-
} as ActionConnector;
67-
const [{ connector }, dispatch] = useReducer(connectorReducer, { connector: initialConnector });
68-
const setActionProperty = (key: string, value: any) => {
71+
};
72+
73+
const reducer: ConnectorReducer<
74+
Record<string, unknown>,
75+
Record<string, unknown>
76+
> = createConnectorReducer<Record<string, unknown>, Record<string, unknown>>();
77+
const [{ connector }, dispatch] = useReducer(reducer, {
78+
connector: initialConnector as UserConfiguredActionConnector<
79+
Record<string, unknown>,
80+
Record<string, unknown>
81+
>,
82+
});
83+
84+
const setActionProperty = <Key extends keyof ActionConnector>(
85+
key: Key,
86+
value:
87+
| UserConfiguredActionConnector<Record<string, unknown>, Record<string, unknown>>[Key]
88+
| null
89+
) => {
6990
dispatch({ command: { type: 'setProperty' }, payload: { key, value } });
7091
};
92+
7193
const setConnector = (value: any) => {
7294
dispatch({ command: { type: 'setConnector' }, payload: { key: 'connector', value } });
7395
};

x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.tsx

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,16 @@ import { EuiButtonEmpty } from '@elastic/eui';
1818
import { EuiOverlayMask } from '@elastic/eui';
1919
import { i18n } from '@kbn/i18n';
2020
import { ActionConnectorForm, getConnectorErrors } from './action_connector_form';
21-
import { connectorReducer } from './connector_reducer';
21+
import { createConnectorReducer, InitialConnector, ConnectorReducer } from './connector_reducer';
2222
import { createActionConnector } from '../../lib/action_connector_api';
2323
import './connector_add_modal.scss';
2424
import { hasSaveActionsCapability } from '../../lib/capabilities';
25-
import { ActionType, ActionConnector, ActionTypeRegistryContract } from '../../../types';
25+
import {
26+
ActionType,
27+
ActionConnector,
28+
ActionTypeRegistryContract,
29+
UserConfiguredActionConnector,
30+
} from '../../../types';
2631
import { useKibana } from '../../../common/lib/kibana';
2732
import { getConnectorWithInvalidatedFields } from '../../lib/value_validators';
2833

@@ -47,7 +52,10 @@ export const ConnectorAddModal = ({
4752
application: { capabilities },
4853
} = useKibana().services;
4954
let hasErrors = false;
50-
const initialConnector = useMemo(
55+
const initialConnector: InitialConnector<
56+
Record<string, unknown>,
57+
Record<string, unknown>
58+
> = useMemo(
5159
() => ({
5260
actionTypeId: actionType.id,
5361
config: {},
@@ -58,7 +66,16 @@ export const ConnectorAddModal = ({
5866
const [isSaving, setIsSaving] = useState<boolean>(false);
5967
const canSave = hasSaveActionsCapability(capabilities);
6068

61-
const [{ connector }, dispatch] = useReducer(connectorReducer, { connector: initialConnector });
69+
const reducer: ConnectorReducer<
70+
Record<string, unknown>,
71+
Record<string, unknown>
72+
> = createConnectorReducer<Record<string, unknown>, Record<string, unknown>>();
73+
const [{ connector }, dispatch] = useReducer(reducer, {
74+
connector: initialConnector as UserConfiguredActionConnector<
75+
Record<string, unknown>,
76+
Record<string, unknown>
77+
>,
78+
});
6279
const setConnector = (value: any) => {
6380
dispatch({ command: { type: 'setConnector' }, payload: { key: 'connector', value } });
6481
};

x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ import { i18n } from '@kbn/i18n';
2626
import { Option, none, some } from 'fp-ts/lib/Option';
2727
import { ActionConnectorForm, getConnectorErrors } from './action_connector_form';
2828
import { TestConnectorForm } from './test_connector_form';
29-
import { ActionConnector, ActionTypeRegistryContract } from '../../../types';
30-
import { connectorReducer } from './connector_reducer';
29+
import {
30+
ActionConnector,
31+
ActionTypeRegistryContract,
32+
UserConfiguredActionConnector,
33+
} from '../../../types';
34+
import { ConnectorReducer, createConnectorReducer } from './connector_reducer';
3135
import { updateActionConnector, executeAction } from '../../lib/action_connector_api';
3236
import { hasSaveActionsCapability } from '../../lib/capabilities';
3337
import {
@@ -66,17 +70,29 @@ export const ConnectorEditFlyout = ({
6670
docLinks,
6771
application: { capabilities },
6872
} = useKibana().services;
73+
const getConnectorWithoutSecrets = () => ({
74+
...(initialConnector as UserConfiguredActionConnector<
75+
Record<string, unknown>,
76+
Record<string, unknown>
77+
>),
78+
secrets: {},
79+
});
6980
const canSave = hasSaveActionsCapability(capabilities);
7081

71-
const [{ connector }, dispatch] = useReducer(connectorReducer, {
72-
connector: { ...initialConnector, secrets: {} },
82+
const reducer: ConnectorReducer<
83+
Record<string, unknown>,
84+
Record<string, unknown>
85+
> = createConnectorReducer<Record<string, unknown>, Record<string, unknown>>();
86+
const [{ connector }, dispatch] = useReducer(reducer, {
87+
connector: getConnectorWithoutSecrets(),
7388
});
7489
const [isSaving, setIsSaving] = useState<boolean>(false);
7590
const [selectedTab, setTab] = useState<EditConectorTabs>(tab);
7691

7792
const [hasChanges, setHasChanges] = useState<boolean>(false);
78-
const setConnector = (key: string, value: any) => {
79-
dispatch({ command: { type: 'setConnector' }, payload: { key, value } });
93+
94+
const setConnector = (value: any) => {
95+
dispatch({ command: { type: 'setConnector' }, payload: { key: 'connector', value } });
8096
};
8197

8298
const [testExecutionActionParams, setTestExecutionActionParams] = useState<
@@ -101,7 +117,7 @@ export const ConnectorEditFlyout = ({
101117
);
102118

103119
const closeFlyout = useCallback(() => {
104-
setConnector('connector', { ...initialConnector, secrets: {} });
120+
setConnector(getConnectorWithoutSecrets());
105121
setHasChanges(false);
106122
setTestExecutionResult(none);
107123
onClose();
@@ -220,7 +236,6 @@ export const ConnectorEditFlyout = ({
220236
const onSaveClicked = async (closeAfterSave: boolean = true) => {
221237
if (hasErrors) {
222238
setConnector(
223-
'connector',
224239
getConnectorWithInvalidatedFields(
225240
connector,
226241
configErrors,
@@ -282,7 +297,6 @@ export const ConnectorEditFlyout = ({
282297
<ActionConnectorForm
283298
connector={connector}
284299
errors={connectorErrors}
285-
actionTypeName={connector.actionType}
286300
dispatch={(changes) => {
287301
setHasChanges(true);
288302
// if the user changes the connector, "forget" the last execution

x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_reducer.test.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
* or more contributor license agreements. Licensed under the Elastic License;
44
* you may not use this file except in compliance with the Elastic License.
55
*/
6-
import { connectorReducer } from './connector_reducer';
7-
import { ActionConnector } from '../../../types';
6+
import { UserConfiguredActionConnector } from '../../../types';
7+
import { createConnectorReducer, ConnectorReducer } from './connector_reducer';
88

99
describe('connector reducer', () => {
10-
let initialConnector: ActionConnector;
10+
let initialConnector: UserConfiguredActionConnector<
11+
Record<string, unknown>,
12+
Record<string, unknown>
13+
>;
1114
beforeAll(() => {
1215
initialConnector = {
1316
secrets: {},
@@ -20,6 +23,11 @@ describe('connector reducer', () => {
2023
};
2124
});
2225

26+
const connectorReducer: ConnectorReducer<
27+
Record<string, unknown>,
28+
Record<string, unknown>
29+
> = createConnectorReducer<Record<string, unknown>, Record<string, unknown>>();
30+
2331
test('if property name was changed', () => {
2432
const updatedConnector = connectorReducer(
2533
{ connector: initialConnector },

0 commit comments

Comments
 (0)