{"version":3,"file":"helpers.mjs","sources":["../../../../../../src/inAppMessaging/providers/pinpoint/utils/helpers.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { ConsoleLogger } from '@aws-amplify/core';\nimport { InAppMessagingAction, getClientInfo, } from '@aws-amplify/core/internals/utils';\nimport isEmpty from 'lodash/isEmpty.js';\nimport { record as recordCore } from '@aws-amplify/core/internals/providers/pinpoint';\nimport { resolveConfig } from './resolveConfig';\nimport { resolveCredentials } from './resolveCredentials';\nimport { CATEGORY } from './constants';\nimport { getInAppMessagingUserAgentString } from './userAgent';\nconst DELIVERY_TYPE = 'IN_APP_MESSAGE';\nlet eventNameMemo = {};\nlet eventAttributesMemo = {};\nlet eventMetricsMemo = {};\nexport const logger = new ConsoleLogger('InAppMessaging.Pinpoint.Utils');\nexport const recordAnalyticsEvent = (event, message) => {\n    const { appId, region } = resolveConfig();\n    const { id, metadata } = message;\n    resolveCredentials()\n        .then(({ credentials, identityId }) => {\n        recordCore({\n            appId,\n            category: CATEGORY,\n            credentials,\n            event: {\n                name: event,\n                attributes: {\n                    // only include campaign_id field if we have one\n                    ...(id && { campaign_id: id }),\n                    delivery_type: DELIVERY_TYPE,\n                    treatment_id: metadata?.treatmentId,\n                },\n            },\n            identityId,\n            region,\n            userAgentValue: getInAppMessagingUserAgentString(InAppMessagingAction.NotifyMessageInteraction),\n        });\n    })\n        .catch(e => {\n        // An error occured while fetching credentials or persisting the event to the buffer\n        logger.warn('Failed to record event.', e);\n    });\n};\nexport const getStartOfDay = () => {\n    const now = new Date();\n    now.setHours(0, 0, 0, 0);\n    return now.toISOString();\n};\nexport const matchesEventType = ({ CampaignId, Schedule }, { name: eventType }) => {\n    const { EventType } = Schedule?.EventFilter?.Dimensions ?? {};\n    const memoKey = `${CampaignId}:${eventType}`;\n    if (!Object.prototype.hasOwnProperty.call(eventNameMemo, memoKey)) {\n        eventNameMemo[memoKey] = !!EventType?.Values?.includes(eventType);\n    }\n    return eventNameMemo[memoKey];\n};\nexport const matchesAttributes = ({ CampaignId, Schedule }, { attributes = {} }) => {\n    const { Attributes } = Schedule?.EventFilter?.Dimensions ?? {};\n    if (isEmpty(Attributes)) {\n        // if message does not have attributes defined it does not matter what attributes are on the event\n        return true;\n    }\n    if (isEmpty(attributes)) {\n        // if message does have attributes but the event does not then it always fails the check\n        return false;\n    }\n    const memoKey = `${CampaignId}:${JSON.stringify(attributes)}`;\n    if (!Object.prototype.hasOwnProperty.call(eventAttributesMemo, memoKey)) {\n        eventAttributesMemo[memoKey] =\n            !Attributes ||\n                Object.entries(Attributes).every(([key, { Values }]) => Values?.includes(attributes[key]));\n    }\n    return eventAttributesMemo[memoKey];\n};\nexport const matchesMetrics = ({ CampaignId, Schedule }, { metrics = {} }) => {\n    const { Metrics } = Schedule?.EventFilter?.Dimensions ?? {};\n    if (isEmpty(Metrics)) {\n        // if message does not have metrics defined it does not matter what metrics are on the event\n        return true;\n    }\n    if (isEmpty(metrics)) {\n        // if message does have metrics but the event does not then it always fails the check\n        return false;\n    }\n    const memoKey = `${CampaignId}:${JSON.stringify(metrics)}`;\n    if (!Object.prototype.hasOwnProperty.call(eventMetricsMemo, memoKey)) {\n        eventMetricsMemo[memoKey] =\n            !Metrics ||\n                Object.entries(Metrics).every(([key, { ComparisonOperator, Value }]) => {\n                    const compare = getComparator(ComparisonOperator);\n                    // if there is some unknown comparison operator, treat as a comparison failure\n                    return compare && !!Value ? compare(Value, metrics[key]) : false;\n                });\n    }\n    return eventMetricsMemo[memoKey];\n};\nexport const getComparator = (operator) => {\n    switch (operator) {\n        case 'EQUAL':\n            return (metricsVal, eventVal) => metricsVal === eventVal;\n        case 'GREATER_THAN':\n            return (metricsVal, eventVal) => metricsVal < eventVal;\n        case 'GREATER_THAN_OR_EQUAL':\n            return (metricsVal, eventVal) => metricsVal <= eventVal;\n        case 'LESS_THAN':\n            return (metricsVal, eventVal) => metricsVal > eventVal;\n        case 'LESS_THAN_OR_EQUAL':\n            return (metricsVal, eventVal) => metricsVal >= eventVal;\n        default:\n            return undefined;\n    }\n};\nexport const isBeforeEndDate = ({ Schedule, }) => {\n    if (!Schedule?.EndDate) {\n        return true;\n    }\n    return new Date() < new Date(Schedule.EndDate);\n};\nexport const isQuietTime = (message) => {\n    const { Schedule } = message;\n    if (!Schedule?.QuietTime) {\n        return false;\n    }\n    const pattern = /^[0-2]\\d:[0-5]\\d$/; // basic sanity check, not a fully featured HH:MM validation\n    const { Start, End } = Schedule.QuietTime;\n    if (!Start ||\n        !End ||\n        Start === End ||\n        !pattern.test(Start) ||\n        !pattern.test(End)) {\n        return false;\n    }\n    const now = new Date();\n    const start = new Date(now);\n    const end = new Date(now);\n    const [startHours, startMinutes] = Start.split(':');\n    const [endHours, endMinutes] = End.split(':');\n    start.setHours(Number.parseInt(startHours, 10), Number.parseInt(startMinutes, 10), 0, 0);\n    end.setHours(Number.parseInt(endHours, 10), Number.parseInt(endMinutes, 10), 0, 0);\n    // if quiet time includes midnight, bump the end time to the next day\n    if (start > end) {\n        end.setDate(end.getDate() + 1);\n    }\n    const isDuringQuietTime = now >= start && now <= end;\n    if (isDuringQuietTime) {\n        logger.debug('message filtered due to quiet time', message);\n    }\n    return isDuringQuietTime;\n};\nexport const clearMemo = () => {\n    eventNameMemo = {};\n    eventAttributesMemo = {};\n    eventMetricsMemo = {};\n};\n// in the pinpoint console when a message is created with a Modal or Full Screen layout,\n// it is assigned a layout value of MOBILE_FEED or OVERLAYS respectively in the message payload.\n// In the future, Pinpoint will be updating the layout values in the aforementioned scenario\n// to MODAL and FULL_SCREEN.\n//\n// This utility acts as a safeguard to ensure that:\n// - 1. the usage of MOBILE_FEED and OVERLAYS as values for message layouts are not leaked\n//      outside the Pinpoint provider\n// - 2. Amplify correctly handles the legacy layout values from Pinpoint after they are updated\nexport const interpretLayout = (layout) => {\n    if (layout === 'MOBILE_FEED') {\n        return 'MODAL';\n    }\n    if (layout === 'OVERLAYS') {\n        return 'FULL_SCREEN';\n    }\n    // cast as PinpointInAppMessage['InAppMessage']['Layout'] allows `string` as a value\n    return layout;\n};\nexport const extractContent = ({ InAppMessage: message, }) => {\n    const clientInfo = getClientInfo();\n    const configPlatform = mapOSPlatform(clientInfo?.platform);\n    return (message?.Content?.map(content => {\n        const { BackgroundColor, BodyConfig, HeaderConfig, ImageUrl, PrimaryBtn, SecondaryBtn, } = content;\n        const defaultPrimaryButton = getButtonConfig(configPlatform, PrimaryBtn);\n        const defaultSecondaryButton = getButtonConfig(configPlatform, SecondaryBtn);\n        const extractedContent = {};\n        if (BackgroundColor) {\n            extractedContent.container = {\n                style: {\n                    backgroundColor: BackgroundColor,\n                },\n            };\n        }\n        if (HeaderConfig) {\n            extractedContent.header = {\n                // Default to empty string in rare cases we don't have a Header value\n                content: HeaderConfig.Header ?? '',\n                style: {\n                    color: HeaderConfig.TextColor,\n                    textAlign: HeaderConfig.Alignment?.toLowerCase(),\n                },\n            };\n        }\n        if (BodyConfig) {\n            extractedContent.body = {\n                // Default to empty string in rare cases we don't have a Body value\n                content: BodyConfig.Body ?? '',\n                style: {\n                    color: BodyConfig.TextColor,\n                    textAlign: BodyConfig.Alignment?.toLowerCase(),\n                },\n            };\n        }\n        if (ImageUrl) {\n            extractedContent.image = {\n                src: ImageUrl,\n            };\n        }\n        if (defaultPrimaryButton) {\n            extractedContent.primaryButton = {\n                // Default to empty string in rare cases we don't have a Text value\n                title: defaultPrimaryButton.Text ?? '',\n                action: defaultPrimaryButton.ButtonAction,\n                url: defaultPrimaryButton.Link,\n                style: {\n                    backgroundColor: defaultPrimaryButton.BackgroundColor,\n                    borderRadius: defaultPrimaryButton.BorderRadius,\n                    color: defaultPrimaryButton.TextColor,\n                },\n            };\n        }\n        if (defaultSecondaryButton) {\n            extractedContent.secondaryButton = {\n                // Default to empty string in rare cases we don't have a Text value\n                title: defaultSecondaryButton.Text ?? '',\n                action: defaultSecondaryButton.ButtonAction,\n                url: defaultSecondaryButton.Link,\n                style: {\n                    backgroundColor: defaultSecondaryButton.BackgroundColor,\n                    borderRadius: defaultSecondaryButton.BorderRadius,\n                    color: defaultSecondaryButton.TextColor,\n                },\n            };\n        }\n        return extractedContent;\n    }) ?? []);\n};\nexport const extractMetadata = ({ InAppMessage: inAppMessage, Priority, Schedule, TreatmentId, }) => ({\n    customData: inAppMessage?.CustomConfig,\n    endDate: Schedule?.EndDate,\n    priority: Priority,\n    treatmentId: TreatmentId,\n});\nexport const mapOSPlatform = (os) => {\n    if (!os)\n        return 'DefaultConfig';\n    // Check if running in a web browser\n    if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {\n        return 'Web';\n    }\n    // Native environment checks\n    switch (os) {\n        case 'android':\n            return 'Android';\n        case 'ios':\n            return 'IOS';\n        default:\n            return 'DefaultConfig';\n    }\n};\nconst getButtonConfig = (configPlatform, button) => {\n    if (!button?.DefaultConfig) {\n        return;\n    }\n    if (!configPlatform || !button?.[configPlatform]) {\n        return button?.DefaultConfig;\n    }\n    return {\n        ...button.DefaultConfig,\n        ...button[configPlatform],\n    };\n};\n"],"names":["recordCore"],"mappings":"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"}