import { crud_fetch } from "app/api/crud.fetch"; import { as_type } from "app/api/crud.types"; import { upload_action } from "app/api/crud.upload"; import { store } from "app/store"; export function crud_actions(type) { const fetch_type = crud_fetch(type); return ["index", "show", "create", "update", "destroy"].reduce( (lookup, param) => { lookup[param] = crud_action(type, param, (q) => fetch_type[param](q)); return lookup; }, { action: (method, fn) => crud_action(type, method, fn), upload: (fd) => upload_action(type, fd), updateOption: (key, value) => (dispatch) => { dispatch({ type: as_type(type, "update_option"), key, value }); }, updateOptions: (opt) => (dispatch) => { dispatch({ type: as_type(type, "update_options"), opt }); }, } ); } export const crud_action = (type, method, fn) => (q, load_more) => ( dispatch ) => { return new Promise((resolve, reject) => { if (method === "index") { if (store.getState()[type].index.loading) { return resolve({}); } } dispatch({ type: as_type(type, method + "_loading"), load_more }); fn(q) .then((data) => { if (data?.status === "ok") { dispatch({ type: as_type(type, method), data, load_more }); resolve(data); } else { dispatch({ type: as_type(type, method + "_error"), error: data.error, }); reject(data); } }) .catch((e) => { console.log(e); dispatch({ type: as_type(type, method + "_error") }); reject(e); }); }); };