siegel
Version:
Web application development ecosystem
1 lines • 4.46 kB
JavaScript
import{useState as e,useEffect as t}from"react";import l from"../../../common/is/exists/index.js";import*as i from"../_internals/key_codes.js";import{setCaretPos as s,INPUT_TYPE as r}from"./utils.js";let{DELETE_BACKWARD:n,DELETE_CUT:o,DELETE_FORWARD:a,INSERT_PASTE:f,INSERT_TEXT:u}=r;export default((r,h)=>{let{copyMask:p,formatterMode:g,valuePlaceholderChar:c=" ",shiftNextChar:d=!0}=r,{value:P,ref:v,onChange:y,onFocus:x,onCopy:F,onPaste:m,onKeyDown:D}=h,I=P.length,{newValue:b,placeholdersIndexesMap:V,placeholderCharsOrdered:E,maxLength:T,FIRST_PLACEHOLDER_INDEX:j,LAST_PLACEHOLDER_INDEX:k,FIRST_EMPTY_PLACEHOLDER_INDEX:C,LAST_FILLED_INDEX:O}=function(e,t){let i,s,r,n,{pattern:o,patternValueChar:a,formatterMode:f,valuePlaceholderChar:u=" "}=e,h=o.length,p={},g=[],c=0,d="";for(let e=0,r=0;e<h;e++){let n=o[e],h={};l(s)&&(h.prevFilled=s),n==a?(h.index=c,c=g.push(e),l(t[r])?(h.isFilled=!0,d+=t[r],r++,s=e):(f||(d+=u),l(i)||(i=e))):f&&l(i)||(d+=n),p[e]=h}let P=g[0],v=g.at(-1);for(let e=v;e>=0;e--){let t=p[e];l(n)&&(t.next=n),l(r)&&(t.nextFilled=r);let{index:i,isFilled:s}=t;l(i)&&(n=e,s&&(r=e))}let y=p[h-1];return p[h]={prevFilled:y.isFilled?h-1:y.prevFilled},{newValue:d,placeholdersIndexesMap:p,placeholderCharsOrdered:g,maxLength:c,FIRST_PLACEHOLDER_INDEX:P,LAST_PLACEHOLDER_INDEX:v,FIRST_EMPTY_PLACEHOLDER_INDEX:i,LAST_FILLED_INDEX:s}}(r,P),w=e({caretPos:j,lastInputValue:b,history:[],historyPos:-1})[0];function N(e,t,i){w.historyPos<w.history.length-1&&(w.history.length=w.historyPos+1),w.caretPos=i;let s="";if(t.length)for(let e=0;e<T;e++){let i=t[E[e]];if(g&&!l(i))break;i!=c&&(s+=i)}e.target.value=s,y(e)}function R(e,t,i,r){let n=l(O)&&t<=O,o=l(C);if(n||o){let s=r||w.lastInputValue.split(""),o=i.length,a=I;if(n){let{index:e,next:i}=V[t];a=l(e)?e:V[i].index,d&&a+o<T&&function(e,t,l=1){let i=O==k?T-2:V[O].index;for(let s=i+l-1;s>=t;s--)e[E[s+l]]=e[E[s]]}(s,a,o)}let f=T-a,u=o>f?f:o;for(let e=0,t=a;e<u;e++,t++)s[E[t]]=i[e];let h=E[u+a-1],{next:p}=V[h];N(e,s,l(p)?p:h+1)}else s(v,O+1)}function U(e,t,i,r=""){let n,{isFilled:o,index:a,next:f}=V[t];if(o?n=a:l(f)&&(n=V[f].index),l(n)){let l=w.lastInputValue.split(""),s=t+i,o=r.length,a=t<j?j:t,f=0;for(let e=n;e<T;e++){let t=E[e];if(t<s){let e=r[f];l[t]=e||c,e&&(f++,a=V[t].next||t+1)}else break}d&&f<o&&!V[k].isFilled?R(e,a,r.substring(f),l):N(e,l,a)}else s(v,j)}t(()=>{let e=s(v,w.caretPos);return()=>{w.historyPos==w.history.length-1&&(w.history.push(P),w.historyPos++),clearTimeout(e)}},[P]),h.value=w.lastInputValue=b,p||(h.onCopy=h.onCut=e=>{let{selectionStart:t,selectionEnd:i}=e.target,{isFilled:s,nextFilled:r}=V[t],n=w.lastInputValue.split(""),o=s?n[t]:"";for(let e=r;e<i&&l(e);e=V[e].nextFilled)o+=n[e];o&&navigator.clipboard.writeText(o),F?.(e)}),y&&(h.onPaste=e=>{let{selectionStart:t,selectionEnd:l}=e.target,i=e.clipboardData.getData("text"),s=t-l;s?U(e,t,Math.abs(s),i):R(e,t,i),m?.(e)},h.onChange=e=>{let t,{inputType:i}=e.nativeEvent;if(i==f)return;let{selectionStart:r,value:h}=e.target,p=h.length;if(!p)return N(e,[],j);let g=b.length-p;if(i==u){let t=r-1,{data:l}=e.nativeEvent;++g?U(e,t,g,l):R(e,t,l)}else{let f=i==n||i==o;if((f||i==a)&&I)if(g>1)U(e,r,g);else{let i=w.lastInputValue.split("");if(f)if(r<j)return s(v,j);else{let e,s,{prevFilled:n,isFilled:o}=V[r];o?(e=r,s=n):(e=n,s=V[n].prevFilled),i[e]=c,t=l(s)?s+1:j}else{if(r>O)return s(v,k+1);let{nextFilled:e,isFilled:n}=V[r],o=n?r:e;l(o)&&(i[o]=c),t=r<j?j:r}N(e,i,t)}else s(v,j)}},h.onFocus=e=>{l(O)||(w.caretPos=C,s(v,C)),x?.(e)},h.onKeyDown=e=>{let t,{code:r,shiftKey:n}=e.nativeEvent,{history:o,historyPos:a}=w;if(r==i.UNDO)a>-1&&(a+1==o.length&&o.push(P),t=o[a],w.historyPos--);else if(r==i.REDO)a<o.length-2&&(t=o[a+2],w.historyPos++);else{let t=r==i.LEFT,o=r==i.RIGHT,a=r==i.UP,f=r==i.DOWN;if(f||a||t||o){e.preventDefault();let{selectionStart:i,selectionEnd:r}=e.target;if(a||f){let e=a?j:O+1||j;w.caretPos=e,s(v,e)}else{let e,o,a;if(l(O))if(!n&&r-i){let e=t?i:r;w.caretPos=e,s(v,e)}else if(t){let{prevFilled:t}=V[i];if(e=a=t,n)if(w.caretPos>i){let t=V[r].prevFilled;r-t==1&&(t=V[t].prevFilled+1),e=i,o=a=t}else o=i==r?e+1:r,a=e;else i-t>1&&(a=++e)}else{let{nextFilled:t,isFilled:s}=V[i];if(!l(e=s?i:t))return;if(n)if(i==r)o=e+1;else if(w.caretPos<r){let t=V[i].nextFilled;e=a=l(t)?t:r,o=r}else{let{isFilled:e,nextFilled:t}=V[r];o=(e?r:t)+1||r}else s&&e++;l(a)||(a=l(o)?o:e)}else e=j;l(a)&&(w.caretPos=a,s(v,e,o))}}}if(l(t)){e.target.value=t;let l=t.length;w.caretPos=l?l==T?k+1:E[l-1]+1:j,y(e)}D?.(e)})});