Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/tricky-eggs-destroy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@refinedev/core": minor
---

Add generic type support to `useDataProvider` so custom data providers keep their assigned types when accessed through the hook.

This is a type-only improvement. Existing runtime behavior is unchanged, and consumers can opt into the stronger type by passing a generic argument when calling `useDataProvider`.
19 changes: 19 additions & 0 deletions packages/core/src/hooks/data/useDataProvider.spec.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
import { renderHook } from "@testing-library/react";

import { MockJSONServer, TestWrapper } from "@test";
import type { BaseKey, DataProvider, GetOneParams } from "@refinedev/core";

import { useDataProvider } from ".";

type CustomDataProvider = Omit<DataProvider, "getOne"> & {
getOne: (params: {
resource: string;
id: BaseKey;
meta?: { test?: string } & GetOneParams["meta"];
}) => ReturnType<DataProvider["getOne"]>;
};

describe("useDataProvider Hook", () => {
const { result } = renderHook(() => useDataProvider(), {
wrapper: TestWrapper({
Expand All @@ -25,6 +34,16 @@ describe("useDataProvider Hook", () => {
expect(dataProvider.getList).toBeDefined();
});

it("preserves custom provider types when generic is provided", async () => {
const dataProvider = result.current<CustomDataProvider>();

await dataProvider.getOne({
resource: "posts",
id: 1,
meta: { test: "typed" },
});
});

it("get list with from second data provider", async () => {
try {
result.current("not-exist");
Expand Down
11 changes: 7 additions & 4 deletions packages/core/src/hooks/data/useDataProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import { useCallback, useContext } from "react";

import { DataContext } from "@contexts/data";
import { type DataProvider, IDataContext } from "../../contexts/data/types";
export const useDataProvider = (): ((
import type { DataProvider } from "../../contexts/data/types";

export const useDataProvider = <
TDataProvider extends DataProvider = DataProvider,
>(): ((
/**
* The name of the `data provider` you want to access
*/
dataProviderName?: string,
) => DataProvider) => {
) => TDataProvider) => {
const context = useContext(DataContext);

const handleDataProvider = useCallback(
Expand Down Expand Up @@ -36,7 +39,7 @@ export const useDataProvider = (): ((
);
},
[context],
);
) as (dataProviderName?: string) => TDataProvider;

return handleDataProvider;
};