fixes
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user