diff --git a/src/Messages.ts b/src/Messages.ts index c55d9b4..2d3c7ea 100644 --- a/src/Messages.ts +++ b/src/Messages.ts @@ -248,10 +248,10 @@ export default class Messages { this.occurrenceTracker.recordOccurrence(id) this.trackMessage(id, { event, value, info, params }) }, - runActionNamed: (actionName: string): void => this.onAction(vars[actionName]), + runActionNamed: (actionName: string): void => this.onAction(vars[actionName], id), runTrackedActionNamed: (actionName: string): void => { const event = actionName.replace(/ action$/, '') - this.trackMessage(id, { event }, () => this.onAction(vars[actionName])) + this.trackMessage(id, { event }, () => this.onAction(vars[actionName], id)) }, } @@ -404,17 +404,17 @@ export default class Messages { }) } - onAction(action: Action): void { + onAction(action: Action, parentMessageId = ''): void { if (!action) { return } const messages = this._messageCache - if (action && action.__name__ === 'Chain to Existing Message') { + if (action.__name__ === 'Chain to Existing Message') { const chainedMessageId = action['Chained message'] const message = messages[chainedMessageId] if (message.action === 'Open URL') { - this.trackMessage(chainedMessageId, { event: 'View' }, () => this.onAction(message.vars)) + this.trackMessage(chainedMessageId, { event: 'View' }, () => this.onAction(message.vars, chainedMessageId)) } else if (message.action === 'Register For Push') { this.events.emit('registerForPush') } else { @@ -426,10 +426,18 @@ export default class Messages { // handle app function const processAction = (): void => { + const name = action.__name__ if (action.__name__ === 'Open URL') { this.events.emit('navigationChange', action.URL) } else if (action.__name__ === 'Register For Push') { this.events.emit('registerForPush') + } else if (name) { + // embedded chained message + this.showMessage(parentMessageId, { + messageId: parentMessageId, + action: name, + vars: action as any, // eslint-disable-line + }) } } const messageId = this.messageIdFromAction(action) diff --git a/test/specs/Messages.test.ts b/test/specs/Messages.test.ts index bab9ea6..127c6c1 100644 --- a/test/specs/Messages.test.ts +++ b/test/specs/Messages.test.ts @@ -166,6 +166,37 @@ describe(Messages, () => { expect(navigationChange).toHaveBeenCalledWith("https://example.com/success") }) + it('triggers showMessage for embedded chained message', () => { + events.emit('messagesReceived', { + "123": { + action: "Confirm", + whenTriggers: TRIGGER_ON_START, + parentCampaignId: 456, + vars: { + __name__: "Confirm", + "Accept action": { + __name__: "Confirm", + Title: "Confirm again", + } + }, + } + }) + + events.emit('start') + + expect(showMessage).toHaveBeenCalledTimes(1) + + // trigger accept action + showMessage.mock.calls[0][0].context.runActionNamed('Accept action') + + expect(showMessage).toHaveBeenCalledTimes(2) + const secondMessage = showMessage.mock.calls[1][0].message + expect(secondMessage).toHaveProperty('__name__', 'Confirm') + expect(secondMessage).toHaveProperty('Title', 'Confirm again') + expect(secondMessage).toHaveProperty('messageId', '123') + }) + + it('tracks actions', () => { events.emit('messagesReceived', { "123": {