summaryrefslogtreecommitdiff
path: root/frontend/app/api/crud.actions.js
blob: 54fc96da3d200f5300126d8b20204304d065eb26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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);
      });
  });
};