From 8751cd7e56632f314f4256ad45ed1b0b96761c20 Mon Sep 17 00:00:00 2001 From: flt3150sk Date: Sun, 21 Dec 2025 00:49:39 +0900 Subject: [PATCH] fix: clear upsert promise when ending externally (#71) --- react-call/src/createCallable/index.tsx | 7 ++++++- tests/src/upsert.test.tsx | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) 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() + }) })