Skip to content

Commit 50cbcc9

Browse files
Merge branch 'master' into cron-triggers-update-fix
2 parents 9d519f9 + 9936ace commit 50cbcc9

File tree

6 files changed

+76
-32
lines changed

6 files changed

+76
-32
lines changed

console/src/components/Services/Events/CronTriggers/Container.tsx

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useState, useEffect } from 'react';
22
import Helmet from 'react-helmet';
33
import CommonTabLayout from '../../../Common/Layout/CommonTabLayout/CommonTabLayout';
44
import {
@@ -21,15 +21,24 @@ interface Props {
2121
allTriggers: Triggers;
2222
tabName: STTab;
2323
dispatch: Dispatch;
24+
eventsLoading?: boolean;
2425
}
26+
type TriggerPresence =
27+
| 'not-missing'
28+
| { type: 'timeout'; timeoutHandle: number }
29+
| 'error-not-found';
2530

2631
const STContainer: React.FC<Props> = ({
2732
triggerName,
2833
children,
2934
allTriggers,
3035
tabName,
3136
dispatch,
37+
eventsLoading,
3238
}) => {
39+
const [triggerPresence, setTriggerPresence] = useState<TriggerPresence>(
40+
'not-missing'
41+
);
3342
React.useEffect(() => {
3443
dispatch(setCurrentTrigger(triggerName));
3544
return () => {
@@ -39,8 +48,28 @@ const STContainer: React.FC<Props> = ({
3948

4049
const currentTrigger = findScheduledTrigger(allTriggers, triggerName);
4150

51+
// TODO: This is a hack to deal with renaming cron triggers and stale props
52+
// https://react-redux.js.org/api/hooks#stale-props-and-zombie-children
53+
// Needs remodelling the state and careful handling of cron triggers rename
54+
useEffect(() => {
55+
if (currentTrigger) {
56+
if (
57+
typeof triggerPresence === 'object' &&
58+
triggerPresence.type === 'timeout'
59+
) {
60+
window.clearTimeout(triggerPresence.timeoutHandle);
61+
setTriggerPresence('not-missing');
62+
}
63+
} else if (triggerPresence === 'not-missing') {
64+
const timeoutHandle = window.setTimeout(() => {
65+
setTriggerPresence('error-not-found');
66+
}, 1200 /* arbitrary value */);
67+
setTriggerPresence({ type: 'timeout', timeoutHandle });
68+
}
69+
}, [currentTrigger]);
70+
4271
if (!currentTrigger) {
43-
dispatch(setCurrentTrigger(''));
72+
if (eventsLoading || triggerPresence !== 'error-not-found') return null;
4473
throw new NotFoundError();
4574
}
4675

console/src/components/Services/Events/CronTriggers/Modify/index.tsx

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
import React from 'react';
22
import { connect, ConnectedProps } from 'react-redux';
33
import STContainer from '../Container';
4-
import { Triggers, RouterTriggerProps } from '../../types';
5-
import { MapStateToProps } from '../../../../../types';
64
import Modify from './Modify';
75
import { mapDispatchToPropsEmpty } from '../../../../Common/utils/reactUtils';
6+
import { ReduxState } from '../../../../../types';
87

98
interface Props extends InjectedProps {}
109

1110
const ModifyContainer: React.FC<Props> = props => {
12-
const { dispatch, allTriggers, triggerName, readOnlyMode } = props;
11+
const {
12+
dispatch,
13+
allTriggers,
14+
triggerName,
15+
readOnlyMode,
16+
eventsLoading,
17+
} = props;
1318
return (
1419
<STContainer
1520
tabName="modify"
1621
dispatch={dispatch}
1722
triggerName={triggerName}
1823
allTriggers={allTriggers}
24+
eventsLoading={eventsLoading}
1925
>
2026
{readOnlyMode ? (
2127
'Cannot modify in read-only mode'
@@ -26,20 +32,15 @@ const ModifyContainer: React.FC<Props> = props => {
2632
);
2733
};
2834

29-
type PropsFromState = {
30-
allTriggers: Triggers;
31-
triggerName: string;
32-
readOnlyMode: boolean;
33-
};
34-
35-
const mapStateToProps: MapStateToProps<PropsFromState, RouterTriggerProps> = (
36-
state,
37-
ownProps
35+
const mapStateToProps = (
36+
state: ReduxState,
37+
ownProps: { params: { triggerName: string } }
3838
) => {
3939
return {
4040
allTriggers: state.events.triggers,
4141
readOnlyMode: state.main.readOnlyMode,
4242
triggerName: ownProps.params.triggerName,
43+
eventsLoading: state.events.loading,
4344
};
4445
};
4546

console/src/components/Services/Events/ServerIO.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { push } from 'react-router-redux';
1+
import { push, replace } from 'react-router-redux';
22
import {
33
fetchEventTriggersQuery,
44
fetchScheduledTriggersQuery,
@@ -35,8 +35,14 @@ import {
3535
EventTrigger,
3636
EventKind,
3737
InvocationLog,
38+
LOADING_TRIGGERS,
3839
} from './types';
39-
import { setScheduledTriggers, setEventTriggers, setTriggers } from './reducer';
40+
import {
41+
setScheduledTriggers,
42+
setEventTriggers,
43+
setTriggers,
44+
setCurrentTrigger,
45+
} from './reducer';
4046
import { LocalScheduledTriggerState } from './CronTriggers/state';
4147
import { LocalAdhocEventState } from './AdhocEvents/Add/state';
4248
import {
@@ -59,6 +65,8 @@ import { getLogsTableDef } from './utils';
5965
export const fetchTriggers = (
6066
kind: Nullable<TriggerKind>
6167
): Thunk<Promise<void>> => (dispatch, getState) => {
68+
dispatch({ type: LOADING_TRIGGERS });
69+
6270
const bulkQueryArgs = [];
6371
if (kind) {
6472
bulkQueryArgs.push(
@@ -194,8 +202,8 @@ export const saveScheduledTrigger = (
194202
);
195203

196204
const upRenameQueries = [
197-
getDropScheduledTriggerQuery(existingTrigger.name),
198205
generateCreateScheduledTriggerQuery(state),
206+
getDropScheduledTriggerQuery(existingTrigger.name),
199207
];
200208
const downRenameQueries = [
201209
getDropScheduledTriggerQuery(state.name),
@@ -209,18 +217,19 @@ export const saveScheduledTrigger = (
209217
const successMsg = 'Updated scheduled trigger successfully';
210218

211219
const customOnSuccess = () => {
212-
if (isRenamed) {
213-
const newHref = window.location.href.replace(
214-
getSTModifyRoute(existingTrigger.name, 'relative'),
215-
getSTModifyRoute(state.name, 'relative')
216-
);
217-
return window.location.replace(newHref);
218-
}
219220
return dispatch(fetchTriggers('cron'))
220221
.then(() => {
221222
if (successCb) {
222223
successCb();
223224
}
225+
if (isRenamed) {
226+
const newHref = window.location.href.replace(
227+
getSTModifyRoute(existingTrigger.name, 'relative'),
228+
getSTModifyRoute(state.name, 'relative')
229+
);
230+
dispatch(replace(newHref));
231+
dispatch(setCurrentTrigger(state.name));
232+
}
224233
})
225234
.catch(() => {
226235
if (errorCb) {

console/src/components/Services/Events/reducer.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
RASetCurrentTrigger,
1313
RASetEventTriggers,
1414
RASetScheduledTriggers,
15+
LOADING_TRIGGERS,
1516
} from './types';
1617

1718
export const setTriggers = (data: Triggers): RASetAllTriggers => ({
@@ -41,6 +42,7 @@ const reducer = (state = defaultState, action: RAEvents) => {
4142
return {
4243
...state,
4344
triggers: action.data,
45+
loading: false,
4446
};
4547
case LOADED_SCHEDULED_TRIGGERS:
4648
return {
@@ -49,6 +51,7 @@ const reducer = (state = defaultState, action: RAEvents) => {
4951
...state.triggers,
5052
scheduled: action.data,
5153
},
54+
loading: false,
5255
};
5356
case LOADED_EVENT_TRIGGERS:
5457
return {
@@ -57,12 +60,18 @@ const reducer = (state = defaultState, action: RAEvents) => {
5760
...state.triggers,
5861
event: action.data,
5962
},
63+
loading: false,
6064
};
6165
case SET_CURRENT_TRIGGER:
6266
return {
6367
...state,
6468
currentTrigger: action.name,
6569
};
70+
case LOADING_TRIGGERS:
71+
return {
72+
...state,
73+
loading: true,
74+
};
6675
default:
6776
return state;
6877
}

console/src/components/Services/Events/state.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ import { Triggers } from './types';
33
export type EventsState = {
44
triggers: Triggers;
55
currentTrigger: string;
6-
loading: {
7-
[component: string]: boolean;
8-
};
6+
loading: boolean;
97
error: {
108
[component: string]: any;
119
};
@@ -17,7 +15,7 @@ const state: EventsState = {
1715
event: [],
1816
},
1917
currentTrigger: '',
20-
loading: {},
18+
loading: true,
2119
error: {},
2220
};
2321

console/src/components/Services/Events/types.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,8 @@ import { Dispatch } from '../../../types';
66

77
export const LOADING_TRIGGERS = 'Events/LOADING_TRIGGERS';
88
export const LOADED_TRIGGERS = 'Events/LOADED_TRIGGERS';
9-
export const LOADING_SCHEDULED_TRIGGERS = 'Events/LOADING_SCHEDULED_TRIGGERS';
109
export const LOADED_SCHEDULED_TRIGGERS = 'Events/LOADED_SCHEDULED_TRIGGERS';
11-
export const LOADING_EVENT_TRIGGERS = 'Events/LOADING_EVENT_TRIGGERS';
1210
export const LOADED_EVENT_TRIGGERS = 'Events/LOADED_EVENT_TRIGGERS';
13-
export const LOADING_TRIGGERS_ERROR = 'Events/LOADING_TRIGGERS_ERROR';
1411
export const SET_CURRENT_TRIGGER = 'Events/SET_CURRENT_TRIGGER';
1512
export const LOAD_PENDING_DATA_EVENTS = 'Events/LOAD_PENDING_DATA_EVENTS';
1613

@@ -161,4 +158,5 @@ export type RAEvents =
161158
| RASetAllTriggers
162159
| RASetScheduledTriggers
163160
| RASetEventTriggers
164-
| RASetCurrentTrigger;
161+
| RASetCurrentTrigger
162+
| { type: typeof LOADING_TRIGGERS };

0 commit comments

Comments
 (0)