useModel.jsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import React from "react";
  2. import { useNavigate } from "react-router-dom";
  3. import { emptyRequest, getRequest, postRequest } from "../constants/requests";
  4. import { useHttp } from "./useHttp";
  5. const empty = emptyRequest();
  6. export function useModel({
  7. name,
  8. id,
  9. fields = null,
  10. expand = null,
  11. extraParams = null,
  12. redirectOnPost = false,
  13. path = "guardar",
  14. }) {
  15. const [modelRequest, setProfileRequest] = React.useState(empty);
  16. const [model, modelLoading, modelError, refreshModel] = useHttp(modelRequest);
  17. const [updateRequest, setUpdateRequest] = React.useState(empty);
  18. const [postResult, postResultLoading, postResultError] =
  19. useHttp(updateRequest);
  20. const navigate = useNavigate();
  21. const updateModel = React.useCallback(
  22. (newModel, alert = true) => {
  23. if (!postResultLoading) {
  24. if (newModel.id) {
  25. newModel = { id: newModel.id };
  26. delete newModel.id;
  27. }
  28. const updateReq = postRequest(`${name}/${path}`, newModel);
  29. updateReq.alert = alert;
  30. setUpdateRequest(updateReq);
  31. }
  32. },
  33. [name, postResultLoading, path]
  34. );
  35. React.useEffect(() => {
  36. let mounted = true;
  37. if (mounted && postResult && redirectOnPost && !postResultError) {
  38. const { pathname } = navigate.location; // todo revisar esto
  39. const redirectTo = pathname.split("/").filter((e) => e !== "");
  40. navigate.push("/" + redirectTo[0]);
  41. }
  42. return () => {
  43. mounted = false;
  44. };
  45. }, [postResult, redirectOnPost, postResultError, navigate]);
  46. React.useEffect(() => {
  47. if (!name || !id) return;
  48. let params = { id: id };
  49. if (fields) params = { ...params, fields };
  50. if (expand) params = { ...params, expand };
  51. if (extraParams) params = { ...params, ...extraParams };
  52. const modelReq = getRequest(name, params);
  53. setProfileRequest(modelReq);
  54. }, [name, id, fields, expand, extraParams]);
  55. return React.useMemo(() => {
  56. let modelTmp = null;
  57. if (model && model.resultado && model.resultado.length > 0) {
  58. modelTmp = model.resultado[0];
  59. if (model.detalle) modelTmp.detalleExtra = model.detalle;
  60. }
  61. let finalError = {};
  62. if (modelError) finalError = { ...modelError };
  63. if (postResultError) finalError = { ...postResultError };
  64. return {
  65. model: modelTmp,
  66. modelLoading,
  67. modelError: finalError,
  68. refreshModel,
  69. updateModel,
  70. updateModelResult: postResult,
  71. updateModelLoading: postResultLoading,
  72. };
  73. }, [
  74. model,
  75. modelLoading,
  76. modelError,
  77. refreshModel,
  78. postResult,
  79. postResultLoading,
  80. postResultError,
  81. updateModel,
  82. ]);
  83. }