From f6dcf93e6b2bbcee9904112a839e72fb30366a1c Mon Sep 17 00:00:00 2001 From: alexandredev3 Date: Sun, 9 Oct 2022 12:55:04 +0000 Subject: [PATCH 1/3] add update toast type when toast promise resolves --- src/components/Toast.tsx | 1 + src/core/toast.ts | 17 ++++++++++++----- src/hooks/useToastContainer.ts | 8 ++++---- test/core/toast.test.tsx | 33 ++++++++++++++++++++++++++++++++- 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/components/Toast.tsx b/src/components/Toast.tsx index 691f175b..6a689203 100644 --- a/src/components/Toast.tsx +++ b/src/components/Toast.tsx @@ -83,6 +83,7 @@ export const Toast: React.FC = props => { {...eventHandlers} style={style} ref={toastRef} + data-testid={type} >
}) ); +interface ToastPromiseUpdateOptions + extends Omit, 'type'> { + type?: TypeOptions | ((data: T) => TypeOptions); +} + export interface ToastPromiseParams { - pending?: string | UpdateOptions; - success?: string | UpdateOptions; - error?: string | UpdateOptions; + pending?: string | ToastPromiseUpdateOptions; + success?: string | ToastPromiseUpdateOptions; + error?: string | ToastPromiseUpdateOptions; } function handlePromise( @@ -132,7 +137,7 @@ function handlePromise( const resolver = ( type: TypeOptions, - input: string | UpdateOptions | undefined, + input: string | ToastPromiseUpdateOptions | undefined, result: T ) => { // Remove the toast if the input has not been provided. This prevents the toast from hanging @@ -148,7 +153,9 @@ function handlePromise( ...options, data: result }; - const params = isStr(input) ? { render: input } : input; + const params = isStr(input) + ? { render: input } + : { ...input, type: isFn(input.type) ? input.type(result) : input.type }; // if the id is set we know that it's an update if (id) { diff --git a/src/hooks/useToastContainer.ts b/src/hooks/useToastContainer.ts index 580b03a7..c085b1c9 100644 --- a/src/hooks/useToastContainer.ts +++ b/src/hooks/useToastContainer.ts @@ -76,10 +76,10 @@ export function useToastContainer(props: ToastContainerProps) { .on(Event.ClearWaitingQueue, clearWaitingQueue) .emit(Event.DidMount, instance); - return () => { - toastToRender.clear(); - eventManager.emit(Event.WillUnmount, instance); - }; + return () => { + toastToRender.clear(); + eventManager.emit(Event.WillUnmount, instance); + }; }, []); useEffect(() => { diff --git a/test/core/toast.test.tsx b/test/core/toast.test.tsx index 6f0ab0aa..e39ca89d 100644 --- a/test/core/toast.test.tsx +++ b/test/core/toast.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { render, act, screen } from '@testing-library/react'; +import { render, act, screen, waitFor } from '@testing-library/react'; import { triggerAnimationEnd } from '../helpers'; import { eventManager, toast, Event } from '../../src/core'; @@ -478,4 +478,35 @@ describe('toastify', () => { expect(screen.queryByText('hello')).toBe(null); }); + + it('should update the toast type when the promise resolves', async () => { + render(); + + const promiseResolved = jest.fn(() => Promise.resolve()); + const promiseRejected = jest.fn(() => Promise.reject()); + + act(() => { + toast.promise(promiseResolved, { + success: { + render: 'success', + type: () => 'error' + }, + error: { + render: 'error', + } + }); + toast.promise(promiseRejected, { + success: 'success', + error: { + render: 'error', + type: () => 'success' + } + }); + }); + + await waitFor(() => { + expect(screen.getByTestId('error')).not.toBe(null); + expect(screen.getByTestId('success')).not.toBe(null); + }); + }); }); From 76689b6814866829bc28a8d551d6a0695cfa9199 Mon Sep 17 00:00:00 2001 From: alexandredev3 Date: Sun, 9 Oct 2022 13:29:59 +0000 Subject: [PATCH 2/3] fix toast.promise update the toast type test --- test/core/toast.test.tsx | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/test/core/toast.test.tsx b/test/core/toast.test.tsx index e39ca89d..b12dca08 100644 --- a/test/core/toast.test.tsx +++ b/test/core/toast.test.tsx @@ -482,11 +482,10 @@ describe('toastify', () => { it('should update the toast type when the promise resolves', async () => { render(); - const promiseResolved = jest.fn(() => Promise.resolve()); - const promiseRejected = jest.fn(() => Promise.reject()); + const promise = jest.fn(() => Promise.resolve()); act(() => { - toast.promise(promiseResolved, { + toast.promise(promise, { success: { render: 'success', type: () => 'error' @@ -495,18 +494,10 @@ describe('toastify', () => { render: 'error', } }); - toast.promise(promiseRejected, { - success: 'success', - error: { - render: 'error', - type: () => 'success' - } - }); }); await waitFor(() => { expect(screen.getByTestId('error')).not.toBe(null); - expect(screen.getByTestId('success')).not.toBe(null); }); }); }); From c1a1fb0e428ad630bf49a3477712019db434337f Mon Sep 17 00:00:00 2001 From: alexandredev3 Date: Fri, 4 Nov 2022 18:27:25 +0000 Subject: [PATCH 3/3] update toast.promise test --- src/core/toast.ts | 4 ++-- test/core/toast.test.tsx | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/core/toast.ts b/src/core/toast.ts index 9f31d8ad..81eb82f5 100644 --- a/src/core/toast.ts +++ b/src/core/toast.ts @@ -106,7 +106,7 @@ toast.loading = ( interface ToastPromiseUpdateOptions extends Omit, 'type'> { - type?: TypeOptions | ((data: T) => TypeOptions); + type?: TypeOptions | ((props: { data: T }) => TypeOptions); } export interface ToastPromiseParams< @@ -164,7 +164,7 @@ function handlePromise( }; const params = isStr(input) ? { render: input } - : { ...input, type: isFn(input.type) ? input.type(result) : input.type }; + : { ...input, type: isFn(input.type) ? input.type({ data: result }) : input.type }; // if the id is set we know that it's an update if (id) { diff --git a/test/core/toast.test.tsx b/test/core/toast.test.tsx index b12dca08..34f2d9f2 100644 --- a/test/core/toast.test.tsx +++ b/test/core/toast.test.tsx @@ -482,13 +482,15 @@ describe('toastify', () => { it('should update the toast type when the promise resolves', async () => { render(); - const promise = jest.fn(() => Promise.resolve()); + const promise = jest.fn(() => Promise.resolve({ + ok: false + })); act(() => { toast.promise(promise, { success: { render: 'success', - type: () => 'error' + type: ({ data }) => !data.ok ? 'error' : 'success' }, error: { render: 'error',