New analytics feature (#2150)

* New analytics feature

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Fix eslint swaggerJsdoc

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
This commit is contained in:
grégoire parant 2022-04-29 20:53:33 +02:00 committed by GitHub
parent 5e156ade74
commit 755ca93d49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 421 additions and 37 deletions

View File

@ -17,7 +17,7 @@ class AnalyticsClient {
}
}
identifyUser(uuid: string, email: string | null) {
identifyUser(uuid: string, email: string | null): void {
this.posthogPromise
?.then((posthog) => {
posthog.identify(uuid, { uuid, email, wa: true });
@ -25,7 +25,7 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
loggedWithSso() {
loggedWithSso(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-logged-sso");
@ -33,7 +33,7 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
loggedWithToken() {
loggedWithToken(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-logged-token");
@ -41,7 +41,7 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
enteredRoom(roomId: string, roomGroup: string | null) {
enteredRoom(roomId: string, roomGroup: string | null): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("$pageView", { roomId, roomGroup });
@ -50,7 +50,7 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
openedMenu() {
openedMenu(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-opened-menu");
@ -58,7 +58,7 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
launchEmote(emote: string) {
launchEmote(emote: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-emote-launch", { emote });
@ -66,7 +66,7 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
enteredJitsi(roomName: string, roomId: string) {
enteredJitsi(roomName: string, roomId: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-entered-jitsi", { roomName, roomId });
@ -74,7 +74,7 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
validationName() {
validationName(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-name-validation");
@ -82,7 +82,7 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
validationWoka(scene: string) {
validationWoka(scene: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-woka-validation", { scene });
@ -90,12 +90,309 @@ class AnalyticsClient {
.catch((e) => console.error(e));
}
validationVideo() {
validationVideo(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-video-validation");
})
.catch((e) => console.error(e));
}
/** New feature analytics **/
openedChat(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-opened-chat");
})
.catch((e) => console.error(e));
}
openRegister(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-opened-register");
})
.catch((e) => console.error(e));
}
openInvite(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-opened-invite");
})
.catch((e) => console.error(e));
}
lockDiscussion(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_lockroom");
})
.catch((e) => console.error(e));
}
screenSharing(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa-screensharing");
})
.catch((e) => console.error(e));
}
follow(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_follow");
})
.catch((e) => console.error(e));
}
camera(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_camera");
})
.catch((e) => console.error(e));
}
microphone(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_microphone");
})
.catch((e) => console.error(e));
}
settingMicrophone(value: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_setting_microphone", {
checkbox: value,
});
})
.catch((e) => console.error(e));
}
settingCamera(value: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_setting_camera", {
checkbox: value,
});
})
.catch((e) => console.error(e));
}
settingNotification(value: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_setting_notification", {
checkbox: value,
});
})
.catch((e) => console.error(e));
}
settingFullscreen(value: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_setting_fullscreen", {
checkbox: value,
});
})
.catch((e) => console.error(e));
}
settingAskWebsite(value: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_setting_ask_website", {
checkbox: value,
});
})
.catch((e) => console.error(e));
}
settingRequestFollow(value: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_setting_request_follow", {
checkbox: value,
});
})
.catch((e) => console.error(e));
}
settingDecreaseAudioVolume(value: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_setting_decrease_audio_volume", {
checkbox: value,
});
})
.catch((e) => console.error(e));
}
login(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_login");
})
.catch((e) => console.error(e));
}
logout(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_logout");
})
.catch((e) => console.error(e));
}
switchMultiIframe(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_multiiframe_switch");
})
.catch((e) => console.error(e));
}
closeMultiIframe(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_multiiframe_close");
})
.catch((e) => console.error(e));
}
fullScreenMultiIframe(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_multiiframe_fullscreen");
})
.catch((e) => console.error(e));
}
stackOpenCloseMultiIframe(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_multiiframe_stack_open_close");
})
.catch((e) => console.error(e));
}
menuCredit(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_menu_credit");
})
.catch((e) => console.error(e));
}
menuProfile(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_menu_profile");
})
.catch((e) => console.error(e));
}
menuSetting() {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_menu_setting");
})
.catch((e) => console.error(e));
}
menuInvite(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_menu_invite");
})
.catch((e) => console.error(e));
}
globalMessage(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_menu_globalmessage");
})
.catch((e) => console.error(e));
}
menuContact(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_menu_contact");
})
.catch((e) => console.error(e));
}
inviteCopyLink(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_menu_invite_copylink");
})
.catch((e) => console.error(e));
}
inviteCopyLinkWalk(value: string): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_menu_invite_copylink_walk", {
checkbox: value,
});
})
.catch((e) => console.error(e));
}
editCompanion(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_edit_companion");
})
.catch((e) => console.error(e));
}
editCamera(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_edit_camera");
})
.catch((e) => console.error(e));
}
editName(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_edit_name");
})
.catch((e) => console.error(e));
}
editWoka(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_edit_woka");
})
.catch((e) => console.error(e));
}
selectWoka(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_wokascene_select");
})
.catch((e) => console.error(e));
}
selectCustomWoka(): void {
this.posthogPromise
?.then((posthog) => {
posthog.capture("wa_wokascene_custom");
})
.catch((e) => console.error(e));
}
}
export const analyticsClient = new AnalyticsClient();

