bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/wake-lock/service.js

100 lines
2.4 KiB
JavaScript
Raw Normal View History

import logger from '/imports/startup/client/logger';
import deviceInfo from '/imports/utils/deviceInfo';
const WAKELOCK_ERRORS = {
NOT_SUPPORTED: {
locale: 'wakeLockNotSupported',
error: 'wake_lock_not_supported',
},
REQUEST_FAILED: {
locale: 'wakeLockAcquireFailed',
error: 'wake_lock_request_error',
},
};
class WakeLock {
constructor() {
this.sentinel = null;
this.apiSupport = 'wakeLock' in navigator;
}
static isEnabled() {
const WAKELOCK_ENABLED = window.meetingClientSettings.public.app.wakeLock.enabled;
return WAKELOCK_ENABLED;
}
isSupported() {
const { isMobile } = deviceInfo;
return WakeLock.isEnabled() && this.apiSupport && isMobile;
}
isMobile() {
const { isMobile } = deviceInfo;
return isMobile;
}
isActive() {
return this.sentinel !== null;
}
handleVisibilityChanged() {
if (document.visibilityState === 'visible') {
this.request();
}
}
handleRelease() {
document.removeEventListener('visibilitychange', this.handleVisibilityChanged);
this.sentinel = null;
}
async request() {
if (!this.isSupported()) {
logger.warn({
logCode: WAKELOCK_ERRORS.NOT_SUPPORTED.error,
}, 'Wake lock API not supported');
return {
...WAKELOCK_ERRORS.NOT_SUPPORTED,
msg: 'Wake lock API not supported',
};
}
try {
this.sentinel = await navigator.wakeLock.request('screen');
this.sentinel.addEventListener('release', this.handleRelease);
document.addEventListener('visibilitychange', this.handleVisibilityChanged.bind(this));
document.addEventListener('fullscreenchange', this.handleVisibilityChanged.bind(this));
} catch (err) {
logger.warn({
logCode: WAKELOCK_ERRORS.REQUEST_FAILED.error,
extraInfo: {
errorName: err.name,
errorMessage: err.message,
},
}, 'Error requesting wake lock.');
return {
...WAKELOCK_ERRORS.REQUEST_FAILED,
msg: `${err.name} - ${err.message}`,
};
}
return {
error: false,
};
}
release() {
if (this.isActive()) this.sentinel.release();
}
}
const wakeLock = new WakeLock();
export default {
isEnabled: () => wakeLock.isEnabled(),
isSupported: () => wakeLock.isSupported(),
isMobile: () => wakeLock.isMobile(),
isActive: () => wakeLock.isActive(),
request: () => wakeLock.request(),
release: () => wakeLock.release(),
};