UNPKG

5.59 kBSource Map (JSON)View Raw
1{"version":3,"file":"use-sound.esm.js","sources":["../src/use-on-mount.ts","../src/index.ts"],"sourcesContent":["import * as React from 'react';\n\nexport default function useOnMount(callback: React.EffectCallback) {\n React.useEffect(callback, []);\n}\n","import React from 'react';\n\nimport useOnMount from './use-on-mount';\n\nimport { HookOptions, PlayOptions, PlayFunction, ReturnedValue } from './types';\n\nexport default function useSound(\n url: string,\n {\n volume = 1,\n playbackRate = 1,\n soundEnabled = true,\n interrupt = false,\n ...delegated\n }: HookOptions = {}\n) {\n const HowlConstructor = React.useRef<HowlStatic | null>(null);\n const [isPlaying, setIsPlaying] = React.useState(false);\n\n const [sound, setSound] = React.useState<Howl | null>(null);\n\n // We want to lazy-load Howler, since sounds can't play on load anyway.\n useOnMount(() => {\n import('howler').then(mod => {\n HowlConstructor.current = mod.Howl;\n\n const sound = new HowlConstructor.current({\n src: [url],\n volume,\n ...delegated,\n });\n\n setSound(sound);\n });\n });\n\n // When the URL changes, we have to do a whole thing where we recreate\n // the Howl instance. This is because Howler doesn't expose a way to\n // tweak the sound\n React.useEffect(() => {\n if (HowlConstructor.current && sound) {\n setSound(\n new HowlConstructor.current({\n src: [url],\n volume,\n ...delegated,\n })\n );\n }\n // The linter wants to run this effect whenever ANYTHING changes,\n // but very specifically I only want to recreate the Howl instance\n // when the `url` changes. Other changes should have no effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url]);\n\n // Whenever volume/playbackRate are changed, change those properties\n // on the sound instance.\n React.useEffect(() => {\n if (sound) {\n sound.volume(volume);\n sound.rate(playbackRate);\n }\n // A weird bug means that including the `sound` here can trigger an\n // error on unmount, where the state loses track of the sprites??\n // No idea, but anyway I don't need to re-run this if only the `sound`\n // changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [volume, playbackRate]);\n\n const play: PlayFunction = React.useCallback(\n (options: PlayOptions = {}) => {\n if (!sound || (!soundEnabled && !options.forceSoundEnabled)) {\n return;\n }\n\n if (interrupt) {\n sound.stop();\n }\n\n if (options.playbackRate) {\n sound.rate(options.playbackRate);\n }\n\n sound.play(options.id);\n\n sound.once('end', () => setIsPlaying(false));\n\n setIsPlaying(true);\n },\n [sound, soundEnabled, interrupt]\n );\n\n const stop = React.useCallback(() => {\n if (!sound) {\n return;\n }\n sound.stop();\n setIsPlaying(false);\n }, [sound]);\n\n const returnedValue: ReturnedValue = [\n play,\n {\n sound,\n stop,\n isPlaying,\n },\n ];\n\n return returnedValue;\n}\n"],"names":["useOnMount","callback","React","useSound","url","volume","playbackRate","soundEnabled","interrupt","delegated","HowlConstructor","useRef","useState","isPlaying","setIsPlaying","sound","setSound","then","mod","current","Howl","src","useEffect","rate","play","useCallback","options","forceSoundEnabled","stop","id","once","returnedValue"],"mappings":"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"}
\No newline at end of file