From 4542fd4d5f68d89a672e868143f039d8e4327665 Mon Sep 17 00:00:00 2001 From: Lete Date: Wed, 22 Jun 2022 08:07:49 +0000 Subject: [PATCH] feat(components): close all messages of the specified type --- .../__tests__/message-manager.test.tsx | 33 +++++++++++++++++++ packages/components/message/src/message.ts | 4 ++- packages/components/message/src/method.ts | 7 ++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/packages/components/message/__tests__/message-manager.test.tsx b/packages/components/message/__tests__/message-manager.test.tsx index 74b191e43ebc9..0b2ace44c184d 100644 --- a/packages/components/message/__tests__/message-manager.test.tsx +++ b/packages/components/message/__tests__/message-manager.test.tsx @@ -50,6 +50,39 @@ describe('Message on command', () => { expect(document.querySelectorAll(selector).length).toBe(0) }) + test('it should close all messages of the specified type', async () => { + const onClose = vi.fn() + const instances = [] + const success = 'success' + for (let i = 0; i < 4; i++) { + const instance = Message({ + type: success, + duration: 0, + onClose, + }) + instances.push(instance) + } + + for (let i = 0; i < 2; i++) { + const instance = Message({ + duration: 0, + onClose, + }) + instances.push(instance) + } + + await rAF() + const elements = document.querySelectorAll(selector) + const successElements = document.querySelectorAll(`${selector}--${success}`) + expect(elements.length).toBe(6) + expect(successElements.length).toBe(4) + Message.closeAll(success) + await rAF() + expect(onClose).toHaveBeenCalledTimes(4) + expect(document.querySelectorAll(selector).length).toBe(2) + Message.closeAll() + }) + test('it should stack messages', async () => { const messages = [Message(), Message(), Message()] await rAF() diff --git a/packages/components/message/src/message.ts b/packages/components/message/src/message.ts index 48f6c05893147..4534f38160930 100644 --- a/packages/components/message/src/message.ts +++ b/packages/components/message/src/message.ts @@ -11,6 +11,8 @@ import type MessageConstructor from './message.vue' export const messageTypes = ['success', 'info', 'warning', 'error'] as const +export type messageType = typeof messageTypes[number] + export interface MessageConfigContext { max?: number } @@ -127,7 +129,7 @@ export interface MessageHandler { export type MessageFn = { (options?: MessageParams, appContext?: null | AppContext): MessageHandler - closeAll(): void + closeAll(type?: messageType): void } export type MessageTypedFn = ( options?: MessageParamsWithType, diff --git a/packages/components/message/src/method.ts b/packages/components/message/src/method.ts index b53ae5c3124eb..f6972a1d7e367 100644 --- a/packages/components/message/src/method.ts +++ b/packages/components/message/src/method.ts @@ -24,6 +24,7 @@ import type { MessageOptions, MessageParams, MessageParamsNormalized, + messageType, } from './message' let seed = 1 @@ -168,9 +169,11 @@ messageTypes.forEach((type) => { } }) -export function closeAll(): void { +export function closeAll(type?: messageType): void { for (const instance of instances) { - instance.handler.close() + if (!type || type === instance.props.type) { + instance.handler.close() + } } }