mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +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