Skip to content

Commit

Permalink
Showing 44 changed files with 2,382 additions and 406 deletions.
31 changes: 31 additions & 0 deletions express_webpack/index.html
Original file line number Diff line number Diff line change
@@ -71,6 +71,15 @@
label: "Very Long Category",
}
]
},
{
type: "sms"
},
{
type: "email"
},
{
type: "smsAndEmail"
}]
},
customlink: {
@@ -119,6 +128,25 @@
OneSignal.showCategorySlidedown();
})
}

function showSmsSlidedown() {
OneSignal.push(function() {
OneSignal.showSmsSlidedown();
})
}

function showEmailSlidedown() {
OneSignal.push(function() {
OneSignal.showEmailSlidedown();
})
}

function showSmsAndEmailSlidedown() {
OneSignal.push(function() {
OneSignal.showSmsAndEmailSlidedown();
})
}

</script>
<head>
<meta charset="utf-8">
@@ -141,6 +169,9 @@ <h1>OneSignal WebSDK Sandbox</h1>
<br />
<br />
<button onclick="javascript:showCategorySlidedown();">Show Category Slidedown</button>
<button onclick="javascript:showSmsSlidedown();">Show Sms Slidedown</button>
<button onclick="javascript:showEmailSlidedown();">Show Email Slidedown</button>
<button onclick="javascript:showSmsAndEmailSlidedown();">Show Sms & Email Slidedown</button>
<br />
<br />
<div class='onesignal-customlink-container'></div>
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
"version": "1.2.0",
"description": "Web push notifications from OneSignal.",
"dependencies": {
"@types/intl-tel-input": "^17.0.1",
"bowser": "github:OneSignal/bowser#fix-android8-opr6-build-detection",
"jsdom": "^9.12.0",
"jsonp": "github:OneSignal/jsonp#onesignal",
@@ -129,7 +130,7 @@
},
{
"path": "./build/bundles/OneSignalPageSDKES6.js",
"maxSize": "64 kB",
"maxSize": "68 kB",
"compression": "gzip"
},
{
@@ -139,7 +140,7 @@
},
{
"path": "./build/bundles/OneSignalSDKStyles.css",
"maxSize": "8 kB",
"maxSize": "9 kB",
"compression": "gzip"
}
]
33 changes: 27 additions & 6 deletions src/OneSignal.ts
Original file line number Diff line number Diff line change
@@ -10,7 +10,6 @@ import HttpHelper from './helpers/HttpHelper';
import InitHelper, { RegisterOptions } from './helpers/InitHelper';
import MainHelper from './helpers/MainHelper';
import SubscriptionHelper from './helpers/SubscriptionHelper';
import TestHelper from './helpers/TestHelper';
import LimitStore from './LimitStore';
import AltOriginManager from './managers/AltOriginManager';
import LegacyManager from './managers/LegacyManager';
@@ -57,7 +56,7 @@ import { EnvironmentInfo } from './context/browser/models/EnvironmentInfo';
import { SessionManager } from './managers/sessionManager/page/SessionManager';
import OutcomesHelper from "./helpers/shared/OutcomesHelper";
import { OutcomeAttributionType } from "./models/Outcomes";
import { AppUserConfigNotifyButton } from './models/Prompts';
import { AppUserConfigNotifyButton, DelayedPromptType } from './models/Prompts';
import LocalStorage from './utils/LocalStorage';

