80 lines
2.4 KiB
JavaScript
80 lines
2.4 KiB
JavaScript
(function (root, factory) {
|
|
if (typeof module === 'object' && module.exports) module.exports = factory;
|
|
else root.createInstallApp = factory;
|
|
})(typeof self !== 'undefined' ? self : this, function createInstallApp(options) {
|
|
const dismissedKey = 'stackchain.install.dismissed.v1';
|
|
let deferredPrompt = options.initialPrompt || null;
|
|
let installed = false;
|
|
|
|
function hide() {
|
|
options.card.hidden = true;
|
|
}
|
|
|
|
function showNativePrompt(event) {
|
|
event.preventDefault();
|
|
deferredPrompt = event;
|
|
options.guidance.hidden = true;
|
|
options.installButton.hidden = false;
|
|
options.card.hidden = false;
|
|
}
|
|
|
|
async function install() {
|
|
if (!deferredPrompt) return;
|
|
const prompt = deferredPrompt;
|
|
deferredPrompt = null;
|
|
options.installButton.disabled = true;
|
|
await prompt.prompt();
|
|
const choice = await prompt.userChoice;
|
|
if (choice.outcome === 'accepted') {
|
|
installed = true;
|
|
hide();
|
|
options.status.textContent = 'Stackchain was added to your device.';
|
|
} else {
|
|
hide();
|
|
options.installButton.disabled = false;
|
|
options.status.textContent = 'Installation was not completed.';
|
|
}
|
|
}
|
|
|
|
function dismiss() {
|
|
options.storage.setItem(dismissedKey, '1');
|
|
hide();
|
|
}
|
|
|
|
function start() {
|
|
if (options.isStandalone() || options.storage.getItem(dismissedKey) === '1') {
|
|
hide();
|
|
return;
|
|
}
|
|
if (deferredPrompt) showNativePrompt(deferredPrompt);
|
|
if (options.isIosSafari()) {
|
|
options.installButton.hidden = true;
|
|
options.guidance.hidden = false;
|
|
options.card.hidden = false;
|
|
}
|
|
options.window.addEventListener('beforeinstallprompt', showNativePrompt);
|
|
options.window.addEventListener('appinstalled', () => {
|
|
installed = true;
|
|
deferredPrompt = null;
|
|
hide();
|
|
});
|
|
options.installButton.addEventListener('click', install);
|
|
options.dismissButton.addEventListener('click', dismiss);
|
|
}
|
|
|
|
function state() {
|
|
if (installed || options.isStandalone()) {
|
|
return {state:'complete', detail:'Stackchain is installed on this device.'};
|
|
}
|
|
if (options.isIosSafari()) {
|
|
return {state:'incomplete', detail:'On Safari, tap Share, then Add to Home Screen.'};
|
|
}
|
|
if (deferredPrompt) {
|
|
return {state:'incomplete', detail:'Stackchain is ready to install.'};
|
|
}
|
|
return {state:'unavailable', detail:'Installation is available from a supported browser.'};
|
|
}
|
|
|
|
return {start, install, state};
|
|
});
|