diff --git a/react-call/src/createCallable/index.tsx b/react-call/src/createCallable/index.tsx index 82d784c..05f6ddd 100644 --- a/react-call/src/createCallable/index.tsx +++ b/react-call/src/createCallable/index.tsx @@ -97,7 +97,12 @@ export function createCallable( }, end: (...args: [Promise, Response] | [Response]) => { const targeted = args.length === 2 - return createEnd(targeted ? args[0] : null)(targeted ? args[1] : args[0]) + const promise = targeted ? args[0] : null + const response = targeted ? args[1] : args[0] + + if (!targeted || promise === $upsertPromise) $upsertPromise = null + + return createEnd(promise)(response) }, update: ( ...args: [Promise, Partial] | [Partial] diff --git a/tests/src/upsert.test.tsx b/tests/src/upsert.test.tsx index 8223be3..66f69b1 100644 --- a/tests/src/upsert.test.tsx +++ b/tests/src/upsert.test.tsx @@ -88,4 +88,26 @@ describe('upsert()', () => { .element(screen.getByRole('dialog', { name: 'Second' })) .toBeInTheDocument() }) + + test('creates new instance after previous one is ended externally', async () => { + const screen = render() + + Confirm.upsert({ message: 'First' }) + + await expect + .element(screen.getByRole('dialog', { name: 'First' })) + .toBeInTheDocument() + + Confirm.end(false) + + await expect + .element(screen.container.querySelector('[role="dialog"]')) + .not.toBeInTheDocument() + + Confirm.upsert({ message: 'Second' }) + + await expect + .element(screen.getByRole('dialog', { name: 'Second' })) + .toBeInTheDocument() + }) })