From 0eeca2be5c1d97005c4d194a04c9727f2046075f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 1 Aug 2022 23:03:16 -0500 Subject: [PATCH] Add Rumble AdProvider --- app/soapbox/features/ads/providers/index.ts | 1 + app/soapbox/features/ads/providers/rumble.ts | 45 ++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 app/soapbox/features/ads/providers/rumble.ts diff --git a/app/soapbox/features/ads/providers/index.ts b/app/soapbox/features/ads/providers/index.ts index 69b8800a4..65e593985 100644 --- a/app/soapbox/features/ads/providers/index.ts +++ b/app/soapbox/features/ads/providers/index.ts @@ -6,6 +6,7 @@ import type { Card } from 'soapbox/types/entities'; /** Map of available provider modules. */ const PROVIDERS: Record Promise> = { soapbox: async() => (await import(/* webpackChunkName: "features/ads/soapbox" */'./soapbox-config')).default, + rumble: async() => (await import(/* webpackChunkName: "features/ads/rumble" */'./rumble')).default, }; /** Ad server implementation. */ diff --git a/app/soapbox/features/ads/providers/rumble.ts b/app/soapbox/features/ads/providers/rumble.ts new file mode 100644 index 000000000..17c4abea8 --- /dev/null +++ b/app/soapbox/features/ads/providers/rumble.ts @@ -0,0 +1,45 @@ +import { getSoapboxConfig } from 'soapbox/actions/soapbox'; +import { normalizeCard } from 'soapbox/normalizers'; + +import type { AdProvider } from '.'; + +/** Rumble ad API entity. */ +interface RumbleAd { + type: number, + impression: string, + click: string, + asset: string, + expires: number, +} + +/** Response from Rumble ad server. */ +interface RumbleApiResponse { + count: number, + ads: RumbleAd[], +} + +/** Provides ads from Soapbox Config. */ +const RumbleAdProvider: AdProvider = { + getAds: async(getState) => { + const state = getState(); + const soapboxConfig = getSoapboxConfig(state); + const endpoint = soapboxConfig.extensions.getIn(['ads', 'endpoint']) as string | undefined; + + if (endpoint) { + const response = await fetch(endpoint); + const data = await response.json() as RumbleApiResponse; + return data.ads.map(item => ({ + impression: item.impression, + card: normalizeCard({ + type: item.type === 1 ? 'Link' : 'Rich', + image: item.asset, + url: item.click, + }), + })); + } else { + return []; + } + }, +}; + +export default RumbleAdProvider;