diff --git a/example/src/components/Embedded/Embedded.tsx b/example/src/components/Embedded/Embedded.tsx index c603e210e..62cdc5fec 100644 --- a/example/src/components/Embedded/Embedded.tsx +++ b/example/src/components/Embedded/Embedded.tsx @@ -16,7 +16,7 @@ export const Embedded = () => { IterableEmbeddedMessage[] >([]); const [selectedViewType, setSelectedViewType] = - useState(IterableEmbeddedViewType.Banner); + useState(IterableEmbeddedViewType.Card); const syncEmbeddedMessages = useCallback(() => { Iterable.embeddedManager.syncMessages(); diff --git a/src/core/classes/IterableApi.ts b/src/core/classes/IterableApi.ts index 09d0dc44f..8aa5338b0 100644 --- a/src/core/classes/IterableApi.ts +++ b/src/core/classes/IterableApi.ts @@ -540,7 +540,10 @@ export class IterableApi { */ static startEmbeddedImpression(messageId: string, placementId: number) { IterableLogger.log('startEmbeddedImpression: ', messageId, placementId); - return RNIterableAPI.startEmbeddedImpression(messageId, placementId); + return RNIterableAPI.startEmbeddedImpression( + messageId, + Number(placementId) + ); } /** diff --git a/src/core/images/logo-grey.png b/src/core/images/logo-grey.png new file mode 100644 index 000000000..5c0d56a92 Binary files /dev/null and b/src/core/images/logo-grey.png differ diff --git a/src/embedded/components/IterableEmbeddedCard.tsx b/src/embedded/components/IterableEmbeddedCard.tsx deleted file mode 100644 index 87b2d1940..000000000 --- a/src/embedded/components/IterableEmbeddedCard.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { View, Text } from 'react-native'; -import type { IterableEmbeddedComponentProps } from '../types/IterableEmbeddedComponentProps'; - -export const IterableEmbeddedCard = ({ - config, - message, - onButtonClick = () => {}, -}: IterableEmbeddedComponentProps) => { - console.log(`🚀 > IterableEmbeddedCard > config:`, config); - console.log(`🚀 > IterableEmbeddedCard > message:`, message); - console.log(`🚀 > IterableEmbeddedCard > onButtonClick:`, onButtonClick); - - return ( - - IterableEmbeddedCard - - ); -}; diff --git a/src/embedded/components/IterableEmbeddedCard/IterableEmbeddedCard.styles.ts b/src/embedded/components/IterableEmbeddedCard/IterableEmbeddedCard.styles.ts new file mode 100644 index 000000000..1a728c657 --- /dev/null +++ b/src/embedded/components/IterableEmbeddedCard/IterableEmbeddedCard.styles.ts @@ -0,0 +1,88 @@ +import { StyleSheet } from 'react-native'; +import { embeddedMediaImageBackgroundColors } from '../../constants/embeddedViewDefaults'; + +export const IMAGE_HEIGHT = 230; +export const PLACEHOLDER_IMAGE_HEIGHT = 56; +export const PLACEHOLDER_IMAGE_WIDTH = 56; + +export const styles = StyleSheet.create({ + body: { + alignSelf: 'stretch', + fontSize: 14, + fontWeight: '400', + lineHeight: 20, + }, + bodyContainer: { + alignItems: 'flex-start', + alignSelf: 'stretch', + display: 'flex', + flexDirection: 'column', + gap: 24, + paddingBottom: 16, + paddingHorizontal: 16, + paddingTop: 12, + }, + button: { + borderRadius: 32, + gap: 8, + }, + buttonContainer: { + alignItems: 'flex-start', + alignSelf: 'stretch', + display: 'flex', + flexDirection: 'row', + gap: 12, + width: '100%', + }, + buttonText: { + fontSize: 14, + fontWeight: '700', + lineHeight: 20, + }, + container: { + alignItems: 'center', + borderStyle: 'solid', + boxShadow: + '0 1px 1px 0 rgba(0, 0, 0, 0.06), 0 0 2px 0 rgba(0, 0, 0, 0.06), 0 0 1px 0 rgba(0, 0, 0, 0.08)', + display: 'flex', + flexDirection: 'column', + gap: 16, + justifyContent: 'center', + overflow: 'hidden', + width: '100%', + }, + mediaContainer: { + alignItems: 'flex-start', + alignSelf: 'stretch', + backgroundColor: embeddedMediaImageBackgroundColors.card, + display: 'flex', + flexDirection: 'row', + height: IMAGE_HEIGHT, + }, + mediaContainerNoImage: { + alignItems: 'center', + justifyContent: 'center', + }, + mediaImage: { + height: IMAGE_HEIGHT, + paddingHorizontal: 0, + paddingVertical: 0, + width: '100%', + }, + mediaImagePlaceholder: { + height: PLACEHOLDER_IMAGE_HEIGHT, + opacity: 0.25, + width: PLACEHOLDER_IMAGE_WIDTH, + }, + textContainer: { + alignItems: 'flex-start', + alignSelf: 'stretch', + display: 'flex', + flexDirection: 'column', + gap: 8, + }, + title: { + fontSize: 18, + fontWeight: '700', + }, +}); diff --git a/src/embedded/components/IterableEmbeddedCard/IterableEmbeddedCard.tsx b/src/embedded/components/IterableEmbeddedCard/IterableEmbeddedCard.tsx new file mode 100644 index 000000000..fcd04f5ac --- /dev/null +++ b/src/embedded/components/IterableEmbeddedCard/IterableEmbeddedCard.tsx @@ -0,0 +1,136 @@ +import { + Image, + PixelRatio, + Text, + TouchableOpacity, + View, + type TextStyle, + type ViewStyle, + Pressable, +} from 'react-native'; + +import { IterableEmbeddedViewType } from '../../enums'; +import { useEmbeddedView } from '../../hooks/useEmbeddedView'; +import type { IterableEmbeddedComponentProps } from '../../types/IterableEmbeddedComponentProps'; +import { IMAGE_HEIGHT, styles } from './IterableEmbeddedCard.styles'; + +/** + * TODO: Add default action click handler. See IterableEmbeddedView for functionality. + */ + +export const IterableEmbeddedCard = ({ + config, + message, + onButtonClick = () => {}, + onMessageClick = () => {}, +}: IterableEmbeddedComponentProps) => { + const { + componentRef, + handleButtonClick, + handleLayout, + handleMessageClick, + media, + parsedStyles, + } = useEmbeddedView(IterableEmbeddedViewType.Card, { + message, + config, + onButtonClick, + onMessageClick, + }); + const buttons = message?.elements?.buttons ?? []; + + return ( + handleMessageClick()}> + + + {media.caption + + + + + {message.elements?.title} + + + {message.elements?.body} + + + {buttons.length > 0 && ( + + {buttons.map((button, index) => { + const backgroundColor = + index === 0 + ? parsedStyles.primaryBtnBackgroundColor + : parsedStyles.secondaryBtnBackgroundColor; + const textColor = + index === 0 + ? parsedStyles.primaryBtnTextColor + : parsedStyles.secondaryBtnTextColor; + return ( + handleButtonClick(button)} + key={button.id} + > + + {button.title} + + + ); + })} + + )} + + + + ); +}; diff --git a/src/embedded/components/IterableEmbeddedCard/index.ts b/src/embedded/components/IterableEmbeddedCard/index.ts new file mode 100644 index 000000000..748f2064f --- /dev/null +++ b/src/embedded/components/IterableEmbeddedCard/index.ts @@ -0,0 +1 @@ +export * from './IterableEmbeddedCard'; diff --git a/src/embedded/components/index.ts b/src/embedded/components/index.ts index 22725d80c..f51919c32 100644 --- a/src/embedded/components/index.ts +++ b/src/embedded/components/index.ts @@ -1,4 +1,4 @@ export * from './IterableEmbeddedBanner/IterableEmbeddedBanner'; -export * from './IterableEmbeddedCard'; +export * from './IterableEmbeddedCard/IterableEmbeddedCard'; export * from './IterableEmbeddedNotification/IterableEmbeddedNotification'; export * from './IterableEmbeddedView';