UNPKG

react-sounds

Version:

A library of ready-to-play sound effects for React applications.

3 lines (2 loc) 11.2 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("howler"),t=require("react");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=o(t),r={version:"1.0.0",sounds:{"ambient/campfire":{src:"ambient/campfire.eb676cb.mp3",duration:22.047313},"ambient/heartbeat":{src:"ambient/heartbeat.3680f81.mp3",duration:22.047313},"ambient/rain":{src:"ambient/rain.96a6bc5.mp3",duration:22.047313},"ambient/water_stream":{src:"ambient/water_stream.9383548.mp3",duration:22.047313},"ambient/wind":{src:"ambient/wind.13b95c3.mp3",duration:22.047313},"arcade/coin":{src:"arcade/coin.5ec00e3.mp3",duration:.862},"arcade/coin_bling":{src:"arcade/coin_bling.e7e6644.mp3",duration:.862},"arcade/jump":{src:"arcade/jump.6baf978.mp3",duration:.862},"arcade/level_down":{src:"arcade/level_down.7f42195.mp3",duration:1.123265},"arcade/level_up":{src:"arcade/level_up.0aba301.mp3",duration:1.48898},"arcade/power_down":{src:"arcade/power_down.222ab81.mp3",duration:1.071},"arcade/power_up":{src:"arcade/power_up.bcafcc5.mp3",duration:1.071},"arcade/upgrade":{src:"arcade/upgrade.1da1db4.mp3",duration:.862},"game/coin":{src:"game/coin.21575b3.mp3",duration:.914286},"game/hit":{src:"game/hit.7f64763.mp3",duration:.313469},"game/miss":{src:"game/miss.b1d5a19.mp3",duration:.287347},"game/portal_closing":{src:"game/portal_closing.f434407.mp3",duration:2.08975},"game/portal_opening":{src:"game/portal_opening.54935de.mp3",duration:3.474286},"game/void":{src:"game/void.ab99118.mp3",duration:.862},"misc/silence":{src:"misc/silence.01e0b9b.mp3",duration:1.152},"notification/completed":{src:"notification/completed.31e527e.mp3",duration:.862},"notification/error":{src:"notification/error.b92d3c6.mp3",duration:.548563},"notification/info":{src:"notification/info.fc3baa4.mp3",duration:.862},"notification/message":{src:"notification/message.1eefe18.mp3",duration:.862},"notification/notification":{src:"notification/notification.595d086.mp3",duration:.862},"notification/popup":{src:"notification/popup.cf74b54.mp3",duration:.313469},"notification/reminder":{src:"notification/reminder.6d68587.mp3",duration:.862},"notification/success":{src:"notification/success.f38c2ed.mp3",duration:1.227755},"notification/warning":{src:"notification/warning.207aed9.mp3",duration:.862},"system/boot_down":{src:"system/boot_down.7baf040.mp3",duration:1.593469},"system/boot_up":{src:"system/boot_up.7369806.mp3",duration:3.134694},"system/device_connect":{src:"system/device_connect.e609d62.mp3",duration:.862},"system/device_disconnect":{src:"system/device_disconnect.bd814fa.mp3",duration:.862},"system/lock":{src:"system/lock.4063aab.mp3",duration:.862},"system/screenshot":{src:"system/screenshot.f3483cb.mp3",duration:.235102},"system/trash":{src:"system/trash.ed51a4e.mp3",duration:.862},"ui/blocked":{src:"ui/blocked.be40409.mp3",duration:.940408},"ui/button_hard":{src:"ui/button_hard.011f516.mp3",duration:.835918},"ui/button_hard_double":{src:"ui/button_hard_double.2c7e778.mp3",duration:.862},"ui/button_medium":{src:"ui/button_medium.f1076ea.mp3",duration:.862},"ui/button_soft":{src:"ui/button_soft.896771c.mp3",duration:.862},"ui/button_soft_double":{src:"ui/button_soft_double.ef0aec4.mp3",duration:.862},"ui/button_squishy":{src:"ui/button_squishy.69c5c9a.mp3",duration:.391837},"ui/buzz":{src:"ui/buzz.6d6857f.mp3",duration:.548563},"ui/buzz_deep":{src:"ui/buzz_deep.c1f597f.mp3",duration:.809796},"ui/buzz_long":{src:"ui/buzz_long.d506d81.mp3",duration:1.071},"ui/copy":{src:"ui/copy.4aadb27.mp3",duration:.130612},"ui/input_blur":{src:"ui/input_blur.607531b.mp3",duration:.862},"ui/input_focus":{src:"ui/input_focus.80b402e.mp3",duration:.287347},"ui/item_deselect":{src:"ui/item_deselect.9955ec7.mp3",duration:.862},"ui/item_select":{src:"ui/item_select.5d88832.mp3",duration:.862},"ui/keystroke_hard":{src:"ui/keystroke_hard.6d8eb42.mp3",duration:.548563},"ui/keystroke_medium":{src:"ui/keystroke_medium.2b4ae6c.mp3",duration:.548563},"ui/keystroke_soft":{src:"ui/keystroke_soft.fcd4503.mp3",duration:.548563},"ui/panel_collapse":{src:"ui/panel_collapse.1b8441f.mp3",duration:.862},"ui/panel_expand":{src:"ui/panel_expand.ef3ca39.mp3",duration:.862},"ui/pop_close":{src:"ui/pop_close.1f2dc35.mp3",duration:.809796},"ui/pop_open":{src:"ui/pop_open.360c640.mp3",duration:.835918},"ui/popup_close":{src:"ui/popup_close.1bd2a1b.mp3",duration:1.071},"ui/popup_open":{src:"ui/popup_open.97597a8.mp3",duration:1.071},"ui/radio_select":{src:"ui/radio_select.4fbe4e3.mp3",duration:.862},"ui/send":{src:"ui/send.396090f.mp3",duration:.182857},"ui/submit":{src:"ui/submit.1e228b1.mp3",duration:.548563},"ui/success_bling":{src:"ui/success_bling.3f44a2f.mp3",duration:.809796},"ui/success_blip":{src:"ui/success_blip.911b304.mp3",duration:.626939},"ui/success_chime":{src:"ui/success_chime.436ed4a.mp3",duration:1.619592},"ui/tab_close":{src:"ui/tab_close.3c1a646.mp3",duration:.548563},"ui/tab_open":{src:"ui/tab_open.3745bcd.mp3",duration:.548563},"ui/toggle_off":{src:"ui/toggle_off.7103845.mp3",duration:.261224},"ui/toggle_on":{src:"ui/toggle_on.2f87bf7.mp3",duration:.287347},"ui/window_close":{src:"ui/window_close.0e958da.mp3",duration:.548563},"ui/window_open":{src:"ui/window_open.7478756.mp3",duration:.548563}}};function i(e){return e in r.sounds}let u="https://reacticons.sfo3.cdn.digitaloceanspaces.com/v1",c=!0;const a=[];let s=!1;const d={},l={};function p(t){return async()=>(d[t]||(d[t]=b(t)),async function(t){if(l[t])return l[t];d[t]||(d[t]=b(t));const o=await d[t],n=URL.createObjectURL(o),r=new e.Howl({src:[n],format:["mp3"],html5:!0,onload:()=>{r._objectUrl=n}});return l[t]={instance:r,subscriptions:0},l[t]}(t))}async function m(e){const t=await p(e)();return t.subscriptions+=1,t.instance}function f(e){const t=l[e];return t&&t.subscriptions>0&&(t.subscriptions-=1),function(e){const t=l[e];if(!t||t.instance.playing()||t.subscriptions>0)return;const{instance:o}=t;o._objectUrl&&URL.revokeObjectURL(o._objectUrl);o.unload(),delete l[e]}(e),null}async function b(e){try{const t=await async function(e){var t;if(!i(e))return e;const o=`/sounds/${e}.mp3`;try{const e=new AbortController,n=setTimeout((()=>e.abort()),300),r=await fetch(o,{method:"HEAD",signal:e.signal});return clearTimeout(n),r.ok&&(null===(t=r.headers.get("content-type"))||void 0===t?void 0:t.toLowerCase().startsWith("audio"))?o:null}catch(e){}return null}(e);if(t){const e=await fetch(t);if(e.ok)return await e.blob()}}catch(t){console.warn(`Error loading local sound "${e}", falling back to CDN:`,t)}if(!i(e))throw new Error(`Failed to load custom sound "${e}"`);const t=r.sounds[e],o=`${u}/${t.src}`,n=await fetch(o);if(!n.ok)throw new Error(`Failed to fetch sound "${e}" from CDN`);return await n.blob()}function _(e){return Promise.all(e.map((async e=>{d[e]||(d[e]=b(e)),await d[e]})))}async function w(e,t){if(!h())return;const o=await m(e);let n=!1;t&&(void 0!==t.volume&&o.volume(t.volume),void 0!==t.rate&&o.rate(t.rate),void 0!==t.loop&&o.loop(t.loop)),o.on("end",(()=>{n||(null==t?void 0:t.loop)||(f(e),n=!0)})),o.play()}function h(){return"undefined"!=typeof window&&c}function y(e){c=e,"undefined"!=typeof localStorage&&localStorage.setItem("react-sounds-enabled",e?"true":"false"),a.forEach((t=>t(e)))}async function g(){if("undefined"!=typeof window&&e.Howler.ctx&&"suspended"===e.Howler.ctx.state)try{await e.Howler.ctx.resume()}catch(e){console.warn("Failed to unlock audio context:",e)}}let v;function E(e,o={}){const[n,r]=t.useState(!1),[i,u]=t.useState(!1),c=t.useRef(null),a=t.useRef([]);let s=h();try{const e=v?t.useContext(v):null;e&&(s=e.enabled)}catch(e){}const d=t.useCallback((async()=>{if(c.current)return c.current;try{const t=await m(e);return t.on("end",(t=>{const o=a.current.findIndex((e=>e.id===t));if(o>=0){const e=a.current[o];e.resolver&&e.resolver(),e.loop||a.current.splice(o,1)}0===a.current.length&&(c.current=f(e),u(!1))})),c.current=t,r(!0),t}catch(e){throw console.error("Error loading sound:",e),e}}),[e,u]),l=t.useCallback((async(e=o)=>{if(s)try{await g();const t=await d(),o=void 0!==e.loop&&e.loop;void 0!==e.volume&&t.volume(e.volume),void 0!==e.rate&&t.rate(e.rate),t.loop(o);const n=t.play();return u(!0),o?void a.current.push({id:n,loop:o}):new Promise((e=>{a.current.push({id:n,loop:o,resolver:()=>e()})}))}catch(e){throw console.error("Error playing sound:",e),e}}),[o,s,d,n]),p=t.useCallback((()=>{c.current&&(a.current.forEach((e=>{e.resolver&&e.resolver()})),c.current.stop(),c.current=f(e),a.current=[],u(!1))}),[]),b=t.useCallback((()=>{c.current&&(c.current.pause(),u(!1))}),[]),w=t.useCallback((()=>{c.current&&s&&0!==a.current.length&&g().then((()=>{a.current.forEach((({id:e})=>{var t;return null===(t=c.current)||void 0===t?void 0:t.play(e)})),u(!0)}))}),[s]);return t.useEffect((()=>{!s&&i&&b()}),[s,i,b]),t.useEffect((()=>(_([e]).then((()=>r(!0))),()=>{r(!1),u(!1),a.current.forEach((e=>{e.resolver&&e.resolver()})),a.current=[],c.current&&(c.current.stop(),c.current=f(e))})),[e]),{play:l,stop:p,pause:b,resume:w,isPlaying:i,isLoaded:n}}!function(){if("undefined"==typeof localStorage)return;const e=localStorage.getItem("react-sounds-enabled");null!==e&&(c="false"!==e)}(),"undefined"!=typeof window&&function(){if("undefined"==typeof window||s)return()=>{};s=!0;const e=["click","touchstart","keydown"],t=()=>{g(),e.forEach((e=>document.removeEventListener(e,t)))};e.forEach((e=>document.addEventListener(e,t)))}();const k=t.createContext(null);v=k,exports.Sound=function({name:e,trigger:o="none",options:r,children:i,onLoad:u,onPlay:c,onStop:a,onError:s}){const{play:d,stop:l,isLoaded:p,isPlaying:m}=E(e,r);return t.useEffect((()=>{p&&u&&u()}),[p,u]),t.useEffect((()=>{m&&c&&c()}),[m,c]),t.useEffect((()=>("mount"===o&&d(r).catch((e=>{s&&s(e)})),()=>{"unmount"===o&&w(e,r),l(),a&&a()})),[o,e,d,l,a,r,s]),n.default.createElement(n.default.Fragment,null,i)},exports.SoundButton=function({sound:e,soundOptions:t,children:o,onClick:r,onSoundError:i,...u}){const{play:c}=E(e,t);return n.default.createElement("button",{onClick:e=>{c().catch((e=>{i&&i(e)})),r&&r(e)},...u},o)},exports.SoundProvider=function({preload:e=[],initialEnabled:o,children:r}){const[i,u]=t.useState((()=>void 0!==o?o:h())),c=t.useCallback((e=>{y(e)}),[]);return t.useEffect((()=>{return e=e=>{u(e)},a.push(e),()=>{const t=a.indexOf(e);-1!==t&&a.splice(t,1)};var e}),[]),t.useEffect((()=>{g()}),[]),t.useEffect((()=>{if(e.length>0){_(e).catch((e=>{console.error("Error preloading sounds:",e)}))}}),[e]),n.default.createElement(k.Provider,{value:{enabled:i,setEnabled:c}},r)},exports.fetchSoundBlob=b,exports.getCDNUrl=function(){return u},exports.isSoundEnabled=h,exports.makeRemoteSound=p,exports.playSound=w,exports.preloadSounds=_,exports.setCDNUrl=function(e){u=e},exports.setSoundEnabled=y,exports.useSound=E,exports.useSoundEnabled=function(){const e=t.useContext(v);if(!e)throw new Error("useSoundEnabled must be used within a SoundProvider");return[e.enabled,e.setEnabled]},exports.useSoundOnChange=function(e,o,n){const{play:r}=E(e),i=t.useRef(!0);t.useEffect((()=>{const e=i.current&&!1===(null==n?void 0:n.initial);i.current=!1,e||r(n).catch((e=>console.error("Failed to play sound:",e)))}),[o])}; //# sourceMappingURL=index.js.map