| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import i18next from 'i18next';
-
- import {
- setPrejoinPageVisibility,
- setSkipPrejoinOnReload
- } from '../../prejoin/actions.web';
- import { hangup } from '../connection/actions.web';
- import { JitsiConferenceErrors } from '../lib-jitsi-meet';
- import MiddlewareRegistry from '../redux/MiddlewareRegistry';
-
- import {
- CONFERENCE_FAILED,
- CONFERENCE_JOINED,
- CONFERENCE_JOIN_IN_PROGRESS,
- CONFERENCE_LEFT,
- KICKED_OUT
- } from './actionTypes';
- import { TRIGGER_READY_TO_CLOSE_REASONS } from './constants';
- import logger from './logger';
-
- import './middleware.any';
-
- let screenLock: WakeLockSentinel | undefined;
-
- /**
- * Releases the screen lock.
- *
- * @returns {Promise}
- */
- async function releaseScreenLock() {
- if (screenLock) {
- if (!screenLock.released) {
- logger.debug('Releasing wake lock.');
-
- try {
- await screenLock.release();
- } catch (e) {
- logger.error(`Error while releasing the screen wake lock: ${e}.`);
- }
- }
- screenLock.removeEventListener('release', onWakeLockReleased);
- screenLock = undefined;
- document.removeEventListener('visibilitychange', handleVisibilityChange);
- }
- }
-
- /**
- * Requests a new screen wake lock.
- *
- * @returns {void}
- */
- function requestWakeLock() {
- if (navigator.wakeLock?.request) {
- navigator.wakeLock.request('screen')
- .then(lock => {
- screenLock = lock;
- screenLock.addEventListener('release', onWakeLockReleased);
- document.addEventListener('visibilitychange', handleVisibilityChange);
- logger.debug('Wake lock created.');
- })
- .catch(e => {
- logger.error(`Error while requesting wake lock for screen: ${e}`);
- });
- }
- }
-
- /**
- * Page visibility change handler that re-requests the wake lock if it has been released by the OS.
- *
- * @returns {void}
- */
- async function handleVisibilityChange() {
- if (screenLock?.released && document.visibilityState === 'visible') {
- // The screen lock have been released by the OS because of document visibility change. Lets try to request the
- // wake lock again.
- await releaseScreenLock();
- requestWakeLock();
- }
- }
-
- /**
- * Wake lock released handler.
- *
- * @returns {void}
- */
- function onWakeLockReleased() {
- logger.debug('Wake lock released');
- }
-
- MiddlewareRegistry.register(store => next => action => {
- const { dispatch, getState } = store;
- const { enableForcedReload } = getState()['features/base/config'];
-
- switch (action.type) {
- case CONFERENCE_JOIN_IN_PROGRESS: {
- dispatch(setPrejoinPageVisibility(false));
-
- break;
- }
- case CONFERENCE_JOINED: {
- if (enableForcedReload) {
- dispatch(setSkipPrejoinOnReload(false));
- }
-
- requestWakeLock();
-
- break;
- }
- case CONFERENCE_FAILED: {
- const errorName = action.error?.name;
-
- if (enableForcedReload && errorName === JitsiConferenceErrors.CONFERENCE_RESTARTED) {
- dispatch(setSkipPrejoinOnReload(true));
- }
-
- if (errorName === JitsiConferenceErrors.CONFERENCE_DESTROYED) {
- const [ reason ] = action.error.params;
- const titlekey = Object.keys(TRIGGER_READY_TO_CLOSE_REASONS)[
- Object.values(TRIGGER_READY_TO_CLOSE_REASONS).indexOf(reason)
- ];
-
- dispatch(hangup(true, i18next.t(titlekey) || reason));
- }
-
- releaseScreenLock();
-
- break;
- }
- case CONFERENCE_LEFT:
- case KICKED_OUT:
- releaseScreenLock();
-
- break;
- }
-
- return next(action);
- });
|