diff --git a/front/dist/index.tmpl.html b/front/dist/index.tmpl.html
index 40f437c8..b381c0fb 100644
--- a/front/dist/index.tmpl.html
+++ b/front/dist/index.tmpl.html
@@ -86,9 +86,15 @@
diff --git a/front/dist/resources/style/style.css b/front/dist/resources/style/style.css
index ff79245c..a003e10b 100644
--- a/front/dist/resources/style/style.css
+++ b/front/dist/resources/style/style.css
@@ -403,6 +403,18 @@ body {
visibility: hidden;
display: none;
}
+#audioplayer_volume_icon_playing.low #audioplayer_volume_icon_playing_high {
+ visibility: hidden;
+ display: none;
+}
+#audioplayer_volume_icon_playing.low #audioplayer_volume_icon_playing_mid {
+ visibility: hidden;
+ display: none;
+}
+#audioplayer_volume_icon_playing.mid #audioplayer_volume_icon_playing_high {
+ visibility: hidden;
+ display: none;
+}
#audioplayerctrl > #audioplayer_volume {
width: 100%;
background-color: rgba(0,0,0,0.5);
diff --git a/front/src/Api/IframeListener.ts b/front/src/Api/IframeListener.ts
index c875ebbb..0222351d 100644
--- a/front/src/Api/IframeListener.ts
+++ b/front/src/Api/IframeListener.ts
@@ -52,6 +52,9 @@ class IframeListener {
private readonly _removeBubbleStream: Subject = new Subject();
public readonly removeBubbleStream = this._removeBubbleStream.asObservable();
+ private readonly _unregisterIFrameStream: Subject = new Subject();
+ public readonly unregisterIFrameStream = this._unregisterIFrameStream.asObservable();
+
private readonly iframes = new Set();
private readonly scripts = new Map();
@@ -119,6 +122,7 @@ class IframeListener {
}
unregisterIframe(iframe: HTMLIFrameElement): void {
+ this._unregisterIFrameStream.next();
this.iframes.delete(iframe);
}
diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts
index 990f702c..d0ffdbd3 100644
--- a/front/src/Phaser/Game/GameScene.ts
+++ b/front/src/Phaser/Game/GameScene.ts
@@ -852,6 +852,25 @@ ${escapedMessage}
scriptedBubbleSprite.destroy();
}));
+ this.iframeSubscriptionList.push(iframeListener.unregisterIFrameStream.subscribe(() => {
+ const allProps = this.gameMap.getCurrentProperties();
+ if(allProps.get("openWebsite") == null) {
+ layoutManager.removeActionButton('openWebsite', this.userInputManager);
+ } else {
+ const openWebsiteFunction = () => {
+ coWebsiteManager.loadCoWebsite(allProps.get("openWebsite") as string, this.MapUrlFile, allProps.get('openWebsiteAllowApi') as boolean | undefined, allProps.get('openWebsitePolicy') as string | undefined);
+ layoutManager.removeActionButton('openWebsite', this.userInputManager);
+ };
+
+ let message = allProps.get(WEBSITE_MESSAGE_PROPERTIES);
+ if(message === undefined) {
+ message = 'Press SPACE or touch here to open web site';
+ }
+ layoutManager.addActionButton('openWebsite', message.toString(), () => {
+ openWebsiteFunction();
+ }, this.userInputManager);
+ }
+ }));
}
private getMapDirUrl(): string {
@@ -1456,6 +1475,33 @@ ${escapedMessage}
mediaManager.showGameOverlay();
mediaManager.removeTriggerCloseJitsiFrameButton('close-jisi');
+
+ const allProps = this.gameMap.getCurrentProperties();
+
+ if(allProps.get("jitsiRoom") === undefined) {
+ layoutManager.removeActionButton('jitsiRoom', this.userInputManager);
+ } else {
+ const openJitsiRoomFunction = () => {
+ const roomName = jitsiFactory.getRoomName(allProps.get("jitsiRoom") as string, this.instance);
+ const jitsiUrl = allProps.get("jitsiUrl") as string | undefined;
+ if(JITSI_PRIVATE_MODE && !jitsiUrl) {
+ const adminTag = allProps.get("jitsiRoomAdminTag") as string | undefined;
+
+ this.connection.emitQueryJitsiJwtMessage(roomName, adminTag);
+ } else {
+ this.startJitsi(roomName, undefined);
+ }
+ layoutManager.removeActionButton('jitsiRoom', this.userInputManager);
+ }
+
+ let message = allProps.get(JITSI_MESSAGE_PROPERTIES);
+ if(message === undefined) {
+ message = 'Press SPACE or touch here to enter Jitsi Meet room';
+ }
+ layoutManager.addActionButton('jitsiRoom', message.toString(), () => {
+ openJitsiRoomFunction();
+ }, this.userInputManager);
+ }
}
//todo: put this into an 'orchestrator' scene (EntryScene?)
diff --git a/front/src/WebRtc/AudioManager.ts b/front/src/WebRtc/AudioManager.ts
index 60255a77..94488b4e 100644
--- a/front/src/WebRtc/AudioManager.ts
+++ b/front/src/WebRtc/AudioManager.ts
@@ -11,7 +11,7 @@ enum audioStates {
const audioPlayerDivId = "audioplayer";
const audioPlayerCtrlId = "audioplayerctrl";
const audioPlayerVolId = "audioplayer_volume";
-const audioPlayerMuteId = "audioplayer_volume_icon_playing";
+const audioPlayerVolumeIconId = "audioplayer_volume_icon_playing";
const animationTime = 500;
class AudioManager {
@@ -21,7 +21,7 @@ class AudioManager {
private audioPlayerCtrl: HTMLDivElement;
private audioPlayerElem: HTMLAudioElement | undefined;
private audioPlayerVol: HTMLInputElement;
- private audioPlayerMute: HTMLInputElement;
+ private audioPlayerVolumeIcon: HTMLInputElement;
private volume = 1;
private muted = false;
@@ -32,15 +32,12 @@ class AudioManager {
this.audioPlayerDiv = HtmlUtils.getElementByIdOrFail(audioPlayerDivId);
this.audioPlayerCtrl = HtmlUtils.getElementByIdOrFail(audioPlayerCtrlId);
this.audioPlayerVol = HtmlUtils.getElementByIdOrFail(audioPlayerVolId);
- this.audioPlayerMute = HtmlUtils.getElementByIdOrFail(audioPlayerMuteId);
+ this.audioPlayerVolumeIcon = HtmlUtils.getElementByIdOrFail(audioPlayerVolumeIconId);
this.volume = localUserStore.getAudioPlayerVolume();
this.audioPlayerVol.value = '' + this.volume;
this.muted = localUserStore.getAudioPlayerMuted();
- if (this.muted) {
- this.audioPlayerMute.classList.add('muted');
- }
}
public playAudio(url: string|number|boolean, mapDirUrl: string, volume: number|undefined, loop=false): void {
@@ -93,7 +90,22 @@ class AudioManager {
this.volumeReduced = reduceVolume;
this.audioPlayerElem.volume = this.volume;
- this.audioPlayerVol.value = '' + this.volume;
+ if (this.muted) {
+ this.audioPlayerVol.value = '0';
+ this.audioPlayerVolumeIcon.classList.add('muted');
+ } else {
+ this.audioPlayerVol.value = '' + this.volume;
+ this.audioPlayerVolumeIcon.classList.remove('muted');
+ if (this.volume < 0.3) {
+ this.audioPlayerVolumeIcon.classList.add('low');
+ } else if (this.volume < 0.7) {
+ this.audioPlayerVolumeIcon.classList.remove('low');
+ this.audioPlayerVolumeIcon.classList.add('mid');
+ } else {
+ this.audioPlayerVolumeIcon.classList.remove('low');
+ this.audioPlayerVolumeIcon.classList.remove('mid');
+ }
+ }
this.audioPlayerElem.muted = this.muted;
}
@@ -129,18 +141,14 @@ class AudioManager {
this.muted = !this.muted;
this.changeVolume();
localUserStore.setAudioPlayerMuted(this.muted);
-
- if (this.muted) {
- this.audioPlayerMute.classList.add('muted');
- } else {
- this.audioPlayerMute.classList.remove('muted');
- }
}
this.audioPlayerVol.oninput = (ev: Event)=> {
this.setVolume(parseFloat((ev.currentTarget).value));
+ this.muted = false;
this.changeVolume();
-
+ localUserStore.setAudioPlayerMuted(this.muted);
+
(ev.currentTarget).blur();
}
diff --git a/front/src/WebRtc/CoWebsiteManager.ts b/front/src/WebRtc/CoWebsiteManager.ts
index 95885a53..6d8aa43b 100644
--- a/front/src/WebRtc/CoWebsiteManager.ts
+++ b/front/src/WebRtc/CoWebsiteManager.ts
@@ -180,6 +180,7 @@ class CoWebsiteManager {
}
setTimeout(() => {
this.cowebsiteMainDom.innerHTML = ``;
+ HtmlUtils.getElementByIdOrFail(cowebsiteCloseButtonId).blur();
resolve();
}, animationTime)
}));