From 61ca0db9025afdbf3570bdaa236b94b4f6eb5652 Mon Sep 17 00:00:00 2001 From: Mitch Prewitt <44011584+mprew97@users.noreply.github.com> Date: Thu, 19 Oct 2023 12:52:02 -0400 Subject: [PATCH] [MOB-7175]: add new filter method that leaves in JSON only messages (#238) * add new filter method that leaves in JSON only messages * Mentioning filterOnlyReadAndNeverTriggerMessages --------- Co-authored-by: mitch prewitt Co-authored-by: Brad Umbaugh --- README.md | 2 +- src/inapp/tests/utils.test.ts | 97 ++++++++++++++++++++++++++++++++++- src/inapp/utils.ts | 8 +++ 3 files changed, 105 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ca9727cf..99d2806f 100644 --- a/README.md +++ b/README.md @@ -204,7 +204,7 @@ request() :rotating_light: *_PLEASE NOTE_*: If you choose the `deferred` option, the SDK will _not_ do any filtering or sorting on the messages internally. You will get the messages exactly as they come down from the API, untouched. This means you may (for example) show in-app messages marked `read` or show the messages in the wrong order based on `priority`. -If you want to keep the default sorting and filtering, please take advantage of the `sortInAppMessages` and `filterHiddenInAppMessages` methods the SDK provides. +If you want to keep the default sorting and filtering, please take advantage of the `sortInAppMessages` and `filterHiddenInAppMessages` methods the SDK provides. Also see `filterOnlyReadAndNeverTriggerMessages`, which is similar to `filterHiddenInAppMessages` but does not filter out JSON-only messages. ## initialize diff --git a/src/inapp/tests/utils.test.ts b/src/inapp/tests/utils.test.ts index 067e6639..d9278fcf 100644 --- a/src/inapp/tests/utils.test.ts +++ b/src/inapp/tests/utils.test.ts @@ -9,6 +9,7 @@ import { CLOSE_BUTTON_POSITION, CachedMessage, InAppMessage } from '../types'; import { addButtonAttrsToAnchorTag, filterHiddenInAppMessages, + filterOnlyReadAndNeverTriggerMessages, generateCloseButton, generateWidth, getCachedMessagesToDelete, @@ -33,7 +34,7 @@ const mockMarkup = ` `; describe('Utils', () => { - describe('Filtering', () => { + describe('filterHiddenInAppMessages', () => { it('should filter out read messages', () => { expect(filterHiddenInAppMessages()).toEqual([]); expect(filterHiddenInAppMessages(messages).every((e) => !e?.read)).toBe( @@ -128,6 +129,100 @@ describe('Utils', () => { }); }); + describe('filterOnlyReadAndNeverTriggerMessages', () => { + it('should filter out read messages', () => { + expect(filterOnlyReadAndNeverTriggerMessages()).toEqual([]); + expect( + filterOnlyReadAndNeverTriggerMessages(messages).every((e) => !e?.read) + ).toBe(true); + expect( + filterOnlyReadAndNeverTriggerMessages([ + { + ...messages[0], + read: true + }, + { + ...messages[1], + read: true + } + ]).length + ).toBe(0); + expect( + filterOnlyReadAndNeverTriggerMessages([ + { + ...messages[0], + trigger: { type: 'good' }, + read: undefined + }, + { + ...messages[1], + trigger: { type: 'good' }, + read: undefined + } + ]).length + ).toBe(2); + }); + + it('should filter out trigger type "never" messages', () => { + expect( + filterOnlyReadAndNeverTriggerMessages(messages).every( + (e) => !e?.trigger?.type + ) + ).not.toBe('never'); + expect( + filterOnlyReadAndNeverTriggerMessages([ + { + ...messages[0], + trigger: { type: 'never' } + }, + { + ...messages[1], + trigger: { type: 'never' } + } + ]).length + ).toBe(0); + expect( + filterOnlyReadAndNeverTriggerMessages([ + { + ...messages[0], + trigger: undefined + }, + { + ...messages[1], + trigger: undefined + } + ]).length + ).toBe(2); + }); + + it('should not filter out messages with no HTML body', () => { + expect( + filterOnlyReadAndNeverTriggerMessages([ + { + ...messages[0], + content: { ...messages[0].content, html: '' } + }, + { + ...messages[1], + content: { ...messages[0].content, html: '

' } + } + ]).length + ).toBe(2); + expect( + filterOnlyReadAndNeverTriggerMessages([ + { + ...messages[0], + content: undefined + }, + { + ...messages[1], + content: undefined + } + ]).length + ).toBe(2); + }); + }); + describe('Sorting', () => { it('should sort messages by priority level, lesser ones first', () => { expect(sortInAppMessages()).toEqual([]); diff --git a/src/inapp/utils.ts b/src/inapp/utils.ts index b526f082..8190fb9d 100644 --- a/src/inapp/utils.ts +++ b/src/inapp/utils.ts @@ -120,6 +120,14 @@ export const filterHiddenInAppMessages = ( }); }; +export const filterOnlyReadAndNeverTriggerMessages = ( + messages: Partial[] = [] +) => { + return messages.filter( + (eachMessage) => !eachMessage.read && eachMessage.trigger?.type !== 'never' + ); +}; + export const sortInAppMessages = (messages: Partial[] = []) => { return messages.sort(by(['priorityLevel', 'asc'], ['createdAt', 'asc'])); };