@api-platform/client-generator
Version:
Generate apps built with Next, Nuxt, Quasar, React, React Native, Vue or Vuetify for any API documented using Hydra or OpenAPI
132 lines (109 loc) • 3.51 kB
JavaScript
import { SubmissionError } from 'redux-form';
import {
fetch,
extractHubURL,
normalize,
mercureSubscribe as subscribe
} from '../../utils/dataAccess';
import { success as createSuccess } from './create';
import { loading, error } from './delete';
export function retrieveError(retrieveError) {
return { type: '{{{uc}}}_UPDATE_RETRIEVE_ERROR', retrieveError };
}
export function retrieveLoading(retrieveLoading) {
return { type: '{{{uc}}}_UPDATE_RETRIEVE_LOADING', retrieveLoading };
}
export function retrieveSuccess(retrieved) {
return { type: '{{{uc}}}_UPDATE_RETRIEVE_SUCCESS', retrieved };
}
export function retrieve(id) {
return dispatch => {
dispatch(retrieveLoading(true));
return fetch(id)
.then(response =>
response
.json()
.then(retrieved => ({ retrieved, hubURL: extractHubURL(response) }))
)
.then(({ retrieved, hubURL }) => {
retrieved = normalize(retrieved);
dispatch(retrieveLoading(false));
dispatch(retrieveSuccess(retrieved));
if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id']));
})
.catch(e => {
dispatch(retrieveLoading(false));
dispatch(retrieveError(e.message));
});
};
}
export function updateError(updateError) {
return { type: '{{{uc}}}_UPDATE_UPDATE_ERROR', updateError };
}
export function updateLoading(updateLoading) {
return { type: '{{{uc}}}_UPDATE_UPDATE_LOADING', updateLoading };
}
export function updateSuccess(updated) {
return { type: '{{{uc}}}_UPDATE_UPDATE_SUCCESS', updated };
}
export function update(item, values) {
return dispatch => {
dispatch(updateError(null));
dispatch(createSuccess(null));
dispatch(updateLoading(true));
return fetch(item['@id'], {
method: 'PUT',
headers: new Headers({ 'Content-Type': 'application/ld+json' }),
body: JSON.stringify(values)
})
.then(response =>
response
.json()
.then(retrieved => ({ retrieved, hubURL: extractHubURL(response) }))
)
.then(({ retrieved, hubURL }) => {
retrieved = normalize(retrieved);
dispatch(updateLoading(false));
dispatch(updateSuccess(retrieved));
if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id']));
})
.catch(e => {
dispatch(updateLoading(false));
if (e instanceof SubmissionError) {
dispatch(updateError(e.errors._error));
throw e;
}
dispatch(updateError(e.message));
});
};
}
export function reset(eventSource) {
return dispatch => {
if (eventSource) eventSource.close();
dispatch({ type: '{{{uc}}}_UPDATE_RESET' });
dispatch(error(null));
dispatch(loading(false));
dispatch(createSuccess(null));
};
}
export function mercureSubscribe(hubURL, topic) {
return dispatch => {
const eventSource = subscribe(hubURL, [topic]);
dispatch(mercureOpen(eventSource));
eventSource.addEventListener('message', event =>
dispatch(mercureMessage(normalize(JSON.parse(event.data))))
);
};
}
export function mercureOpen(eventSource) {
return { type: '{{{uc}}}_UPDATE_MERCURE_OPEN', eventSource };
}
export function mercureMessage(retrieved) {
return dispatch => {
if (1 === Object.keys(retrieved).length) {
dispatch({ type: '{{{uc}}}_UPDATE_MERCURE_DELETED', retrieved });
return;
}
dispatch({ type: '{{{uc}}}_UPDATE_MERCURE_MESSAGE', retrieved });
};
}