Skip to content

Instantly share code, notes, and snippets.

@pSapien
Created August 3, 2023 12:45
Show Gist options
  • Select an option

  • Save pSapien/454ea1b43f59477b571e89d83229e5fb to your computer and use it in GitHub Desktop.

Select an option

Save pSapien/454ea1b43f59477b571e89d83229e5fb to your computer and use it in GitHub Desktop.

Revisions

  1. pSapien created this gist Aug 3, 2023.
    166 changes: 166 additions & 0 deletions admob.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,166 @@
    import React, { useEffect, useState } from 'react';
    import { NativeModules, NativeEventEmitter, EmitterSubscription, Button } from 'react-native';

    const { Yodo1MASAds } = NativeModules;

    const Constants = {
    EVENT_NAME: 'yodo1ad',
    INIT_SUCCESS: 'init-success',
    INIT_FAILURE: 'init-failure',
    REWARD_LOAD_SUCCESS: 'reward-load-success',
    REWARD_LOAD_FAILURE: 'reward-load-failure',
    REWARD_OPENED_SUCCESS: 'reward-open-success',
    REWARD_OPENED_FAILURE: 'reward-open-failure',
    REWARD_CLOSED: 'reward-closed',
    REWARD_EARNED: 'reward-earned',
    INTERSTITIAL_LOAD_SUCCESS: 'interstitial-load-success',
    INTERSTITIAL_LOAD_FAILURE: 'interstitial-load-failure',
    INTERSTITIAL_OPENED_SUCCESS: 'interstitial-open-success',
    INTERSTITIAL_OPENED_FAILURE: 'interstitial-open-failure',
    INTERSTITIAL_CLOSED: 'interstitial-closed',
    INTERSTITIAL_EARNED: 'interstitial-earned',
    } as const;

    const nativeYodoEmitter = new NativeEventEmitter(NativeModules.Yodo1MASAds);
    type YodoEvent = {
    type: typeof Constants[keyof typeof Constants];
    error: string;
    };

    type State = (() => void) | null;

    class Subscription {
    subscribers = new Set<(args: State) => void>();
    state: State = null;

    getState() {
    return this.state as State;
    }

    subscribe(subFn: () => void) {
    this.subscribers.add(subFn);

    return () => {
    this.subscribers.delete(subFn);
    };
    }

    dispatch = (subValue: State) => {
    this.state = subValue;
    this.subscribers.forEach(s => s(subValue));
    };
    }

    type RewardedAdReward = { type: 'diamonds', amount: number };
    type ReturnPromiseFn = ((value: RewardedAdReward | null) => void) | null;
    type ReturnInterFn = () => void;

    class AdManager {
    key: string;
    interAdSubscription = new Subscription();
    rewardedAdSubscription = new Subscription();
    initializedCalled = false;
    returnRewardPromiseFn: ReturnPromiseFn = null;
    returnInterPromiseFn: ReturnInterFn = null;

    constructor(key: string) {
    this.key = key;
    }

    public init = () => {
    let yodoSub: EmitterSubscription | null = null;

    if (!this.initializedCalled) {
    yodoSub = nativeYodoEmitter.addListener('yodo1ad', (event: YodoEvent) => {
    console.log('this is the yodoad', event);

    switch (event.type) {
    case Constants.INIT_SUCCESS:
    Yodo1MASAds.loadRewardedAds();
    Yodo1MASAds.loadInterstitialAds();
    break;

    case Constants.INTERSTITIAL_LOAD_SUCCESS:
    this.interAdSubscription.dispatch(() => this.showInterAd);
    break;

    case Constants.INTERSTITIAL_OPENED_SUCCESS:
    this.interAdSubscription.dispatch(null);
    break;

    case Constants.INTERSTITIAL_CLOSED:
    case Constants.INTERSTITIAL_LOAD_FAILURE:
    case Constants.INTERSTITIAL_OPENED_FAILURE:
    this.returnInterPromiseFn();
    this.returnInterPromiseFn = null;
    Yodo1MASAds.loadInterstitialAds();
    break;

    case Constants.REWARD_LOAD_SUCCESS:
    this.rewardedAdSubscription.dispatch(() => this.showRewardAd);
    break;

    case Constants.REWARD_OPENED_SUCCESS:
    this.rewardedAdSubscription.dispatch(null);
    break;

    case Constants.REWARD_EARNED:
    this.returnRewardPromiseFn({ type: 'diamonds', amount: 10 });
    this.returnRewardPromiseFn = null;
    break;

    case Constants.REWARD_CLOSED:
    case Constants.REWARD_LOAD_FAILURE:
    case Constants.REWARD_OPENED_FAILURE:
    if (this.returnRewardPromiseFn) this.returnRewardPromiseFn(null);
    this.returnRewardPromiseFn = null;
    Yodo1MASAds.loadRewardedAds();
    break;

    default:
    break;
    }
    });

    Yodo1MASAds.initSdk(this.key);
    this.initializedCalled = true;
    }

    return () => {
    if (yodoSub) yodoSub.remove();
    };
    };

    private showRewardAd = async () => {
    return new Promise<RewardedAdReward | null>((resolve) => {
    this.returnRewardPromiseFn = resolve;
    Yodo1MASAds.showRewardedAds();
    });
    }

    private showInterAd = async () => {
    return new Promise<void>((resolve) => {
    this.returnInterPromiseFn = resolve;
    Yodo1MASAds.showInterstitialAds();
    });
    }
    }

    const adManager = new AdManager(global.YODO_ADMOB_APP_KEY);

    export function useInitAdmob(): null {
    useEffect(() => adManager.init(), []);
    return null;
    }

    export function useInterstitialAd() {
    const [showFn, setShowFn] = useState(adManager.interAdSubscription.getState());
    useEffect(() => adManager.interAdSubscription.subscribe(setShowFn), []);
    return showFn;
    }

    export function useRewardAd() {
    const [showFn, setShowFn] = useState(adManager.rewardedAdSubscription.getState());
    useEffect(() => adManager.rewardedAdSubscription.subscribe(setShowFn), []);
    return showFn;
    }