UNPKG

react-native-admob-native-ads

Version:

A simple and robust library for creating & displaying Admob Native Ads in your React Native App using Native Views

498 lines (438 loc) 14.4 kB
import React from "react"; import { ViewStyle, TextProps, ImageProps, TextStyle, StyleProp, EmitterSubscription, } from "react-native"; type Image = { /** * The url of the image */ url: string; /** * The height of the image */ height: number; /** * The width of the image */ width: number; }; type NativeAd = { /** * Title of the native ad. */ headline: string; /** * Description of the native ad. */ tagline: string; /** * Advertiser of the native ad. */ advertiser: string; /** * If the ad is for a paid app or service, price value. */ price: string; /** * Aspect ratio of the Content loaded inside MediaView. * You should use this to calculate the correct width and height of the MediaView. */ aspectRatio: number; /** * If ad is for an app, then name of the store. */ store: string; /** * Icon / Logo of the adveriser or the product advertised in ad. */ icon: string; /** * An array of images along with the ad. */ images: Array<Image>; /** * callToAction text value for the native ad. */ callToAction: string; /** * If ad is for an app, then its rating on the respective store. */ rating: number; /** * if ad has video content or not. */ video: boolean; }; type options = { adChoicesPlacement: { TOP_LEFT: number; TOP_RIGHT: number; BOTTOM_RIGHT: number; BOTTOM_LEFT: number; }; }; /** * | Name | Description | | --------- | -------- | | G | "General audiences." Content suitable for all audiences, including families and children. | | MA | "Mature audiences." Content suitable only for mature audiences; includes topics such as alcohol, gambling, sexual content, and weapons. | | PG | "Parental guidance." Content suitable for most audiences with parental guidance, including topics like non-realistic, cartoonish violence. | | T | "Teen." Content suitable for teen and older audiences, including topics such as general health, social networks, scary imagery, and fight sports. | | UNSPECIFIED | Set default value to ""| */ type MAX_AD_CONTENT_RATING = "G" | "MA" | "PG" | "T" | "UNSPECIFIED"; type AdManagerConfiguration = { maxAdContentRating?: MAX_AD_CONTENT_RATING; tagForChildDirectedTreatment?: boolean; tagForUnderAgeConsent?: boolean; testDeviceIds?: Array<string>; trackingAuthorized?: boolean; }; type VideoOptions = { /** Sets if the video should be muted by default when played automatically */ muted?: boolean; /** Allow the ad to expand to full screen on click */ clickToExpand?: boolean; /** Set this to true if you want to use custom controls for play/pause etc on videos */ customControlsRequested?: boolean; }; type MediationOptions = { nativeBanner?: boolean; }; type TargetingOptions = { targets?: Array<{ key: boolean; value: string | Array<string> }>; categoryExclusions?: Array<string>; publisherId?: string; requestAgent?: string; keywords?: Array<string>; contentUrl?: string; neighboringContentUrls?: Array<string>; }; export enum AdapterState { NOT_READY, READY, } type MediationAdapterStatus = { name: string; description: string; state: AdapterState; }; type AdRepositoryConfig = { /** Name for this repository. If name is not provided, adUnitId will * be used as repository name. */ name?: string; /** **(Required)** Provide adUnitId to load ads. */ adUnitId: string; /**The number of ads to preload. Default is `5` */ numOfAds?: number; /** * Under the Google EU User Consent Policy, you must make certain disclosures * to your users in the European Economic Area (EEA) and obtain their consent * to use cookies or other local storage, where legally required, and to use * personal data (such as AdID) to serve ads. This policy reflects the requirements * of the EU ePrivacy Directive and the General Data Protection Regulation (GDPR). * * You can use library such as: https://github.com/birgernass/react-native-ad-consent * to obtain the consent or if you are using rn-firebase you can obtain the consent from * there and then pass the consent to this library. If user has selected * non-personalized-ads then pass `true` and non-personalized ads will be shown to the user. * */ requestNonPersonalizedAdsOnly?: boolean; /** After how long should ads in this repository expire after being loaded in milliseconds. Default is `3600000`.*/ expirationPeriod?: number; /** Set this to true if you are using mediation. */ mediationEnabled?: boolean; videoOptions?: VideoOptions; mediationOptions?: MediationOptions; targetingOptions?: TargetingOptions; adChoicesPlacement?: "topLeft" | "topRight" | "bottomLeft" | "bottomRight"; mediaAspectRatio?: "any" | "landscape" | "portrait" | "square" | "unknown"; }; type ImagePropsWithOptionalSource = Omit<ImageProps, "source"> & Partial<Pick<ImageProps, "source">>; type NativeAdViewProps = { /** * When you are designing your ad, placeholders * for the ad will be loaded so you can easily * design, because for each type of ad * recieved from the server, not all * the info is available. */ enableTestMode?: boolean; children: React.ReactNode; style?: StyleProp<ViewStyle>; /** * Ad Unit ID for Native ads. Remember to use only test-ids during * development mode or add your device to testDevices. */ adUnitID?: string; /** * Ads returned will be of the desired aspectRatio */ mediaAspectRatio?: "any" | "landscape" | "portrait" | "square" | "unknown"; /** * A repository is used to preload ads before they are presented. * Provide the name of the repository registered for ad caching. * If you have not registered a repository, you can do so by * calling `AdManager.registerRepository`. * * **Note:** Use this only if you have registered a repository. */ repository?: string; /** * Time after which a new ad should be * requested from the server. Default is 1 minute (60000 ms); */ refreshInterval?: number; /** * Time in milliseconds to delay ad rendering. * Use this if you are rendering multiple ads * in your screen such as in a list. Default is 0ms. * This is usually done so that ad request is done * after the views are attached. */ delayAdLoading?: number; /** * Placement of AdChoicesView in any of the 4 corners of the ad * * import `AdOptions` then pass the value from there. AdOptions.adChoicesPlacement **/ adChoicesPlacement?: "topLeft" | "topRight" | "bottomLeft" | "bottomRight"; /** * Under the Google EU User Consent Policy, you must make certain disclosures * to your users in the European Economic Area (EEA) and obtain their consent * to use cookies or other local storage, where legally required, and to use * personal data (such as AdID) to serve ads. This policy reflects the requirements * of the EU ePrivacy Directive and the General Data Protection Regulation (GDPR). * * You can use library such as: https://github.com/birgernass/react-native-ad-consent * to obtain the consent or if you are using rn-firebase you can obtain the consent from * there and then pass the consent to this library. If user has selected * non-personalized-ads then pass `true` and non-personalized ads will be shown to the user. * */ requestNonPersonalizedAdsOnly?: boolean; /** * Set testdevices for the ad. (DEPRECATED) */ videoOptions?: VideoOptions; mediationOptions?: MediationOptions; targetingOptions?: TargetingOptions; testDevices?: Array<string>; onAdOpened?: () => void; onAdClosed?: () => void; onAdLeftApplication?: () => void; onAdImpression?: () => void; onAdClicked?: () => void; onAdLoaded?: () => void; onNativeAdLoaded?: (event: NativeAd) => void; onAdFailedToLoad?: (error: { message: string }) => void; }; type SimpleViewProps = { style?: StyleProp<ViewStyle>; }; type NestedTextProps = { style?: StyleProp<ViewStyle>; textStyle?: TextStyle; allCaps?: boolean; allowFontScaling?: boolean; }; type CallToActionViewProps = NestedTextProps & { buttonAndroidStyle?: { /** * Only 6 digit hex colors are supported. Example: #f0f0f0 */ backgroundColor?: string; /** * Only 6 digit hex colors are supported. Example: #f0f0f0 */ borderColor?: string; borderWidth?: number; borderRadius?: number; }; }; type StarViewProps = { style?: StyleProp<ViewStyle>; size?: number; iconSet?: | "Entypo" | "EvilIcons" | "Feather" | "FontAwesome" | "Foundation" | "Ionicons" | "MaterialIcons" | "MaterialCommunityIcons" | "Octicons" | "Zocial" | "SimpleLineIcons"; fullIcon?: string; halfIcon?: string; emptyIcon?: string; fullIconColor?: string; halfIconColor?: string; emptyIconColor?: string; }; declare module "react-native-admob-native-ads" { /** * * Wrapper for the UnifiedNativeAdView from Google Ads SDK. All your views should be * wrapped inside this view always. * */ export default class NativeAdView extends React.Component<NativeAdViewProps> { loadAd: () => void; } /** * AdManager can be used to configure your ads on App Startup such as setting test devices. * */ export const AdManager: { /** * Configure your Ad Requests during App Startup. You need to pass a single object as an argument with at least one of the following properties | Name | Type | Required | | --------- | -------- | -------- | | testDeviceIds | `Array<string>` | no | | maxAdContentRating | AdManager.MAX_AD_CONTENT_RATING | no | | tagForChildDirectedTreatment | AdManager.TAG_FOR_CHILD_DIRECTED_TREATMENT | no | | tagForUnderAgeConsent | AdManager.TAG_FOR_UNDER_AGE_CONSENT | no | Example: ```js const config = { testDeviceIds:["YOUR_TEST_DEVICE_ID"], maxAdContentRating: 'MA', tagForChildDirectedTreatment: false, tagForUnderAgeConsent: false } AdManager.setRequestConfiguration(config); ``` * */ setRequestConfiguration: ( config: Partial<AdManagerConfiguration> ) => Promise<Array<MediationAdapterStatus>>; /** * Check if the current device is registered as a test device to show test ads. ```js AdManager.isTestDevice().then(result => console.log(result)) ``` return: `boolean` */ isTestDevice: () => Promise<boolean>; /** * Register a repository with given settings for native ads */ registerRepository: (config: AdRepositoryConfig) => Promise<boolean>; /** * Unregister a repository. All preloaded ads in this repository will be destroyed. */ unRegisterRepository: (name: string) => void; /** * Reset all ad repositories. */ resetCache: () => void; /** * Check if there is ad in a repository. */ hasAd: (name: string) => Promise<boolean>; /** * When using Repositories to load ads, events are not recieved on the ad itself * on android. If you want to track clicks and impressions you can do this using below * events for each repository on android. * * Android only. * @param repo * @param eventName * @param listener * @returns */ subscribe: ( repo: string, eventName: | "onAdPreloadLoaded" | "onAdPreloadError" | "onAdPreloadOpen" | "onAdPreloadClosed" | "onAdPreloadClicked" | "onAdPreloadImpression", listener ) => EmitterSubscription; }; export const AdOptions: options; /** * Ad Badge shows the {ad} badge on top of the ad telling the user that this is an AD. * */ export function AdBadge(props: NestedTextProps): JSX.Element; /** * The title of the native ad recieved from server is renderd here. * You dont need to pass any values to it. It will automatically get the title from * context and load it. * You should on style it as you want. */ export function HeadlineView(props: TextProps): JSX.Element; /** * * The description of the native ad recieved from server is renderd here. */ export function TaglineView(props: TextProps): JSX.Element; /** * * The adveriser name of the native ad recieved from server is renderd here. */ export function AdvertiserView(props: TextProps): JSX.Element; /** * If the ad or service is paid,then this view can be used to show the price. */ export function PriceView(props: TextProps): JSX.Element; /** * Many times, the ad recieved will be from the Google Playstore or AppStore for iOS. * In that case, you can show the store name using this view. */ export function StoreView(props: TextProps): JSX.Element; /** * If you want to explicitly show only Images and no video etc, use ImageView. */ export function ImageView(props: ImagePropsWithOptionalSource): JSX.Element; /** * Icon/Logo of the adveriser shown inside this view */ export function IconView(props: ImagePropsWithOptionalSource): JSX.Element; /** * If the ad has images or video content. It will be loaded inside the MediaView. */ export function NativeMediaView(props: { style?: StyleProp<ViewStyle>; onVideoStart?: () => void; onVideoEnd?: () => void; onVideoPause?: () => void; onVideoPlay?: () => void; onVideoProgress?: (progress: { duration: string; currentTime: string; }) => void; onVideoMute?: (muted: boolean) => void; paused?: boolean; muted?: boolean; }): JSX.Element; /** * A simple button to open the adveriser website or store page etc. It is a simple * Text Component wrapped in a View. I dont know how to make the Touchables or Buttons * work since they have no effect. Native side does not recieve the call hence simple * Text Component is used to receive the clicks. */ export function CallToActionView(props: CallToActionViewProps): JSX.Element; /** * A Star Rating View to show the star rating for the app ads that you might recieve from * the server. */ export function StarRatingView(props: StarViewProps): JSX.Element; export const TestIds: { Video: string; Image: string; }; }