diff --git a/packages/react/src/hooks/useIonModal.ts b/packages/react/src/hooks/useIonModal.ts index f9f94002fb..50a7deec3d 100644 --- a/packages/react/src/hooks/useIonModal.ts +++ b/packages/react/src/hooks/useIonModal.ts @@ -40,5 +40,5 @@ export type UseIonModalResult = [ /** * Dismisses the modal */ - () => void + (data?: any, role?: string) => void ]; diff --git a/packages/react/src/hooks/useOverlay.ts b/packages/react/src/hooks/useOverlay.ts index f1afcf3831..cfb771727c 100644 --- a/packages/react/src/hooks/useOverlay.ts +++ b/packages/react/src/hooks/useOverlay.ts @@ -81,8 +81,8 @@ export function useOverlay( } }, []); - const dismiss = useCallback(async () => { - overlayRef.current && (await overlayRef.current.dismiss()); + const dismiss = useCallback(async (data?: any, role?: string) => { + overlayRef.current && (await overlayRef.current.dismiss(data, role)); overlayRef.current = undefined; containerElRef.current = undefined; }, []); diff --git a/packages/react/test-app/cypress/integration/overlay-hooks/useIonModal.spec.ts b/packages/react/test-app/cypress/integration/overlay-hooks/useIonModal.spec.ts index 74f89e5675..64e904061c 100644 --- a/packages/react/test-app/cypress/integration/overlay-hooks/useIonModal.spec.ts +++ b/packages/react/test-app/cypress/integration/overlay-hooks/useIonModal.spec.ts @@ -48,6 +48,18 @@ describe('useIonModal', () => { cy.get('ion-modal').should('not.exist'); }); + it('display modal and dismiss with data and role', () => { + //show modal + cy.get('ion-button').contains('Show Modal using component param').click(); + + //close modal + cy.get('ion-button').contains('Close').click(); + cy.get('ion-modal').should('not.exist'); + + //verify role and data on main page was updated + cy.contains('Dismissed with role: close'); + cy.contains('Data: {"test":true}'); + }); // This test should pass in v6, skipping until merged with v6 it.skip('display modal with context', () => { diff --git a/packages/react/test-app/src/pages/overlay-hooks/ModalHook.tsx b/packages/react/test-app/src/pages/overlay-hooks/ModalHook.tsx index 0b6a90aff7..72af405154 100644 --- a/packages/react/test-app/src/pages/overlay-hooks/ModalHook.tsx +++ b/packages/react/test-app/src/pages/overlay-hooks/ModalHook.tsx @@ -13,7 +13,7 @@ import { useContext } from 'react'; const Body: React.FC<{ type: string; count: number; - onDismiss: () => void; + onDismiss: (data?: any, role?: string) => void; onIncrement: () => void; }> = ({ count, onDismiss, onIncrement, type }) => ( @@ -27,7 +27,7 @@ const Body: React.FC<{ onIncrement()}> Increment Count - onDismiss()}> + onDismiss({ test: true }, 'close')}> Close @@ -42,13 +42,16 @@ const ModalWithContext: React.FC = () => { const ModalHook: React.FC = () => { const [count, setCount] = useState(0); + const [dismissedRole, setDismissedRole] = useState(); + const [dismissedData, setDismissedData] = useState(); + const handleIncrement = useCallback(() => { setCount(count + 1); }, [count, setCount]); - const handleDismissWithComponent = useCallback(() => { - dismissWithComponent(); - // eslint-disable-next-line react-hooks/exhaustive-deps + const handleDismissWithComponent = useCallback((data, role) => { + dismissWithComponent(data, role); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleDismissWithElement = useCallback(() => { @@ -89,6 +92,11 @@ const ModalHook: React.FC = () => { onClick={() => { presentWithComponent({ cssClass: 'my-class', + onDidDismiss: (ev) => { + const { data, role } = ev.detail; + setDismissedData(data); + setDismissedRole(role); + }, }); }} > @@ -127,6 +135,8 @@ const ModalHook: React.FC = () => {
Count: {count}
+
Dismissed with role: {dismissedRole}
+
Data: {dismissedData && JSON.stringify(dismissedData)}