export default class OneSignal {
@@ -369,8 +368,7 @@ export default class OneSignal {
* @PublicApi
*/
public static async showHttpPrompt(options?: AutoPromptOptions) {
await awaitOneSignalInitAndSupported();
await OneSignal.context.promptsManager.internalShowSlidedownPrompt(options);
await OneSignal.showSlidedownPrompt(options);
}

/**
@@ -388,7 +386,7 @@ export default class OneSignal {
*/
public static async showSlidedownPrompt(options?: AutoPromptOptions): Promise<void> {
await awaitOneSignalInitAndSupported();
await OneSignal.context.promptsManager.internalShowSlidedownPrompt(options);
await OneSignal.context.promptsManager.internalShowParticularSlidedown(DelayedPromptType.Push, options);
}

public static async showCategorySlidedown(options?: AutoPromptOptions): Promise<void> {
@@ -400,6 +398,27 @@ export default class OneSignal {
});
}

public static async showSmsSlidedown(options?: AutoPromptOptions): Promise<void> {
await awaitOneSignalInitAndSupported();
await OneSignal.context.promptsManager.internalShowSmsSlidedown({
...options,
});
}

public static async showEmailSlidedown(options?: AutoPromptOptions): Promise<void> {
await awaitOneSignalInitAndSupported();
await OneSignal.context.promptsManager.internalShowEmailSlidedown({
...options,
});
}

public static async showSmsAndEmailSlidedown(options?: AutoPromptOptions): Promise<void> {
await awaitOneSignalInitAndSupported();
await OneSignal.context.promptsManager.internalShowSmsAndEmailSlidedown({
...options,
});
}

/**
* Prompts the user to subscribe.
* @PublicApi
@@ -764,6 +783,7 @@ export default class OneSignal {
return await OneSignal.privateGetSubscription(callback);
}

// TO DO: consider renaming to something like privateGetOptedStatus
static async privateGetSubscription(callback?: Action<boolean>): Promise<boolean> {
logMethodCall('getSubscription', callback);
const subscription = await Database.getSubscription();
@@ -925,6 +945,7 @@ export default class OneSignal {
static _channel = null;
static timedLocalStorage = TimedLocalStorage;
static initialized = false;
static _didLoadITILibrary = false;
static notifyButton: AppUserConfigNotifyButton | null = null;
static store = LimitStore;
static environment = Environment;
@@ -940,7 +961,6 @@ export default class OneSignal {
static httpHelper = HttpHelper;
static eventHelper = EventHelper;
static initHelper = InitHelper;
static testHelper = TestHelper;
private static pendingInit: boolean = true;

static subscriptionPopup: SubscriptionPopup;
@@ -1103,6 +1123,7 @@ export default class OneSignal {
*/
TEST_INIT_OPTION_DISABLED: 'testInitOptionDisabled',
TEST_WOULD_DISPLAY: 'testWouldDisplay',
TEST_FINISHED_ALLOW_CLICK_HANDLING: 'testFinishedAllowClickHandling',
POPUP_WINDOW_TIMEOUT: 'popupWindowTimeout',
SESSION_STARTED: "os.sessionStarted",
};
4 changes: 3 additions & 1 deletion src/bell/Bell.ts
Original file line number Diff line number Diff line change
@@ -15,6 +15,8 @@ import Launcher from './Launcher';
import Message from './Message';
import Log from '../libraries/Log';
import OneSignal from "../OneSignal";
import { DismissHelper } from '../helpers/DismissHelper';
import { DismissPrompt } from '../models/Dismiss';

var logoSvg = `<svg class="onesignal-bell-svg" xmlns="http://www.w3.org/2000/svg" width="99.7" height="99.7" viewBox="0 0 99.7 99.7"><circle class="background" cx="49.9" cy="49.9" r="49.9"/><path class="foreground" d="M50.1 66.2H27.7s-2-.2-2-2.1c0-1.9 1.7-2 1.7-2s6.7-3.2 6.7-5.5S33 52.7 33 43.3s6-16.6 13.2-16.6c0 0 1-2.4 3.9-2.4 2.8 0 3.8 2.4 3.8 2.4 7.2 0 13.2 7.2 13.2 16.6s-1 11-1 13.3c0 2.3 6.7 5.5 6.7 5.5s1.7.1 1.7 2c0 1.8-2.1 2.1-2.1 2.1H50.1zm-7.2 2.3h14.5s-1 6.3-7.2 6.3-7.3-6.3-7.3-6.3z"/><ellipse class="stroke" cx="49.9" cy="49.9" rx="37.4" ry="36.9"/></svg>`;

