UNPKG

@abl-solutions/wifi-connect

Version:

The WiFi Connect React Native SDK enables the use of WiFi WPA2-Enterprise networks on mobile devices that are managed and operated by abl solutions GmbH

125 lines (104 loc) 4.19 kB
import { throwOnInvliadResponse } from './http'; export interface CampaignOptions { /** * An access token that allows access to the Campaign API for the current user. */ accessToken: string; /** * Optionally set a different REST API endpoint that should be used by this library. */ campaignApiEndpoint?: string; } export interface Notification { title: string | null; body: string | null; } export type WifiConfigType = 'SURFTIME' | 'TIMESPAN'; export interface Campaign { campaignUrl: string; required: boolean; notification: Notification; timeUntilNextCampaignToWatch: number; /** * Type of wifi mode * If TIMESPAN -> Campaigns will be required to watch each time after defined time period to prolong access to wifi (for instance every 5 mins) * If SURFTIME -> Campaigns will be sent depending on connection session (eg 5 mins set -> after connection to access point session started and tracking * -> if user stop connection or leaving access point and used 3 mins from 5 -> timer stop tracking/campaign not required to watch -> next time user connecting * to the access point -> timer continue track time and sending campaign to prolong access to wifi after last 2 mins of limit will be reached) */ type: WifiConfigType; } export interface CampaignService { /** * Get the next campaign that should be shown to the user. * @param deviceId A string that uniquely identifies this device. * @returns A promise that resolves to a `Campaign` object if the * campaign was fetched successfully. Rejects if fetching the next * campaign failed for any reason. * The `Campaign` object contains a flag `Campaign.required` that will * be `true` if the user needs to watch a campaign. This will be the case * if the timespan since watching the last campaign is greater than the * configured timespan. If `Campaign.required` is `false` then it is not * necessary to watch a campaign. */ getNextCampaign(deviceId: string): Promise<Campaign>; /** * Method for checking when campaign view should be closed * @param campaignUrl A string to campaign */ shouldCloseCampaignView(campaignUrl: string): boolean; } export class CampaignServiceImpl implements CampaignService { private readonly options: Required<CampaignOptions>; constructor(campaignOptions: CampaignOptions) { this.throwIfInvalidOptions(campaignOptions); this.options = this.mergeWithDefaultOptions(campaignOptions); } public async getNextCampaign(deviceId: string): Promise<Campaign> { const endpoint = `${this.options.campaignApiEndpoint}/api/v1/campaigns/next?deviceId=${deviceId}`; var response = await fetch(endpoint, { method: 'GET', headers: { Authorization: `Bearer ${this.options.accessToken}`, Accept: 'application/json', }, }); const body: Campaign = await response.json(); throwOnInvliadResponse(response.status, body); // copy the values to ensure that the response always contains the required properties return { campaignUrl: body?.campaignUrl, required: body?.required ?? false, notification: { title: body?.notification?.title, body: body?.notification?.body, }, type: body?.type, timeUntilNextCampaignToWatch: body?.timeUntilNextCampaignToWatch || 0, }; } public shouldCloseCampaignView(campaignUrl: string): boolean { return campaignUrl.includes('close_campaign=true'); } private mergeWithDefaultOptions( options: CampaignOptions ): Required<CampaignOptions> { return { accessToken: options.accessToken, campaignApiEndpoint: options?.campaignApiEndpoint || 'https://api.wifi-connect.campaign-manager.ads.abl-solutions.io', }; } private throwIfInvalidOptions(options: CampaignOptions) { if (!options) { throw new Error('CampaignOptions must be not null.'); } if (!options.accessToken) { throw new Error('CampaignOptions.accessToken must be not null.'); } if (options.accessToken === '') { throw new Error('CampaignOptions.accessToken must be not empty.'); } } }