1
0
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:
Youssef 2022-02-10 11:02:53 +01:00
parent ef8e3dcbfa
commit 104adda8fc
4 changed files with 156 additions and 18 deletions

View File

@ -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>

View 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));
}

View 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,
};

View 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;