Skip to content

Commit f1f0218

Browse files
authored
[yugabyte#6346, yugabyte#6477, yugabyte#6421] Platform: Implemented toaster component for visual feedback (yugabyte#7078)
Description: Added toaster for having visual feedback for user action. cases covered: 1. When the user adds/delete the KMS configuration. 2. When duplicate region code is added for on-prem Provider. 3. Api error response in case of edit universe. Test scenario: - Adding duplicate region code for the on-prem provider notifies the user of an appropriate toaster. - Adding/Deleting the KMS have visual feedback to the users. - Any error encountered during edit universe have visual feedback
1 parent ccb580a commit f1f0218

File tree

9 files changed

+60
-7
lines changed

9 files changed

+60
-7
lines changed

managed/ui/package-lock.json

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

managed/ui/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
"react-router-dom": "5.2.0",
8989
"react-scripts": "3.2.0",
9090
"react-select": "3.1.0",
91+
"react-toastify": "7.0.3",
9192
"react-toggle": "4.1.1",
9293
"react-use": "15.3.4",
9394
"react-widgets": "4.5.0",

managed/ui/src/app/App.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,18 @@
22

33
import React, { Component } from 'react';
44
import 'bootstrap/dist/css/bootstrap.css';
5+
import 'react-toastify/dist/ReactToastify.css';
56
import './stylesheets/App.scss';
67
import './../_style/fonts.css';
8+
import { ToastContainer } from 'react-toastify';
79

810
export default class App extends Component {
911
render() {
10-
return <div>{this.props.children}</div>;
12+
return (
13+
<>
14+
<div>{this.props.children}</div>
15+
<ToastContainer/>
16+
</>
17+
);
1118
}
1219
}

managed/ui/src/app/stylesheets/App.scss

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,15 @@
7575
.no-padding {
7676
padding: 0 !important;
7777
}
78+
79+
.Toastify__toast--error {
80+
background: $YB_FAIL_COLOR;
81+
}
82+
83+
.Toastify__toast--success {
84+
background: $YB_SUCCESS_COLOR;
85+
}
86+
87+
.Toastify__toast--warning {
88+
background: $YB_WARNING_COLOR;
89+
}

managed/ui/src/components/config/OnPrem/OnPremConfigurationContainer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
} from '../../../actions/cloud';
2727
import { isNonEmptyArray } from '../../../utils/ObjectUtils';
2828
import { destroy } from 'redux-form';
29+
import { toast } from 'react-toastify';
2930