View File

@ -17,6 +17,7 @@
import { followRoleStore, followStateStore, followUsersStore } from "../Stores/FollowStore";
import { gameManager } from "../Phaser/Game/GameManager";
import { currentPlayerGroupLockStateStore } from "../Stores/CurrentPlayerGroupStore";
import { analyticsClient } from "../Administration/AnalyticsClient";
const gameScene = gameManager.getCurrentGameScene();
@ -89,6 +90,7 @@
class="btn-follow"
class:hide={($peerStore.size === 0 && $followStateStore === "off") || $silentStore}
class:disabled={$followStateStore !== "off"}
on:click={() => analyticsClient.follow()}
on:click={followClick}
>
<img class="noselect" src={followImg} alt="" />
@ -98,6 +100,7 @@
class="btn-lock"
class:hide={$peerStore.size === 0 || $silentStore}
class:disabled={$currentPlayerGroupLockStateStore}
on:click={() => analyticsClient.lockDiscussion()}
on:click={lockClick}
>
<img class="noselect" src={lockImg} alt="" />
@ -105,6 +108,7 @@
<div
class="btn-monitor"
on:click={() => analyticsClient.screenSharing()}
on:click={screenSharingClick}
class:hide={!$screenSharingAvailableStore || $silentStore}
class:enabled={$requestedScreenSharingState}
@ -116,7 +120,12 @@
{/if}
</div>
<div class="btn-video" on:click={cameraClick} class:disabled={!$requestedCameraState || $silentStore}>
<div
class="btn-video"
on:click={() => analyticsClient.camera()}
on:click={cameraClick}
class:disabled={!$requestedCameraState || $silentStore}
>
{#if $requestedCameraState && !$silentStore}
<img class="noselect" src={cinemaImg} alt="Turn on webcam" />
{:else}
@ -124,7 +133,12 @@
{/if}
</div>
<div class="btn-micro" on:click={microphoneClick} class:disabled={!$requestedMicrophoneState || $silentStore}>
<div
class="btn-micro"
on:click={() => analyticsClient.microphone()}
on:click={microphoneClick}
class:disabled={!$requestedMicrophoneState || $silentStore}
>
{#if $requestedMicrophoneState && !$silentStore}
<img class="noselect" src={microphoneImg} alt="Turn on microphone" />
{:else}

View File

@ -10,6 +10,7 @@
import { coWebsiteManager } from "../../WebRtc/CoWebsiteManager";
import uploadFile from "../images/jitsi.png";
import { analyticsClient } from "../../Administration/AnalyticsClient";
export let index: number;
export let coWebsite: CoWebsite;
@ -89,6 +90,7 @@
class:ready={$state === "ready"}
class:displayed={isMain || isHighlight}
class:vertical
on:click={() => analyticsClient.stackOpenCloseMultiIframe()}
on:click={onClick}
>
<img

View File

@ -2,6 +2,7 @@
import LL from "../../i18n/i18n-svelte";
import { gameManager } from "../../Phaser/Game/GameManager";
import { startLayerNamesStore } from "../../Stores/StartLayerNamesStore";
import { analyticsClient } from "../../Administration/AnalyticsClient";
let entryPoint: string = $startLayerNamesStore[0];
let walkAutomatically: boolean = false;
@ -54,16 +55,26 @@
class="link-url nes-input is-dark"
value={location.toString()}
/>
<button type="button" class="nes-btn is-primary" on:click={copyLink}>{$LL.menu.invite.copy()}</button>
<button
type="button"
class="nes-btn is-primary"
on:click={() => analyticsClient.inviteCopyLink()}
on:click={copyLink}>{$LL.menu.invite.copy()}</button
>
</section>
{:else}
<section class="is-mobile">
<h3>{$LL.menu.invite.description()}</h3>
<input type="hidden" readonly id="input-share-link" value={location.toString()} />
<button type="button" class="nes-btn is-primary" on:click={shareLink}>{$LL.menu.invite.share()}</button>
<button
type="button"
class="nes-btn is-primary"
on:click={() => analyticsClient.inviteCopyLink()}
on:click={shareLink}>{$LL.menu.invite.share()}</button
>
</section>
{/if}
<h3>Select an entry point</h3>
<h3>{$LL.menu.invite.selectEntryPoint()}</h3>
<section class="nes-select is-dark starting-points">
<select
bind:value={entryPoint}
@ -81,11 +92,12 @@
type="checkbox"
class="nes-checkbox is-dark"
bind:checked={walkAutomatically}
on:change={(e) => analyticsClient.inviteCopyLinkWalk(e.currentTarget.value)}
on:change={() => {
updateInputFieldValue();
}}
/>
<span>{$LL.menu.invite.walk_automatically_to_position()}</span>
<span>{$LL.menu.invite.walkAutomaticallyToPosition()}</span>
</label>
</section>
</div>

View File

@ -18,6 +18,7 @@
import type { Unsubscriber } from "svelte/store";
import { sendMenuClickedEvent } from "../../Api/iframe/Ui/MenuItem";
import LL from "../../i18n/i18n-svelte";
import { analyticsClient } from "../../Administration/AnalyticsClient";
let activeSubMenu: MenuItem = $subMenusStore[0];
let activeComponent: typeof ProfileSubMenu | typeof CustomSubMenu = ProfileSubMenu;
@ -47,21 +48,27 @@
activeSubMenu = menu;
switch (menu.key) {
case SubMenusInterface.settings:
analyticsClient.menuSetting();
activeComponent = SettingsSubMenu;
break;
case SubMenusInterface.profile:
analyticsClient.menuProfile();
activeComponent = ProfileSubMenu;
break;
case SubMenusInterface.invite:
analyticsClient.menuInvite();
activeComponent = GuestSubMenu;
break;
case SubMenusInterface.aboutRoom:
analyticsClient.menuCredit();
activeComponent = AboutRoomSubMenu;
break;
case SubMenusInterface.globalMessages:
analyticsClient.globalMessage();
activeComponent = (await import("./GlobalMessagesSubMenu.svelte")).default;
break;
case SubMenusInterface.contact:
analyticsClient.menuContact();
activeComponent = ContactSubMenu;
break;
}

View File

@ -10,6 +10,7 @@
import { ADMIN_URL } from "../../Enum/EnvironmentVariable";
import { showShareLinkMapModalStore } from "../../Stores/ModalStore";
import LL from "../../i18n/i18n-svelte";
import { analyticsClient } from "../../Administration/AnalyticsClient";
function showMenu() {
menuVisiblilityStore.set(!get(menuVisiblilityStore));
@ -42,7 +43,8 @@
class="nes-pointer"
draggable="false"
on:dragstart|preventDefault={noDrag}
on:click|preventDefault={showInvite}
on:click={() => analyticsClient.openInvite()}
on:click={showInvite}
/>
<img
src={logoRegister}
@ -50,7 +52,8 @@
class="nes-pointer"
draggable="false"
on:dragstart|preventDefault={noDrag}
on:click|preventDefault={register}
on:click={() => analyticsClient.openRegister()}
on:click={register}
/>
{:else}
<img
@ -59,7 +62,8 @@
class="nes-pointer"
draggable="false"
on:dragstart|preventDefault={noDrag}
on:click|preventDefault={showMenu}
on:click={() => analyticsClient.openedMenu()}
on:click={showMenu}
/>
{/if}
<img
@ -68,7 +72,8 @@
class="nes-pointer"
draggable="false"
on:dragstart|preventDefault={noDrag}
on:click|preventDefault={showChat}
on:click={() => analyticsClient.openedMenu()}
on:click={showChat}
/>
</main>

View File

@ -23,6 +23,7 @@
import Woka from "../Woka/Woka.svelte";
import Companion from "../Companion/Companion.svelte";
import LL from "../../i18n/i18n-svelte";
import { analyticsClient } from "../../Administration/AnalyticsClient";
function disableMenuStores() {
menuVisiblilityStore.set(false);
@ -62,19 +63,39 @@
<div class="customize-main">
<div class="submenu">
<section>
<button type="button" class="nes-btn" on:click|preventDefault={openEditNameScene}>
<button
type="button"
class="nes-btn"
on:click={() => analyticsClient.editName()}
on:click={openEditNameScene}
>
<img src={btnProfileSubMenuIdentity} alt={$LL.menu.profile.edit.name()} />
<span class="btn-hover">{$LL.menu.profile.edit.name()}</span>
</button>
<button type="button" class="nes-btn" on:click|preventDefault={openEditSkinScene}>
<button
type="button"
class="nes-btn"
on:click={() => analyticsClient.editWoka()}
on:click={openEditSkinScene}
>
<Woka userId={-1} placeholderSrc="" width="26px" height="26px" />
<span class="btn-hover">{$LL.menu.profile.edit.woka()}</span>
</button>
<button type="button" class="nes-btn" on:click|preventDefault={openEditCompanionScene}>
<button
type="button"
class="nes-btn"
on:click={() => analyticsClient.editCompanion()}
on:click={openEditCompanionScene}
>
<Companion userId={-1} placeholderSrc={btnProfileSubMenuCompanion} width="26px" height="26px" />
<span class="btn-hover">{$LL.menu.profile.edit.companion()}</span>
</button>
<button type="button" class="nes-btn" on:click|preventDefault={openEnableCameraScene}>
<button
type="button"
class="nes-btn"
on:click={() => analyticsClient.editCamera()}
on:click={openEnableCameraScene}
>
<img src={btnProfileSubMenuCamera} alt={$LL.menu.profile.edit.camera()} />
<span class="btn-hover">{$LL.menu.profile.edit.camera()}</span>
</button>
@ -89,13 +110,15 @@
{/if}
</section>
<section>
<button type="button" class="nes-btn" on:click|preventDefault={logOut}
<button type="button" class="nes-btn" on:click={() => analyticsClient.logout()} on:click={logOut}
>{$LL.menu.profile.logout()}</button
>
</section>
{:else}
<section>
<a type="button" class="nes-btn" href="/login">{$LL.menu.profile.login()}</a>
<a type="button" class="nes-btn" href="/login" on:click={() => analyticsClient.login()}
>{$LL.menu.profile.login()}</a
>
</section>
{/if}
</div>

View File

@ -10,6 +10,7 @@
import { audioManagerVolumeStore } from "../../Stores/AudioManagerStore";
import infoImg from "../images/info.svg";
import { analyticsClient } from "../../Administration/AnalyticsClient";
let fullscreen: boolean = localUserStore.getFullscreen();
let notification: boolean = localUserStore.getNotification() === "granted";
@ -191,11 +192,21 @@
</div>
</div>
<label>
<input type="checkbox" class="nes-checkbox is-dark" bind:checked={valueCameraPrivacySettings} />
<input
type="checkbox"
class="nes-checkbox is-dark"
on:change={(event) => analyticsClient.settingCamera(event.currentTarget.value)}
bind:checked={valueCameraPrivacySettings}
/>
<span>{$LL.menu.settings.privacySettings.cameraToggle()}</span>
</label>
<label>
<input type="checkbox" class="nes-checkbox is-dark" bind:checked={valueMicrophonePrivacySettings} />
<input
type="checkbox"
class="nes-checkbox is-dark"
on:change={(event) => analyticsClient.settingMicrophone(event.currentTarget.value)}
bind:checked={valueMicrophonePrivacySettings}
/>
<span>{$LL.menu.settings.privacySettings.microphoneToggle()}</span>
</label>
</section>
@ -211,6 +222,7 @@
type="checkbox"
class="nes-checkbox is-dark"
bind:checked={fullscreen}
on:change={(event) => analyticsClient.settingFullscreen(event.currentTarget.value)}
on:change={changeFullscreen}
/>
<span>{$LL.menu.settings.fullscreen()}</span>
@ -220,6 +232,7 @@
type="checkbox"
class="nes-checkbox is-dark"
bind:checked={notification}
on:change={(event) => analyticsClient.settingNotification(event.currentTarget.value)}
on:change={changeNotification}
/>
<span>{$LL.menu.settings.notifications()}</span>
@ -229,6 +242,7 @@
type="checkbox"
class="nes-checkbox is-dark"
bind:checked={forceCowebsiteTrigger}
on:change={(event) => analyticsClient.settingAskWebsite(event.currentTarget.value)}
on:change={changeForceCowebsiteTrigger}
/>
<span>{$LL.menu.settings.cowebsiteTrigger()}</span>
@ -238,6 +252,7 @@
type="checkbox"
class="nes-checkbox is-dark"
bind:checked={ignoreFollowRequests}
on:change={(event) => analyticsClient.settingRequestFollow(event.currentTarget.value)}
on:change={changeIgnoreFollowRequests}
/>
<span>{$LL.menu.settings.ignoreFollowRequest()}</span>
@ -246,6 +261,7 @@
type="checkbox"
class="nes-checkbox is-dark"
bind:checked={decreaseAudioPlayerVolumeWhileTalking}
on:change={(event) => analyticsClient.settingDecreaseAudioVolume(event.currentTarget.value)}
on:change={changeDecreaseAudioPlayerVolumeWhileTalking}
/>
<span>{$LL.audio.manager.reduce()}</span>

View File

@ -3,6 +3,7 @@
import { SelectCharacterScene, SelectCharacterSceneName } from "../../Phaser/Login/SelectCharacterScene";
import LL from "../../i18n/i18n-svelte";
import { customizeAvailableStore, selectedCollection } from "../../Stores/SelectCharacterSceneStore";
import { analyticsClient } from "../../Administration/AnalyticsClient";
export let game: Game;
@ -40,13 +41,15 @@
<button
type="submit"
class="selectCharacterSceneFormSubmit nes-btn is-primary"
on:click|preventDefault={cameraScene}>{$LL.woka.selectWoka.continue()}</button
on:click={() => analyticsClient.selectWoka()}
on:click={cameraScene}>{$LL.woka.selectWoka.continue()}</button
>
{#if $customizeAvailableStore}
<button
type="submit"
class="selectCharacterSceneFormCustomYourOwnSubmit nes-btn"
on:click|preventDefault={customizeScene}>{$LL.woka.selectWoka.customize()}</button
on:click={() => analyticsClient.selectCustomWoka()}
on:click={customizeScene}>{$LL.woka.selectWoka.customize()}</button
>
{/if}
</section>

View File

@ -2,7 +2,6 @@ import { get, writable } from "svelte/store";
import Timeout = NodeJS.Timeout;
import { userIsAdminStore } from "./GameStore";
import { CONTACT_URL, IDENTITY_URL, PROFILE_URL } from "../Enum/EnvironmentVariable";
import { analyticsClient } from "../Administration/AnalyticsClient";
import type { Translation } from "../i18n/i18n-types";
import axios from "axios";
import { localUserStore } from "../Connexion/LocalUserStore";
@ -14,7 +13,6 @@ export const userIsConnected = writable(false);
export const profileAvailable = writable(true);
menuVisiblilityStore.subscribe((value) => {
if (value) analyticsClient.openedMenu();
if (userIsConnected && value && IDENTITY_URL != null) {
axios.get(getMeUrl()).catch((err) => {
console.error("menuVisiblilityStore => err => ", err);

View File

@ -8,6 +8,7 @@ import { isMediaBreakpointDown } from "../Utils/BreakpointsUtils";
import { LayoutMode } from "./LayoutManager";
import type { CoWebsite } from "./CoWebsite/CoWesbite";
import type CancelablePromise from "cancelable-promise";
import { analyticsClient } from "../Administration/AnalyticsClient";
export enum iframeStates {
closed = 1,
@ -126,6 +127,7 @@ class CoWebsiteManager {
const buttonCloseCoWebsite = HtmlUtils.getElementByIdOrFail(cowebsiteCloseButtonId);
buttonCloseCoWebsite.addEventListener("click", () => {
analyticsClient.closeMultiIframe();
const coWebsite = this.getMainCoWebsite();
if (!coWebsite) {
@ -143,6 +145,7 @@ class CoWebsiteManager {
const buttonFullScreenFrame = HtmlUtils.getElementByIdOrFail(cowebsiteFullScreenButtonId);
buttonFullScreenFrame.addEventListener("click", () => {
analyticsClient.fullScreenMultiIframe();
buttonFullScreenFrame.blur();
this.fullscreen();
});
@ -159,6 +162,7 @@ class CoWebsiteManager {
});
buttonSwipe.addEventListener("click", () => {
analyticsClient.switchMultiIframe();
const mainCoWebsite = this.getMainCoWebsite();
const highlightedEmbed = get(highlightedEmbedScreen);
if (highlightedEmbed?.type === "cowebsite") {

View File

@ -77,7 +77,8 @@ const menu: NonNullable<Translation["menu"]> = {
description: "Link zu diesem Raum teilen!",
copy: "Kopieren",
share: "Teilen",
walk_automatically_to_position: "Automatisch zu meiner Position gehen",
walkAutomaticallyToPosition: "Automatisch zu meiner Position gehen",
selectEntryPoint: "Select an entry point",
},
globalMessage: {
text: "Text",

View File

@ -77,7 +77,8 @@ const menu: BaseTranslation = {
description: "Share the link of the room!",
copy: "Copy",
share: "Share",
walk_automatically_to_position: "Walk automatically to my position",
walkAutomaticallyToPosition: "Walk automatically to my position",
selectEntryPoint: "Select an entry point",
},
globalMessage: {
text: "Text",

View File

@ -77,7 +77,8 @@ const menu: NonNullable<Translation["menu"]> = {
description: "Partager le lien de la salle!",
copy: "Copier",
share: "Partager",
walk_automatically_to_position: "Marcher automatiquement jusqu'à ma position",
walkAutomaticallyToPosition: "Marcher automatiquement jusqu'à ma position",
selectEntryPoint: "Selectionner la zone de départ",
},
globalMessage: {
text: "Texte",

View File

@ -77,7 +77,8 @@ const menu: NonNullable<Translation["menu"]> = {
description: "分享该房间的链接!",
copy: "复制",
share: "分享",
walk_automatically_to_position: "自动走到我的位置",
walkAutomaticallyToPosition: "自动走到我的位置",
selectEntryPoint: "Select an entry point",
},
globalMessage: {
text: "文本",

View File

@ -2,7 +2,6 @@ import { BaseHttpController } from "./BaseHttpController";
import * as fs from "fs";
import { ADMIN_URL } from "../Enum/EnvironmentVariable";
import SwaggerGenerator from "../Services/SwaggerGenerator";
import swaggerJsdoc from "swagger-jsdoc";
export class SwaggerController extends BaseHttpController {
routes() {