mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-25 00:07:47 +01:00
refactor: restore application store and add toast
This commit is contained in:
parent
ef8e3dcbfa
commit
104adda8fc
@ -7,7 +7,6 @@ import useApplicationsApi from '../../../hooks/api/actions/useApplicationsApi/us
|
||||
import useToast from '../../../hooks/useToast';
|
||||
import { IApplication } from '../../../interfaces/application';
|
||||
|
||||
|
||||
interface IApplicationUpdateProps {
|
||||
application: IApplication;
|
||||
}
|
||||
@ -17,19 +16,22 @@ export const ApplicationUpdate = ({ application }: IApplicationUpdateProps) => {
|
||||
const { appName, icon, url, description } = application;
|
||||
const [localUrl, setLocalUrl] = useState(url || '');
|
||||
const [localDescription, setLocalDescription] = useState(description || '');
|
||||
const { setToastApiError } = useToast();
|
||||
const { setToastData, setToastApiError } = useToast();
|
||||
const commonStyles = useCommonStyles();
|
||||
|
||||
const handleChange = (
|
||||
evt: ChangeEvent<{ name?: string | undefined; value: unknown }>
|
||||
evt: ChangeEvent<{ name?: string | undefined; value: unknown }>,
|
||||
field: string,
|
||||
value: string
|
||||
) => {
|
||||
evt.preventDefault();
|
||||
try {
|
||||
storeApplicationMetaData(
|
||||
appName,
|
||||
'icon',
|
||||
evt.target.value as string
|
||||
);
|
||||
storeApplicationMetaData(appName, field, value);
|
||||
setToastData({
|
||||
type: 'success',
|
||||
title: 'Updated Successfully',
|
||||
text: `${field} successfully updated`,
|
||||
});
|
||||
} catch (e: any) {
|
||||
setToastApiError(e.toString());
|
||||
}
|
||||
@ -45,7 +47,9 @@ export const ApplicationUpdate = ({ application }: IApplicationUpdateProps) => {
|
||||
label="Icon"
|
||||
options={icons.map(v => ({ key: v, label: v }))}
|
||||
value={icon || 'apps'}
|
||||
onChange={e => handleChange(e)}
|
||||
onChange={e =>
|
||||
handleChange(e, 'icon', e.target.value as string)
|
||||
}
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
@ -57,9 +61,7 @@ export const ApplicationUpdate = ({ application }: IApplicationUpdateProps) => {
|
||||
type="url"
|
||||
variant="outlined"
|
||||
size="small"
|
||||
onBlur={() =>
|
||||
storeApplicationMetaData(appName, 'url', localUrl)
|
||||
}
|
||||
onBlur={e => handleChange(e, 'url', localUrl)}
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
@ -70,12 +72,8 @@ export const ApplicationUpdate = ({ application }: IApplicationUpdateProps) => {
|
||||
size="small"
|
||||
rows={2}
|
||||
onChange={e => setLocalDescription(e.target.value)}
|
||||
onBlur={() =>
|
||||
storeApplicationMetaData(
|
||||
appName,
|
||||
'description',
|
||||
localDescription
|
||||
)
|
||||
onBlur={e =>
|
||||
handleChange(e, 'description', localDescription)
|
||||
}
|
||||
/>
|
||||
</Grid>
|
||||
|
58
frontend/src/store/application/actions.js
Normal file
58
frontend/src/store/application/actions.js
Normal file
@ -0,0 +1,58 @@
|
||||
import api from './api';
|
||||
import { dispatchError } from '../util';
|
||||
import { MUTE_ERROR } from '../error/actions';
|
||||
|
||||
export const RECEIVE_ALL_APPLICATIONS = 'RECEIVE_ALL_APPLICATIONS';
|
||||
export const ERROR_RECEIVE_ALL_APPLICATIONS = 'ERROR_RECEIVE_ALL_APPLICATIONS';
|
||||
export const ERROR_UPDATING_APPLICATION_DATA = 'ERROR_UPDATING_APPLICATION_DATA';
|
||||
|
||||
export const RECEIVE_APPLICATION = 'RECEIVE_APPLICATION';
|
||||
export const UPDATE_APPLICATION_FIELD = 'UPDATE_APPLICATION_FIELD';
|
||||
export const DELETE_APPLICATION = 'DELETE_APPLICATION';
|
||||
export const ERROR_DELETE_APPLICATION = 'ERROR_DELETE_APPLICATION';
|
||||
|
||||
const recieveAllApplications = json => ({
|
||||
type: RECEIVE_ALL_APPLICATIONS,
|
||||
value: json,
|
||||
});
|
||||
|
||||
const recieveApplication = json => ({
|
||||
type: RECEIVE_APPLICATION,
|
||||
value: json,
|
||||
});
|
||||
|
||||
export function fetchAll() {
|
||||
return dispatch =>
|
||||
api
|
||||
.fetchAll()
|
||||
.then(json => dispatch(recieveAllApplications(json)))
|
||||
.catch(dispatchError(dispatch, ERROR_RECEIVE_ALL_APPLICATIONS));
|
||||
}
|
||||
|
||||
export function storeApplicationMetaData(appName, key, value) {
|
||||
return dispatch =>
|
||||
api
|
||||
.storeApplicationMetaData(appName, key, value)
|
||||
.then(() => {
|
||||
const info = `${appName} successfully updated!`;
|
||||
setTimeout(() => dispatch({ type: MUTE_ERROR, error: info }), 1000);
|
||||
dispatch({ type: UPDATE_APPLICATION_FIELD, appName, key, value, info });
|
||||
})
|
||||
.catch(dispatchError(dispatch, ERROR_UPDATING_APPLICATION_DATA));
|
||||
}
|
||||
|
||||
export function fetchApplication(appName) {
|
||||
return dispatch =>
|
||||
api
|
||||
.fetchApplication(appName)
|
||||
.then(json => dispatch(recieveApplication(json)))
|
||||
.catch(dispatchError(dispatch, ERROR_RECEIVE_ALL_APPLICATIONS));
|
||||
}
|
||||
|
||||
export function deleteApplication(appName) {
|
||||
return dispatch =>
|
||||
api
|
||||
.deleteApplication(appName)
|
||||
.then(() => dispatch({ type: DELETE_APPLICATION, appName }))
|
||||
.catch(dispatchError(dispatch, ERROR_DELETE_APPLICATION));
|
||||
}
|
52
frontend/src/store/application/api.js
Normal file
52
frontend/src/store/application/api.js
Normal file
@ -0,0 +1,52 @@
|
||||
import { formatApiPath } from '../../utils/format-path';
|
||||
import { throwIfNotSuccess, headers } from '../api-helper';
|
||||
|
||||
const URI = formatApiPath('api/admin/metrics/applications');
|
||||
|
||||
function fetchAll() {
|
||||
return fetch(URI, { headers, credentials: 'include' })
|
||||
.then(throwIfNotSuccess)
|
||||
.then(response => response.json());
|
||||
}
|
||||
|
||||
function fetchApplication(appName) {
|
||||
return fetch(`${URI}/${appName}`, { headers, credentials: 'include' })
|
||||
.then(throwIfNotSuccess)
|
||||
.then(response => response.json());
|
||||
}
|
||||
|
||||
function fetchApplicationsWithStrategyName(strategyName) {
|
||||
return fetch(`${URI}?strategyName=${strategyName}`, {
|
||||
headers,
|
||||
credentials: 'include',
|
||||
})
|
||||
.then(throwIfNotSuccess)
|
||||
.then(response => response.json());
|
||||
}
|
||||
|
||||
function storeApplicationMetaData(appName, key, value) {
|
||||
const data = {};
|
||||
data[key] = value;
|
||||
return fetch(`${URI}/${appName}`, {
|
||||
method: 'POST',
|
||||
headers,
|
||||
body: JSON.stringify(data),
|
||||
credentials: 'include',
|
||||
}).then(throwIfNotSuccess);
|
||||
}
|
||||
|
||||
function deleteApplication(appName) {
|
||||
return fetch(`${URI}/${appName}`, {
|
||||
method: 'DELETE',
|
||||
headers,
|
||||
credentials: 'include',
|
||||
}).then(throwIfNotSuccess);
|
||||
}
|
||||
|
||||
export default {
|
||||
fetchApplication,
|
||||
fetchAll,
|
||||
fetchApplicationsWithStrategyName,
|
||||
storeApplicationMetaData,
|
||||
deleteApplication,
|
||||
};
|
30
frontend/src/store/application/index.js
Normal file
30
frontend/src/store/application/index.js
Normal file
@ -0,0 +1,30 @@
|
||||
import { fromJS, List, Map } from 'immutable';
|
||||
import { RECEIVE_ALL_APPLICATIONS, RECEIVE_APPLICATION, UPDATE_APPLICATION_FIELD, DELETE_APPLICATION } from './actions';
|
||||
import { USER_LOGOUT, USER_LOGIN } from '../user/actions';
|
||||
|
||||
function getInitState() {
|
||||
return fromJS({ list: [], apps: {} });
|
||||
}
|
||||
|
||||
const store = (state = getInitState(), action) => {
|
||||
switch (action.type) {
|
||||
case RECEIVE_APPLICATION:
|
||||
return state.setIn(['apps', action.value.appName], new Map(action.value));
|
||||
case RECEIVE_ALL_APPLICATIONS:
|
||||
return state.set('list', new List(action.value.applications));
|
||||
case UPDATE_APPLICATION_FIELD:
|
||||
return state.setIn(['apps', action.appName, action.key], action.value);
|
||||
case DELETE_APPLICATION: {
|
||||
const index = state.get('list').findIndex(item => item.appName === action.appName);
|
||||
const result = state.removeIn(['list', index]);
|
||||
return result.removeIn(['apps', action.appName]);
|
||||
}
|
||||
case USER_LOGOUT:
|
||||
case USER_LOGIN:
|
||||
return getInitState();
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
};
|
||||
|
||||
export default store;
|
Loading…
Reference in New Issue
Block a user