From 9f7960ab9163d20c7cc9a23e2b9af34b324b2ec4 Mon Sep 17 00:00:00 2001 From: Adrian Humphreys Date: Wed, 18 Jan 2023 11:00:17 +1300 Subject: [PATCH 1/3] Add ability to resolve/reject and hide --- src/index.tsx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/index.tsx b/src/index.tsx index 59cdc9e..09517ed 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -79,6 +79,16 @@ export interface NiceModalHandler> extends NiceM * Resolve the promise returned by {@link NiceModalHandler.hide | hide} method. */ resolveHide: (args?: unknown) => void; + + /** + * Runs {@link NiceModalHandler.resolve} followed by {@link NiceModalHandler.hide} + */ + resolveAndHide: (args?: unknown) => void; + + /** + * Runs {@link NiceModalHandler.reject} followed by {@link NiceModalHandler.hide} + */ + rejectAndHide: (args?: unknown) => void; } // Omit will not work if extends Record, which is not needed here @@ -339,6 +349,20 @@ export function useModal(modal?: any, args?: any): any { }, [mid], ); + const resolveAndHide = useCallback( + (args?: unknown) => { + resolveCallback(args); + hideCallback(); + }, + [resolveCallback, hideCallback], + ); + const rejectAndHide = useCallback( + (args?: unknown) => { + rejectCallback(args); + hideCallback(); + }, + [resolveCallback, hideCallback], + ); return { id: mid, @@ -351,6 +375,8 @@ export function useModal(modal?: any, args?: any): any { resolve: resolveCallback, reject: rejectCallback, resolveHide, + resolveAndHide, + rejectAndHide, }; } export const create =

(Comp: React.ComponentType

): React.FC

=> { From 70fa54b46a684c20fbec079a43cfbcf18e2f838d Mon Sep 17 00:00:00 2001 From: Adrian Humphreys Date: Wed, 18 Jan 2023 11:09:01 +1300 Subject: [PATCH 2/3] Update useCallback deps --- src/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.tsx b/src/index.tsx index 09517ed..8aa5039 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -361,7 +361,7 @@ export function useModal(modal?: any, args?: any): any { rejectCallback(args); hideCallback(); }, - [resolveCallback, hideCallback], + [rejectCallback, hideCallback], ); return { From af30e8fc28239eef8903d876214807f2703d1fac Mon Sep 17 00:00:00 2001 From: Adrian Humphreys Date: Tue, 7 Feb 2023 09:35:21 +1300 Subject: [PATCH 3/3] Add unit tests for rejectAndHide and resolveAndHide --- src/index.test.js | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/index.test.js b/src/index.test.js index 205920a..b70fd3f 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -1,5 +1,5 @@ import React, { useEffect, useRef } from 'react'; -import { render, screen, fireEvent, waitForElementToBeRemoved, act } from '@testing-library/react'; +import { render, screen, fireEvent, waitForElementToBeRemoved, act, waitFor } from '@testing-library/react'; import NiceModal, { useModal, Provider, @@ -146,6 +146,46 @@ const testUseModal = async (modal, props = {}) => { await waitForElementToBeRemoved(screen.queryByText('HocTestModal')); expect(rejected && rejected.message).toBe('sample error'); + + /** + * Resolve and hide + */ + let unresolvedValue; + + act(() => { + unresolvedValue = modal.show(); + }); + + modalTextElement = screen.queryByText("HocTestModal"); + expect(modalTextElement).toBeInTheDocument(); + + act(() => { + modal.resolveAndHide("example-value"); + }); + + await waitForElementToBeRemoved(screen.queryByText("HocTestModal")); + await waitFor(() => expect(unresolvedValue).resolves.toEqual('example-value')) + + /** + * Reject and hide + */ + let caughtValue; + + act(() => { + unresolvedValue = modal.show().catch((value) => { + caughtValue = value + }); + }); + + modalTextElement = screen.queryByText("HocTestModal"); + expect(modalTextElement).toBeInTheDocument(); + + act(() => { + modal.rejectAndHide("example-reject"); + }); + + await waitForElementToBeRemoved(screen.queryByText("HocTestModal")); + await waitFor(() => expect(caughtValue).toEqual('example-reject')) }; test('useModal by id of registered modal', async () => {