From 46df6bd251ede9cb7530e9b08d0d20e5590cd740 Mon Sep 17 00:00:00 2001 From: guilhermer Date: Mon, 20 Nov 2023 12:29:50 +0100 Subject: [PATCH] fix: removed property --- .../availableBrands.disabled.clientScripts.js | 4 -- .../component/availableBrands.test.js | 11 +--- packages/lib/src/components/BaseElement.ts | 2 - packages/lib/src/components/Card/Card.tsx | 4 +- .../components/CardInput/CardInput.test.tsx | 20 +------ .../CardInput/components/CardFields.tsx | 3 +- .../components/CardFieldsWrapper.tsx | 2 - .../components/CardInput/components/types.ts | 1 - .../Card/components/CardInput/defaultProps.ts | 1 - .../Card/components/CardInput/types.ts | 1 - .../Card/components/CardInput/utils.ts | 1 - packages/lib/src/components/Card/types.ts | 6 -- .../PaymentMethodBrands/CompactView.test.tsx | 36 ------------ .../PaymentMethodBrands/CompactView.tsx | 35 ----------- .../PaymentMethodBrands.test.tsx | 58 ++++++++++++------- .../PaymentMethodBrands.tsx | 43 ++++++-------- .../PaymentMethod/PaymentMethodItem.test.tsx | 1 - .../PaymentMethod/PaymentMethodItem.tsx | 19 +----- .../PaymentMethod/PaymentMethodList.test.tsx | 12 +--- .../lib/src/components/EventEmitter.test.ts | 25 -------- packages/lib/src/components/EventEmitter.ts | 27 --------- 21 files changed, 67 insertions(+), 245 deletions(-) delete mode 100644 packages/e2e/tests/cards/availableBrands/component/availableBrands.disabled.clientScripts.js delete mode 100644 packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/CompactView.test.tsx delete mode 100644 packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/CompactView.tsx delete mode 100644 packages/lib/src/components/EventEmitter.test.ts delete mode 100644 packages/lib/src/components/EventEmitter.ts diff --git a/packages/e2e/tests/cards/availableBrands/component/availableBrands.disabled.clientScripts.js b/packages/e2e/tests/cards/availableBrands/component/availableBrands.disabled.clientScripts.js deleted file mode 100644 index 5dabc8d2de..0000000000 --- a/packages/e2e/tests/cards/availableBrands/component/availableBrands.disabled.clientScripts.js +++ /dev/null @@ -1,4 +0,0 @@ -window.cardConfig = { - brands: ['visa', 'mc', 'amex', 'discover', 'cup', 'maestro', 'bijcard', 'diners', 'jcb', 'synchrony_cbcc'], - showBrandsUnderCardNumber: false -}; diff --git a/packages/e2e/tests/cards/availableBrands/component/availableBrands.test.js b/packages/e2e/tests/cards/availableBrands/component/availableBrands.test.js index 86f379c135..e70f2cc754 100644 --- a/packages/e2e/tests/cards/availableBrands/component/availableBrands.test.js +++ b/packages/e2e/tests/cards/availableBrands/component/availableBrands.test.js @@ -8,24 +8,17 @@ fixture`Cards - Available brands on Card Component`.page(CARDS_URL).beforeEach(a cardComponent = new CardComponent('.card-field'); }); -test('#1 Available brands dont show underneath Card Number field if property `showBrandsUnderCardNumber` is set to false', async t => { - // Wait for field to appear in DOM - await cardComponent.numHolder(); - const brandsInsidePaymentMethod = Selector('.adyen-checkout__card__brands'); - await t.expect(brandsInsidePaymentMethod.find('img').count).eql(0); -}).clientScripts('./availableBrands.disabled.clientScripts.js'); - /** * NOTE: this test ALWAYS fails if other test files are run i.e. only if this fixture is run in isolation does this test pass * So it is a false negative from TestCafe. */ -test('#2 Available brands show underneath Card Number field by default', async t => { +test('#1 Available brands show underneath Card Number field by default', async t => { await cardComponent.numHolder(); const brandsInsidePaymentMethod = Selector('.adyen-checkout__card__brands'); await t.expect(brandsInsidePaymentMethod.find('img').count).eql(10); }).clientScripts('./availableBrands.clientScripts.js'); -test('#3 Available brands show underneath Card Number field but with excluded brands missing', async t => { +test('#2 Available brands show underneath Card Number field but with excluded brands missing', async t => { await cardComponent.numHolder(); const brandsInsidePaymentMethod = Selector('.adyen-checkout__card__brands'); await t.expect(brandsInsidePaymentMethod.find('img').count).eql(7); diff --git a/packages/lib/src/components/BaseElement.ts b/packages/lib/src/components/BaseElement.ts index b7557e90aa..60bd2ebde5 100644 --- a/packages/lib/src/components/BaseElement.ts +++ b/packages/lib/src/components/BaseElement.ts @@ -1,6 +1,5 @@ import { ComponentChild, render } from 'preact'; import getProp from '../utils/getProp'; -import EventEmitter from './EventEmitter'; import uuid from '../utils/uuid'; import { BaseElementProps, IBaseElement, PaymentData } from './types'; import AdyenCheckoutError from '../core/Errors/AdyenCheckoutError'; @@ -12,7 +11,6 @@ class BaseElement

implements IBaseElement { public props: P; public state: any = {}; public _component; - public eventEmitter = new EventEmitter(); protected _node: HTMLElement = null; protected readonly core: ICore; diff --git a/packages/lib/src/components/Card/Card.tsx b/packages/lib/src/components/Card/Card.tsx index 6dea822b5e..c4e5e2b4f0 100644 --- a/packages/lib/src/components/Card/Card.tsx +++ b/packages/lib/src/components/Card/Card.tsx @@ -37,7 +37,6 @@ export class CardElement extends UIElement { protected static defaultProps = { onBinLookup: () => {}, - showBrandsUnderCardNumber: true, showFormInstruction: true, _disableClickToPay: false }; @@ -133,8 +132,7 @@ export class CardElement extends UIElement { } public onBrand = event => { - this.eventEmitter.emit('brand', { ...event, brand: event.brand === 'card' ? null : event.brand }); - if (this.props.onBrand) this.props.onBrand(event); + this.props.onBrand?.(event); }; processBinLookupResponse(binLookupResponse: BinLookupResponse, isReset = false) { diff --git a/packages/lib/src/components/Card/components/CardInput/CardInput.test.tsx b/packages/lib/src/components/Card/components/CardInput/CardInput.test.tsx index 3fb6a24d5d..874524d11b 100644 --- a/packages/lib/src/components/Card/components/CardInput/CardInput.test.tsx +++ b/packages/lib/src/components/Card/components/CardInput/CardInput.test.tsx @@ -27,8 +27,7 @@ const cardInputRequiredProps = { clientKey: 'xxxx', loadingContext: 'test', resources: global.resources, - brandsIcons: [], - showBrandsUnderCardNumber: true + brandsIcons: [] }; const getWrapper = ui => { @@ -54,22 +53,7 @@ describe('CardInput', () => { }); describe('CardInput - Brands beneath Card Number field', () => { - test('should not render brands if property `showBrandsUnderCardNumber` is set to false', () => { - const wrapper = getWrapper(); - expect(wrapper.find('span.adyen-checkout__card__brands').exists()).toBeFalsy(); - }); - - test('should render brands if property `showBrandsUnderCardNumber` is set', () => { - const brandsIcons = [ - { name: 'visa', icon: 'visa.png' }, - { name: 'mc', icon: 'mc.png' } - ]; - const wrapper = getWrapper(); - expect(wrapper.find('.adyen-checkout__card__brands__brand-wrapper')).toHaveLength(2); - expect(wrapper.find('.adyen-checkout__card__brands__brand-wrapper--disabled')).toHaveLength(0); - }); - - test('should render brands if property `showBrandsUnderCardNumber` is not set', () => { + test('should render brands under Card number field', () => { const brandsIcons = [ { name: 'visa', icon: 'visa.png' }, { name: 'mc', icon: 'mc.png' } diff --git a/packages/lib/src/components/Card/components/CardInput/components/CardFields.tsx b/packages/lib/src/components/Card/components/CardInput/components/CardFields.tsx index ec418b5a0c..c80a6648ea 100644 --- a/packages/lib/src/components/Card/components/CardInput/components/CardFields.tsx +++ b/packages/lib/src/components/Card/components/CardInput/components/CardFields.tsx @@ -28,7 +28,6 @@ export default function CardFields({ expiryDatePolicy, onFocusField, showBrandIcon, - showBrandsUnderCardNumber, valid, showContextualElement }: CardFieldsProps) { @@ -62,7 +61,7 @@ export default function CardFields({ dualBrandingSelected={dualBrandingSelected} /> - {showBrandsUnderCardNumber && } +

CardNumber showBrandIcon, - showBrandsUnderCardNumber, showContextualElement, // iOSFocusedField, @@ -86,7 +85,6 @@ export const CardFieldsWrapper = ({ void; - showBrandsUnderCardNumber: boolean; showBrandIcon?: boolean; showFormInstruction?: boolean; showInstallmentAmounts?: boolean; diff --git a/packages/lib/src/components/Card/components/CardInput/utils.ts b/packages/lib/src/components/Card/components/CardInput/utils.ts index b1ba3e070e..16c48ccb71 100644 --- a/packages/lib/src/components/Card/components/CardInput/utils.ts +++ b/packages/lib/src/components/Card/components/CardInput/utils.ts @@ -125,7 +125,6 @@ export const extractPropsForCardFields = (props: CardInputProps) => { positionHolderNameOnTop: props.positionHolderNameOnTop, // Extract props for CardFields > CardNumber showBrandIcon: props.showBrandIcon, - showBrandsUnderCardNumber: props.showBrandsUnderCardNumber, showContextualElement: props.showContextualElement, // Extract props for StoredCardFields lastFour: props.lastFour, diff --git a/packages/lib/src/components/Card/types.ts b/packages/lib/src/components/Card/types.ts index 582e8f4ac9..6664757fbb 100644 --- a/packages/lib/src/components/Card/types.ts +++ b/packages/lib/src/components/Card/types.ts @@ -56,12 +56,6 @@ export interface CardElementProps extends UIElementProps { /** List of brands accepted by the component */ brands?: string[]; - /** - * Show/hide available card brands under the Card number field - * @defaultValue `false` - */ - showBrandsUnderCardNumber?: boolean; - /** * Position holder name above card number field (instead of having it after the security code field) * @defaultValue `false` diff --git a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/CompactView.test.tsx b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/CompactView.test.tsx deleted file mode 100644 index 5fd32cfc4e..0000000000 --- a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/CompactView.test.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { h } from 'preact'; -import { mount } from 'enzyme'; -import CompactView from './CompactView'; -import PaymentMethodIcon from '../PaymentMethodIcon'; - -const brands = [ - { name: 'visa', icon: 'visa.png' }, - { name: 'mc', icon: 'mc.png' }, - { name: 'amex', icon: 'amex.png' }, - { name: 'discovery', icon: 'discovery.png' }, - { name: 'vpay', icon: 'vpay.png' }, - { name: 'maestro', icon: 'maestro.png' } -]; - -describe('CompactView', () => { - test('should render the 4 brands', () => { - const wrapper = mount(); - expect(wrapper.find(PaymentMethodIcon)).toHaveLength(4); - }); - - test('should render the 3 brands and +2 label', () => { - const wrapper = mount(); - expect(wrapper.find(PaymentMethodIcon)).toHaveLength(3); - expect(wrapper.find('.adyen-checkout__payment-method__brand-number').text()).toBe('+2'); - }); - - test('should render 3 brands and +3 label', () => { - const wrapper = mount(); - expect(wrapper.find(PaymentMethodIcon)).toHaveLength(3); - expect(wrapper.find('.adyen-checkout__payment-method__brand-number').text()).toBe('+3'); - }); - test('should not render if payment method is selected', () => { - const wrapper = mount(); - expect(wrapper.find('.adyen-checkout__payment-method__brand-number').length).toBe(0); - }); -}); diff --git a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/CompactView.tsx b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/CompactView.tsx deleted file mode 100644 index 3661bad1c8..0000000000 --- a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/CompactView.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { h } from 'preact'; -import PaymentMethodIcon from '../PaymentMethodIcon'; -import { BrandConfiguration } from '../../../../Card/types'; -import { getFullBrandName } from '../../../../Card/components/CardInput/utils'; - -interface CompactViewProps { - allowedBrands: Array; // A set of brands filtered to exclude those that can never appear in the UI - isPaymentMethodSelected: boolean; -} - -const prepareVisibleBrands = (allowedBrands: Array) => { - const visibleBrands = allowedBrands.length <= 4 ? allowedBrands : allowedBrands.slice(0, 3); - return { - visibleBrands, - leftBrandsAmount: allowedBrands.length - visibleBrands.length - }; -}; - -const CompactView = ({ allowedBrands, isPaymentMethodSelected }: CompactViewProps) => { - if (isPaymentMethodSelected) { - return null; - } - - const { visibleBrands, leftBrandsAmount } = prepareVisibleBrands(allowedBrands); - return ( - - {visibleBrands.map(brand => ( - - ))} - {leftBrandsAmount !== 0 && +{leftBrandsAmount}} - - ); -}; - -export default CompactView; diff --git a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/PaymentMethodBrands.test.tsx b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/PaymentMethodBrands.test.tsx index 6318d964eb..9c1a57d677 100644 --- a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/PaymentMethodBrands.test.tsx +++ b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/PaymentMethodBrands.test.tsx @@ -1,31 +1,47 @@ import { h } from 'preact'; -import { mount } from 'enzyme'; +import { render, screen } from '@testing-library/preact'; import PaymentMethodBrands from './PaymentMethodBrands'; -import CompactView from './CompactView'; -import PaymentMethodIcon from '../PaymentMethodIcon'; - -const brands = [ - { name: 'visa', icon: 'visa.png' }, - { name: 'mc', icon: 'mc.png' }, - { name: 'amex', icon: 'amex.png' }, - { name: 'discovery', icon: 'discovery.png' }, - { name: 'vpay', icon: 'vpay.png' }, - { name: 'maestro', icon: 'maestro.png' } -]; describe('PaymentMethodBrands', () => { - test('should render compact view if prop is set', () => { - const wrapper = mount(); - expect(wrapper.find(CompactView)).toHaveLength(1); + test('should not render anything if payment method is selected', () => { + const brands = [{ name: 'visa', icon: 'visa.png' }]; + const { container } = render(); + + expect(container).toBeEmptyDOMElement(); }); - test('should render compact view if prop is not', () => { - const wrapper = mount(); - expect(wrapper.find(CompactView)).toHaveLength(1); + test('should render three brands', () => { + const brands = [ + { name: 'visa', icon: 'visa.png' }, + { name: 'mc', icon: 'mc.png' }, + { name: 'amex', icon: 'amex.png' } + ]; + + render(); + + screen.getByAltText('VISA'); + screen.getByAltText('MasterCard'); + screen.getByAltText('American Express'); + + expect(screen.queryByText(/\+/)).toBeNull(); }); - test('should not render compact view if prop is set to false', () => { - const wrapper = mount(); - expect(wrapper.find(PaymentMethodIcon)).toHaveLength(6); + test('should render three brands AND number of left over brands', () => { + const brands = [ + { name: 'visa', icon: 'visa.png' }, + { name: 'mc', icon: 'mc.png' }, + { name: 'amex', icon: 'amex.png' }, + { name: 'discovery', icon: 'discovery.png' }, + { name: 'vpay', icon: 'vpay.png' }, + { name: 'maestro', icon: 'maestro.png' } + ]; + + render(); + + screen.getByAltText('VISA'); + screen.getByAltText('MasterCard'); + screen.getByAltText('American Express'); + + screen.getByText('+3'); }); }); diff --git a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/PaymentMethodBrands.tsx b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/PaymentMethodBrands.tsx index bde7244a87..6bf1454144 100644 --- a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/PaymentMethodBrands.tsx +++ b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodBrands/PaymentMethodBrands.tsx @@ -1,41 +1,36 @@ import { h } from 'preact'; -import PaymentMethodIcon from '../PaymentMethodIcon'; import { BrandConfiguration } from '../../../../Card/types'; -import CompactView from './CompactView'; +import PaymentMethodIcon from '../PaymentMethodIcon'; import { getFullBrandName } from '../../../../Card/components/CardInput/utils'; +const prepareVisibleBrands = (allowedBrands: Array) => { + const visibleBrands = allowedBrands.length <= 4 ? allowedBrands : allowedBrands.slice(0, 3); + return { + visibleBrands, + leftBrandsAmount: allowedBrands.length - visibleBrands.length + }; +}; + interface PaymentMethodBrandsProps { brands: Array; - excludedUIBrands?: Array; // A list of brands that can never appear in the UI + excludedUIBrands?: Array; isPaymentMethodSelected: boolean; - activeBrand?: string; - isCompactView?: boolean; } -const PaymentMethodBrands = ({ - activeBrand, - brands, - excludedUIBrands = [], - isPaymentMethodSelected, - isCompactView = true -}: PaymentMethodBrandsProps) => { - // A set of brands filtered to exclude those that can never appear in the UI +const PaymentMethodBrands = ({ brands, excludedUIBrands = [], isPaymentMethodSelected }: PaymentMethodBrandsProps) => { + if (isPaymentMethodSelected) { + return null; + } + const allowedBrands = brands.filter(brand => !excludedUIBrands?.includes(brand.name)); + const { visibleBrands, leftBrandsAmount } = prepareVisibleBrands(allowedBrands); - if (isCompactView) { - return ; - } return ( - {allowedBrands.map(brand => ( - + {visibleBrands.map(brand => ( + ))} + {leftBrandsAmount !== 0 && +{leftBrandsAmount}} ); }; diff --git a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodItem.test.tsx b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodItem.test.tsx index 1b0baaf53d..cc92b288d9 100644 --- a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodItem.test.tsx +++ b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodItem.test.tsx @@ -9,7 +9,6 @@ const paymentMethod = { props: { type: 'mytype' }, - eventEmitter: { on: jest.fn(), off: jest.fn() }, render: jest.fn() }; diff --git a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodItem.tsx b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodItem.tsx index 939ae241db..c50dd40c99 100644 --- a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodItem.tsx +++ b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodItem.tsx @@ -33,22 +33,9 @@ class PaymentMethodItem extends Component { }; public state = { - showDisableStoredPaymentMethodConfirmation: false, - activeBrand: null + showDisableStoredPaymentMethodConfirmation: false }; - componentDidMount() { - this.props.paymentMethod.eventEmitter.on('brand', e => { - this.setState({ activeBrand: e.brand }); - }); - } - - componentWillUnmount() { - this.props.paymentMethod.eventEmitter.off('brand', e => { - this.setState({ activeBrand: e.brand }); - }); - } - public toggleDisableConfirmation = () => { this.setState({ showDisableStoredPaymentMethodConfirmation: !this.state.showDisableStoredPaymentMethodConfirmation }); }; @@ -63,7 +50,7 @@ class PaymentMethodItem extends Component { onSelect(paymentMethod); }; - render({ paymentMethod, isSelected, isDisablingPaymentMethod, isLoaded, isLoading, standalone }, { activeBrand }) { + render({ paymentMethod, isSelected, isDisablingPaymentMethod, isLoaded, isLoading, standalone }) { const { i18n } = useCoreContext(); if (!paymentMethod) { @@ -136,11 +123,9 @@ class PaymentMethodItem extends Component { {showBrands && ( )}
diff --git a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodList.test.tsx b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodList.test.tsx index 6d8392da75..d21a190ab7 100644 --- a/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodList.test.tsx +++ b/packages/lib/src/components/Dropin/components/PaymentMethod/PaymentMethodList.test.tsx @@ -3,7 +3,6 @@ import PaymentMethodList from './PaymentMethodList'; import { render, screen, within } from '@testing-library/preact'; import { mock } from 'jest-mock-extended'; import UIElement from '../../../UIElement'; -import EventEmitter from '../../../EventEmitter'; import userEvent from '@testing-library/user-event'; import Giftcard from '../../../Giftcard'; import { Order, OrderStatus } from '../../../../types'; @@ -18,7 +17,6 @@ function createInstantPaymentMethods() { }, _id: 'scheme-123456', displayName: 'Google Pay', - eventEmitter: mock(), render: () => }), mock({ @@ -28,7 +26,6 @@ function createInstantPaymentMethods() { }, _id: 'scheme-123456', displayName: 'Apple Pay', - eventEmitter: mock(), render: () => }) ]; @@ -42,8 +39,7 @@ function createPaymentMethodsMock() { type: 'scheme' }, _id: 'scheme-123456', - displayName: 'Card', - eventEmitter: mock() + displayName: 'Card' }), mock({ props: { @@ -51,8 +47,7 @@ function createPaymentMethodsMock() { type: 'wechat' }, _id: 'google-pay-123456', - displayName: 'WeChat', - eventEmitter: mock() + displayName: 'WeChat' }), mock({ props: { @@ -60,8 +55,7 @@ function createPaymentMethodsMock() { type: 'pix' }, _id: 'apple-pay-123456', - displayName: 'Pix', - eventEmitter: mock() + displayName: 'Pix' }) ]; } diff --git a/packages/lib/src/components/EventEmitter.test.ts b/packages/lib/src/components/EventEmitter.test.ts deleted file mode 100644 index 01212cbb54..0000000000 --- a/packages/lib/src/components/EventEmitter.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import EventEmitter from './EventEmitter'; - -describe('EventEmitter', () => { - test('add/remove events', () => { - const myObject = new EventEmitter(); - const eventFunction = jest.fn(); - - myObject.on('test', eventFunction); - expect(myObject.events['test'].length).toBe(1); - - myObject.off('test', eventFunction); - expect(myObject.events['test'].length).toBe(0); - }); - - test('calls events on emit', () => { - const myObject = new EventEmitter(); - const eventFunction = jest.fn(); - - myObject.on('test', eventFunction); - expect(myObject.events['test'].length).toBe(1); - - myObject.emit('test', {}); - expect(eventFunction.mock.calls.length).toBe(1); - }); -}); diff --git a/packages/lib/src/components/EventEmitter.ts b/packages/lib/src/components/EventEmitter.ts deleted file mode 100644 index 6783aab256..0000000000 --- a/packages/lib/src/components/EventEmitter.ts +++ /dev/null @@ -1,27 +0,0 @@ -class EventEmitter { - public events = {}; - - public on = (eventName: string, fn: Function): void => { - this.events[eventName] = this.events[eventName] || []; - this.events[eventName].push(fn); - }; - - public off = (eventName: string, fn: Function): void => { - if (this.events[eventName]) { - this.events[eventName] = this.events[eventName].reduce((acc, cur) => { - if (cur !== fn) acc.push(cur); - return acc; - }, []); - } - }; - - public emit = (eventName: string, data: any): void => { - if (this.events[eventName]) { - this.events[eventName].forEach(fn => { - fn(data); - }); - } - }; -} - -export default EventEmitter;