diff --git a/packages/ra-core/src/dataProvider/useCreate.spec.tsx b/packages/ra-core/src/dataProvider/useCreate.spec.tsx index 98c479fc2c6..38a7af34f38 100644 --- a/packages/ra-core/src/dataProvider/useCreate.spec.tsx +++ b/packages/ra-core/src/dataProvider/useCreate.spec.tsx @@ -36,7 +36,7 @@ import { describe('useCreate', () => { it('returns a callback that can be used with create arguments', async () => { const dataProvider = testDataProvider({ - create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)), + create: jest.fn(() => Promise.resolve({ data: { id: 0 } } as any)), }); let localCreate; const Dummy = () => { @@ -60,7 +60,7 @@ describe('useCreate', () => { it('returns a callback that can be used with no arguments', async () => { const dataProvider = testDataProvider({ - create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)), + create: jest.fn(() => Promise.resolve({ data: { id: 0 } } as any)), }); let localCreate; const Dummy = () => { @@ -84,7 +84,7 @@ describe('useCreate', () => { it('uses a custom mutationFn with mutation middlewares', async () => { const dataProvider = testDataProvider({ - create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)), + create: jest.fn(() => Promise.resolve({ data: { id: 0 } } as any)), }); const customMutationFn = jest.fn(async params => ({ id: 1, @@ -179,7 +179,7 @@ describe('useCreate', () => { it('uses call time params over hook time params', async () => { const dataProvider = testDataProvider({ - create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)), + create: jest.fn(() => Promise.resolve({ data: { id: 0 } } as any)), }); let localCreate; const Dummy = () => { @@ -203,7 +203,7 @@ describe('useCreate', () => { it('calls onSettled when provided in hook time options', async () => { const dataProvider = testDataProvider({ - create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)), + create: jest.fn(() => Promise.resolve({ data: { id: 0 } } as any)), }); let localCreate; const onSettled = jest.fn(); @@ -230,7 +230,7 @@ describe('useCreate', () => { it('accepts a meta parameter', async () => { const dataProvider = testDataProvider({ - create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)), + create: jest.fn(() => Promise.resolve({ data: { id: 0 } } as any)), }); let localCreate; const Dummy = () => { @@ -260,7 +260,7 @@ describe('useCreate', () => { }); const dataProvider = testDataProvider({ - create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)), + create: jest.fn(() => Promise.resolve({ data: { id: 0 } } as any)), }); let localCreate; const Dummy = () => { @@ -300,7 +300,7 @@ describe('useCreate', () => { } const dataProvider = testDataProvider({ create: jest.fn(() => - Promise.resolve({ data: { id: 1, sku: 'abc' } } as any) + Promise.resolve({ data: { id: 0, sku: 'abc' } } as any) ), }); let localCreate; diff --git a/packages/ra-core/src/dataProvider/useCreate.stories.tsx b/packages/ra-core/src/dataProvider/useCreate.stories.tsx index 0cdd400be56..b87aeaa5487 100644 --- a/packages/ra-core/src/dataProvider/useCreate.stories.tsx +++ b/packages/ra-core/src/dataProvider/useCreate.stories.tsx @@ -451,3 +451,67 @@ InvalidateList.argTypes = { options: ['pessimistic', 'optimistic', 'undoable'], }, }; + +export const CreateIdZero = ({ + mutationMode, +}: { + mutationMode: MutationModeType; +}) => { + const dataProvider = fakeRestDataProvider( + { + posts: [], + }, + process.env.NODE_ENV !== 'test', + process.env.NODE_ENV === 'test' ? 10 : 1000 + ); + + return ( + + + +
+ {mutationMode !== 'pessimistic' && ( + + )} + + + + + } + list={ + Loading...

}> + ( +
+ {record.id}: {record.title} +
+ )} + /> + +
+ } + /> +
+
+ ); +}; +CreateIdZero.args = { + mutationMode: 'undoable', +}; +CreateIdZero.argTypes = { + mutationMode: { + control: { + type: 'select', + }, + options: ['pessimistic', 'optimistic', 'undoable'], + }, +}; diff --git a/packages/ra-core/src/dataProvider/useCreate.ts b/packages/ra-core/src/dataProvider/useCreate.ts index 8cbae2f314a..fdf806abcff 100644 --- a/packages/ra-core/src/dataProvider/useCreate.ts +++ b/packages/ra-core/src/dataProvider/useCreate.ts @@ -146,7 +146,7 @@ export const useCreate = < mutationMode === 'pessimistic' ? result?.id : params.data?.id; - if (!id) { + if (id === undefined || id === null) { throw new Error( 'Invalid dataProvider response for create: missing id' );