3031
const mapStateToProps = (state) => {
3132
return {
@@ -91,6 +92,10 @@ const mapDispatchToProps = (dispatch) => {
9192
};
9293
if ((isEdit && region.isBeingEdited) || !isEdit) {
9394
dispatch(createRegion(providerUUID, formValues)).then((response) => {
95+
if (response.error) {
96+
const errorMessage = response.payload?.response?.data?.error || response.payload.message;
97+
toast.error(errorMessage);
98+
}
9499
dispatch(createRegionResponse(response.payload));
95100
});
96101
}

managed/ui/src/components/config/PublicCloud/ProviderConfigurationContainer.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
fetchHostInfoSuccess,
3535
fetchHostInfoFailure
3636
} from '../../../actions/customers';
37+
import { toast } from 'react-toastify';
3738

3839
const mapDispatchToProps = (dispatch) => {
3940
return {
@@ -52,6 +53,7 @@ const mapDispatchToProps = (dispatch) => {
5253
dispatch(fetchCloudMetadata());
5354
const providerUUID = response.payload.data.uuid;
5455
dispatch(bootstrapProvider(providerUUID, regionFormVals)).then((boostrapResponse) => {
56+
toast.success('Successfully created AWS Provider!');
5557
dispatch(bootstrapProviderResponse(boostrapResponse.payload));
5658
});
5759
}
@@ -130,6 +132,8 @@ const mapDispatchToProps = (dispatch) => {
130132
deleteProviderConfig: (providerUUID) => {
131133
dispatch(deleteProvider(providerUUID)).then((response) => {
132134
if (response.payload.status !== 200) {
135+
const errorMessage = response.payload?.response?.data?.error || response.payload.message;
136+
toast.error(errorMessage);
133137
dispatch(deleteProviderFailure(response.payload));
134138
} else {
135139
dispatch(deleteProviderSuccess(response.payload));

managed/ui/src/components/config/Security/KeyManagementConfiguration.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { regionsData } from '../PublicCloud/views/providerRegionsData';
1919
import { readUploadedFile } from '../../../utils/UniverseUtils';
2020
import { change } from 'redux-form';
2121
import YBInfoTip from '../../common/descriptors/YBInfoTip';
22+
import { toast } from 'react-toastify';
2223

2324
// TODO: (Daniel) - Replace this hard-coding with an API that returns
2425
// a list of supported KMS Configurations
@@ -88,6 +89,7 @@ class KeyManagementConfiguration extends Component {
8889
setKMSConfig(kmsProvider.value, data).then(() => {
8990
fetchKMSConfigList();
9091
this.setState({ listView: true });
92+
toast.success('Successfully added the configuration');
9193
});
9294
}
9395
};
@@ -276,6 +278,7 @@ class KeyManagementConfiguration extends Component {
276278
render() {
277279
const { configList } = this.props;
278280
const { listView, enabledIAMProfile } = this.state;
281+
279282
if (getPromiseState(configList).isInit() || getPromiseState(configList).isLoading()) {
280283
return <YBLoadingCircleIcon />;
281284
}
@@ -287,7 +290,8 @@ class KeyManagementConfiguration extends Component {
287290
onDelete={this.deleteAuthConfig}
288291
/>
289292
);
290-
}
293+
294+
};
291295

292296
const validationSchema = Yup.object().shape({
293297
apiUrl: Yup.string(),

managed/ui/src/components/config/Security/KeyManagementConfigurationContainer.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
deleteKMSProviderConfig,
1212
deleteKMSProviderConfigResponse
1313
} from '../../../actions/cloud';
14+
import { toast } from 'react-toastify';
1415

1516
const mapStateToProps = (state) => {
1617
return {
@@ -32,26 +33,32 @@ const mapDispatchToProps = (dispatch) => {
3233
fetchKMSConfigList: () => {
3334
return dispatch(fetchAuthConfigList()).then((response) =>
3435
dispatch(fetchAuthConfigListResponse(response.payload))
35-
);
36+
)
37+
.catch(() => toast.error('Error occured while fetching config.'));
3638
},
3739

3840
setKMSConfig: (provider, body) => {
3941
return dispatch(createKMSProviderConfig(provider, body))
4042
.then((response) => {
41-
return dispatch(createKMSProviderConfigResponse(response.payload));
43+
return dispatch(createKMSProviderConfigResponse(response.payload)).then(
44+
() => toast.success('Successfully added the configuration')
45+
);
4246
})
43-
.catch((err) => console.err('Error submitting KMS configuration: ', err));
47+
.catch((err) => toast.error(`Error submitting KMS configuration: ${err}`));
4448
},
4549

4650
deleteKMSConfig: (configUUID) => {
4751
dispatch(deleteKMSProviderConfig(configUUID))
4852
.then((response) => {
4953
if (response.payload.status === 200) {
54+
toast.success('Successfully deleted KMS configuration');
5055
return dispatch(deleteKMSProviderConfigResponse(configUUID));
5156
}
52-
console.warn('Warning: Deleting configuration returned unsuccessful response.');
57+
toast.warn('Warning: Deleting configuration returned unsuccessful response.');
5358
})
54-
.catch((err) => console.error(err));
59+
.catch((err) => {
60+
console.error(err)
61+
});
5562
}
5663
};
5764
};

managed/ui/src/components/universes/UniverseForm/UniverseFormContainer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import { getClusterByType } from '../../../utils/UniverseUtils';
5959
import {
6060
EXPOSING_SERVICE_STATE_TYPES
6161
} from './ClusterFields';
62+
import { toast } from 'react-toastify';
6263

6364
const mapDispatchToProps = (dispatch) => {
6465
return {
@@ -123,6 +124,10 @@ const mapDispatchToProps = (dispatch) => {
123124

124125
submitEditUniverse: (values, universeUUID) => {
125126
dispatch(editUniverse(values, universeUUID)).then((response) => {
127+
if (response.error) {
128+
const errorMessage = response.payload?.response?.data?.error || response.payload.message;
129+
toast.error(errorMessage);
130+
}
126131
dispatch(editUniverseResponse(response.payload));
127132
});
128133
},

0 commit comments

Comments
 (0)