@gsretail.com/gui-core
Version:
A skeleton to create your own React component library using Rollup, TypeScript, Sass and Storybook
2 lines (1 loc) • 1.97 kB
JavaScript
import{useReducer as e,useRef as t,useLayoutEffect as n,useEffect as r}from"react";const o=o=>{const[,s]=e((e=>e+1),0),c=t(null),{replace:u,append:a}=o,l=u?u(o.format(o.value)):o.format(o.value),i=t(!1);return"production"!==process.env.NODE_ENV&&"undefined"==typeof window||n((()=>{if(null==c.current)return;let[e,t,n,r,i]=c.current;c.current=null;const d=r&&i,p=e.slice(t.selectionStart).search(o.accept||/\d/g),f=-1!==p?p:0,m=e=>(e.match(o.accept||/\d/g)||[]).join(""),v=m(e.substr(0,t.selectionStart)),g=e=>{let t=0,n=0;for(let r=0;r!==v.length;++r){let o=e.indexOf(v[r],t)+1,s=m(e).indexOf(v[r],n)+1;s-n>1&&(o=t,s=n),n=Math.max(s,n),t=Math.max(t,o)}return t};if(!0===o.mask&&n&&!i){let t=g(e);const n=m(e.substr(t))[0];t=e.indexOf(n,t),e=`${e.substr(0,t)}${e.substr(t+1)}`}let h=o.format(e);null==a||t.selectionStart!==e.length||i||(n?h=a(h):""===m(h.slice(-1))&&(h=h.slice(0,-1)));const E=u?u(h):h;return l===E?s():o.onChange(E),()=>{let e=g(h);if(null!=o.mask&&(n||r&&!d))for(;h[e]&&""===m(h[e]);)e+=1;t.selectionStart=t.selectionEnd=e+(d?1+f:0)}})),r((()=>{const e=e=>{"Delete"===e.code&&(i.current=!0)},t=e=>{"Delete"===e.code&&(i.current=!1)};return document.addEventListener("keydown",e),document.addEventListener("keyup",t),()=>{document.removeEventListener("keydown",e),document.removeEventListener("keyup",t)}}),[]),{value:null!=c.current?c.current[0]:l,onChange:e=>{if("production"!==process.env.NODE_ENV){if("number"===e.target.type)return void console.error("Rifm does not support input type=number, use type=tel instead.");if("date"===e.target.type)return void console.error("Rifm does not support input type=date.")}const t=e.target.value;if(c.current=[t,e.target,t.length>l.length,i.current,l===o.format(t)],"production"!==process.env.NODE_ENV){const e=o.format(t);t!==e&&t.toLowerCase()===e.toLowerCase()&&console.warn("Case enforcement does not work with format. Please use replace={value => value.toLowerCase()} instead")}s()}}};export{o as useRifm};