@cradokski/fullscreen
Version:
An Angular service that toggles the browser between Fullscreen and normal view. Includes optional **double-tap support** to prevent accidental toggling — useful on mobile/touch devices.
69 lines • 6.8 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class FullScreenService {
constructor() {
this.isFullscreen = false;
this.lastTapTime = null;
}
enterFullscreen() {
if (document.documentElement?.requestFullscreen) {
document.documentElement.requestFullscreen();
}
}
exitFullscreen() {
if (document?.fullscreenElement) {
document.exitFullscreen();
}
}
fullscreen() {
if (this.isFullscreen) {
this.isFullscreen = false;
this.exitFullscreen();
}
else {
this.isFullscreen = true;
this.enterFullscreen();
}
}
/**
* Toggle fullscreen with optional double-tap logic.
*
* @param options Optional. If requireDoubleTap is true, two quick calls are required.
* @returns True if fullscreen is now active, false otherwise.
*/
browserFsToggle(options) {
const requireDoubleTap = options?.requireDoubleTap ?? false;
const delayMs = options?.delayMs ?? 300;
if (!requireDoubleTap) {
this.fullscreen();
return this.isFullscreen;
}
const now = Date.now();
if (this.lastTapTime && now - this.lastTapTime < delayMs) {
this.lastTapTime = null;
this.fullscreen();
return this.isFullscreen;
}
else {
this.lastTapTime = now;
return this.isFullscreen; // unchanged
}
}
/**
* True if the document is currently in fullscreen mode.
*
* @returns True if fullscreen is active, false otherwise.
*/
isFullscreenActive() {
return this.isFullscreen;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: FullScreenService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: FullScreenService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: FullScreenService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHNjcmVlbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZnVsbHNjcmVlbi9zcmMvbGliL2Z1bGxzY3JlZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8saUJBQWlCO0lBSTVCO1FBSFEsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO0lBRTFCLENBQUM7SUFFakIsZUFBZTtRQUNiLElBQUksUUFBUSxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO1lBQ2hELFFBQVEsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsT0FBMEQ7UUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksS0FBSyxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDO1FBRXhDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0IsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFlBQVk7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDOzhHQTVEVSxpQkFBaUI7a0hBQWpCLGlCQUFpQixjQUZoQixNQUFNOzsyRkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGdWxsU2NyZWVuU2VydmljZSB7XG4gIHByaXZhdGUgaXNGdWxsc2NyZWVuID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdFRhcFRpbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgZW50ZXJGdWxsc2NyZWVuKCk6IHZvaWQge1xuICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/LnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH1cblxuICBleGl0RnVsbHNjcmVlbigpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnQ/LmZ1bGxzY3JlZW5FbGVtZW50KSB7XG4gICAgICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZnVsbHNjcmVlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgICB0aGlzLmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW50ZXJGdWxsc2NyZWVuKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBmdWxsc2NyZWVuIHdpdGggb3B0aW9uYWwgZG91YmxlLXRhcCBsb2dpYy5cbiAgICogXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsLiBJZiByZXF1aXJlRG91YmxlVGFwIGlzIHRydWUsIHR3byBxdWljayBjYWxscyBhcmUgcmVxdWlyZWQuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgZnVsbHNjcmVlbiBpcyBub3cgYWN0aXZlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBicm93c2VyRnNUb2dnbGUob3B0aW9ucz86IHsgcmVxdWlyZURvdWJsZVRhcD86IGJvb2xlYW47IGRlbGF5TXM/OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlcXVpcmVEb3VibGVUYXAgPSBvcHRpb25zPy5yZXF1aXJlRG91YmxlVGFwID8/IGZhbHNlO1xuICAgIGNvbnN0IGRlbGF5TXMgPSBvcHRpb25zPy5kZWxheU1zID8/IDMwMDtcblxuICAgIGlmICghcmVxdWlyZURvdWJsZVRhcCkge1xuICAgICAgdGhpcy5mdWxsc2NyZWVuKCk7XG4gICAgICByZXR1cm4gdGhpcy5pc0Z1bGxzY3JlZW47XG4gICAgfVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5sYXN0VGFwVGltZSAmJiBub3cgLSB0aGlzLmxhc3RUYXBUaW1lIDwgZGVsYXlNcykge1xuICAgICAgdGhpcy5sYXN0VGFwVGltZSA9IG51bGw7XG4gICAgICB0aGlzLmZ1bGxzY3JlZW4oKTtcbiAgICAgIHJldHVybiB0aGlzLmlzRnVsbHNjcmVlbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXN0VGFwVGltZSA9IG5vdztcbiAgICAgIHJldHVybiB0aGlzLmlzRnVsbHNjcmVlbjsgLy8gdW5jaGFuZ2VkXG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUcnVlIGlmIHRoZSBkb2N1bWVudCBpcyBjdXJyZW50bHkgaW4gZnVsbHNjcmVlbiBtb2RlLlxuICAgKiBcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBmdWxsc2NyZWVuIGlzIGFjdGl2ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNGdWxsc2NyZWVuQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRnVsbHNjcmVlbjtcbiAgfVxufVxuIl19