Client: Added custom data provider
Similar to the simple REST provider, but supports any query parameters.
This commit is contained in:
@@ -15,7 +15,7 @@ import routerBindings, {
|
|||||||
NavigateToResource,
|
NavigateToResource,
|
||||||
UnsavedChangesNotifier,
|
UnsavedChangesNotifier,
|
||||||
} from "@refinedev/react-router-v6";
|
} from "@refinedev/react-router-v6";
|
||||||
import dataProvider from "@refinedev/simple-rest";
|
import dataProvider from "./components/dataProvider";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { BrowserRouter, Outlet, Route, Routes } from "react-router-dom";
|
import { BrowserRouter, Outlet, Route, Routes } from "react-router-dom";
|
||||||
import { Header } from "./components/header";
|
import { Header } from "./components/header";
|
||||||
|
|||||||
146
client/src/components/dataProvider.ts
Normal file
146
client/src/components/dataProvider.ts
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
import { AxiosInstance } from "axios";
|
||||||
|
import { stringify } from "query-string";
|
||||||
|
import { DataProvider } from "@refinedev/core";
|
||||||
|
import { axiosInstance } from "@refinedev/simple-rest";
|
||||||
|
|
||||||
|
type MethodTypes = "get" | "delete" | "head" | "options";
|
||||||
|
type MethodTypesWithBody = "post" | "put" | "patch";
|
||||||
|
|
||||||
|
const dataProvider = (
|
||||||
|
apiUrl: string,
|
||||||
|
httpClient: AxiosInstance = axiosInstance,
|
||||||
|
): Omit<
|
||||||
|
Required<DataProvider>,
|
||||||
|
"createMany" | "updateMany" | "deleteMany"
|
||||||
|
> => ({
|
||||||
|
getList: async ({ resource, meta }) => {
|
||||||
|
const url = `${apiUrl}/${resource}`;
|
||||||
|
|
||||||
|
const { headers: headersFromMeta, method, queryParams } = meta ?? {};
|
||||||
|
const requestMethod = (method as MethodTypes) ?? "get";
|
||||||
|
|
||||||
|
const { data } = await httpClient[requestMethod](
|
||||||
|
`${url}`,
|
||||||
|
{
|
||||||
|
headers: headersFromMeta,
|
||||||
|
params: queryParams,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
data,
|
||||||
|
total: data.length,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
getMany: async () => {
|
||||||
|
throw new Error("getMany not implemented");
|
||||||
|
},
|
||||||
|
|
||||||
|
create: async ({ resource, variables, meta }) => {
|
||||||
|
const url = `${apiUrl}/${resource}`;
|
||||||
|
|
||||||
|
const { headers, method } = meta ?? {};
|
||||||
|
const requestMethod = (method as MethodTypesWithBody) ?? "post";
|
||||||
|
|
||||||
|
const { data } = await httpClient[requestMethod](url, variables, {
|
||||||
|
headers,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
data,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
update: async ({ resource, id, variables, meta }) => {
|
||||||
|
const url = `${apiUrl}/${resource}/${id}`;
|
||||||
|
|
||||||
|
const { headers, method } = meta ?? {};
|
||||||
|
const requestMethod = (method as MethodTypesWithBody) ?? "patch";
|
||||||
|
|
||||||
|
const { data } = await httpClient[requestMethod](url, variables, {
|
||||||
|
headers,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
data,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
getOne: async ({ resource, id, meta }) => {
|
||||||
|
const url = `${apiUrl}/${resource}/${id}`;
|
||||||
|
|
||||||
|
const { headers, method } = meta ?? {};
|
||||||
|
const requestMethod = (method as MethodTypes) ?? "get";
|
||||||
|
|
||||||
|
const { data } = await httpClient[requestMethod](url, { headers });
|
||||||
|
|
||||||
|
return {
|
||||||
|
data,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteOne: async ({ resource, id, variables, meta }) => {
|
||||||
|
const url = `${apiUrl}/${resource}/${id}`;
|
||||||
|
|
||||||
|
const { headers, method } = meta ?? {};
|
||||||
|
const requestMethod = (method as MethodTypesWithBody) ?? "delete";
|
||||||
|
|
||||||
|
const { data } = await httpClient[requestMethod](url, {
|
||||||
|
data: variables,
|
||||||
|
headers,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
data,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
getApiUrl: () => {
|
||||||
|
return apiUrl;
|
||||||
|
},
|
||||||
|
|
||||||
|
custom: async ({
|
||||||
|
url,
|
||||||
|
method,
|
||||||
|
payload,
|
||||||
|
query,
|
||||||
|
headers,
|
||||||
|
}) => {
|
||||||
|
let requestUrl = `${url}?`;
|
||||||
|
|
||||||
|
if (query) {
|
||||||
|
requestUrl = `${requestUrl}&${stringify(query)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (headers) {
|
||||||
|
httpClient.defaults.headers = {
|
||||||
|
...httpClient.defaults.headers,
|
||||||
|
...headers,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let axiosResponse;
|
||||||
|
switch (method) {
|
||||||
|
case "put":
|
||||||
|
case "post":
|
||||||
|
case "patch":
|
||||||
|
axiosResponse = await httpClient[method](url, payload);
|
||||||
|
break;
|
||||||
|
case "delete":
|
||||||
|
axiosResponse = await httpClient.delete(url, {
|
||||||
|
data: payload,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
axiosResponse = await httpClient.get(requestUrl);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data } = axiosResponse;
|
||||||
|
|
||||||
|
return Promise.resolve({ data });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default dataProvider;
|
||||||
Reference in New Issue
Block a user