mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-04 00:18:01 +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 useToast from '../../../hooks/useToast';
|
||||||
import { IApplication } from '../../../interfaces/application';
|
import { IApplication } from '../../../interfaces/application';
|
||||||
|
|
||||||
|
|
||||||
interface IApplicationUpdateProps {
|
interface IApplicationUpdateProps {
|
||||||
application: IApplication;
|
application: IApplication;
|
||||||
}
|
}
|
||||||
@ -17,19 +16,22 @@ export const ApplicationUpdate = ({ application }: IApplicationUpdateProps) => {
|
|||||||
const { appName, icon, url, description } = application;
|
const { appName, icon, url, description } = application;
|
||||||
const [localUrl, setLocalUrl] = useState(url || '');
|
const [localUrl, setLocalUrl] = useState(url || '');
|
||||||
const [localDescription, setLocalDescription] = useState(description || '');
|
const [localDescription, setLocalDescription] = useState(description || '');
|
||||||
const { setToastApiError } = useToast();
|
const { setToastData, setToastApiError } = useToast();
|
||||||
const commonStyles = useCommonStyles();
|
const commonStyles = useCommonStyles();
|
||||||
|
|
||||||
const handleChange = (
|
const handleChange = (
|
||||||
evt: ChangeEvent<{ name?: string | undefined; value: unknown }>
|
evt: ChangeEvent<{ name?: string | undefined; value: unknown }>,
|
||||||
|
field: string,
|
||||||
|
value: string
|
||||||
) => {
|
) => {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
try {
|
try {
|
||||||
storeApplicationMetaData(
|
storeApplicationMetaData(appName, field, value);
|
||||||
appName,
|
setToastData({
|
||||||
'icon',
|
type: 'success',
|
||||||
evt.target.value as string
|
title: 'Updated Successfully',
|
||||||
);
|
text: `${field} successfully updated`,
|
||||||
|
});
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
setToastApiError(e.toString());
|
setToastApiError(e.toString());
|
||||||
}
|
}
|
||||||
@ -45,7 +47,9 @@ export const ApplicationUpdate = ({ application }: IApplicationUpdateProps) => {
|
|||||||
label="Icon"
|
label="Icon"
|
||||||
options={icons.map(v => ({ key: v, label: v }))}
|
options={icons.map(v => ({ key: v, label: v }))}
|
||||||
value={icon || 'apps'}
|
value={icon || 'apps'}
|
||||||
onChange={e => handleChange(e)}
|
onChange={e =>
|
||||||
|
handleChange(e, 'icon', e.target.value as string)
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item>
|
<Grid item>
|
||||||
@ -57,9 +61,7 @@ export const ApplicationUpdate = ({ application }: IApplicationUpdateProps) => {
|
|||||||
type="url"
|
type="url"
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
size="small"
|
size="small"
|
||||||
onBlur={() =>
|
onBlur={e => handleChange(e, 'url', localUrl)}
|
||||||
storeApplicationMetaData(appName, 'url', localUrl)
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item>
|
<Grid item>
|
||||||
@ -70,12 +72,8 @@ export const ApplicationUpdate = ({ application }: IApplicationUpdateProps) => {
|
|||||||
size="small"
|
size="small"
|
||||||
rows={2}
|
rows={2}
|
||||||
onChange={e => setLocalDescription(e.target.value)}
|
onChange={e => setLocalDescription(e.target.value)}
|
||||||
onBlur={() =>
|
onBlur={e =>
|
||||||
storeApplicationMetaData(
|
handleChange(e, 'description', localDescription)
|
||||||
appName,
|
|
||||||
'description',
|
|
||||||
localDescription
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</Grid>
|
</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