This commit is contained in:
2026-07-17 14:31:39 +05:30
parent 83ecdcb500
commit 6c720c390c
6 changed files with 134 additions and 8 deletions

View File

@@ -4,6 +4,7 @@ import DoneIcon from "@mui/icons-material/Done";
import type { ResourceConfig, ParsedListResponse, FieldConfig } from "../types";
import { useAppContext } from "./AppContext";
import { getApi } from "../hooks/useApi";
import { sanitizePayload } from "../utils/sanitize-payload";
import { StringField } from "../components/fields/renderers/StringField";
import { NumberField } from "../components/fields/renderers/NumberField";
import { DateField } from "../components/fields/renderers/DateField";
@@ -588,7 +589,7 @@ function buildFilterComponent(field: FieldConfig, resourceName: string): React.F
}
export function useResource(resourceName: string): UseResourceReturn {
const { resources } = useAppContext();
const { resources, schemas } = useAppContext();
const resource = resources.find((r) => r.name === resourceName);
const [state, setState] = useState<ResourceState>({ loading: false, error: null });
@@ -661,6 +662,18 @@ export function useResource(resourceName: string): UseResourceReturn {
[rPath, setLoading, setError]
);
const resolveFk = useCallback(async (resourceName: string, id: any) => {
const targetRes = resources.find((r) => r.name === resourceName);
if (!targetRes) return id;
try {
const api = getApi();
const res = await api.get(`${targetRes.path}/${id}`);
return res.data;
} catch {
return id;
}
}, [resources]);
const create = useCallback(
async (data: any): Promise<any> => {
if (!rPath) throw new Error(`Resource "${resourceName}" not found yet`);
@@ -668,7 +681,10 @@ export function useResource(resourceName: string): UseResourceReturn {
setError(null);
try {
const api = getApi();
const res = await api.post(rPath, data);
const sanitized = rFields && schemas
? await sanitizePayload(data, rFields, schemas, resolveFk)
: data;
const res = await api.post(rPath, sanitized);
return res.data;
} catch (e: any) {
setError(parseError(e));
@@ -677,7 +693,7 @@ export function useResource(resourceName: string): UseResourceReturn {
setLoading(false);
}
},
[rPath, setLoading, setError]
[rPath, rFields, schemas, resolveFk, setLoading, setError]
);
const update = useCallback(
@@ -687,8 +703,11 @@ export function useResource(resourceName: string): UseResourceReturn {
setError(null);
try {
const api = getApi();
const sanitized = rFields && schemas
? await sanitizePayload(data, rFields, schemas, resolveFk)
: data;
const method = rUpdateMethod ?? "put";
const res = await (method === "patch" ? api.patch : api.put)(`${rPath}/${id}`, data);
const res = await (method === "patch" ? api.patch : api.put)(`${rPath}/${id}`, sanitized);
return res.data;
} catch (e: any) {
setError(parseError(e));
@@ -697,7 +716,7 @@ export function useResource(resourceName: string): UseResourceReturn {
setLoading(false);
}
},
[rPath, rUpdateMethod, setLoading, setError]
[rPath, rFields, schemas, resolveFk, rUpdateMethod, setLoading, setError]
);
const remove = useCallback(