react-extended-hooks
Version:
A collection of React custom hooks providing extended functionality for geolocation, platform details, battery status, and more.
3 lines (2 loc) • 8.33 kB
JavaScript
(function(m,g){typeof exports=="object"&&typeof module<"u"?g(exports,require("react")):typeof define=="function"&&define.amd?define(["exports","react"],g):(m=typeof globalThis<"u"?globalThis:m||self,g(m["react-extended-hooks"]={},m.React))})(this,function(m,g){"use strict";function ce({onChargingChange:e,onLevelChange:n,onChargingTimeChange:i,onDischargingTimeChange:a}={}){const[o,l]=g.useState(null);return g.useEffect(()=>{const c=(async()=>{if("getBattery"in navigator)try{const r=await navigator.getBattery(),t=()=>{const s={charging:r.charging,level:Math.round(r.level*100),chargingTime:r.chargingTime||null,dischargingTime:r.dischargingTime||null};l(s),e&&s.charging!==(o==null?void 0:o.charging)&&e(s.charging),n&&s.level!==(o==null?void 0:o.level)&&n(s.level),i&&s.chargingTime!==(o==null?void 0:o.chargingTime)&&i(s.chargingTime),a&&s.dischargingTime!==(o==null?void 0:o.dischargingTime)&&a(s.dischargingTime)};return t(),r.addEventListener("chargingchange",t),r.addEventListener("levelchange",t),r.addEventListener("chargingtimechange",t),r.addEventListener("dischargingtimechange",t),()=>{r.removeEventListener("chargingchange",t),r.removeEventListener("levelchange",t),r.removeEventListener("chargingtimechange",t),r.removeEventListener("dischargingtimechange",t)}}catch(r){console.error("Failed to get battery details:",r),l(null)}else console.warn("Battery Status API is not supported in this browser."),l(null)})();return()=>{c instanceof Function&&c()}},[e,n,i,a,o]),o}var j=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function le(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var O,U;function V(){if(U)return O;U=1;function e(n){var i=typeof n;return n!=null&&(i=="object"||i=="function")}return O=e,O}var q,$;function de(){if($)return q;$=1;var e=typeof j=="object"&&j&&j.Object===Object&&j;return q=e,q}var R,H;function X(){if(H)return R;H=1;var e=de(),n=typeof self=="object"&&self&&self.Object===Object&&self,i=e||n||Function("return this")();return R=i,R}var L,z;function fe(){if(z)return L;z=1;var e=X(),n=function(){return e.Date.now()};return L=n,L}var E,J;function ge(){if(J)return E;J=1;var e=/\s/;function n(i){for(var a=i.length;a--&&e.test(i.charAt(a)););return a}return E=n,E}var k,K;function ve(){if(K)return k;K=1;var e=ge(),n=/^\s+/;function i(a){return a&&a.slice(0,e(a)+1).replace(n,"")}return k=i,k}var x,Q;function Y(){if(Q)return x;Q=1;var e=X(),n=e.Symbol;return x=n,x}var P,Z;function he(){if(Z)return P;Z=1;var e=Y(),n=Object.prototype,i=n.hasOwnProperty,a=n.toString,o=e?e.toStringTag:void 0;function l(u){var c=i.call(u,o),r=u[o];try{u[o]=void 0;var t=!0}catch{}var s=a.call(u);return t&&(c?u[o]=r:delete u[o]),s}return P=l,P}var G,ee;function me(){if(ee)return G;ee=1;var e=Object.prototype,n=e.toString;function i(a){return n.call(a)}return G=i,G}var B,te;function pe(){if(te)return B;te=1;var e=Y(),n=he(),i=me(),a="[object Null]",o="[object Undefined]",l=e?e.toStringTag:void 0;function u(c){return c==null?c===void 0?o:a:l&&l in Object(c)?n(c):i(c)}return B=u,B}var A,ne;function be(){if(ne)return A;ne=1;function e(n){return n!=null&&typeof n=="object"}return A=e,A}var D,re;function ye(){if(re)return D;re=1;var e=pe(),n=be(),i="[object Symbol]";function a(o){return typeof o=="symbol"||n(o)&&e(o)==i}return D=a,D}var N,ie;function Te(){if(ie)return N;ie=1;var e=ve(),n=V(),i=ye(),a=NaN,o=/^[-+]0x[0-9a-f]+$/i,l=/^0b[01]+$/i,u=/^0o[0-7]+$/i,c=parseInt;function r(t){if(typeof t=="number")return t;if(i(t))return a;if(n(t)){var s=typeof t.valueOf=="function"?t.valueOf():t;t=n(s)?s+"":s}if(typeof t!="string")return t===0?t:+t;t=e(t);var h=l.test(t);return h||u.test(t)?c(t.slice(2),h?2:8):o.test(t)?a:+t}return N=r,N}var F,oe;function Se(){if(oe)return F;oe=1;var e=V(),n=fe(),i=Te(),a="Expected a function",o=Math.max,l=Math.min;function u(c,r,t){var s,h,T,y,v,d,p=0,_=!1,S=!1,C=!0;if(typeof c!="function")throw new TypeError(a);r=i(r)||0,e(t)&&(_=!!t.leading,S="maxWait"in t,T=S?o(i(t.maxWait)||0,r):T,C="trailing"in t?!!t.trailing:C);function M(f){var b=s,w=h;return s=h=void 0,p=f,y=c.apply(w,b),y}function Re(f){return p=f,v=setTimeout(I,r),_?M(f):y}function Le(f){var b=f-d,w=f-p,ue=r-b;return S?l(ue,T-w):ue}function ae(f){var b=f-d,w=f-p;return d===void 0||b>=r||b<0||S&&w>=T}function I(){var f=n();if(ae(f))return se(f);v=setTimeout(I,Le(f))}function se(f){return v=void 0,C&&s?M(f):(s=h=void 0,y)}function Ee(){v!==void 0&&clearTimeout(v),p=0,s=d=h=v=void 0}function ke(){return v===void 0?y:se(n())}function W(){var f=n(),b=ae(f);if(s=arguments,h=this,d=f,b){if(v===void 0)return Re(d);if(S)return clearTimeout(v),v=setTimeout(I,r),M(d)}return v===void 0&&(v=setTimeout(I,r)),y}return W.cancel=Ee,W.flush=ke,W}return F=u,F}var we=Se();const je=le(we);function _e({trackOnlineStatus:e=!0,debounceDelay:n=0,initialDetails:i={}}={}){const[a,o]=g.useState(()=>{if(typeof navigator<"u"){const{userAgent:u,language:c,onLine:r}=navigator;return{userAgent:u,language:c,onLine:r,...i}}return{userAgent:"",language:"",onLine:!1,...i}}),l=g.useCallback(()=>{o(u=>({...u,onLine:navigator.onLine}))},[]);return g.useEffect(()=>{if(!e)return;const u=je(l,n);return window.addEventListener("online",u),window.addEventListener("offline",u),()=>{window.removeEventListener("online",u),window.removeEventListener("offline",u),u.cancel()}},[l,n,e]),a}function Ie({enableHighAccuracy:e=!1,timeout:n=1/0,maximumAge:i=0,enableWatch:a=!1}={}){const[o,l]=g.useState({latitude:null,longitude:null,accuracy:null,altitude:null,altitudeAccuracy:null,heading:null,speed:null,timestamp:null,error:null});return g.useEffect(()=>{if(!("geolocation"in navigator)){console.warn("Geolocation API is not supported in this browser."),l({latitude:null,longitude:null,accuracy:null,altitude:null,altitudeAccuracy:null,heading:null,speed:null,timestamp:null,error:null});return}const u=t=>{const{coords:s,timestamp:h}=t;l({latitude:s.latitude,longitude:s.longitude,accuracy:s.accuracy,altitude:s.altitude??null,altitudeAccuracy:s.altitudeAccuracy??null,heading:s.heading??null,speed:s.speed??null,timestamp:h,error:null})},c=t=>{l({latitude:null,longitude:null,accuracy:null,altitude:null,altitudeAccuracy:null,heading:null,speed:null,timestamp:null,error:t})},r={enableHighAccuracy:e,timeout:n,maximumAge:i};if(a){const t=navigator.geolocation.watchPosition(u,c,r);return()=>navigator.geolocation.clearWatch(t)}else navigator.geolocation.getCurrentPosition(u,c,r)},[e,n,i,a]),o}function Oe({onStart:e,onEnd:n,onError:i,rate:a=1,pitch:o=1,volume:l=1,voiceURI:u}={}){const[c,r]=g.useState(!1),[t,s]=g.useState([]),h=g.useRef(null);return g.useEffect(()=>{const v=()=>{const d=window.speechSynthesis.getVoices();s(d)};return"speechSynthesis"in window?(window.speechSynthesis.addEventListener("voiceschanged",v),v()):console.warn("SpeechSynthesis API is not supported in this browser."),()=>{"speechSynthesis"in window&&window.speechSynthesis.removeEventListener("voiceschanged",v)}},[]),{speak:v=>{if(!("speechSynthesis"in window)){console.warn("SpeechSynthesis API is not supported in this browser.");return}if(c){console.warn("Speech is already in progress.");return}const d=new SpeechSynthesisUtterance(v);if(h.current=d,d.rate=a,d.pitch=o,d.volume=l,u){const p=t.find(_=>_.voiceURI===u);p?d.voice=p:console.warn("Specified voiceURI not found. Default voice will be used.")}d.onstart=()=>{r(!0),e==null||e()},d.onend=()=>{r(!1),n==null||n()},d.onerror=p=>{r(!1),i==null||i(p)},window.speechSynthesis.speak(d)},cancel:()=>{"speechSynthesis"in window&&(window.speechSynthesis.cancel(),r(!1))},isSpeaking:c,voices:t}}function qe(){const[e,n]=g.useState(""),[i,a]=g.useState(!1),[o,l]=g.useState("");return{copiedText:e,isCopied:i,clipboardContent:o,copyToClipboard:async r=>{try{await navigator.clipboard.writeText(r),n(r),a(!0),setTimeout(()=>a(!1),2e3)}catch(t){console.error("Failed to copy text: ",t),a(!1)}},readFromClipboard:async()=>{try{const r=await navigator.clipboard.readText();l(r)}catch(r){console.error("Failed to read from clipboard: ",r)}}}}m.useBatteryDetails=ce,m.useClipBoardDetails=qe,m.useGeolocationDetails=Ie,m.usePlatformDetails=_e,m.useSpeechSynthesis=Oe,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
//# sourceMappingURL=react-extended-hooks-umd.js.map