Files
ncd-fe/packages/pl-fe/src/utils/sounds.ts
nicole mikołajczyk de8ae5a949 Rename project to Nicolium
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2026-02-09 22:35:22 +01:00

60 lines
1.4 KiB
TypeScript

import boopMp3 from '@/assets/sounds/boop.mp3';
import boopOgg from '@/assets/sounds/boop.ogg';
import chatMp3 from '@/assets/sounds/chat.mp3';
import chatOgg from '@/assets/sounds/chat.ogg';
/** Nicolium audio clip. */
interface Sound {
src: string;
type: string;
}
type Sounds = 'boop' | 'chat';
/** Produce HTML5 audio from sound data. */
const createAudio = (sources: Sound[]): HTMLAudioElement => {
const audio = new Audio();
sources.forEach(({ type, src }) => {
const source = document.createElement('source');
source.type = type;
source.src = src;
audio.appendChild(source);
});
return audio;
};
/** Play HTML5 sound. */
const play = (audio: HTMLAudioElement): Promise<void> => {
if (!audio.paused) {
audio.pause();
if (typeof audio.fastSeek === 'function') {
audio.fastSeek(0);
} else {
audio.currentTime = 0;
}
}
return audio.play().catch((error: Error) => {
if (error.name === 'NotAllowedError') {
// User has disabled autoplay.
// https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide
return;
} else {
throw error;
}
});
};
const soundCache: Record<Sounds, HTMLAudioElement> = {
boop: createAudio([
{ src: boopOgg, type: 'audio/ogg' },
{ src: boopMp3, type: 'audio/mpeg' },
]),
chat: createAudio([
{ src: chatOgg, type: 'audio/ogg' },
{ src: chatMp3, type: 'audio/mpeg' },
]),
};
export { soundCache, play, type Sounds };