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 () => { diff --git a/src/index.tsx b/src/index.tsx index 59cdc9e..8aa5039 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(); + }, + [rejectCallback, 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

=> {