(function (root, factory) { if (typeof module === 'object' && module.exports) module.exports = factory; else root.createMobileDeviceSetup = factory; })(typeof self !== 'undefined' ? self : this, function createMobileDeviceSetup(options) { const steps = [ ['install', options.installButton, options.installStatus, options.install], ['offline', options.offlineButton, options.offlineStatus, options.enableOffline], ['push', options.pushButton, options.pushStatus, options.enablePush], ]; let trigger = options.launcher; async function render() { const readiness = await options.getReadiness(); let available = 0; let complete = 0; steps.forEach(([name, button, status]) => { const step = readiness[name]; status.textContent = step.detail; button.hidden = step.state === 'complete' || step.state === 'unavailable'; button.disabled = step.state === 'pending'; if (step.state !== 'unavailable') available += 1; if (step.state === 'complete') complete += 1; }); options.readyStatus.textContent = complete === available ? 'This device is ready.' : `${complete} of ${available} available steps ready.`; return readiness; } async function open(event) { trigger = event?.currentTarget || options.launcher; await render(); options.sheet.hidden = false; options.closeButton.focus(); } function close() { options.sheet.hidden = true; trigger?.focus?.(); } function start() { options.launcher.addEventListener('click', open); options.closeButton.addEventListener('click', close); options.sheet.addEventListener('click', event => { if (event.target === options.sheet) close(); }); options.escapeTarget.addEventListener('keydown', event => { if (event.key === 'Escape' && !options.sheet.hidden) close(); }); steps.forEach(([_name, button, _status, action]) => { button.addEventListener('click', async () => { button.disabled = true; try { await action(); } finally { await render(); } }); }); } return {start, open, close, render}; }); if (typeof module === 'object' && module.exports) { module.exports.mount = mountMobileDeviceSetup; } else { self.createMobileDeviceSetup.mount = mountMobileDeviceSetup; } function mountMobileDeviceSetup(options) { const qs = selector => options.document.querySelector(selector); return createMobileDeviceSetup({ launcher:qs('#open-device-setup'), closeButton:qs('#close-device-setup'), sheet:qs('#device-setup-sheet'), installButton:qs('#device-setup-install'), offlineButton:qs('#device-setup-offline'), pushButton:qs('#device-setup-push'), installStatus:qs('#device-setup-install-status'), offlineStatus:qs('#device-setup-offline-status'), pushStatus:qs('#device-setup-push-status'), readyStatus:qs('#device-setup-ready-status'), escapeTarget:options.document, getReadiness:() => ({ install:options.installApp.state(), offline:!options.offlineAvailable() ? {state:'unavailable', detail:'Offline saving is unavailable in this browser.'} : options.offlineEnabled() ? {state:'complete', detail:qs('#offline-work-status').textContent || 'Offline work is saved.'} : {state:'incomplete', detail:'Private My Work and Today data are not saved offline.'}, push:qs('#push-updates').disabled ? {state:'unavailable', detail:qs('#push-update-status').textContent || 'Update notifications are unavailable.'} : qs('#push-updates').checked ? {state:'complete', detail:'New update notifications are enabled.'} : {state:'incomplete', detail:qs('#push-update-status').textContent || 'New update notifications are off.'}, }), install:() => options.installApp.install(), enableOffline:options.enableOffline, enablePush:options.enablePush, }); }