mukul-react-hooks
Version:
A comprehensive collection of custom React hooks for modern web development. Includes utilities for fullscreen management, media queries, timeouts, scroll detection, and unsaved change alerts. Built with TypeScript for type safety and optimized for tree-s
2 lines (1 loc) • 4.46 kB
JavaScript
import{useState as e,useCallback as t,useEffect as n,useRef as r,useMemo as u}from'react';const o=()=>{const[r,u]=e(!1),o=t((()=>{const e=document;u(null!=e.fullscreenElement||null!=e.mozFullScreenElement||null!=e.webkitFullscreenElement||null!=e.msFullscreenElement)}),[]);n((()=>(document.addEventListener('fullscreenchange',o),document.addEventListener('mozfullscreenchange',o),document.addEventListener('webkitfullscreenchange',o),document.addEventListener('msfullscreenchange',o),()=>{document.removeEventListener('fullscreenchange',o),document.removeEventListener('mozfullscreenchange',o),document.removeEventListener('webkitfullscreenchange',o),document.removeEventListener('msfullscreenchange',o)})),[o]);const s=t((()=>r?(()=>{const e=document;return e.exitFullscreen?e.exitFullscreen():e.mozCancelFullScreen?e.mozCancelFullScreen():e.webkitExitFullscreen?e.webkitExitFullscreen():e.msExitFullscreen?e.msExitFullscreen():Promise.reject(new Error('Fullscreen API is not supported!'))})():(()=>{const e=document.documentElement;return e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen?e.msRequestFullscreen():Promise.reject(new Error('Fullscreen API is not supported!'))})()),[r]);return{isFullscreen:r,toggleFullscreen:s}};function s(){const[t,r]=e(!0);return n((()=>{const e=()=>{0===window.scrollY?r(!0):r(!1)};return window.addEventListener('scroll',e),()=>window.removeEventListener('scroll',e)}),[]),t}function c(t){const[r,u]=e(!1);return n((()=>{const e=window.matchMedia(t);e.matches!==r&&u(e.matches);const n=()=>u(e.matches);return window.addEventListener('resize',n),()=>window.removeEventListener('resize',n)}),[r,t]),r}function l(e,o){const s=r(null),c=r(e);n((()=>{c.current=e}),[e]),n((()=>()=>{s.current&&clearTimeout(s.current)}),[]);const l=t((e=>{s.current&&clearTimeout(s.current),s.current=setTimeout((()=>{s.current=null,c.current?.(e)}),o)}),[o]);return u((()=>[l]),[l])}const i=e=>{n((()=>{const t=t=>{if(e){t.preventDefault();const e='You have unsaved changes. Are you sure you want to leave?';return t.returnValue=e,e}};return window.addEventListener('beforeunload',t),()=>{window.removeEventListener('beforeunload',t)}}),[e])};const a=['January','February','March','April','May','June','July','August','September','October','November','December'];var m=Object.freeze({__proto__:null,arrayToCommaSeparatedText:function(e){return e?.length>0?e.map((e=>e)).join(', ').toString():'N/A'},asyncDelay:function(e){return new Promise((t=>{setTimeout(t,e)}))},downloadString:function(e,t,n){const r=`data:text/json;charset=utf-8,${encodeURIComponent(e)}`,u=document.createElement('a');u.setAttribute('href',r),u.setAttribute('download',`${t}.${n}`),document.body.appendChild(u),u.click(),u.remove()},generateUniqueId:function(){return`uuid-${Date.now()}-${Math.random().toString(16)}`},internationalCurrencyConvert:function(e){return Math.abs(Number(e))>=1e9?`${(Math.abs(Number(e))/1e9).toFixed(0)} B`:Math.abs(Number(e))>=1e6?`${(Math.abs(Number(e))/1e6).toFixed(0)} M`:Math.abs(Number(e))>=1e3?`${(Math.abs(Number(e))/1e3).toFixed(0)} K`:Math.abs(Number(e))},isEmptyObject:function(e){for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0},isValidEmail:function(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)},numberFormatWithCommas:function(e){let t=e.toString();const n=/(-?\d+)(\d{3})/;for(;n.test(t);)t=t.replace(n,'$1,$2');return t},randomColor:function(){return`#${Math.floor(16777215*Math.random()).toString(16).padStart(6,'0').toUpperCase()}`},transformString:function(e){return e.replace(/\s+/g,'_').toLowerCase()},truncateStringEnd:function(e,t){return e.length>t?`${e.slice(0,t)}...`:e},truncateStringMiddle:function(e,t=10,n='...'){const r=e.length;if(r>t){const u=n.length;if(u>t)return e.substr(r-t);const o=-.5*(t-r-u),s=r/2;return e.substr(0,s-o)+n+e.substr(r-s+o)}return e},unixToDateTime:function(e){const t=new Date(e);return`${t.getDate()} ${a[t.getMonth()]?.substring(0,3)} ${t.getFullYear()}, ${function(e){let t=e.getHours(),n=e.getMinutes(),r='AM';return t>=12&&(r='PM',t%=12),t=t||12,`${t}:${n<10?`0${n}`:n.toString()} ${r}`.toUpperCase()}(t)}`},waitSomeMoment:function(e){const t=(new Date).getTime();let n=t;for(;n<t+e;)n=(new Date).getTime()}});export{m as lib,o as useFullScreen,s as useIsTopOfPage,c as useMediaQuery,l as useTimeout,i as useUnsavedChangeAlert};