123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import React from "react";
- import { useNavigate } from "react-router-dom";
- import { emptyRequest, getRequest, postRequest } from "../constants/requests";
- import { useHttp } from "./useHttp";
- const empty = emptyRequest();
- export function useModel({
- name,
- id,
- fields = null,
- expand = null,
- extraParams = null,
- redirectOnPost = false,
- path = "guardar",
- }) {
- const [modelRequest, setProfileRequest] = React.useState(empty);
- const [model, modelLoading, modelError, refreshModel] = useHttp(modelRequest);
- const [updateRequest, setUpdateRequest] = React.useState(empty);
- const [postResult, postResultLoading, postResultError] =
- useHttp(updateRequest);
- const navigate = useNavigate();
- const updateModel = React.useCallback(
- (newModel, alert = true) => {
- if (!postResultLoading) {
- if (newModel.id) {
- newModel = { id: newModel.id };
- delete newModel.id;
- }
- const updateReq = postRequest(`${name}/${path}`, newModel);
- updateReq.alert = alert;
- setUpdateRequest(updateReq);
- }
- },
- [name, postResultLoading, path]
- );
- React.useEffect(() => {
- let mounted = true;
- if (mounted && postResult && redirectOnPost && !postResultError) {
- const { pathname } = navigate.location; // todo revisar esto
- const redirectTo = pathname.split("/").filter((e) => e !== "");
- navigate.push("/" + redirectTo[0]);
- }
- return () => {
- mounted = false;
- };
- }, [postResult, redirectOnPost, postResultError, navigate]);
- React.useEffect(() => {
- if (!name || !id) return;
- let params = { id: id };
- if (fields) params = { ...params, fields };
- if (expand) params = { ...params, expand };
- if (extraParams) params = { ...params, ...extraParams };
- const modelReq = getRequest(name, params);
- setProfileRequest(modelReq);
- }, [name, id, fields, expand, extraParams]);
- return React.useMemo(() => {
- let modelTmp = null;
- if (model && model.resultado && model.resultado.length > 0) {
- modelTmp = model.resultado[0];
- if (model.detalle) modelTmp.detalleExtra = model.detalle;
- }
- let finalError = {};
- if (modelError) finalError = { ...modelError };
- if (postResultError) finalError = { ...postResultError };
- return {
- model: modelTmp,
- modelLoading,
- modelError: finalError,
- refreshModel,
- updateModel,
- updateModelResult: postResult,
- updateModelLoading: postResultLoading,
- };
- }, [
- model,
- modelLoading,
- modelError,
- refreshModel,
- postResult,
- postResultLoading,
- postResultError,
- updateModel,
- ]);
- }
|