Skip to content

Commit 297ae51

Browse files
committed
feat: improve Embedded component with enhanced message fetching and styling updates
1 parent 14922e0 commit 297ae51

7 files changed

Lines changed: 94 additions & 59 deletions

File tree

example/src/components/Embedded/Embedded.tsx

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,45 @@ export const Embedded = () => {
1818
const [placementIds, setPlacementIds] = useState<number[]>([]);
1919
const [messages, setMessages] = useState<IterableEmbeddedMessage[]>([]);
2020

21+
const getPlacementIds = useCallback(() => {
22+
Iterable.embeddedManager.getPlacementIds().then((ids: unknown) => {
23+
console.log(ids);
24+
setPlacementIds(ids as number[]);
25+
});
26+
}, []);
27+
28+
const getEmbeddedMessages = useCallback(() => {
29+
Iterable.embeddedManager.getMessages(placementIds).then((messageList) => {
30+
console.log(messageList);
31+
setMessages(messageList as IterableEmbeddedMessage[]);
32+
});
33+
}, [placementIds]);
34+
35+
const sync = useCallback(() => {
36+
Iterable.embeddedManager.syncMessages();
37+
}, []);
38+
39+
useEffect(() => {
40+
if (isLoggedIn) {
41+
getPlacementIds();
42+
}
43+
}, [isLoggedIn, getPlacementIds]);
44+
2145
useEffect(() => {
2246
if (isFocused) {
2347
Iterable.embeddedManager.startSession();
2448
Iterable.embeddedManager.syncMessages();
25-
Iterable.embeddedManager.getMessages(placementIds).then((messageList) => {
26-
console.log(messageList);
27-
setMessages(messageList as IterableEmbeddedMessage[]);
49+
Iterable.embeddedManager.getPlacementIds().then((ids: unknown) => {
50+
console.log(ids);
51+
setPlacementIds(ids as number[]);
52+
Iterable.embeddedManager
53+
.getMessages(placementIds)
54+
.then((messageList) => {
55+
console.log(messageList);
56+
setMessages(messageList as IterableEmbeddedMessage[]);
57+
setHasSession(true);
58+
});
2859
});
29-
setHasSession(true);
3060
} else {
3161
if (hasSession) {
3262
Iterable.embeddedManager.endSession();
@@ -36,32 +66,6 @@ export const Embedded = () => {
3666
// eslint-disable-next-line react-hooks/exhaustive-deps
3767
}, [isFocused]);
3868

39-
useEffect(() => {
40-
if (isLoggedIn) {
41-
Iterable.embeddedManager.getPlacementIds().then((ids: unknown) => {
42-
console.log(`🚀 > User > ids:`, ids);
43-
setPlacementIds(ids as number[]);
44-
});
45-
}
46-
}, [isLoggedIn]);
47-
48-
const getEmbeddedMessages = useCallback(() => {
49-
Iterable.embeddedManager.getMessages(placementIds).then((messageList) => {
50-
console.log(messageList);
51-
setMessages(messageList as IterableEmbeddedMessage[]);
52-
});
53-
}, [placementIds]);
54-
55-
const getPlacementIds = useCallback(() => {
56-
Iterable.embeddedManager.getPlacementIds().then((ids: unknown) => {
57-
console.log(ids);
58-
});
59-
}, []);
60-
61-
const sync = useCallback(() => {
62-
Iterable.embeddedManager.syncMessages();
63-
}, []);
64-
6569
return (
6670
<View style={styles.container}>
6771
<Text style={styles.text}>Has session: {hasSession.toString()}</Text>

src/api/NativeRNIterableAPI.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface EmbeddedMessage {
1717
}[]
1818
| null;
1919
body?: string | null;
20-
mediaURL?: string | null;
20+
mediaUrl?: string | null;
2121
mediaUrlCaption?: string | null;
2222
defaultAction?: { type: string; data?: string } | null;
2323
text?: { id: string; text?: string | null; label?: string | null }[] | null;

src/embedded/classes/IterableEmbeddedMessageElements.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { IterableEmbeddedMessageElementsText } from './IterableEmbeddedMess
55
export interface IterableEmbeddedMessageElementsDict {
66
title?: string | null;
77
body?: string | null;
8-
mediaURL?: string | null;
8+
mediaUrl?: string | null;
99
mediaUrlCaption?: string | null;
1010
defaultAction?: IterableEmbeddedMessageElementsDefaultAction | null;
1111
buttons?: IterableEmbeddedMessageElementsButton[] | null;
@@ -15,7 +15,7 @@ export interface IterableEmbeddedMessageElementsDict {
1515
export interface IterableEmbeddedMessageElements {
1616
title?: string | null;
1717
body?: string | null;
18-
mediaURL?: string | null;
18+
mediaUrl?: string | null;
1919
mediaUrlCaption?: string | null;
2020
defaultAction?: IterableEmbeddedMessageElementsDefaultAction | null;
2121
buttons?: IterableEmbeddedMessageElementsButton[] | null;

src/embedded/components/IterableEmbeddedBanner/IterableEmbeddedBanner.styles.tsx

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { StyleSheet } from 'react-native';
2+
import {
3+
embeddedMediaImageBorderColors,
4+
embeddedMediaImageBackgroundColors,
5+
} from '../../constants/embeddedViewDefaults';
26

37
export const styles = StyleSheet.create({
48
body: {
@@ -10,22 +14,17 @@ export const styles = StyleSheet.create({
1014
bodyContainer: {
1115
alignItems: 'center',
1216
alignSelf: 'stretch',
13-
// backgroundColor: 'green',
1417
display: 'flex',
1518
flexDirection: 'row',
16-
// gap: 16,
19+
paddingTop: 4,
1720
},
1821
button: {
19-
// backgroundColor: 'blue',
2022
borderRadius: 12,
2123
gap: 8,
22-
// height: 32,
23-
// display: 'flex',
2424
},
2525
buttonContainer: {
2626
alignItems: 'flex-start',
2727
alignSelf: 'stretch',
28-
// backgroundColor: 'red',
2928
display: 'flex',
3029
flexDirection: 'row',
3130
gap: 12,
@@ -51,14 +50,24 @@ export const styles = StyleSheet.create({
5150
width: '100%',
5251
},
5352
mediaContainer: {
53+
alignItems: 'flex-start',
54+
alignSelf: 'stretch',
5455
display: 'flex',
55-
flexDirection: 'column',
56-
gap: 16,
56+
flexDirection: 'row',
57+
},
58+
mediaImage: {
59+
backgroundColor: embeddedMediaImageBackgroundColors.banner,
60+
borderColor: embeddedMediaImageBorderColors.banner,
61+
borderRadius: 6,
62+
borderStyle: 'solid',
63+
borderWidth: 1,
64+
height: 70,
65+
paddingHorizontal: 0,
66+
paddingVertical: 0,
67+
width: 70,
5768
},
5869
textContainer: {
5970
alignSelf: 'center',
60-
// alignItems: 'flex-start',
61-
// backgroundColor: 'red',
6271
display: 'flex',
6372
flexDirection: 'column',
6473
flexGrow: 1,
@@ -69,6 +78,7 @@ export const styles = StyleSheet.create({
6978
title: {
7079
fontSize: 16,
7180
fontWeight: '700',
72-
lineHeight: 24,
81+
lineHeight: 16,
82+
paddingBottom: 4,
7383
},
7484
});

src/embedded/components/IterableEmbeddedBanner/IterableEmbeddedBanner.tsx

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useCallback, useMemo } from 'react';
22
import {
3+
Image,
34
Text,
45
TouchableOpacity,
56
View,
@@ -15,6 +16,10 @@ import { getStyles } from '../utils/getStyles';
1516
import { styles } from './IterableEmbeddedBanner.styles';
1617
import { runButtonClick } from '../utils/runButtonClick';
1718

19+
/**
20+
* TODO: figure out how default action works.
21+
*/
22+
1823
export const IterableEmbeddedBanner = ({
1924
config,
2025
message,
@@ -26,17 +31,10 @@ export const IterableEmbeddedBanner = ({
2631
const media = useMemo(() => {
2732
return getMedia(IterableEmbeddedViewType.Banner, message);
2833
}, [message]);
29-
console.log(`🚀 > IterableEmbeddedView > media:`, media);
3034
const handleButtonClick = useCallback(
3135
(button: IterableEmbeddedMessageElementsButton) => {
32-
console.group('handleButtonClick');
33-
console.log('message', message);
34-
console.log('button', button);
35-
console.log('button.action', button.action);
36-
3736
onButtonClick(button);
3837
runButtonClick(button, message);
39-
console.groupEnd();
4038
},
4139
[onButtonClick, message]
4240
);
@@ -55,7 +53,8 @@ export const IterableEmbeddedBanner = ({
5553
} as ViewStyle,
5654
]}
5755
>
58-
<View style={styles.bodyContainer}>
56+
{/* eslint-disable-next-line react-native/no-inline-styles */}
57+
<View style={[styles.bodyContainer, { gap: media.shouldShow ? 16 : 0 }]}>
5958
<View style={styles.textContainer}>
6059
<Text
6160
style={[
@@ -74,9 +73,15 @@ export const IterableEmbeddedBanner = ({
7473
{message.elements?.body}
7574
</Text>
7675
</View>
77-
<View style={styles.mediaContainer}>
78-
{/* <Image source={{ uri: media.url }} style={styles.mediaImage} /> */}
79-
</View>
76+
{media.shouldShow && (
77+
<View style={styles.mediaContainer}>
78+
<Image
79+
source={{ uri: media.url as string }}
80+
style={styles.mediaImage}
81+
alt={media.caption as string}
82+
/>
83+
</View>
84+
)}
8085
</View>
8186
{buttons.length > 0 && (
8287
<View style={styles.buttonContainer}>

src/embedded/components/utils/getMedia.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
import type { IterableEmbeddedMessage } from "../../classes/IterableEmbeddedMessage";
2-
import { IterableEmbeddedViewType } from "../../enums/IterableEmbeddedViewType";
1+
import type { IterableEmbeddedMessage } from '../../classes/IterableEmbeddedMessage';
2+
import { IterableEmbeddedViewType } from '../../enums/IterableEmbeddedViewType';
33

4-
export const getMedia = (viewType: IterableEmbeddedViewType, message: IterableEmbeddedMessage) => {
5-
const url = message.elements?.mediaURL ?? null;
4+
export const getMedia = (
5+
viewType: IterableEmbeddedViewType,
6+
message: IterableEmbeddedMessage
7+
) => {
8+
const url = message.elements?.mediaUrl ?? null;
69
const caption = message.elements?.mediaUrlCaption ?? null;
710
const shouldShow =
811
!!url &&

src/embedded/constants/embeddedViewDefaults.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@ export const embeddedBodyTextColors = {
4949
export const defaultBorderWidth = 1;
5050
export const defaultBorderCornerRadius = 8.0;
5151

52+
export const embeddedMediaImageBorderColors = {
53+
notification: '#E0DEDF',
54+
card: '#E0DEDF',
55+
banner: '#E0DEDF',
56+
};
57+
58+
export const embeddedMediaImageBackgroundColors = {
59+
notification: '#F5F4F4',
60+
card: '#F5F4F4',
61+
banner: '#F5F4F4',
62+
};
63+
5264
export const embeddedColors = {
5365
background: embeddedBackgroundColors,
5466
border: embeddedBorderColors,
@@ -58,4 +70,5 @@ export const embeddedColors = {
5870
secondaryBtnText: embeddedSecondaryBtnTextColors,
5971
titleText: embeddedTitleTextColors,
6072
bodyText: embeddedBodyTextColors,
73+
mediaImageBorder: embeddedMediaImageBorderColors,
6174
};

0 commit comments

Comments
 (0)