Moving audio message to Svelte
This commit is contained in:
parent
faa4c7c08e
commit
267d0a2cd1
3
front/dist/index.tmpl.html
vendored
3
front/dist/index.tmpl.html
vendored
@ -87,9 +87,6 @@
|
|||||||
<div id="audioplayer" style="visibility: hidden"></div>
|
<div id="audioplayer" style="visibility: hidden"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="audio-playing">
|
|
||||||
<img src="/resources/logos/megaphone.svg" />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="activeScreenSharing" class="active-screen-sharing active">
|
<div id="activeScreenSharing" class="active-screen-sharing active">
|
||||||
|
@ -3,6 +3,8 @@ import {AUDIO_TYPE, MESSAGE_TYPE} from "./ConsoleGlobalMessageManager";
|
|||||||
import {PUSHER_URL, UPLOADER_URL} from "../Enum/EnvironmentVariable";
|
import {PUSHER_URL, UPLOADER_URL} from "../Enum/EnvironmentVariable";
|
||||||
import type {RoomConnection} from "../Connexion/RoomConnection";
|
import type {RoomConnection} from "../Connexion/RoomConnection";
|
||||||
import type {PlayGlobalMessageInterface} from "../Connexion/ConnexionModels";
|
import type {PlayGlobalMessageInterface} from "../Connexion/ConnexionModels";
|
||||||
|
import {soundPlayingStore} from "../Stores/SoundPlayingStore";
|
||||||
|
import {soundManager} from "../Phaser/Game/SoundManager";
|
||||||
|
|
||||||
export class GlobalMessageManager {
|
export class GlobalMessageManager {
|
||||||
|
|
||||||
@ -43,45 +45,8 @@ export class GlobalMessageManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private playAudioMessage(messageId : string, urlMessage: string){
|
private playAudioMessage(messageId : string, urlMessage: string) {
|
||||||
//delete previous elements
|
soundPlayingStore.playSound(UPLOADER_URL + urlMessage);
|
||||||
const previousDivAudio = document.getElementsByClassName('audio-playing');
|
|
||||||
for(let i = 0; i < previousDivAudio.length; i++){
|
|
||||||
previousDivAudio[i].remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
//create new element
|
|
||||||
const divAudio : HTMLDivElement = document.createElement('div');
|
|
||||||
divAudio.id = `audio-playing-${messageId}`;
|
|
||||||
divAudio.classList.add('audio-playing');
|
|
||||||
const imgAudio : HTMLImageElement = document.createElement('img');
|
|
||||||
imgAudio.src = '/resources/logos/megaphone.svg';
|
|
||||||
const pAudio : HTMLParagraphElement = document.createElement('p');
|
|
||||||
pAudio.textContent = 'Message audio'
|
|
||||||
divAudio.appendChild(imgAudio);
|
|
||||||
divAudio.appendChild(pAudio);
|
|
||||||
|
|
||||||
const mainSectionDiv = HtmlUtils.getElementByIdOrFail<HTMLDivElement>('main-container');
|
|
||||||
mainSectionDiv.appendChild(divAudio);
|
|
||||||
|
|
||||||
const messageAudio : HTMLAudioElement = document.createElement('audio');
|
|
||||||
messageAudio.id = this.getHtmlMessageId(messageId);
|
|
||||||
messageAudio.autoplay = true;
|
|
||||||
messageAudio.style.display = 'none';
|
|
||||||
messageAudio.onended = () => {
|
|
||||||
divAudio.classList.remove('active');
|
|
||||||
messageAudio.remove();
|
|
||||||
setTimeout(() => {
|
|
||||||
divAudio.remove();
|
|
||||||
}, 1000);
|
|
||||||
}
|
|
||||||
messageAudio.onplay = () => {
|
|
||||||
divAudio.classList.add('active');
|
|
||||||
}
|
|
||||||
const messageAudioSource : HTMLSourceElement = document.createElement('source');
|
|
||||||
messageAudioSource.src = `${UPLOADER_URL}${urlMessage}`;
|
|
||||||
messageAudio.appendChild(messageAudioSource);
|
|
||||||
mainSectionDiv.appendChild(messageAudio);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private playTextMessage(messageId : string, htmlMessage: string){
|
private playTextMessage(messageId : string, htmlMessage: string){
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
import {Game} from "../Phaser/Game/Game";
|
import {Game} from "../Phaser/Game/Game";
|
||||||
import {helpCameraSettingsVisibleStore} from "../Stores/HelpCameraSettingsStore";
|
import {helpCameraSettingsVisibleStore} from "../Stores/HelpCameraSettingsStore";
|
||||||
import HelpCameraSettingsPopup from "./HelpCameraSettings/HelpCameraSettingsPopup.svelte";
|
import HelpCameraSettingsPopup from "./HelpCameraSettings/HelpCameraSettingsPopup.svelte";
|
||||||
|
import AudioPlaying from "./UI/AudioPlaying.svelte";
|
||||||
|
import {soundPlayingStore} from "../Stores/SoundPlayingStore";
|
||||||
|
|
||||||
export let game: Game;
|
export let game: Game;
|
||||||
</script>
|
</script>
|
||||||
@ -47,6 +49,11 @@
|
|||||||
<EnableCameraScene game={game}></EnableCameraScene>
|
<EnableCameraScene game={game}></EnableCameraScene>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if $soundPlayingStore}
|
||||||
|
<div>
|
||||||
|
<AudioPlaying url={$soundPlayingStore} />
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
{#if $menuIconVisible}
|
{#if $menuIconVisible}
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
<section class="text-center">
|
<section class="text-center">
|
||||||
<h2>Enter your name</h2>
|
<h2>Enter your name</h2>
|
||||||
</section>
|
</section>
|
||||||
<input type="text" name="loginSceneName" class="nes-input is-dark" maxlength={MAX_USERNAME_LENGTH} bind:value={name} on:keypress={() => {startValidating = true}} class:is-error={name.trim() === '' && startValidating} />
|
<input type="text" name="loginSceneName" class="nes-input is-dark" autofocus maxlength={MAX_USERNAME_LENGTH} bind:value={name} on:keypress={() => {startValidating = true}} class:is-error={name.trim() === '' && startValidating} />
|
||||||
<section class="error-section">
|
<section class="error-section">
|
||||||
{#if name.trim() === '' && startValidating }
|
{#if name.trim() === '' && startValidating }
|
||||||
<p class="err">The name is empty</p>
|
<p class="err">The name is empty</p>
|
||||||
|
53
front/src/Components/UI/AudioPlaying.svelte
Normal file
53
front/src/Components/UI/AudioPlaying.svelte
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import megaphoneImg from "./images/megaphone.svg";
|
||||||
|
import {soundPlayingStore} from "../../Stores/SoundPlayingStore";
|
||||||
|
import {afterUpdate, onMount} from "svelte";
|
||||||
|
|
||||||
|
export let url: string;
|
||||||
|
let audio: HTMLAudioElement;
|
||||||
|
|
||||||
|
function soundEnded() {
|
||||||
|
soundPlayingStore.soundEnded();
|
||||||
|
}
|
||||||
|
|
||||||
|
afterUpdate(() => {
|
||||||
|
audio.play();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="audio-playing">
|
||||||
|
<img src={megaphoneImg} alt="Audio playing" />
|
||||||
|
<p>Audio message</p>
|
||||||
|
<audio bind:this={audio} src={url} on:ended={soundEnded} >
|
||||||
|
<track kind="captions">
|
||||||
|
</audio>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
/*audio html when audio message playing*/
|
||||||
|
.audio-playing {
|
||||||
|
position: absolute;
|
||||||
|
width: 200px;
|
||||||
|
height: 54px;
|
||||||
|
/*right: -210px;*/
|
||||||
|
right: 0;
|
||||||
|
top: 40px;
|
||||||
|
transition: all 0.1s ease-out;
|
||||||
|
background-color: black;
|
||||||
|
border-radius: 30px 0 0 30px;
|
||||||
|
display: inline-flex;
|
||||||
|
|
||||||
|
img {
|
||||||
|
/*width: 30px;*/
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: #ffda01;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: white;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-top: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
18
front/src/Components/UI/images/megaphone.svg
Normal file
18
front/src/Components/UI/images/megaphone.svg
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 451.7 512" style="enable-background:new 0 0 451.7 512;" xml:space="preserve">
|
||||||
|
<path d="M436.9,212.6L237.2,12.9c-11.7-11.7-30.7-11.7-42.4,0s-11.7,30.7,0,42.4L394.5,255c11.5,11.9,30.5,12.2,42.4,0.7
|
||||||
|
c11.9-11.5,12.2-30.5,0.7-42.4C437.4,213.1,437.2,212.8,436.9,212.6z"/>
|
||||||
|
<path d="M179.5,83.1l-1.5,7.5c-10.4,53-36,103.4-70.6,144.3l109,108.3c40.7-34.9,90.2-61.5,143.1-72.3l7.5-1.5L179.5,83.1z"/>
|
||||||
|
<path d="M87.4,257l-74.2,74.2c-17.6,17.6-17.6,46.1,0,63.6c0,0,0,0,0,0l42.4,42.4c17.6,17.6,46.1,17.6,63.6,0c0,0,0,0,0,0l74.2-74.2
|
||||||
|
L87.4,257z M98,373.7c-6.1,5.6-15.6,5.3-21.2-0.8c-5.4-5.8-5.4-14.7,0-20.5l21.2-21.2c6-5.8,15.5-5.6,21.2,0.4
|
||||||
|
c5.6,5.8,5.6,15,0,20.8L98,373.7z"/>
|
||||||
|
<path d="M256.1,445.3l20.4-20.4c17.6-17.6,17.6-46.1,0-63.6l-15.1-15.2c-8.4,5.7-16.4,11.7-24.2,18.3l18.1,18.1
|
||||||
|
c5.8,5.9,5.8,15.3,0,21.2l-20.7,20.8l-30.5-29.5l-42.4,42.4l68.1,65.9c11.7,11.7,30.7,11.7,42.4,0c11.7-11.7,11.7-30.7,0-42.4l0,0
|
||||||
|
L256.1,445.3z"/>
|
||||||
|
<path d="M316.7,0c-8.3,0-15,6.7-15,15v30c0,8.3,6.7,15,15,15c8.3,0,15-6.7,15-15V15C331.7,6.7,325,0,316.7,0z"/>
|
||||||
|
<path d="M436.7,120h-30c-8.3,0-15,6.7-15,15s6.7,15,15,15h30c8.3,0,15-6.7,15-15S445,120,436.7,120z"/>
|
||||||
|
<path d="M417.3,34.4c-5.9-5.9-15.4-5.9-21.2,0l-30,30c-6,5.8-6.1,15.3-0.4,21.2c5.8,6,15.3,6.1,21.2,0.4c0.1-0.1,0.2-0.2,0.4-0.4
|
||||||
|
l30-30C423.2,49.7,423.2,40.2,417.3,34.4z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
@ -280,7 +280,7 @@ export class GameScene extends DirtyScene implements CenterListener {
|
|||||||
this.load.spritesheet('layout_modes', 'resources/objects/layout_modes.png', {frameWidth: 32, frameHeight: 32});
|
this.load.spritesheet('layout_modes', 'resources/objects/layout_modes.png', {frameWidth: 32, frameHeight: 32});
|
||||||
this.load.bitmapFont('main_font', 'resources/fonts/arcade.png', 'resources/fonts/arcade.xml');
|
this.load.bitmapFont('main_font', 'resources/fonts/arcade.png', 'resources/fonts/arcade.xml');
|
||||||
//eslint-disable-next-line @typescript-eslint/no-explicit-any
|
//eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
(this.load as any).rexWebFont({
|
(this.load as any).rexWebFont({
|
||||||
custom: {
|
custom: {
|
||||||
families: ['Press Start 2P'],
|
families: ['Press Start 2P'],
|
||||||
urls: ['/resources/fonts/fonts.css'],
|
urls: ['/resources/fonts/fonts.css'],
|
||||||
|
@ -17,7 +17,9 @@ class SoundManager {
|
|||||||
return res(sound);
|
return res(sound);
|
||||||
}
|
}
|
||||||
loadPlugin.audio(soundUrl, soundUrl);
|
loadPlugin.audio(soundUrl, soundUrl);
|
||||||
loadPlugin.once('filecomplete-audio-' + soundUrl, () => res(soundManager.add(soundUrl)));
|
loadPlugin.once('filecomplete-audio-' + soundUrl, () => {
|
||||||
|
res(soundManager.add(soundUrl));
|
||||||
|
});
|
||||||
loadPlugin.start();
|
loadPlugin.start();
|
||||||
});
|
});
|
||||||
this.soundPromises.set(soundUrl,soundPromise);
|
this.soundPromises.set(soundUrl,soundPromise);
|
||||||
|
22
front/src/Stores/SoundPlayingStore.ts
Normal file
22
front/src/Stores/SoundPlayingStore.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { writable } from "svelte/store";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A store that contains the URL of the sound currently playing
|
||||||
|
*/
|
||||||
|
function createSoundPlayingStore() {
|
||||||
|
const { subscribe, set, update } = writable<string|null>(null);
|
||||||
|
|
||||||
|
return {
|
||||||
|
subscribe,
|
||||||
|
playSound: (url: string) => {
|
||||||
|
set(url);
|
||||||
|
},
|
||||||
|
soundEnded: () => {
|
||||||
|
set(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export const soundPlayingStore = createSoundPlayingStore();
|
@ -810,35 +810,6 @@ input[type=range]:focus::-ms-fill-upper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*audio html when audio message playing*/
|
|
||||||
.main-container .audio-playing {
|
|
||||||
position: absolute;
|
|
||||||
width: 200px;
|
|
||||||
height: 54px;
|
|
||||||
right: -210px;
|
|
||||||
top: 40px;
|
|
||||||
transition: all 0.1s ease-out;
|
|
||||||
background-color: black;
|
|
||||||
border-radius: 30px 0 0 30px;
|
|
||||||
display: inline-flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-container .audio-playing.active{
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
.main-container .audio-playing img{
|
|
||||||
/*width: 30px;*/
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: #ffda01;
|
|
||||||
padding: 10px;
|
|
||||||
}
|
|
||||||
.main-container .audio-playing p{
|
|
||||||
color: white;
|
|
||||||
margin-left: 10px;
|
|
||||||
margin-top: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* VIDEO QUALITY */
|
/* VIDEO QUALITY */
|
||||||
.main-console div.setting h1{
|
.main-console div.setting h1{
|
||||||
color: white;
|
color: white;
|
||||||
|
@ -94,6 +94,7 @@ module.exports = {
|
|||||||
// See https://github.com/sveltejs/svelte/issues/4946#issuecomment-662168782
|
// See https://github.com/sveltejs/svelte/issues/4946#issuecomment-662168782
|
||||||
|
|
||||||
if (warning.code === 'a11y-no-onchange') { return }
|
if (warning.code === 'a11y-no-onchange') { return }
|
||||||
|
if (warning.code === 'a11y-autofocus') { return }
|
||||||
|
|
||||||
// process as usual
|
// process as usual
|
||||||
handleWarning(warning);
|
handleWarning(warning);
|
||||||
|
Loading…
Reference in New Issue
Block a user