@@ -386,7 +388,7 @@ export default class Bell {

const isPushEnabled = await OneSignal.isPushNotificationsEnabled();
const notOptedOut = await OneSignal.getSubscription();
const doNotPrompt = await MainHelper.wasHttpsNativePromptDismissed()
const doNotPrompt = DismissHelper.wasPromptOfTypeDismissed(DismissPrompt.Push);

// Resize to small instead of specified size if enabled, otherwise there's a jerking motion where the bell, at a different size than small, jerks sideways to go from large -> small or medium -> small
let resizeTo = (isPushEnabled ? 'small' : (this.options.size || this.DEFAULT_SIZE));
14 changes: 14 additions & 0 deletions src/config/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { DelayedPromptType, SlidedownPromptOptions } from "../../src/models/Prompts";

export const SERVER_CONFIG_DEFAULTS_SESSION = {
reportingThreshold: 30,
enableOnSessionForUnsubcribed: false,
@@ -20,4 +22,16 @@ export const SERVER_CONFIG_DEFAULTS_SLIDEDOWN = {
negativeUpdateButton: "Cancel"
},
savingText: "Saving...",
confirmMessage: "Thank You!"
};

export const CONFIG_DEFAULTS_SLIDEDOWN_OPTIONS: SlidedownPromptOptions = {
type : DelayedPromptType.Push,
text : {
actionMessage : SERVER_CONFIG_DEFAULTS_SLIDEDOWN.actionMessage,
acceptButton : SERVER_CONFIG_DEFAULTS_SLIDEDOWN.acceptButton,
cancelButton : SERVER_CONFIG_DEFAULTS_SLIDEDOWN.cancelButton
},
autoPrompt : false, // default to false
delay : SERVER_CONFIG_DEFAULTS_PROMPT_DELAYS
};
41 changes: 41 additions & 0 deletions src/errors/ChannelCaptureError.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import OneSignalError from "./OneSignalError";

export enum InvalidChannelInputField {
InvalidSms,
InvalidEmail,
InvalidEmailAndSms
}

export class ChannelCaptureError extends OneSignalError {
description: string;
reason: InvalidChannelInputField;

constructor(reason: InvalidChannelInputField) {
let errorMessage;
switch (reason) {
case InvalidChannelInputField.InvalidEmail:
errorMessage = `Invalid email`;
break;
case InvalidChannelInputField.InvalidSms:
errorMessage = `Invalid sms`;
break;
case InvalidChannelInputField.InvalidEmailAndSms:
errorMessage = `Invalid email & sms`;
break;
default:
break;
}

super(errorMessage);
this.description = InvalidChannelInputField[reason];
this.reason = reason;

/**
* Important! Required to make sure the correct error type is detected during instanceof checks.
* Same applies to all derived classes.
* https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md
* #extending-built-ins-like-error-array-and-map-may-no-longer-work
*/
Object.setPrototypeOf(this, ChannelCaptureError.prototype);
}
}
5 changes: 3 additions & 2 deletions src/errors/PermissionMessageDismissedError.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { DelayedPromptType } from "../models/Prompts";
import OneSignalError from "./OneSignalError";


export default class PermissionMessageDismissedError extends OneSignalError {
constructor() {
super('The permission message was previously dismissed.');
constructor(type?: DelayedPromptType) {
super(`The permission message of type ${type || 'unknown'} was previously dismissed.`);

/**
* Important! Required to make sure the correct error type is detected during instanceof checks.
41 changes: 13 additions & 28 deletions src/helpers/ConfigHelper.ts
Original file line number Diff line number Diff line change
@@ -9,14 +9,13 @@ import Utils from "../context/shared/utils/Utils";
import {
SERVER_CONFIG_DEFAULTS_SESSION,
SERVER_CONFIG_DEFAULTS_PROMPT_DELAYS,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN
SERVER_CONFIG_DEFAULTS_SLIDEDOWN,
CONFIG_DEFAULTS_SLIDEDOWN_OPTIONS
} from "../config";
import {
AppUserConfigCustomLinkOptions,
AppUserConfigPromptOptions,
DelayedPromptType,
SlidedownPromptOptions,
SlidedownDelayOptions,
} from '../models/Prompts';
import TagUtils from '../../src/utils/TagUtils';
import PromptsHelper from './PromptsHelper';
@@ -246,25 +245,28 @@ export class ConfigHelper {
if (promptOption.type === DelayedPromptType.Category) {
promptOption.text = {
...promptOption.text,
positiveUpdateButton: Utils.getValueOrDefault(promptOption.text.positiveUpdateButton,
positiveUpdateButton: Utils.getValueOrDefault(promptOption.text?.positiveUpdateButton,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN.categoryDefaults.positiveUpdateButton),
negativeUpdateButton: Utils.getValueOrDefault(promptOption.text.negativeUpdateButton,
negativeUpdateButton: Utils.getValueOrDefault(promptOption.text?.negativeUpdateButton,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN.categoryDefaults.negativeUpdateButton),
updateMessage: Utils.getValueOrDefault(promptOption.text.updateMessage,
updateMessage: Utils.getValueOrDefault(promptOption.text?.updateMessage,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN.categoryDefaults.updateMessage),
};
}

promptOption.text = {
...promptOption.text,
actionMessage: Utils.getValueOrDefault(promptOption?.text?.actionMessage,
actionMessage: Utils.getValueOrDefault(promptOption.text?.actionMessage,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN.actionMessage),
acceptButton: Utils.getValueOrDefault(promptOption?.text?.acceptButton,
acceptButton: Utils.getValueOrDefault(promptOption.text?.acceptButton,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN.acceptButton),
cancelButton: Utils.getValueOrDefault(promptOption?.text?.cancelButton,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN.cancelButton)
cancelButton: Utils.getValueOrDefault(promptOption.text?.cancelButton,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN.cancelButton),
confirmMessage: Utils.getValueOrDefault(promptOption.text?.confirmMessage,
SERVER_CONFIG_DEFAULTS_SLIDEDOWN.confirmMessage)
};

// default autoPrompt to true iff slidedown config exists but omitted the autoPrompt setting
promptOption.autoPrompt = Utils.getValueOrDefault(promptOption.autoPrompt, true);

promptOption.delay = {
@@ -284,24 +286,7 @@ export class ConfigHelper {

} else {
promptOptionsConfig.slidedown = { prompts: [] };

const delayOptions : SlidedownDelayOptions = {
timeDelay: SERVER_CONFIG_DEFAULTS_PROMPT_DELAYS.timeDelay,
pageViews: SERVER_CONFIG_DEFAULTS_PROMPT_DELAYS.pageViews
};

const defaultSlidedownOptions : SlidedownPromptOptions = {
type : DelayedPromptType.Push,
text : {
actionMessage : SERVER_CONFIG_DEFAULTS_SLIDEDOWN.actionMessage,
acceptButton : SERVER_CONFIG_DEFAULTS_SLIDEDOWN.acceptButton,
cancelButton : SERVER_CONFIG_DEFAULTS_SLIDEDOWN.cancelButton
},
autoPrompt : false, // default to false
delay : delayOptions
};

promptOptionsConfig.slidedown.prompts = [defaultSlidedownOptions];
promptOptionsConfig.slidedown.prompts = [ CONFIG_DEFAULTS_SLIDEDOWN_OPTIONS ];
}

if (promptOptionsConfig.native) {
Loading

0 comments on commit fcb1b4a

Please sign in to comment.