@wareme/currency-input
Version:
Easily input currencies in Dark applications
4 lines (2 loc) • 8.5 kB
JavaScript
import{detectIsArray as Uq,detectIsEmpty as Mq,detectIsNull as xq,detectIsNumber as gq,detectIsString as fq,detectIsUndefined as zq,illegal as Sq}from"@dark-engine/core";var t=(H)=>Sq(H,"currency-input"),Bq=(H)=>/\d/gi.test(H);var N=(H)=>{return H.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")},nq=(H,B=",")=>{let q=new RegExp(N(B),"g");return H.replace(q,"")},sq=(H,B)=>{let q=N(B.join("")),Q=new RegExp(`[^\\d${q}]`,"gi");return H.replace(Q,"")};var vq={k:1000,m:1e6,b:1e9},mq=(H,B=".")=>{let q=new RegExp(`(\\d+(${N(B)}\\d*)?)([kmb])$`,"i"),Q=H.match(q);if(Q){let[,Y,,X]=Q,z=vq[X.toLowerCase()],J=Number(Y.replace(B,"."))*z;return String(J)}return null},l=({value:H,groupSeparator:B=",",decimalSeparator:q=".",allowDecimals:Q=!0,decimalsLimit:Y=2,allowNegativeValue:X=!0,disableAbbreviations:z=!1,prefix:J="",transformRawValue:M=(U)=>U})=>{let U=M(H);if(U==="-")return U;let P=(()=>{if(z)return[];return["k","m","b"]})(),w=new RegExp(`((^|\\D)-\\d)|(-${N(J)})`).test(U),[E,C]=RegExp(`(\\d+)-?${N(J)}`).exec(H)||[],G=(()=>{if(J){if(E)return U.replace(E,"").concat(C);return U.replace(J,"")}return U})(),K=nq(G,B),L=sq(K,[B,q,...P]),O=L;if(!z){if(P.some((I)=>I===L.toLowerCase().replace(q,"")))return"";let R=mq(L,q);if(fq(R))O=R}let b=(()=>{if(w&&X)return"-";return""})();if(q&&O.includes(q)){let[R,I]=L.split(q),p=Y&&I?I.slice(0,Y):I,c=Q?`${q}${p}`:"";return`${b}${R}${c}`}return`${b}${O}`},Gq=(H,B,q)=>{if(gq(q)&&H.length>1){if(q===0)return H.replace(B,"");if(H.includes(B)){let[z,J]=H.split(B);if(J.length===q)return H;if(J.length>q)return`${z}${B}${J.slice(0,q)}`}let Y=(()=>{if(H.length>q)return new RegExp(`(\\d+)(\\d{${q}})`);return/(\d)(\d+)/})(),X=H.match(Y);if(X){let[,z,J]=X;return`${z}${B}${J}`}}return H},Hq=(H,{groupSeparator:B=",",decimalSeparator:q="."})=>{let Q=new RegExp(`\\d([^${N(B)}${N(q)}0-9]+)`),Y=H.match(Q);if(Uq(Y))return Y[1];return null},dq={currencySymbol:"",groupSeparator:"",decimalSeparator:"",prefix:"",suffix:""},Kq=(H)=>{let{locale:B,currency:q}=H||{};return(()=>{if(B){if(q)return new Intl.NumberFormat(B,{currency:q,style:"currency"});return new Intl.NumberFormat(B)}return new Intl.NumberFormat})().formatToParts(1000.1).reduce((X,z,J)=>{if(z.type==="currency")if(J===0)return{...X,currencySymbol:z.value,prefix:z.value};else return{...X,currencySymbol:z.value,suffix:z.value};if(z.type==="group")return{...X,groupSeparator:z.value};if(z.type==="decimal")return{...X,decimalSeparator:z.value};return X},dq)},x=(H)=>{let{value:B,decimalSeparator:q,intlConfig:Q,decimalScale:Y,prefix:X,suffix:z=""}=H;if(B===""||zq(B))return"";if(B==="-")return"-";let M=new RegExp(`^\\d?-${(()=>{if(Mq(X))return"";return`${N(X)}?`})()}\\d`).test(B),W=(()=>{if(q!==".")return pq(B,q,M);return B})(),y=(()=>{if(q&&q!=="-"&&W.startsWith(q))return`0${W}`;return W})(),w={minimumFractionDigits:Y||0,maximumFractionDigits:20},C=(Q?new Intl.NumberFormat(Q.locale,Q.currency?{...w,style:"currency",currency:Q.currency}:w):new Intl.NumberFormat(void 0,w)).formatToParts(Number(y)),F=cq(C,H),G=Hq(F,{...H}),K=B.slice(-1)===q?q:"",O=(()=>{let n=/\d+\.(\d+)/,b=y.match(n);if(Uq(b)&&b.length>1)return b[1];return null})();if(Mq(Y)&&O&&q)if(F.includes(q))F=F.replace(RegExp(`(\\d+)(${N(q)})(\\d+)`,"g"),`$1$2${O}`);else if(G&&!z)F=F.replace(G,`${q}${O}${G}`);else F=`${F}${q}${O}`;if(z&&K)return`${F}${K}${z}`;if(G&&K)return F.replace(G,`${K}${G}`);if(G&&z)return F.replace(G,`${K}${z}`);return[F,K,z].join("")},pq=(H,B,q)=>{if(B&&B!=="."){let Q=H.replace(RegExp(N(B),"g"),".");if(q&&B==="-")return`-${Q.slice(1)}`;return Q}return H},cq=(H,{prefix:B,groupSeparator:q,decimalSeparator:Q,decimalScale:Y,disableGroupSeparators:X=!1})=>{return H.reduce((z,{type:J,value:M},U)=>{if(U===0&&B){if(J==="minusSign")return[M,B];if(J==="currency")return[...z,B];return[B,M]}if(J==="currency"){if(B)return z;return[...z,M]}if(J==="group"){if(!X){if(q)return[...z,q];return[...z,M]}return z}if(J==="decimal"){if(Y&&Y===0)return z;if(Q)return[...z,Q];return[...z,M]}if(J==="fraction"){if(Y)return[...z,M.slice(0,Y)];return[...z,M]}return[...z,M]},[""]).join("")},Tq=(H,B=".",q)=>{if(zq(q)||H===""||zq(H))return H;let Q=H.match(/\d/g);if(xq(Q))return"";let[Y,X]=H.split(B);if(q===0)return Y;let z=X||"";if(z.length<q)while(z.length<q)z+="0";else z=z.slice(0,q);return`${Y}${B}${z}`},Wq=({selectionStart:H,value:B,lastKeyStroke:q,stateValue:Q,groupSeparator:Y})=>{let X=H,z=B;if(Q&&X){let J=B.split("");if(q==="Backspace"&&Q[X]===Y)J.splice(X-1,1),X-=1;if(q==="Delete"&&Q[X]===Y)J.splice(X,1),X+=1;return z=J.join(""),{modifiedValue:z,cursorPosition:X}}return{modifiedValue:z,cursorPosition:H}};import{component as oq,useState as d,useEffect as Aq,useRef as uq,useMemo as iq,detectIsEmpty as _q,detectIsString as Jq,detectIsNumber as S,detectIsNull as Oq}from"@dark-engine/core";import{detectIsNaN as tq}from"@wareme/utils";import{jsxDEV as kq}from"@dark-engine/core/jsx-dev-runtime";var lq=oq(({allowDecimals:H=!0,allowNegativeValue:B=!0,id:q,name:Q,className:Y,customInput:X,decimalsLimit:z,defaultValue:J,disabled:M=!1,maxLength:U,value:W,onValueChange:P,fixedDecimalLength:y,placeholder:w,decimalScale:E,prefix:C,suffix:F,intlConfig:G,step:K,min:L,max:O,disableGroupSeparators:n=!1,disableAbbreviations:b=!1,decimalSeparator:R,groupSeparator:I,onInput:p,onFocus:c,onBlur:o,onKeyDown:Qq,onKeyUp:Xq,transformRawValue:Pq,formatValueOnBlur:Nq=!0,...Eq})=>{if(R&&Bq(R))t("decimalSeparator cannot be a number");if(I&&Bq(I))t("groupSeparator cannot be a number");let u=iq(()=>Kq(G),[G]),j=R||u.decimalSeparator||"",g=I||u.groupSeparator||"";if(j&&g&&j===g&&n===!1)t("decimalSeparator cannot be the same as groupSeparator");let s={decimalSeparator:j,groupSeparator:g,disableGroupSeparators:n,intlConfig:G,prefix:C||u.prefix,suffix:F},r={decimalSeparator:j,groupSeparator:g,allowDecimals:H,decimalsLimit:z||y||2,allowNegativeValue:B,disableAbbreviations:b,prefix:C||u.prefix,transformRawValue:Pq},Rq=()=>{if(Jq(J)||S(J))return x({...s,decimalScale:E,value:String(J)});if(!Oq(W)||S(J))return x({...s,decimalScale:E,value:String(W)});return""},[T,v]=d(Rq()),[a,Iq]=d(!1),[e,qq]=d(0),[Yq,Cq]=d(0),[Lq,bq]=d(null),V=uq(null),Zq=(Z,A)=>{Iq(!0);let{modifiedValue:_,cursorPosition:k}=Wq({selectionStart:A,value:Z,lastKeyStroke:Lq,stateValue:T,groupSeparator:g}),$=l({value:_,...r});if(U&&$.replace(/-/g,"").length>U)return;if($===""||$==="-"||$===j){if(P)P(void 0,Q,{float:null,formatted:"",value:""});v($),qq(1);return}let D=(()=>{if(j)return $.replace(j,".");return $})(),m=parseFloat(D),h=x({value:$,...s});if(S(k)){let i=(()=>{let Fq=k+(h.length-Z.length);if(Fq<=0){if(C)return C.length;return 0}return Fq})();qq(i),Cq(Yq+1)}if(v(h),P)P($,Q,{float:m,formatted:h,value:$});return h},Dq=(Z)=>{let{value:A,selectionStart:_}=Z.target,k=Zq(A,_)||"";if(p)p(Z);return k},yq=(Z)=>{if(c)c(Z);if(T)return T.length;return 0},wq=(Z)=>{let{value:A}=Z.target,_=l({value:A,...r});if(_==="-"||_===j||!_){if(v(""),o)o(Z);return}let k=Gq(_,j,y),f=Tq(k,j,(()=>{if(S(E))return E;return y})()),D=parseFloat(f.replace(j,".")),m=x({...s,value:f});if(P&&Nq)P(f,Q,{float:D,formatted:m,value:f});if(v(m),o)o(Z)},Vq=(Z)=>{let{key:A}=Z.sourceEvent;if(bq(A),K&&(A==="ArrowUp"||A==="ArrowDown")){Z.preventDefault(),qq(T.length);let _=()=>{if(Jq(W))return W.replace(j,".");return l({value:T,...r})},$=(()=>{let i=parseFloat(_());if(tq(i))return 0;return i})(),D=(()=>{if(A==="ArrowUp")return $+K;return $-K})();if(S(L)&&D<L)return;if(S(O)&&D>O)return;let h=(()=>{if(String(K).includes("."))return Number(String(K).split(".")[1].length);return null})();Zq(String((()=>{if(Oq(h))return D;return D.toFixed(h)})()).replace(".",j))}if(Qq)Qq(Z)},hq=(Z)=>{let{key:A}=Z.sourceEvent,{selectionStart:_}=Z.target;if(A!=="ArrowUp"&&A!=="ArrowDown"&&T!=="-"){let k=Hq(T,{groupSeparator:g,decimalSeparator:j});if(k&&_&&_>T.length-k.length){if(V.current){let $=T.length-k.length;V.current.setSelectionRange($,$)}}}if(Xq)Xq(Z)};Aq(()=>{if(_q(W)&&_q(J))v("")},[J,W]),Aq(()=>{if(a&&T!=="-"&&V.current&&document.activeElement===V.current)V.current.setSelectionRange(e,e)},[T,e,V,a,Yq]);let $q={type:"text",inputMode:"decimal",id:q,name:Q,className:Y,onInput:Dq,onBlur:wq,onFocus:yq,onKeyDown:Vq,onKeyUp:hq,placeholder:w,disabled:M,value:(()=>{if(Jq(W)&&T!=="-"&&(!j||T!==j))return x({...s,decimalScale:(()=>{if(a)return null;return E})(),value:W});return T})(),ref:V,...Eq};if(X)return kq(X,{...$q},void 0,!1,void 0,this);return kq("input",{...$q},void 0,!1,void 0,this)}),rq=lq;export{x as formatValue,rq as CurrencyInput};
//# debugId=39C1D7EB392B5B4464756E2164756E21