import { theme } from '@/theme';
import { useRef, useState } from 'react';
import { StyleSheet, View } from 'react-native';
import type { AdInfo, AdLoadFailedInfo, AdRevenueInfo, NativeAdViewHandler } from 'react-native-daro-m';
import { AdvertiserView, BodyView, CallToActionView, IconView, MediaView, NativeAdView, OptionsView, StarRatingView, TitleView } from 'react-native-daro-m';
import { BlurView } from 'expo-blur';
type Props = {
adUnitId: string;
isInitialized: boolean;
log: (str: string) => void;
};
export const NativeAdViewMedium = ({ adUnitId, isInitialized, log }: Props) => {
const DEFAULT_ASPECT_RATIO = 16 / 9;
const [aspectRatio, setAspectRatio] = useState(DEFAULT_ASPECT_RATIO);
const [isNativeAdLoading, setIsNativeAdLoading] = useState(false);
const nativeAdViewRef = useRef<NativeAdViewHandler>(null);
return (
<View style={{ alignSelf: 'flex-end' }}>
<BlurView intensity={50} tint="light" style={styles.blurContainer}>
<NativeAdView
adUnitId={adUnitId}
refreshInterval={7}
ref={nativeAdViewRef}
style={styles.nativeAd}
onAdLoaded={(adInfo: AdInfo) => {
if (adInfo?.nativeAd?.mediaContentAspectRatio) {
setAspectRatio(adInfo?.nativeAd?.mediaContentAspectRatio);
}
log('Native ad loaded from ' + adInfo.networkName);
setIsNativeAdLoading(false);
}}
onAdLoadFailed={(errorInfo: AdLoadFailedInfo) => {
log('Native ad failed to load with error code ' + errorInfo.code + ' and message: ' + errorInfo.message);
setIsNativeAdLoading(false);
}}
onAdClicked={(adInfo: AdInfo) => {
log('Native ad clicked on ' + adInfo.adUnitId);
}}
onAdImpressionRecorded={(adInfo: AdRevenueInfo) => {
log('Native ad impression recorded: ' + adInfo.revenue);
}}
>
<View style={styles.assetContainer}>
<View style={styles.contentContainer}>
<View style={styles.assetUpperContainer}>
<IconView style={styles.icon} />
<View style={styles.assetTitleContainer}>
<TitleView numberOfLines={1} style={styles.title} />
<AdvertiserView numberOfLines={1} style={styles.advertiser} />
<StarRatingView style={styles.starRatingView} />
</View>
<OptionsView style={styles.optionsView} />
</View>
<BodyView numberOfLines={2} style={styles.body} />
<MediaView style={styles.mediaView} />
<CallToActionView style={styles.callToAction} />
</View>
</View>
</NativeAdView>
</BlurView>
</View>
);
};
const styles = StyleSheet.create({
nativeAd: {
margin: 10,
zIndex: 1,
borderRadius: 8
},
icon: {
width: 48,
height: 48,
},
title: {
width: 260,
fontSize: 16,
textAlign: 'left',
fontWeight: 'bold',
color: theme.colorWhite,
},
advertiser: {
marginTop: 4,
fontSize: 12,
textAlign: 'left',
color: theme.colorWhite,
},
starRatingView: {
height: 20,
color: '#ffe234',
},
optionsView: {
width: 20,
height: 20,
},
body: {
marginBottom: 10,
fontSize: 14,
textAlign: 'center',
textAlignVertical: 'center',
color: theme.colorWhite,
},
mediaView: {
height: 200,
width: '100%',
zIndex: 1,
},
callToAction: {
margin: 10,
padding: 10,
borderRadius: 5,
fontSize: 18,
textAlign: 'center',
fontWeight: 'bold',
textTransform: 'uppercase',
color: theme.colorWhite,
backgroundColor: '#2d545e',
},
assetContainer: {
position: 'relative',
flexDirection: 'column',
},
contentContainer: {
flexDirection: 'column',
zIndex: 1,
},
assetUpperContainer: {
flexDirection: 'row',
justifyContent: 'space-between',
},
assetTitleContainer: {
marginLeft: 10,
marginBottom: 10,
flexDirection: 'column',
flexGrow: 1,
},
blurContainer: {
overflow: 'hidden',
width: '100%',
borderRadius: 8,
margin: 10,
},
});