@corva/ui 3.75.0-14 → 3.75.0-16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/cjs-bundle/components/AttachmentPreview/useStoredAttachments.js +1 -1
  2. package/cjs-bundle/components/AttachmentPreview/useStoredAttachments.js.map +1 -1
  3. package/cjs-bundle/components/CommentComposer/useAttachmentUpload.js +1 -1
  4. package/cjs-bundle/components/CommentComposer/useAttachmentUpload.js.map +1 -1
  5. package/cjs-bundle/componentsV2/DatePicker/Input/Input.js +1 -1
  6. package/cjs-bundle/componentsV2/DatePicker/Input/Input.js.map +1 -1
  7. package/cjs-bundle/componentsV2/DatePicker/utils.js +1 -1
  8. package/cjs-bundle/componentsV2/DatePicker/utils.js.map +1 -1
  9. package/cjs-bundle/effects/useSignedURL.js +1 -1
  10. package/cjs-bundle/effects/useSignedURL.js.map +1 -1
  11. package/cjs-bundle/utils/signedLinkCache.js +2 -0
  12. package/cjs-bundle/utils/signedLinkCache.js.map +1 -0
  13. package/components/AttachmentPreview/useStoredAttachments.d.ts.map +1 -1
  14. package/components/AttachmentPreview/useStoredAttachments.js +1 -1
  15. package/components/AttachmentPreview/useStoredAttachments.js.map +1 -1
  16. package/components/CommentComposer/useAttachmentUpload.d.ts.map +1 -1
  17. package/components/CommentComposer/useAttachmentUpload.js +1 -1
  18. package/components/CommentComposer/useAttachmentUpload.js.map +1 -1
  19. package/components/Drillstring/BHAComponentDetail/constants.d.ts +2 -2
  20. package/componentsV2/DatePicker/Input/Input.d.ts.map +1 -1
  21. package/componentsV2/DatePicker/Input/Input.js +1 -1
  22. package/componentsV2/DatePicker/Input/Input.js.map +1 -1
  23. package/componentsV2/DatePicker/utils.d.ts +8 -1
  24. package/componentsV2/DatePicker/utils.d.ts.map +1 -1
  25. package/componentsV2/DatePicker/utils.js +1 -1
  26. package/componentsV2/DatePicker/utils.js.map +1 -1
  27. package/effects/useSignedURL.d.ts +1 -1
  28. package/effects/useSignedURL.d.ts.map +1 -1
  29. package/effects/useSignedURL.js +1 -1
  30. package/effects/useSignedURL.js.map +1 -1
  31. package/mcp-server/server.mjs +1 -1
  32. package/package.json +1 -1
  33. package/tsconfig.tsbuildinfo +1 -1
  34. package/utils/__tests__/signedLinkCache.test.d.ts +2 -0
  35. package/utils/__tests__/signedLinkCache.test.d.ts.map +1 -0
  36. package/utils/signedLinkCache.d.ts +9 -0
  37. package/utils/signedLinkCache.d.ts.map +1 -0
  38. package/utils/signedLinkCache.js +2 -0
  39. package/utils/signedLinkCache.js.map +1 -0
@@ -1,2 +1,2 @@
1
- import r from"@babel/runtime/helpers/toConsumableArray";import e from"@babel/runtime/helpers/asyncToGenerator";import n from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/slicedToArray";import i from"@babel/runtime/regenerator";import{useState as o,useRef as u,useCallback as l,useEffect as c}from"react";import a from"react-s3-uploader/s3upload";import{getAttachmentKind as f}from"../AttachmentPreview/getAttachmentKind.js";import{ACCEPTED_ATTACHMENT_TYPES as s}from"../AttachFileButton/AttachFileButton.js";import{getS3SignedUrl as d,getS3DownloadLink as p}from"../../clients/jsonApi/index.js";import{getUrlFileName as v}from"../../utils/links.js";function m(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.push.apply(n,t)}return n}function h(r){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{};e%2?m(Object(t),!0).forEach((function(e){n(r,e,t[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):m(Object(t)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(t,e))}))}return r}var g=10,b=function(r){return r.type.startsWith("image/")?"image":r.type.startsWith("video/")?"video":"file"},w=function(r){return(r/1048576).toFixed(1)},U=function(r){return{id:r.url,name:r.name,file:null,previewUrl:"",isUploading:!1,error:null,uploaded:r}},y=0,j=function(){return"attachment-".concat(y+=1)},O=function(n){var m,g,y=n.value,O=n.onChange,k=n.onError,F=n.maxSizeBytes,x=n.maxFiles,L=void 0===x?10:x,P=n.accept,A=void 0===P?s:P,S=o([]),z=t(S,2),E=z[0],R=z[1],B=u(null),D=u(new Map),C=u(new Map),M=u([]),W=u(O),T=u(k);W.current=O,T.current=k;var I=u([]),Y=l((function(r){var e=r(M.current);M.current=e,R(e),I.current=function(r){return r.map((function(r){return r.uploaded})).filter(Boolean)}(e),W.current(I.current)}),[]),_=l((function(r,e){return Y((function(n){return n.map((function(n){return n.id===r?h(h({},n),e):n}))}))}),[Y]),G=l((function(r){var e,n;null===(e=D.current.get(r))||void 0===e||e.abortUpload(),D.current.delete(r),C.current.set(r,(null!==(n=C.current.get(r))&&void 0!==n?n:0)+1)}),[]),K=l((function(r){null!=r&&r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}),[]),q=l((function(){var r,e,n;null===(r=T.current)||void 0===r||r.call(T,null!==(e=null===(n=M.current.find((function(r){return r.error})))||void 0===n?void 0:n.error)&&void 0!==e?e:null)}),[]);c((function(){return function(){D.current.forEach((function(r){return r.abortUpload()})),D.current.clear(),M.current.forEach((function(r){r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}))}}),[]);var H=l((function(r,n){var t,o=(null!==(t=C.current.get(r))&&void 0!==t?t:0)+1;C.current.set(r,o);var u,l,c=function(){return C.current.get(r)===o},f=function(e){var n;c()&&(_(r,{isUploading:!1,error:e}),null===(n=T.current)||void 0===n||n.call(T,e))},s="",v=new a({files:[n],preprocess:function(r,e){return e(r)},onProgress:function(){},getSignedUrl:(l=e(i.mark((function r(e,n){var t;return i.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,r.next=3,d(e.name,e.type);case 3:t=r.sent,s=t.file_name,n(h(h({},t),{},{signedUrl:t.signed_url})),r.next=11;break;case 8:r.prev=8,r.t0=r.catch(0),f((null===r.t0||void 0===r.t0?void 0:r.t0.message)||"Failed to upload the file");case 11:case"end":return r.stop()}}),r,null,[[0,8]])}))),function(r,e){return l.apply(this,arguments)}),onFinishS3Put:(u=e(i.mark((function e(){var t,o;return i.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,p(s);case 3:if(t=e.sent,o=t.url,c()){e.next=7;break}return e.abrupt("return");case 7:D.current.delete(r),_(r,{isUploading:!1,error:null,uploaded:{url:o,name:s,size:n.size}}),q(),e.next=15;break;case 12:e.prev=12,e.t0=e.catch(0),f((null===e.t0||void 0===e.t0?void 0:e.t0.message)||"Failed to upload the file");case 15:case"end":return e.stop()}}),e,null,[[0,12]])}))),function(){return u.apply(this,arguments)}),onError:function(r){return f(r||"Failed to upload the file")}});D.current.set(r,v)}),[_,q]),J=l((function(e){var n,t=v(e);t&&(M.current.length>=L?null===(n=T.current)||void 0===n||n.call(T,"You can attach up to ".concat(L," files.")):M.current.some((function(r){var n;return(null===(n=r.uploaded)||void 0===n?void 0:n.url)===e}))||Y((function(n){return[].concat(r(n),[{id:j(),name:t,file:null,previewUrl:e,isUploading:!1,error:null,uploaded:{url:e,name:t}}])})))}),[Y,L]),N=l((function(e){var n,t,i,o,u=e.filter((function(r){return function(r,e){return e.split(",").map((function(r){return r.trim().toLowerCase()})).filter(Boolean).some((function(e){if(e.startsWith("."))return r.name.toLowerCase().endsWith(e);if(e.endsWith("/*")){var n=r.type.toLowerCase();return n?n.startsWith(e.slice(0,-1)):f({name:r.name})===e.slice(0,-1)}return r.type.toLowerCase()===e}))}(r,A)})),l=u.length<e.length?1===e.length?"That file type is not supported.":"Some files were skipped — unsupported file type.":null,c="You can attach up to ".concat(L," files."),a=L-M.current.length;if(!u.length||a<=0){var s;null===(s=T.current)||void 0===s||s.call(T,u.length?c:l)}else{var d=u.slice(0,a),p=d.map((function(r){var e=b(r),n=!!F&&r.size>F;return{id:j(),name:r.name,file:r,previewUrl:"file"===e?"":URL.createObjectURL(r),isUploading:!n,error:n?"File is too large (".concat(w(r.size)," MB). Maximum size is ").concat(w(F)," MB."):null,uploaded:null}}));Y((function(e){return[].concat(r(e),r(p))}));var v=u.length>d.length?c:null;null===(n=T.current)||void 0===n||n.call(T,null!==(t=null!==(i=null===(o=M.current.find((function(r){return r.error})))||void 0===o?void 0:o.error)&&void 0!==i?i:l)&&void 0!==t?t:v),p.filter((function(r){return!r.error})).forEach((function(r){return H(r.id,r.file)}))}}),[Y,L,F,H,A]),Q=l((function(r){var e,n=Array.from(null!==(e=r.target.files)&&void 0!==e?e:[]);B.current&&(B.current.value=""),n.length&&N(n)}),[N]),V=l((function(){var r;return null===(r=B.current)||void 0===r?void 0:r.click()}),[]),X=l((function(r){var e=String(r);G(e),K(M.current.find((function(r){return r.id===e}))),Y((function(r){return r.filter((function(r){return r.id!==e}))})),q()}),[G,K,Y,q]),Z=l((function(r){var e=String(r),n=M.current.find((function(r){return r.id===e}));null!=n&&n.file&&(G(e),_(e,{isUploading:!0,error:null}),q(),H(e,n.file))}),[G,_,H,q]),$=l((function(e){return Y((function(n){var t=new Map(n.map((function(r){return[r.id,r]}))),i=e.map((function(r){return t.get(String(r))})).filter(Boolean),o=n.filter((function(r){return!e.some((function(e){return String(e)===r.id}))}));return[].concat(r(i),r(o))}))}),[Y]),rr=l((function(){var r;M.current.forEach((function(r){G(r.id),K(r)})),Y((function(){return[]})),null===(r=T.current)||void 0===r||r.call(T,null)}),[G,Y,K]);c((function(){var r,e,n;(e=I.current,n=y,e.length===n.length&&e.every((function(r,e){return r.url===n[e].url})))||(M.current.forEach((function(r){G(r.id),r.previewUrl&&URL.revokeObjectURL(r.previewUrl)})),M.current=y.map(U),I.current=y,R(M.current),null===(r=T.current)||void 0===r||r.call(T,null))}),[y,G]);var er=o({}),nr=t(er,2),tr=nr[0],ir=nr[1],or=u(tr);or.current=tr;var ur=E.filter((function(r){return!r.file&&!r.previewUrl&&r.uploaded})).map((function(r){return r.uploaded.name})).join("|");return c((function(){var r=ur.split("|").filter((function(r){return r&&!(r in or.current)}));if(r.length){var e=!0;return Promise.all(r.map((function(r){return p(r,"inline").then((function(e){var n=e.url;return[r,n]})).catch((function(e){return console.error('Failed to sign stored attachment "'.concat(r,'"'),e),[r,""]}))}))).then((function(r){e&&ir((function(e){return h(h({},e),Object.fromEntries(r))}))})),function(){e=!1}}}),[ur]),{items:E.reduce((function(r,e){var n;if(e.file)return r.push({id:e.id,name:e.name,src:e.previewUrl,kind:b(e.file),size:e.file.size,isUploading:e.isUploading,hideDownload:!0,error:null!==(n=e.error)&&void 0!==n?n:void 0}),r;var t=e.uploaded,i=f(t),o=e.previewUrl||tr[t.name];return"file"===i||o?(r.push({id:e.id,name:t.name,src:o,kind:i,size:t.size,hideDownload:!0}),r):r}),[]),fileInputRef:B,openFileDialog:V,handleFileSelect:Q,addFiles:N,addLinkedImage:J,removeAttachment:X,handleRetry:Z,reorderAttachments:$,clearAttachments:rr,isUploading:E.some((function(r){return r.isUploading})),error:null!==(m=null===(g=E.find((function(r){return r.error})))||void 0===g?void 0:g.error)&&void 0!==m?m:null,count:E.length,isFull:E.length>=L,maxFiles:L}};export{g as DEFAULT_MAX_ATTACHMENTS,O as useAttachmentUpload};
1
+ import r from"@babel/runtime/helpers/toConsumableArray";import e from"@babel/runtime/helpers/asyncToGenerator";import n from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/slicedToArray";import i from"@babel/runtime/regenerator";import{useState as o,useRef as u,useCallback as l,useEffect as c}from"react";import a from"react-s3-uploader/s3upload";import{getAttachmentKind as f}from"../AttachmentPreview/getAttachmentKind.js";import{ACCEPTED_ATTACHMENT_TYPES as s}from"../AttachFileButton/AttachFileButton.js";import{getS3SignedUrl as d}from"../../clients/jsonApi/index.js";import{getUrlFileName as p}from"../../utils/links.js";import{getSignedLink as v,peekSignedLink as m}from"../../utils/signedLinkCache.js";function h(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.push.apply(n,t)}return n}function g(r){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{};e%2?h(Object(t),!0).forEach((function(e){n(r,e,t[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):h(Object(t)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(t,e))}))}return r}var b=10,w=function(r){return r.type.startsWith("image/")?"image":r.type.startsWith("video/")?"video":"file"},U=function(r){return(r/1048576).toFixed(1)},y=function(r){return{id:r.url,name:r.name,file:null,previewUrl:"",isUploading:!1,error:null,uploaded:r}},j=0,O=function(){return"attachment-".concat(j+=1)},k=function(n){var h,b,j=n.value,k=n.onChange,F=n.onError,x=n.maxSizeBytes,L=n.maxFiles,P=void 0===L?10:L,A=n.accept,S=void 0===A?s:A,z=o([]),E=t(z,2),R=E[0],B=E[1],C=u(null),D=u(new Map),M=u(new Map),W=u([]),T=u(k),I=u(F);T.current=k,I.current=F;var Y=u([]),_=l((function(r){var e=r(W.current);W.current=e,B(e),Y.current=function(r){return r.map((function(r){return r.uploaded})).filter(Boolean)}(e),T.current(Y.current)}),[]),G=l((function(r,e){return _((function(n){return n.map((function(n){return n.id===r?g(g({},n),e):n}))}))}),[_]),K=l((function(r){var e,n;null===(e=D.current.get(r))||void 0===e||e.abortUpload(),D.current.delete(r),M.current.set(r,(null!==(n=M.current.get(r))&&void 0!==n?n:0)+1)}),[]),q=l((function(r){null!=r&&r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}),[]),H=l((function(){var r,e,n;null===(r=I.current)||void 0===r||r.call(I,null!==(e=null===(n=W.current.find((function(r){return r.error})))||void 0===n?void 0:n.error)&&void 0!==e?e:null)}),[]);c((function(){return function(){D.current.forEach((function(r){return r.abortUpload()})),D.current.clear(),W.current.forEach((function(r){r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}))}}),[]);var J=l((function(r,n){var t,o=(null!==(t=M.current.get(r))&&void 0!==t?t:0)+1;M.current.set(r,o);var u,l,c=function(){return M.current.get(r)===o},f=function(e){var n;c()&&(G(r,{isUploading:!1,error:e}),null===(n=I.current)||void 0===n||n.call(I,e))},s="",p=new a({files:[n],preprocess:function(r,e){return e(r)},onProgress:function(){},getSignedUrl:(l=e(i.mark((function r(e,n){var t;return i.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,r.next=3,d(e.name,e.type);case 3:t=r.sent,s=t.file_name,n(g(g({},t),{},{signedUrl:t.signed_url})),r.next=11;break;case 8:r.prev=8,r.t0=r.catch(0),f((null===r.t0||void 0===r.t0?void 0:r.t0.message)||"Failed to upload the file");case 11:case"end":return r.stop()}}),r,null,[[0,8]])}))),function(r,e){return l.apply(this,arguments)}),onFinishS3Put:(u=e(i.mark((function e(){var t;return i.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,v(s);case 3:if(t=e.sent,c()){e.next=6;break}return e.abrupt("return");case 6:D.current.delete(r),G(r,{isUploading:!1,error:null,uploaded:{url:t,name:s,size:n.size}}),H(),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(0),f((null===e.t0||void 0===e.t0?void 0:e.t0.message)||"Failed to upload the file");case 14:case"end":return e.stop()}}),e,null,[[0,11]])}))),function(){return u.apply(this,arguments)}),onError:function(r){return f(r||"Failed to upload the file")}});D.current.set(r,p)}),[G,H]),N=l((function(e){var n,t=p(e);t&&(W.current.length>=P?null===(n=I.current)||void 0===n||n.call(I,"You can attach up to ".concat(P," files.")):W.current.some((function(r){var n;return(null===(n=r.uploaded)||void 0===n?void 0:n.url)===e}))||_((function(n){return[].concat(r(n),[{id:O(),name:t,file:null,previewUrl:e,isUploading:!1,error:null,uploaded:{url:e,name:t}}])})))}),[_,P]),Q=l((function(e){var n,t,i,o,u=e.filter((function(r){return function(r,e){return e.split(",").map((function(r){return r.trim().toLowerCase()})).filter(Boolean).some((function(e){if(e.startsWith("."))return r.name.toLowerCase().endsWith(e);if(e.endsWith("/*")){var n=r.type.toLowerCase();return n?n.startsWith(e.slice(0,-1)):f({name:r.name})===e.slice(0,-1)}return r.type.toLowerCase()===e}))}(r,S)})),l=u.length<e.length?1===e.length?"That file type is not supported.":"Some files were skipped — unsupported file type.":null,c="You can attach up to ".concat(P," files."),a=P-W.current.length;if(!u.length||a<=0){var s;null===(s=I.current)||void 0===s||s.call(I,u.length?c:l)}else{var d=u.slice(0,a),p=d.map((function(r){var e=w(r),n=!!x&&r.size>x;return{id:O(),name:r.name,file:r,previewUrl:"file"===e?"":URL.createObjectURL(r),isUploading:!n,error:n?"File is too large (".concat(U(r.size)," MB). Maximum size is ").concat(U(x)," MB."):null,uploaded:null}}));_((function(e){return[].concat(r(e),r(p))}));var v=u.length>d.length?c:null;null===(n=I.current)||void 0===n||n.call(I,null!==(t=null!==(i=null===(o=W.current.find((function(r){return r.error})))||void 0===o?void 0:o.error)&&void 0!==i?i:l)&&void 0!==t?t:v),p.filter((function(r){return!r.error})).forEach((function(r){return J(r.id,r.file)}))}}),[_,P,x,J,S]),V=l((function(r){var e,n=Array.from(null!==(e=r.target.files)&&void 0!==e?e:[]);C.current&&(C.current.value=""),n.length&&Q(n)}),[Q]),X=l((function(){var r;return null===(r=C.current)||void 0===r?void 0:r.click()}),[]),Z=l((function(r){var e=String(r);K(e),q(W.current.find((function(r){return r.id===e}))),_((function(r){return r.filter((function(r){return r.id!==e}))})),H()}),[K,q,_,H]),$=l((function(r){var e=String(r),n=W.current.find((function(r){return r.id===e}));null!=n&&n.file&&(K(e),G(e,{isUploading:!0,error:null}),H(),J(e,n.file))}),[K,G,J,H]),rr=l((function(e){return _((function(n){var t=new Map(n.map((function(r){return[r.id,r]}))),i=e.map((function(r){return t.get(String(r))})).filter(Boolean),o=n.filter((function(r){return!e.some((function(e){return String(e)===r.id}))}));return[].concat(r(i),r(o))}))}),[_]),er=l((function(){var r;W.current.forEach((function(r){K(r.id),q(r)})),_((function(){return[]})),null===(r=I.current)||void 0===r||r.call(I,null)}),[K,_,q]);c((function(){var r,e,n;(e=Y.current,n=j,e.length===n.length&&e.every((function(r,e){return r.url===n[e].url})))||(W.current.forEach((function(r){K(r.id),r.previewUrl&&URL.revokeObjectURL(r.previewUrl)})),W.current=j.map(y),Y.current=j,B(W.current),null===(r=I.current)||void 0===r||r.call(I,null))}),[j,K]);var nr=o((function(){return j.reduce((function(r,e){var n=m(e.name,"inline");return n&&(r[e.name]=n),r}),{})})),tr=t(nr,2),ir=tr[0],or=tr[1],ur=u(ir);ur.current=ir;var lr=R.filter((function(r){return!r.file&&!r.previewUrl&&r.uploaded})).map((function(r){return r.uploaded.name})).join("|");return c((function(){var r=lr.split("|").filter((function(r){return r&&!(r in ur.current)}));if(r.length){var e=!0;return Promise.all(r.map((function(r){return v(r,"inline").then((function(e){return[r,e]})).catch((function(e){return console.error('Failed to sign stored attachment "'.concat(r,'"'),e),[r,""]}))}))).then((function(r){e&&or((function(e){return g(g({},e),Object.fromEntries(r))}))})),function(){e=!1}}}),[lr]),{items:R.reduce((function(r,e){var n;if(e.file)return r.push({id:e.id,name:e.name,src:e.previewUrl,kind:w(e.file),size:e.file.size,isUploading:e.isUploading,hideDownload:!0,error:null!==(n=e.error)&&void 0!==n?n:void 0}),r;var t=e.uploaded,i=f(t),o=e.previewUrl||ir[t.name];return"file"===i||o?(r.push({id:e.id,name:t.name,src:o,kind:i,size:t.size,hideDownload:!0}),r):r}),[]),fileInputRef:C,openFileDialog:X,handleFileSelect:V,addFiles:Q,addLinkedImage:N,removeAttachment:Z,handleRetry:$,reorderAttachments:rr,clearAttachments:er,isUploading:R.some((function(r){return r.isUploading})),error:null!==(h=null===(b=R.find((function(r){return r.error})))||void 0===b?void 0:b.error)&&void 0!==h?h:null,count:R.length,isFull:R.length>=P,maxFiles:P}};export{b as DEFAULT_MAX_ATTACHMENTS,k as useAttachmentUpload};
2
2
  //# sourceMappingURL=useAttachmentUpload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAttachmentUpload.js","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport S3Upload from 'react-s3-uploader/s3upload';\n\nimport type {\n AttachmentKind,\n AttachmentPreviewItem,\n} from '../AttachmentPreview/AttachmentPreview.types';\nimport { getAttachmentKind } from '../AttachmentPreview/getAttachmentKind';\nimport { ACCEPTED_ATTACHMENT_TYPES } from '../AttachFileButton';\n\nimport { getS3SignedUrl, getS3DownloadLink } from '~/clients/jsonApi';\nimport { getUrlFileName } from '~/utils/links';\n\nexport type UploadedAttachment = {\n url: string;\n name: string;\n size?: number;\n};\n\ntype UseAttachmentUploadOptions = {\n value: UploadedAttachment[];\n onChange: (attachments: UploadedAttachment[]) => void;\n onError?: (message: string | null) => void;\n maxSizeBytes?: number;\n maxFiles?: number;\n /** Mirrors the file input's `accept`; also gates drag-and-drop. */\n accept?: string;\n};\n\n/** A picked or already-stored file, in the order the user arranged it. */\ntype Entry = {\n id: string;\n name: string;\n /** Set while the file is local; cleared entries come from `value`. */\n file: File | null;\n previewUrl: string;\n isUploading: boolean;\n error: string | null;\n uploaded: UploadedAttachment | null;\n};\n\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/** Same rules the file input enforces via `accept`, so drag-and-drop can't smuggle a type past it. */\nconst isAcceptedType = (file: File, accept: string) =>\n accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith('/*')) {\n const type = file.type.toLowerCase();\n if (type) return type.startsWith(rule.slice(0, -1));\n\n return getAttachmentKind({ name: file.name }) === rule.slice(0, -1);\n }\n\n return file.type.toLowerCase() === rule;\n });\n\nconst getFileKind = (file: File): AttachmentKind => {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n return 'file';\n};\n\nconst formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(1);\n\nconst getUploaded = (entries: Entry[]) =>\n entries.map(entry => entry.uploaded).filter(Boolean) as UploadedAttachment[];\n\nconst isSameList = (a: UploadedAttachment[], b: UploadedAttachment[]) =>\n a.length === b.length && a.every((item, index) => item.url === b[index].url);\n\nconst toStoredEntry = (attachment: UploadedAttachment): Entry => ({\n id: attachment.url,\n name: attachment.name,\n file: null,\n previewUrl: '',\n isUploading: false,\n error: null,\n uploaded: attachment,\n});\n\nlet entrySeq = 0;\nconst nextEntryId = () => {\n entrySeq += 1;\n return `attachment-${entrySeq}`;\n};\n\nexport const useAttachmentUpload = ({\n value,\n onChange,\n onError,\n maxSizeBytes,\n maxFiles = DEFAULT_MAX_ATTACHMENTS,\n accept = ACCEPTED_ATTACHMENT_TYPES,\n}: UseAttachmentUploadOptions) => {\n const [entries, setEntries] = useState<Entry[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadersRef = useRef(new Map<string, S3Upload>());\n // Bumped per attempt so a superseded upload can't write state for a restarted entry.\n const sessionsRef = useRef(new Map<string, number>());\n // Mutations are driven from async upload callbacks, so the latest list lives in a ref.\n const entriesRef = useRef<Entry[]>([]);\n const onChangeRef = useRef(onChange);\n const onErrorRef = useRef(onError);\n\n onChangeRef.current = onChange;\n onErrorRef.current = onError;\n\n // What we last handed the parent. A `value` that still matches it is our own change echoing\n // back; anything else is a parent-driven reset we must adopt.\n const emittedRef = useRef<UploadedAttachment[]>([]);\n\n const commit = useCallback((updater: (prev: Entry[]) => Entry[]) => {\n const next = updater(entriesRef.current);\n entriesRef.current = next;\n setEntries(next);\n emittedRef.current = getUploaded(next);\n onChangeRef.current(emittedRef.current);\n }, []);\n\n const patchEntry = useCallback(\n (id: string, patch: Partial<Entry>) =>\n commit(prev => prev.map(entry => (entry.id === id ? { ...entry, ...patch } : entry))),\n [commit]\n );\n\n const abortUpload = useCallback((id: string) => {\n uploadersRef.current.get(id)?.abortUpload();\n uploadersRef.current.delete(id);\n // Bump, never delete: deleting would let the next attempt reuse session 1, so a callback\n // still in flight from the aborted attempt would pass `isCurrent` and clobber it.\n sessionsRef.current.set(id, (sessionsRef.current.get(id) ?? 0) + 1);\n }, []);\n\n const releasePreview = useCallback((entry?: Entry) => {\n if (entry?.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n }, []);\n\n // The banner is shared by every tile, so recompute it rather than clear it — one file\n // succeeding must not hide a sibling that is still failing.\n const syncError = useCallback(() => {\n onErrorRef.current?.(entriesRef.current.find(entry => entry.error)?.error ?? null);\n }, []);\n\n useEffect(\n () => () => {\n uploadersRef.current.forEach(uploader => uploader.abortUpload());\n uploadersRef.current.clear();\n entriesRef.current.forEach(entry => {\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n },\n []\n );\n\n const startUpload = useCallback(\n (id: string, file: File) => {\n const session = (sessionsRef.current.get(id) ?? 0) + 1;\n sessionsRef.current.set(id, session);\n // A superseded upload must not write state for an entry that is gone or restarted.\n const isCurrent = () => sessionsRef.current.get(id) === session;\n\n const fail = (message: string) => {\n if (!isCurrent()) return;\n patchEntry(id, { isUploading: false, error: message });\n onErrorRef.current?.(message);\n };\n\n let storedKey = '';\n\n const uploader = new S3Upload({\n files: [file],\n preprocess: (target: File, next: (file: File) => void) => next(target),\n onProgress: () => {},\n getSignedUrl: async (\n target: File,\n callback: (data: { signedUrl: string; [key: string]: unknown }) => void\n ) => {\n try {\n const data = await getS3SignedUrl(target.name, target.type);\n storedKey = data.file_name;\n callback({ ...data, signedUrl: data.signed_url });\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onFinishS3Put: async () => {\n try {\n const { url } = await getS3DownloadLink(storedKey);\n if (!isCurrent()) return;\n\n uploadersRef.current.delete(id);\n patchEntry(id, {\n isUploading: false,\n error: null,\n uploaded: { url, name: storedKey, size: file.size },\n });\n syncError();\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onError: (message: string) => fail(message || 'Failed to upload the file'),\n });\n\n uploadersRef.current.set(id, uploader);\n },\n [patchEntry, syncError]\n );\n\n /** Nothing is uploaded: a comment attachment is a url, so the link itself is the attachment. */\n const addLinkedImage = useCallback(\n (url: string) => {\n const name = getUrlFileName(url);\n\n if (!name) return;\n if (entriesRef.current.length >= maxFiles) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n if (entriesRef.current.some(entry => entry.uploaded?.url === url)) return;\n\n commit(prev => [\n ...prev,\n {\n id: nextEntryId(),\n name,\n file: null,\n previewUrl: url,\n isUploading: false,\n error: null,\n uploaded: { url, name },\n },\n ]);\n },\n [commit, maxFiles]\n );\n\n const addFiles = useCallback(\n (files: File[]) => {\n const supported = files.filter(file => isAcceptedType(file, accept));\n const skipped = supported.length < files.length;\n // One banner, one message: report the most actionable reason once, at the end. Reporting\n // as we go would let a later call overwrite an earlier warning on a mixed drop.\n const unsupported = skipped\n ? (files.length === 1 && 'That file type is not supported.') ||\n 'Some files were skipped — unsupported file type.'\n : null;\n const tooMany = `You can attach up to ${maxFiles} files.`;\n\n const room = maxFiles - entriesRef.current.length;\n if (!supported.length || room <= 0) {\n onErrorRef.current?.(supported.length ? tooMany : unsupported);\n return;\n }\n\n const accepted = supported.slice(0, room);\n const added: Entry[] = accepted.map(file => {\n const kind = getFileKind(file);\n const isTooLarge = !!maxSizeBytes && file.size > maxSizeBytes;\n\n return {\n id: nextEntryId(),\n name: file.name,\n file,\n previewUrl: kind === 'file' ? '' : URL.createObjectURL(file),\n isUploading: !isTooLarge,\n error: isTooLarge\n ? `File is too large (${formatMb(file.size)} MB). Maximum size is ${formatMb(\n maxSizeBytes as number\n )} MB.`\n : null,\n uploaded: null,\n };\n });\n\n commit(prev => [...prev, ...added]);\n\n const overflow = supported.length > accepted.length ? tooMany : null;\n onErrorRef.current?.(\n entriesRef.current.find(entry => entry.error)?.error ?? unsupported ?? overflow\n );\n\n added\n .filter(entry => !entry.error)\n .forEach(entry => startUpload(entry.id, entry.file as File));\n },\n [commit, maxFiles, maxSizeBytes, startUpload, accept]\n );\n\n const handleFileSelect = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n // Reset the input so re-picking the same file still fires a change event.\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (files.length) addFiles(files);\n },\n [addFiles]\n );\n\n const openFileDialog = useCallback(() => fileInputRef.current?.click(), []);\n\n const removeAttachment = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n abortUpload(key);\n releasePreview(entriesRef.current.find(entry => entry.id === key));\n commit(prev => prev.filter(entry => entry.id !== key));\n syncError();\n },\n [abortUpload, releasePreview, commit, syncError]\n );\n\n const handleRetry = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n const entry = entriesRef.current.find(item => item.id === key);\n if (!entry?.file) return;\n\n abortUpload(key);\n patchEntry(key, { isUploading: true, error: null });\n syncError();\n startUpload(key, entry.file);\n },\n [abortUpload, patchEntry, startUpload, syncError]\n );\n\n const reorderAttachments = useCallback(\n (orderedIds: AttachmentPreviewItem['id'][]) =>\n commit(prev => {\n const byId = new Map(prev.map(entry => [entry.id, entry]));\n const reordered = orderedIds.map(id => byId.get(String(id))).filter(Boolean) as Entry[];\n // Unlisted ids (a race with a removal) keep their place at the end.\n const missing = prev.filter(entry => !orderedIds.some(id => String(id) === entry.id));\n return [...reordered, ...missing];\n }),\n [commit]\n );\n\n const clearAttachments = useCallback(() => {\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n releasePreview(entry);\n });\n commit(() => []);\n onErrorRef.current?.(null);\n }, [abortUpload, commit, releasePreview]);\n\n // Adopt a value we didn't produce — an edit form's initial attachments, or a parent-side reset.\n // Compared against what we emitted, not against the current entries: a failed-only or\n // mid-upload list emits `[]` too, and treating that as \"in sync\" would strand those tiles\n // on screen and let a late upload write itself back into freshly reset parent state.\n useEffect(() => {\n if (isSameList(emittedRef.current, value)) return;\n\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n entriesRef.current = value.map(toStoredEntry);\n emittedRef.current = value;\n setEntries(entriesRef.current);\n onErrorRef.current?.(null);\n }, [value, abortUpload]);\n\n // A stored url has expired by now, so re-sign it for the preview.\n const [storedSrcs, setStoredSrcs] = useState<Record<string, string>>({});\n const storedSrcsRef = useRef(storedSrcs);\n storedSrcsRef.current = storedSrcs;\n\n const storedNames = entries\n // A linked image carries its own url, so there is no key of ours to sign.\n .filter(entry => !entry.file && !entry.previewUrl && entry.uploaded)\n .map(entry => (entry.uploaded as UploadedAttachment).name)\n .join('|');\n\n useEffect(() => {\n const pending = storedNames.split('|').filter(name => name && !(name in storedSrcsRef.current));\n if (!pending.length) return undefined;\n\n let isActive = true;\n Promise.all(\n pending.map(name =>\n getS3DownloadLink(name, 'inline')\n .then(({ url }: { url: string }) => [name, url] as const)\n .catch(error => {\n console.error(`Failed to sign stored attachment \"${name}\"`, error);\n\n return [name, ''] as const;\n })\n )\n ).then(resolved => {\n if (isActive) setStoredSrcs(prev => ({ ...prev, ...Object.fromEntries(resolved) }));\n });\n\n return () => {\n isActive = false;\n };\n }, [storedNames]);\n\n const items = entries.reduce<AttachmentPreviewItem[]>((acc, entry) => {\n if (entry.file) {\n acc.push({\n id: entry.id,\n name: entry.name,\n src: entry.previewUrl,\n kind: getFileKind(entry.file),\n size: entry.file.size,\n isUploading: entry.isUploading,\n hideDownload: true,\n error: entry.error ?? undefined,\n });\n return acc;\n }\n\n const stored = entry.uploaded as UploadedAttachment;\n const kind = getAttachmentKind(stored);\n // A linked image is already a url; only one of ours has an S3 key worth signing.\n const src = entry.previewUrl || storedSrcs[stored.name];\n // A thumbnail without its signed url would paint as a broken image, so hold it back.\n if (kind !== 'file' && !src) return acc;\n\n acc.push({ id: entry.id, name: stored.name, src, kind, size: stored.size, hideDownload: true });\n return acc;\n }, []);\n\n return {\n items,\n fileInputRef,\n openFileDialog,\n handleFileSelect,\n addFiles,\n addLinkedImage,\n removeAttachment,\n handleRetry,\n reorderAttachments,\n clearAttachments,\n isUploading: entries.some(entry => entry.isUploading),\n error: entries.find(entry => entry.error)?.error ?? null,\n count: entries.length,\n isFull: entries.length >= maxFiles,\n maxFiles,\n };\n};\n"],"names":["DEFAULT_MAX_ATTACHMENTS","getFileKind","file","type","startsWith","formatMb","bytes","toFixed","toStoredEntry","attachment","id","url","name","previewUrl","isUploading","error","uploaded","entrySeq","nextEntryId","concat","useAttachmentUpload","_ref","_entries$find$error","_entries$find","value","onChange","onError","maxSizeBytes","_ref$maxFiles","maxFiles","_ref$accept","accept","ACCEPTED_ATTACHMENT_TYPES","useState","_useState2","_slicedToArray","_useState","entries","setEntries","fileInputRef","useRef","uploadersRef","Map","sessionsRef","entriesRef","onChangeRef","onErrorRef","current","emittedRef","commit","useCallback","updater","next","map","entry","filter","Boolean","getUploaded","patchEntry","patch","prev","abortUpload","_uploadersRef$current","_sessionsRef$current$","get","delete","set","releasePreview","URL","revokeObjectURL","syncError","_onErrorRef$current","_entriesRef$current$f","_entriesRef$current$f2","find","useEffect","forEach","uploader","clear","startUpload","_sessionsRef$current$2","session","_onFinishS3Put","_getSignedUrl","isCurrent","fail","message","_onErrorRef$current2","storedKey","S3Upload","files","preprocess","target","onProgress","getSignedUrl","_asyncToGenerator","_regeneratorRuntime","mark","_callee","callback","_data","wrap","_context","getS3SignedUrl","data","sent","file_name","signedUrl","signed_url","t0","stop","_x","_x2","apply","this","arguments","onFinishS3Put","_callee2","_yield$getS3DownloadL","_context2","getS3DownloadLink","abrupt","size","addLinkedImage","_onErrorRef$current3","getUrlFileName","length","some","_entry$uploaded","_toConsumableArray","addFiles","_onErrorRef$current5","_ref2","_entriesRef$current$f3","_entriesRef$current$f4","supported","split","rule","trim","toLowerCase","endsWith","slice","getAttachmentKind","isAcceptedType","unsupported","tooMany","room","_onErrorRef$current4","accepted","added","kind","isTooLarge","createObjectURL","overflow","handleFileSelect","event","_event$target$files","Array","from","openFileDialog","_fileInputRef$current","click","removeAttachment","key","String","handleRetry","item","reorderAttachments","orderedIds","byId","reordered","missing","clearAttachments","_onErrorRef$current6","_onErrorRef$current7","a","b","every","index","_useState3","_useState4","storedSrcs","setStoredSrcs","storedSrcsRef","storedNames","join","pending","isActive","Promise","all","then","_ref3","catch","console","resolved","_objectSpread","Object","fromEntries","items","reduce","acc","_entry$error","push","src","hideDownload","undefined","stored","count","isFull"],"mappings":"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"}
1
+ {"version":3,"file":"useAttachmentUpload.js","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport S3Upload from 'react-s3-uploader/s3upload';\n\nimport type {\n AttachmentKind,\n AttachmentPreviewItem,\n} from '../AttachmentPreview/AttachmentPreview.types';\nimport { getAttachmentKind } from '../AttachmentPreview/getAttachmentKind';\nimport { ACCEPTED_ATTACHMENT_TYPES } from '../AttachFileButton';\n\nimport { getS3SignedUrl } from '~/clients/jsonApi';\nimport { getUrlFileName } from '~/utils/links';\nimport { getSignedLink, peekSignedLink } from '~/utils/signedLinkCache';\n\nexport type UploadedAttachment = {\n url: string;\n name: string;\n size?: number;\n};\n\ntype UseAttachmentUploadOptions = {\n value: UploadedAttachment[];\n onChange: (attachments: UploadedAttachment[]) => void;\n onError?: (message: string | null) => void;\n maxSizeBytes?: number;\n maxFiles?: number;\n /** Mirrors the file input's `accept`; also gates drag-and-drop. */\n accept?: string;\n};\n\n/** A picked or already-stored file, in the order the user arranged it. */\ntype Entry = {\n id: string;\n name: string;\n /** Set while the file is local; cleared entries come from `value`. */\n file: File | null;\n previewUrl: string;\n isUploading: boolean;\n error: string | null;\n uploaded: UploadedAttachment | null;\n};\n\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/** Same rules the file input enforces via `accept`, so drag-and-drop can't smuggle a type past it. */\nconst isAcceptedType = (file: File, accept: string) =>\n accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith('/*')) {\n const type = file.type.toLowerCase();\n if (type) return type.startsWith(rule.slice(0, -1));\n\n return getAttachmentKind({ name: file.name }) === rule.slice(0, -1);\n }\n\n return file.type.toLowerCase() === rule;\n });\n\nconst getFileKind = (file: File): AttachmentKind => {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n return 'file';\n};\n\nconst formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(1);\n\nconst getUploaded = (entries: Entry[]) =>\n entries.map(entry => entry.uploaded).filter(Boolean) as UploadedAttachment[];\n\nconst isSameList = (a: UploadedAttachment[], b: UploadedAttachment[]) =>\n a.length === b.length && a.every((item, index) => item.url === b[index].url);\n\nconst toStoredEntry = (attachment: UploadedAttachment): Entry => ({\n id: attachment.url,\n name: attachment.name,\n file: null,\n previewUrl: '',\n isUploading: false,\n error: null,\n uploaded: attachment,\n});\n\nlet entrySeq = 0;\nconst nextEntryId = () => {\n entrySeq += 1;\n return `attachment-${entrySeq}`;\n};\n\nexport const useAttachmentUpload = ({\n value,\n onChange,\n onError,\n maxSizeBytes,\n maxFiles = DEFAULT_MAX_ATTACHMENTS,\n accept = ACCEPTED_ATTACHMENT_TYPES,\n}: UseAttachmentUploadOptions) => {\n const [entries, setEntries] = useState<Entry[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadersRef = useRef(new Map<string, S3Upload>());\n // Bumped per attempt so a superseded upload can't write state for a restarted entry.\n const sessionsRef = useRef(new Map<string, number>());\n // Mutations are driven from async upload callbacks, so the latest list lives in a ref.\n const entriesRef = useRef<Entry[]>([]);\n const onChangeRef = useRef(onChange);\n const onErrorRef = useRef(onError);\n\n onChangeRef.current = onChange;\n onErrorRef.current = onError;\n\n // What we last handed the parent. A `value` that still matches it is our own change echoing\n // back; anything else is a parent-driven reset we must adopt.\n const emittedRef = useRef<UploadedAttachment[]>([]);\n\n const commit = useCallback((updater: (prev: Entry[]) => Entry[]) => {\n const next = updater(entriesRef.current);\n entriesRef.current = next;\n setEntries(next);\n emittedRef.current = getUploaded(next);\n onChangeRef.current(emittedRef.current);\n }, []);\n\n const patchEntry = useCallback(\n (id: string, patch: Partial<Entry>) =>\n commit(prev => prev.map(entry => (entry.id === id ? { ...entry, ...patch } : entry))),\n [commit]\n );\n\n const abortUpload = useCallback((id: string) => {\n uploadersRef.current.get(id)?.abortUpload();\n uploadersRef.current.delete(id);\n // Bump, never delete: deleting would let the next attempt reuse session 1, so a callback\n // still in flight from the aborted attempt would pass `isCurrent` and clobber it.\n sessionsRef.current.set(id, (sessionsRef.current.get(id) ?? 0) + 1);\n }, []);\n\n const releasePreview = useCallback((entry?: Entry) => {\n if (entry?.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n }, []);\n\n // The banner is shared by every tile, so recompute it rather than clear it — one file\n // succeeding must not hide a sibling that is still failing.\n const syncError = useCallback(() => {\n onErrorRef.current?.(entriesRef.current.find(entry => entry.error)?.error ?? null);\n }, []);\n\n useEffect(\n () => () => {\n uploadersRef.current.forEach(uploader => uploader.abortUpload());\n uploadersRef.current.clear();\n entriesRef.current.forEach(entry => {\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n },\n []\n );\n\n const startUpload = useCallback(\n (id: string, file: File) => {\n const session = (sessionsRef.current.get(id) ?? 0) + 1;\n sessionsRef.current.set(id, session);\n // A superseded upload must not write state for an entry that is gone or restarted.\n const isCurrent = () => sessionsRef.current.get(id) === session;\n\n const fail = (message: string) => {\n if (!isCurrent()) return;\n patchEntry(id, { isUploading: false, error: message });\n onErrorRef.current?.(message);\n };\n\n let storedKey = '';\n\n const uploader = new S3Upload({\n files: [file],\n preprocess: (target: File, next: (file: File) => void) => next(target),\n onProgress: () => {},\n getSignedUrl: async (\n target: File,\n callback: (data: { signedUrl: string; [key: string]: unknown }) => void\n ) => {\n try {\n const data = await getS3SignedUrl(target.name, target.type);\n storedKey = data.file_name;\n callback({ ...data, signedUrl: data.signed_url });\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onFinishS3Put: async () => {\n try {\n const url = await getSignedLink(storedKey);\n if (!isCurrent()) return;\n\n uploadersRef.current.delete(id);\n patchEntry(id, {\n isUploading: false,\n error: null,\n uploaded: { url, name: storedKey, size: file.size },\n });\n syncError();\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onError: (message: string) => fail(message || 'Failed to upload the file'),\n });\n\n uploadersRef.current.set(id, uploader);\n },\n [patchEntry, syncError]\n );\n\n /** Nothing is uploaded: a comment attachment is a url, so the link itself is the attachment. */\n const addLinkedImage = useCallback(\n (url: string) => {\n const name = getUrlFileName(url);\n\n if (!name) return;\n if (entriesRef.current.length >= maxFiles) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n if (entriesRef.current.some(entry => entry.uploaded?.url === url)) return;\n\n commit(prev => [\n ...prev,\n {\n id: nextEntryId(),\n name,\n file: null,\n previewUrl: url,\n isUploading: false,\n error: null,\n uploaded: { url, name },\n },\n ]);\n },\n [commit, maxFiles]\n );\n\n const addFiles = useCallback(\n (files: File[]) => {\n const supported = files.filter(file => isAcceptedType(file, accept));\n const skipped = supported.length < files.length;\n // One banner, one message: report the most actionable reason once, at the end. Reporting\n // as we go would let a later call overwrite an earlier warning on a mixed drop.\n const unsupported = skipped\n ? (files.length === 1 && 'That file type is not supported.') ||\n 'Some files were skipped — unsupported file type.'\n : null;\n const tooMany = `You can attach up to ${maxFiles} files.`;\n\n const room = maxFiles - entriesRef.current.length;\n if (!supported.length || room <= 0) {\n onErrorRef.current?.(supported.length ? tooMany : unsupported);\n return;\n }\n\n const accepted = supported.slice(0, room);\n const added: Entry[] = accepted.map(file => {\n const kind = getFileKind(file);\n const isTooLarge = !!maxSizeBytes && file.size > maxSizeBytes;\n\n return {\n id: nextEntryId(),\n name: file.name,\n file,\n previewUrl: kind === 'file' ? '' : URL.createObjectURL(file),\n isUploading: !isTooLarge,\n error: isTooLarge\n ? `File is too large (${formatMb(file.size)} MB). Maximum size is ${formatMb(\n maxSizeBytes as number\n )} MB.`\n : null,\n uploaded: null,\n };\n });\n\n commit(prev => [...prev, ...added]);\n\n const overflow = supported.length > accepted.length ? tooMany : null;\n onErrorRef.current?.(\n entriesRef.current.find(entry => entry.error)?.error ?? unsupported ?? overflow\n );\n\n added\n .filter(entry => !entry.error)\n .forEach(entry => startUpload(entry.id, entry.file as File));\n },\n [commit, maxFiles, maxSizeBytes, startUpload, accept]\n );\n\n const handleFileSelect = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n // Reset the input so re-picking the same file still fires a change event.\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (files.length) addFiles(files);\n },\n [addFiles]\n );\n\n const openFileDialog = useCallback(() => fileInputRef.current?.click(), []);\n\n const removeAttachment = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n abortUpload(key);\n releasePreview(entriesRef.current.find(entry => entry.id === key));\n commit(prev => prev.filter(entry => entry.id !== key));\n syncError();\n },\n [abortUpload, releasePreview, commit, syncError]\n );\n\n const handleRetry = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n const entry = entriesRef.current.find(item => item.id === key);\n if (!entry?.file) return;\n\n abortUpload(key);\n patchEntry(key, { isUploading: true, error: null });\n syncError();\n startUpload(key, entry.file);\n },\n [abortUpload, patchEntry, startUpload, syncError]\n );\n\n const reorderAttachments = useCallback(\n (orderedIds: AttachmentPreviewItem['id'][]) =>\n commit(prev => {\n const byId = new Map(prev.map(entry => [entry.id, entry]));\n const reordered = orderedIds.map(id => byId.get(String(id))).filter(Boolean) as Entry[];\n // Unlisted ids (a race with a removal) keep their place at the end.\n const missing = prev.filter(entry => !orderedIds.some(id => String(id) === entry.id));\n return [...reordered, ...missing];\n }),\n [commit]\n );\n\n const clearAttachments = useCallback(() => {\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n releasePreview(entry);\n });\n commit(() => []);\n onErrorRef.current?.(null);\n }, [abortUpload, commit, releasePreview]);\n\n // Adopt a value we didn't produce — an edit form's initial attachments, or a parent-side reset.\n // Compared against what we emitted, not against the current entries: a failed-only or\n // mid-upload list emits `[]` too, and treating that as \"in sync\" would strand those tiles\n // on screen and let a late upload write itself back into freshly reset parent state.\n useEffect(() => {\n if (isSameList(emittedRef.current, value)) return;\n\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n entriesRef.current = value.map(toStoredEntry);\n emittedRef.current = value;\n setEntries(entriesRef.current);\n onErrorRef.current?.(null);\n }, [value, abortUpload]);\n\n // A stored url has expired by now, so re-sign it for the preview.\n const [storedSrcs, setStoredSrcs] = useState<Record<string, string>>(() =>\n value.reduce<Record<string, string>>((acc, attachment) => {\n const src = peekSignedLink(attachment.name, 'inline');\n if (src) acc[attachment.name] = src;\n\n return acc;\n }, {})\n );\n const storedSrcsRef = useRef(storedSrcs);\n storedSrcsRef.current = storedSrcs;\n\n const storedNames = entries\n // A linked image carries its own url, so there is no key of ours to sign.\n .filter(entry => !entry.file && !entry.previewUrl && entry.uploaded)\n .map(entry => (entry.uploaded as UploadedAttachment).name)\n .join('|');\n\n useEffect(() => {\n const pending = storedNames.split('|').filter(name => name && !(name in storedSrcsRef.current));\n if (!pending.length) return undefined;\n\n let isActive = true;\n Promise.all(\n pending.map(name =>\n getSignedLink(name, 'inline')\n .then(url => [name, url] as const)\n .catch(error => {\n console.error(`Failed to sign stored attachment \"${name}\"`, error);\n\n return [name, ''] as const;\n })\n )\n ).then(resolved => {\n if (isActive) setStoredSrcs(prev => ({ ...prev, ...Object.fromEntries(resolved) }));\n });\n\n return () => {\n isActive = false;\n };\n }, [storedNames]);\n\n const items = entries.reduce<AttachmentPreviewItem[]>((acc, entry) => {\n if (entry.file) {\n acc.push({\n id: entry.id,\n name: entry.name,\n src: entry.previewUrl,\n kind: getFileKind(entry.file),\n size: entry.file.size,\n isUploading: entry.isUploading,\n hideDownload: true,\n error: entry.error ?? undefined,\n });\n return acc;\n }\n\n const stored = entry.uploaded as UploadedAttachment;\n const kind = getAttachmentKind(stored);\n // A linked image is already a url; only one of ours has an S3 key worth signing.\n const src = entry.previewUrl || storedSrcs[stored.name];\n // A thumbnail without its signed url would paint as a broken image, so hold it back.\n if (kind !== 'file' && !src) return acc;\n\n acc.push({ id: entry.id, name: stored.name, src, kind, size: stored.size, hideDownload: true });\n return acc;\n }, []);\n\n return {\n items,\n fileInputRef,\n openFileDialog,\n handleFileSelect,\n addFiles,\n addLinkedImage,\n removeAttachment,\n handleRetry,\n reorderAttachments,\n clearAttachments,\n isUploading: entries.some(entry => entry.isUploading),\n error: entries.find(entry => entry.error)?.error ?? null,\n count: entries.length,\n isFull: entries.length >= maxFiles,\n maxFiles,\n };\n};\n"],"names":["DEFAULT_MAX_ATTACHMENTS","getFileKind","file","type","startsWith","formatMb","bytes","toFixed","toStoredEntry","attachment","id","url","name","previewUrl","isUploading","error","uploaded","entrySeq","nextEntryId","concat","useAttachmentUpload","_ref","_entries$find$error","_entries$find","value","onChange","onError","maxSizeBytes","_ref$maxFiles","maxFiles","_ref$accept","accept","ACCEPTED_ATTACHMENT_TYPES","useState","_useState2","_slicedToArray","_useState","entries","setEntries","fileInputRef","useRef","uploadersRef","Map","sessionsRef","entriesRef","onChangeRef","onErrorRef","current","emittedRef","commit","useCallback","updater","next","map","entry","filter","Boolean","getUploaded","patchEntry","patch","prev","abortUpload","_uploadersRef$current","_sessionsRef$current$","get","delete","set","releasePreview","URL","revokeObjectURL","syncError","_onErrorRef$current","_entriesRef$current$f","_entriesRef$current$f2","find","useEffect","forEach","uploader","clear","startUpload","_sessionsRef$current$2","session","_onFinishS3Put","_getSignedUrl","isCurrent","fail","message","_onErrorRef$current2","storedKey","S3Upload","files","preprocess","target","onProgress","getSignedUrl","_asyncToGenerator","_regeneratorRuntime","mark","_callee","callback","_data","wrap","_context","getS3SignedUrl","data","sent","file_name","signedUrl","signed_url","t0","stop","_x","_x2","apply","this","arguments","onFinishS3Put","_callee2","_context2","getSignedLink","abrupt","size","addLinkedImage","_onErrorRef$current3","getUrlFileName","length","some","_entry$uploaded","_toConsumableArray","addFiles","_onErrorRef$current5","_ref2","_entriesRef$current$f3","_entriesRef$current$f4","supported","split","rule","trim","toLowerCase","endsWith","slice","getAttachmentKind","isAcceptedType","unsupported","tooMany","room","_onErrorRef$current4","accepted","added","kind","isTooLarge","createObjectURL","overflow","handleFileSelect","event","_event$target$files","Array","from","openFileDialog","_fileInputRef$current","click","removeAttachment","key","String","handleRetry","item","reorderAttachments","orderedIds","byId","reordered","missing","clearAttachments","_onErrorRef$current6","_onErrorRef$current7","a","b","every","index","_useState3","reduce","acc","src","peekSignedLink","_useState4","storedSrcs","setStoredSrcs","storedSrcsRef","storedNames","join","pending","isActive","Promise","all","then","catch","console","resolved","_objectSpread","Object","fromEntries","items","_entry$error","push","hideDownload","undefined","stored","count","isFull"],"mappings":"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"}
@@ -106,10 +106,10 @@ export declare const BHA_COMPONENT_TYPES: ({
106
106
  })[];
107
107
  })[];
108
108
  export declare const BHA_GENERAL_FIELD_TYPES: ({
109
+ unit?: undefined;
109
110
  name: string;
110
111
  label: string;
111
112
  cond?: undefined;
112
- unit?: undefined;
113
113
  col_size?: undefined;
114
114
  family?: undefined;
115
115
  } | {
@@ -134,8 +134,8 @@ export declare const BHA_GENERAL_FIELD_TYPES: ({
134
134
  col_size: number;
135
135
  family?: undefined;
136
136
  } | {
137
- cond?: undefined;
138
137
  unit?: undefined;
138
+ cond?: undefined;
139
139
  name: string;
140
140
  label: string;
141
141
  col_size: number;
@@ -1 +1 @@
1
- {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../src/componentsV2/DatePicker/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAyB,MAAM,OAAO,CAAC;AAGrE,OAAO,EAAiB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAEL,cAAc,EAKf,MAAM,UAAU,CAAC;AAIlB,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;IAC5D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;IAC9D,SAAS,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAE5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAcF,eAAO,MAAM,KAAK,uGAwHjB,CAAC"}
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../src/componentsV2/DatePicker/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,SAAS,EAAiC,MAAM,OAAO,CAAC;AAGhG,OAAO,EAAiB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAGL,cAAc,EAKf,MAAM,UAAU,CAAC;AAIlB,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;IAC5D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;IAC9D,SAAS,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAE5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAcF,eAAO,MAAM,KAAK,uGA8IjB,CAAC"}
@@ -1,2 +1,2 @@
1
- import o from"@babel/runtime/helpers/slicedToArray";import s from"@babel/runtime/helpers/toConsumableArray";import{forwardRef as c,useState as n,useCallback as i}from"react";import t from"moment";import{TextInputNext as r}from"../../TextInputNext/TextInputNext.js";import{TextInput as m}from"../../TextInput/TextInput.js";import{getMinDate as e,getMaxDate as u,FallbackInputFormats as p,getDefaultFormat as l}from"../utils.js";import{CalendarThreeIcon as a}from"../../../icons/iconParkIcons.js";import"../../../icons/customIcons/icons/AddMessage.js";import"../../../icons/customIcons/icons/DragOne.js";import"../../../icons/customIcons/icons/Attention.js";import"../../../icons/customIcons/icons/Collapse.js";import"../../../icons/customIcons/icons/Dashboard.js";import"../../../icons/customIcons/icons/Expand.js";import"../../../icons/customIcons/icons/FolderClosed.js";import"../../../icons/customIcons/icons/FolderClosedFilled.js";import"../../../icons/customIcons/icons/FolderOpened.js";import"../../../icons/customIcons/icons/GreaterOrEqual.js";import"../../../icons/customIcons/icons/LessOrEqual.js";import"../../../icons/customIcons/icons/Search.js";import"../../../icons/customIcons/icons/SearchOne.js";import"../../../icons/customIcons/icons/Wellhub.js";import"../../../icons/customIcons/icons/MultiRuler.js";import"../../../icons/customIcons/icons/Checkbox.js";import"../../../icons/customIcons/icons/CheckboxChecked.js";import"../../../icons/customIcons/icons/CheckboxIndeterminate.js";import"../../../icons/customIcons/icons/Radio.js";import"../../../icons/customIcons/icons/RadioChecked.js";import"../../../icons/customIcons/icons/SimulFrac.js";import"../../../icons/customIcons/icons/ZipperFrac.js";import"../../../icons/customIcons/icons/CautionFilled.js";import"../../../icons/customIcons/icons/InfoRounded.js";import"../../../icons/customIcons/icons/FlameFilled.js";import"../../../icons/customIcons/icons/MoreApp.js";import"../../../icons/customIcons/icons/Pad.js";import"../../../icons/customIcons/icons/DrilloutUnit.js";import"../../../icons/customIcons/icons/FracFleet.js";import"../../../icons/customIcons/icons/Global.js";import"../../../icons/customIcons/icons/Program.js";import"../../../icons/customIcons/icons/Rig.js";import"../../../icons/customIcons/icons/Well.js";import"../../../icons/customIcons/icons/Gap.js";import"../../../icons/customIcons/icons/Pin.js";import"../../../icons/customIcons/icons/CloseOneFilled.js";import"../../../icons/customIcons/icons/AttentionFilled.js";import"../../../icons/customIcons/icons/CheckOneFilled.js";import"../../../icons/customIcons/icons/Archive.js";import"../../../icons/customIcons/icons/ArchiveCancel.js";import"../../../icons/customIcons/icons/Unarchive.js";import"../../../icons/customIcons/icons/Archived.js";import"../../../icons/customIcons/icons/InterventionUnit.js";import"../../../icons/customIcons/icons/CloudDelete.js";import"../../../icons/customIcons/icons/Lasso.js";import"../../../icons/customIcons/icons/Radius.js";import"../../../icons/customIcons/icons/ErrorOps.js";import"../../../icons/customIcons/icons/DataTypeOps.js";import"../../../icons/customIcons/icons/FalsePositiveOps.js";import"../../../icons/customIcons/icons/CalibrationOps.js";import"../../../icons/customIcons/icons/CriticalOps.js";import"../../../icons/customIcons/icons/Company.js";import"../../../icons/customIcons/icons/ArchiveOne.js";import"../../../icons/customIcons/icons/ParseBotFusion.js";import"../../../icons/customIcons/icons/Connect.js";import"../../../icons/customIcons/icons/PuzzleOne.js";import"../../../icons/customIcons/icons/Feed.js";import"../../../icons/customIcons/icons/Prompt.js";import"../../../icons/customIcons/icons/Companies.js";import"../../../icons/customIcons/icons/ClipboardAi.js";import"../../../icons/customIcons/icons/Key.js";import"../../../icons/customIcons/icons/AtSignCrossed.js";import"../../../icons/customIcons/icons/MappingManual.js";import"../../../icons/customIcons/icons/Mapping.js";import"../../../icons/customIcons/icons/Metrics.js";import"../../../icons/customIcons/icons/Drops.js";import"../../../icons/customIcons/icons/ClipboardSearch.js";import"../../../icons/customIcons/icons/Template.js";import"../../../icons/customIcons/icons/ClipboardMetrics.js";import"../../../icons/customIcons/icons/ClipboardBuilder.js";import"../../../icons/customIcons/icons/UnitConversion.js";import"../../../icons/customIcons/icons/NPT.js";import"../../../icons/customIcons/icons/GuidedFrac.js";import{jsx as I}from"react/jsx-runtime";var j=function(o,s){return(Array.isArray(o)?o:[o]).filter((function(o){return!!o})).map((function(o){return t(o).format(s)})).join(" - ")},d=function(o,c,n){var i=t(o,[c].concat(s(p[n]||[])),!0);return i.isValid()?i.toDate():void 0},f=c((function(s,c){var t=s.value,p=s.label,f=s.open,C=s.className,h=s.testId,b=s.format,v=s.placeholder,O=s.range,F=s.readOnly,x=s.type,A=s.setValue,g=s.focusOnClear,y=s.labelPlacement,P=s.size,N=s.elementsClassNames,k=s.isNext,M=s.isOpen,T=s.clearable,D=b||l(x,O),R=n(j(t,D)),S=o(R,2),z=S[0],B=S[1],E=n(t),G=o(E,2),U=G[0],L=G[1];U!==t&&(B(j(t,D)),L(t));var q=i((function(o){if(""===o.trim())return null==A||A(void 0),void B("");if(B(o),O){var s=o.split(/[-–—]/).map((function(o){return d(o.trim(),D,x)})).filter((function(o){return!!o}));if(2===s.length){var c=e(s[0],s[1]),n=u(s[0],s[1]);c&&n&&(null==A||A([c,n]))}}else{var i=d(o,D,x);i&&(null==A||A(i))}}),[D,O,A,x]),V=i((function(){B(j(t,D))}),[t,D]),W=i((function(){null==A||A(void 0),B("")}),[A]);return k?I(r,{value:z,inputContainerRef:c,label:p,onFocus:f,onBlur:V,className:C,testId:h,suffix:I(a,{}),placeholder:v,onChange:q,readOnly:F,clearable:T,focusOnClear:g,labelPlacement:y,size:P,elementsClassNames:N}):I(m,{value:z,ref:c,label:p,onFocus:f,onBlur:V,forceLabelShrink:M,className:C,testId:h,suffix:I(a,{}),placeholder:v,onChange:q,readOnly:F,onClear:T?W:void 0,focusOnClear:g})}));export{f as Input};
1
+ import o from"@babel/runtime/helpers/slicedToArray";import s from"@babel/runtime/helpers/toConsumableArray";import{forwardRef as c,useState as n,useRef as i,useCallback as t}from"react";import r from"moment";import{TextInputNext as m}from"../../TextInputNext/TextInputNext.js";import{TextInput as e}from"../../TextInput/TextInput.js";import{autocompleteValue as u,getMinDate as p,getMaxDate as a,InputParseFormats as l,getDefaultFormat as I}from"../utils.js";import{CalendarThreeIcon as j}from"../../../icons/iconParkIcons.js";import"../../../icons/customIcons/icons/AddMessage.js";import"../../../icons/customIcons/icons/DragOne.js";import"../../../icons/customIcons/icons/Attention.js";import"../../../icons/customIcons/icons/Collapse.js";import"../../../icons/customIcons/icons/Dashboard.js";import"../../../icons/customIcons/icons/Expand.js";import"../../../icons/customIcons/icons/FolderClosed.js";import"../../../icons/customIcons/icons/FolderClosedFilled.js";import"../../../icons/customIcons/icons/FolderOpened.js";import"../../../icons/customIcons/icons/GreaterOrEqual.js";import"../../../icons/customIcons/icons/LessOrEqual.js";import"../../../icons/customIcons/icons/Search.js";import"../../../icons/customIcons/icons/SearchOne.js";import"../../../icons/customIcons/icons/Wellhub.js";import"../../../icons/customIcons/icons/MultiRuler.js";import"../../../icons/customIcons/icons/Checkbox.js";import"../../../icons/customIcons/icons/CheckboxChecked.js";import"../../../icons/customIcons/icons/CheckboxIndeterminate.js";import"../../../icons/customIcons/icons/Radio.js";import"../../../icons/customIcons/icons/RadioChecked.js";import"../../../icons/customIcons/icons/SimulFrac.js";import"../../../icons/customIcons/icons/ZipperFrac.js";import"../../../icons/customIcons/icons/CautionFilled.js";import"../../../icons/customIcons/icons/InfoRounded.js";import"../../../icons/customIcons/icons/FlameFilled.js";import"../../../icons/customIcons/icons/MoreApp.js";import"../../../icons/customIcons/icons/Pad.js";import"../../../icons/customIcons/icons/DrilloutUnit.js";import"../../../icons/customIcons/icons/FracFleet.js";import"../../../icons/customIcons/icons/Global.js";import"../../../icons/customIcons/icons/Program.js";import"../../../icons/customIcons/icons/Rig.js";import"../../../icons/customIcons/icons/Well.js";import"../../../icons/customIcons/icons/Gap.js";import"../../../icons/customIcons/icons/Pin.js";import"../../../icons/customIcons/icons/CloseOneFilled.js";import"../../../icons/customIcons/icons/AttentionFilled.js";import"../../../icons/customIcons/icons/CheckOneFilled.js";import"../../../icons/customIcons/icons/Archive.js";import"../../../icons/customIcons/icons/ArchiveCancel.js";import"../../../icons/customIcons/icons/Unarchive.js";import"../../../icons/customIcons/icons/Archived.js";import"../../../icons/customIcons/icons/InterventionUnit.js";import"../../../icons/customIcons/icons/CloudDelete.js";import"../../../icons/customIcons/icons/Lasso.js";import"../../../icons/customIcons/icons/Radius.js";import"../../../icons/customIcons/icons/ErrorOps.js";import"../../../icons/customIcons/icons/DataTypeOps.js";import"../../../icons/customIcons/icons/FalsePositiveOps.js";import"../../../icons/customIcons/icons/CalibrationOps.js";import"../../../icons/customIcons/icons/CriticalOps.js";import"../../../icons/customIcons/icons/Company.js";import"../../../icons/customIcons/icons/ArchiveOne.js";import"../../../icons/customIcons/icons/ParseBotFusion.js";import"../../../icons/customIcons/icons/Connect.js";import"../../../icons/customIcons/icons/PuzzleOne.js";import"../../../icons/customIcons/icons/Feed.js";import"../../../icons/customIcons/icons/Prompt.js";import"../../../icons/customIcons/icons/Companies.js";import"../../../icons/customIcons/icons/ClipboardAi.js";import"../../../icons/customIcons/icons/Key.js";import"../../../icons/customIcons/icons/AtSignCrossed.js";import"../../../icons/customIcons/icons/MappingManual.js";import"../../../icons/customIcons/icons/Mapping.js";import"../../../icons/customIcons/icons/Metrics.js";import"../../../icons/customIcons/icons/Drops.js";import"../../../icons/customIcons/icons/ClipboardSearch.js";import"../../../icons/customIcons/icons/Template.js";import"../../../icons/customIcons/icons/ClipboardMetrics.js";import"../../../icons/customIcons/icons/ClipboardBuilder.js";import"../../../icons/customIcons/icons/UnitConversion.js";import"../../../icons/customIcons/icons/NPT.js";import"../../../icons/customIcons/icons/GuidedFrac.js";import{jsx as d}from"react/jsx-runtime";var f=function(o,s){return(Array.isArray(o)?o:[o]).filter((function(o){return!!o})).map((function(o){return r(o).format(s)})).join(" - ")},C=function(o,c,n){var i=r(o,[c].concat(s(l[n]||[])),!0);return i.isValid()?i.toDate():void 0},v=c((function(s,c){var r=s.value,l=s.label,v=s.open,h=s.className,b=s.testId,O=s.format,F=s.placeholder,x=s.range,A=s.readOnly,g=s.type,y=s.setValue,P=s.focusOnClear,N=s.labelPlacement,k=s.size,M=s.elementsClassNames,T=s.isNext,D=s.isOpen,R=s.clearable,S=O||I(g,x),z=n(f(r,S)),B=o(z,2),E=B[0],G=B[1],U=n(r),L=o(U,2),V=L[0],q=L[1],W=i(E);if(V!==r){var K=f(r,S);G(K),q(r),W.current=K}var Z=t((function(o){if(""===o.trim())return null==y||y(void 0),G(""),void(W.current="");var s=u({type:g,range:x,value:o,prevValue:W.current});if(W.current=s,G(s),x){var c=s.split(/[-–—]/).map((function(o){return C(o.trim(),S,g)})).filter((function(o){return!!o}));if(2===c.length){var n=p(c[0],c[1]),i=a(c[0],c[1]);n&&i&&(null==y||y([n,i]))}}else{var t=C(s,S,g);t&&(null==y||y(t))}}),[S,x,y,g]),w=t((function(o){o.target.select(),v()}),[v]),H=t((function(){G(f(r,S)),W.current=""}),[r,S]),J=t((function(){null==y||y(void 0),G("")}),[y]);return T?d(m,{value:E,inputContainerRef:c,label:l,onFocus:w,onBlur:H,className:h,testId:b,suffix:d(j,{}),placeholder:F,onChange:Z,readOnly:A,clearable:R,focusOnClear:P,labelPlacement:N,size:k,elementsClassNames:M}):d(e,{value:E,ref:c,label:l,onFocus:v,onBlur:H,forceLabelShrink:D,className:h,testId:b,suffix:d(j,{}),placeholder:F,onChange:Z,readOnly:A,onClear:R?J:void 0,focusOnClear:P})}));export{v as Input};
2
2
  //# sourceMappingURL=Input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Input.js","sources":["../../../../src/componentsV2/DatePicker/Input/Input.tsx"],"sourcesContent":["import { forwardRef, ReactNode, useCallback, useState } from 'react';\nimport moment from 'moment';\n\nimport { TextInputNext, TextInputNextProps } from '../../TextInputNext';\nimport { TextInput } from '../../TextInput';\nimport {\n DatePickerChangeHandler,\n DatePickerType,\n FallbackInputFormats,\n getDefaultFormat,\n getMaxDate,\n getMinDate,\n} from '../utils';\n\nimport { CalendarThreeIcon } from '~/icons';\n\nexport type InputProps = {\n value?: Date | [Date, Date];\n setValue?: (value: Date | [Date, Date] | undefined) => void;\n label?: ReactNode;\n placeholder?: string;\n open: () => void;\n type: DatePickerType;\n format?: string;\n range?: boolean;\n readOnly?: boolean;\n focusOnClear?: boolean;\n labelPlacement?: TextInputNextProps['labelPlacement'];\n size?: TextInputNextProps['size'];\n elementsClassNames?: TextInputNextProps['elementsClassNames'];\n clearable?: TextInputNextProps['clearable'];\n\n className?: string;\n testId?: string;\n\n // Remove when next becomes baseline\n isOpen: boolean;\n isNext: boolean;\n};\n\nconst formatValue = (value: Date | [Date, Date] | undefined, format: string) =>\n (Array.isArray(value) ? value : [value])\n .filter(item => !!item)\n .map(item => moment(item).format(format))\n .join(' - ');\n\nconst parseStringDate = (value: string, format: string, type: DatePickerType) => {\n const parsedMoment = moment(value, [format, ...(FallbackInputFormats[type] || [])], true);\n\n return parsedMoment.isValid() ? parsedMoment.toDate() : undefined;\n};\n\nexport const Input = forwardRef<HTMLDivElement, InputProps>(\n (\n {\n value,\n label,\n open,\n className,\n testId,\n format,\n placeholder,\n range,\n readOnly,\n type,\n setValue,\n focusOnClear,\n labelPlacement,\n size,\n elementsClassNames,\n isNext,\n isOpen,\n clearable,\n },\n ref\n ) => {\n const actualFormat = format || getDefaultFormat(type, range);\n const [inputValue, setInputValue] = useState(formatValue(value, actualFormat));\n const [prevValue, setPrevValue] = useState(value);\n\n // Value changed - reconstructing input value\n if (prevValue !== value) {\n setInputValue(formatValue(value, actualFormat));\n setPrevValue(value);\n }\n\n const onChange = useCallback(\n (newValue: string) => {\n if (newValue.trim() === '') {\n setValue?.(undefined);\n setInputValue('');\n return;\n }\n\n setInputValue(newValue);\n if (range) {\n // Splitting by hyphen, or en dash, or em dash\n const dateParts = newValue\n .split(/[-–—]/)\n .map(part => parseStringDate(part.trim(), actualFormat, type))\n .filter(part => !!part);\n\n if (dateParts.length === 2) {\n const minDate = getMinDate(dateParts[0], dateParts[1]);\n const maxDate = getMaxDate(dateParts[0], dateParts[1]);\n\n if (minDate && maxDate) {\n (setValue as DatePickerChangeHandler<true>)?.([minDate, maxDate]);\n }\n }\n } else {\n const maybeDate = parseStringDate(newValue, actualFormat, type);\n\n if (maybeDate) {\n (setValue as DatePickerChangeHandler<false>)?.(maybeDate);\n }\n }\n },\n [actualFormat, range, setValue, type]\n );\n\n const onBlur = useCallback(() => {\n setInputValue(formatValue(value, actualFormat));\n }, [value, actualFormat]);\n\n const onClear = useCallback(() => {\n setValue?.(undefined);\n setInputValue('');\n }, [setValue]);\n\n if (isNext) {\n return (\n <TextInputNext\n value={inputValue}\n inputContainerRef={ref}\n label={label}\n onFocus={open}\n onBlur={onBlur}\n className={className}\n testId={testId}\n suffix={<CalendarThreeIcon />}\n placeholder={placeholder}\n onChange={onChange}\n readOnly={readOnly}\n clearable={clearable}\n focusOnClear={focusOnClear}\n labelPlacement={labelPlacement}\n size={size}\n elementsClassNames={elementsClassNames}\n />\n );\n }\n\n return (\n <TextInput\n value={inputValue}\n ref={ref as never}\n label={label}\n onFocus={open}\n onBlur={onBlur}\n forceLabelShrink={isOpen}\n className={className}\n testId={testId}\n suffix={<CalendarThreeIcon />}\n placeholder={placeholder}\n onChange={onChange}\n readOnly={readOnly}\n onClear={clearable ? onClear : undefined}\n focusOnClear={focusOnClear}\n />\n );\n }\n);\n"],"names":["formatValue","value","format","Array","isArray","filter","item","map","moment","join","parseStringDate","type","parsedMoment","concat","_toConsumableArray","FallbackInputFormats","isValid","toDate","undefined","Input","forwardRef","_ref","ref","label","open","className","testId","placeholder","range","readOnly","setValue","focusOnClear","labelPlacement","size","elementsClassNames","isNext","isOpen","clearable","actualFormat","getDefaultFormat","useState","_useState2","_slicedToArray","_useState","inputValue","setInputValue","_useState4","_useState3","prevValue","setPrevValue","onChange","useCallback","newValue","trim","dateParts","split","part","length","minDate","getMinDate","maxDate","getMaxDate","maybeDate","onBlur","onClear","_jsx","TextInputNext","inputContainerRef","onFocus","suffix","CalendarThreeIcon","TextInput","forceLabelShrink"],"mappings":"66IAwCA,IAAMA,EAAc,SAACC,EAAwCC,GAAc,OACxEC,MAAMC,QAAQH,GAASA,EAAQ,CAACA,IAC9BI,QAAO,SAAAC,GAAI,QAAMA,CAAI,IACrBC,KAAI,SAAAD,GAAI,OAAIE,EAAOF,GAAMJ,OAAOA,EAAO,IACvCO,KAAK,MAAM,EAEVC,EAAkB,SAACT,EAAeC,EAAgBS,GACtD,IAAMC,EAAeJ,EAAOP,GAAQC,GAAMW,OAAAC,EAAMC,EAAqBJ,IAAS,MAAM,GAEpF,OAAOC,EAAaI,UAAYJ,EAAaK,cAAWC,CAC1D,EAEaC,EAAQC,GACnB,SAAAC,EAqBEC,GACG,IApBDrB,IAAAA,MACAsB,IAAAA,MACAC,IAAAA,KACAC,IAAAA,UACAC,IAAAA,OACAxB,IAAAA,OACAyB,IAAAA,YACAC,IAAAA,MACAC,IAAAA,SACAlB,IAAAA,KACAmB,IAAAA,SACAC,IAAAA,aACAC,IAAAA,eACAC,IAAAA,KACAC,IAAAA,mBACAC,IAAAA,OACAC,IAAAA,OACAC,IAAAA,UAIIC,EAAepC,GAAUqC,EAAiB5B,EAAMiB,GAClBY,EAAAA,EAASxC,EAAYC,EAAOqC,IAAcG,EAAAC,EAAAC,EAAA,GAAvEC,EAAUH,EAAA,GAAEI,EAAaJ,EAAA,GACED,EAAAA,EAASvC,GAAM6C,EAAAJ,EAAAK,EAAA,GAA1CC,EAASF,EAAA,GAAEG,EAAYH,EAAA,GAG1BE,IAAc/C,IAChB4C,EAAc7C,EAAYC,EAAOqC,IACjCW,EAAahD,IAGf,IAAMiD,EAAWC,GACf,SAACC,GACC,GAAwB,KAApBA,EAASC,OAGX,OAFAvB,SAAAA,OAAWZ,QACX2B,EAAc,IAKhB,GADAA,EAAcO,GACVxB,EAAO,CAET,IAAM0B,EAAYF,EACfG,MAAM,SACNhD,KAAI,SAAAiD,GAAI,OAAI9C,EAAgB8C,EAAKH,OAAQf,EAAc3B,EAAK,IAC5DN,QAAO,SAAAmD,GAAI,QAAMA,KAEpB,GAAyB,IAArBF,EAAUG,OAAc,CAC1B,IAAMC,EAAUC,EAAWL,EAAU,GAAIA,EAAU,IAC7CM,EAAUC,EAAWP,EAAU,GAAIA,EAAU,IAE/CI,GAAWE,IACZ9B,SAAAA,EAA6C,CAAC4B,EAASE,IAE5D,CACF,KAAO,CACL,IAAME,EAAYpD,EAAgB0C,EAAUd,EAAc3B,GAEtDmD,IACDhC,SAAAA,EAA8CgC,GAEnD,CACD,GACD,CAACxB,EAAcV,EAAOE,EAAUnB,IAG5BoD,EAASZ,GAAY,WACzBN,EAAc7C,EAAYC,EAAOqC,GACnC,GAAG,CAACrC,EAAOqC,IAEL0B,EAAUb,GAAY,WAC1BrB,SAAAA,OAAWZ,GACX2B,EAAc,GAChB,GAAG,CAACf,IAEJ,OAAIK,EAEA8B,EAACC,EAAa,CACZjE,MAAO2C,EACPuB,kBAAmB7C,EACnBC,MAAOA,EACP6C,QAAS5C,EACTuC,OAAQA,EACRtC,UAAWA,EACXC,OAAQA,EACR2C,OAAQJ,EAACK,EAAqB,IAC9B3C,YAAaA,EACbuB,SAAUA,EACVrB,SAAUA,EACVQ,UAAWA,EACXN,aAAcA,EACdC,eAAgBA,EAChBC,KAAMA,EACNC,mBAAoBA,IAMxB+B,EAACM,EAAS,CACRtE,MAAO2C,EACPtB,IAAKA,EACLC,MAAOA,EACP6C,QAAS5C,EACTuC,OAAQA,EACRS,iBAAkBpC,EAClBX,UAAWA,EACXC,OAAQA,EACR2C,OAAQJ,EAACK,EAAqB,IAC9B3C,YAAaA,EACbuB,SAAUA,EACVrB,SAAUA,EACVmC,QAAS3B,EAAY2B,OAAU9C,EAC/Ba,aAAcA,GAGpB"}
1
+ {"version":3,"file":"Input.js","sources":["../../../../src/componentsV2/DatePicker/Input/Input.tsx"],"sourcesContent":["import { FocusEventHandler, forwardRef, ReactNode, useCallback, useRef, useState } from 'react';\nimport moment from 'moment';\n\nimport { TextInputNext, TextInputNextProps } from '../../TextInputNext';\nimport { TextInput } from '../../TextInput';\nimport {\n autocompleteValue,\n DatePickerChangeHandler,\n DatePickerType,\n getDefaultFormat,\n getMaxDate,\n getMinDate,\n InputParseFormats,\n} from '../utils';\n\nimport { CalendarThreeIcon } from '~/icons';\n\nexport type InputProps = {\n value?: Date | [Date, Date];\n setValue?: (value: Date | [Date, Date] | undefined) => void;\n label?: ReactNode;\n placeholder?: string;\n open: () => void;\n type: DatePickerType;\n format?: string;\n range?: boolean;\n readOnly?: boolean;\n focusOnClear?: boolean;\n labelPlacement?: TextInputNextProps['labelPlacement'];\n size?: TextInputNextProps['size'];\n elementsClassNames?: TextInputNextProps['elementsClassNames'];\n clearable?: TextInputNextProps['clearable'];\n\n className?: string;\n testId?: string;\n\n // Remove when next becomes baseline\n isOpen: boolean;\n isNext: boolean;\n};\n\nconst formatValue = (value: Date | [Date, Date] | undefined, format: string) =>\n (Array.isArray(value) ? value : [value])\n .filter(item => !!item)\n .map(item => moment(item).format(format))\n .join(' - ');\n\nconst parseStringDate = (value: string, format: string, type: DatePickerType) => {\n const parsedMoment = moment(value, [format, ...(InputParseFormats[type] || [])], true);\n\n return parsedMoment.isValid() ? parsedMoment.toDate() : undefined;\n};\n\nexport const Input = forwardRef<HTMLDivElement, InputProps>(\n (\n {\n value,\n label,\n open,\n className,\n testId,\n format,\n placeholder,\n range,\n readOnly,\n type,\n setValue,\n focusOnClear,\n labelPlacement,\n size,\n elementsClassNames,\n isNext,\n isOpen,\n clearable,\n },\n ref\n ) => {\n const actualFormat = format || getDefaultFormat(type, range);\n const [inputValue, setInputValue] = useState(formatValue(value, actualFormat));\n const [prevValue, setPrevValue] = useState(value);\n const prevInputValueRef = useRef(inputValue);\n\n // Value changed - reconstructing input value\n if (prevValue !== value) {\n const newInputValue = formatValue(value, actualFormat);\n setInputValue(newInputValue);\n setPrevValue(value);\n prevInputValueRef.current = newInputValue;\n }\n\n const onChange = useCallback(\n (typedValue: string) => {\n if (typedValue.trim() === '') {\n setValue?.(undefined);\n setInputValue('');\n prevInputValueRef.current = '';\n return;\n }\n\n const newValue = autocompleteValue({\n type,\n range,\n value: typedValue,\n prevValue: prevInputValueRef.current,\n });\n\n prevInputValueRef.current = newValue;\n\n setInputValue(newValue);\n if (range) {\n // Splitting by hyphen, or en dash, or em dash\n const dateParts = newValue\n .split(/[-–—]/)\n .map(part => parseStringDate(part.trim(), actualFormat, type))\n .filter(part => !!part);\n\n if (dateParts.length === 2) {\n const minDate = getMinDate(dateParts[0], dateParts[1]);\n const maxDate = getMaxDate(dateParts[0], dateParts[1]);\n\n if (minDate && maxDate) {\n (setValue as DatePickerChangeHandler<true>)?.([minDate, maxDate]);\n }\n }\n } else {\n const maybeDate = parseStringDate(newValue, actualFormat, type);\n\n if (maybeDate) {\n (setValue as DatePickerChangeHandler<false>)?.(maybeDate);\n }\n }\n },\n [actualFormat, range, setValue, type]\n );\n\n const onFocus = useCallback<FocusEventHandler<HTMLInputElement>>(\n e => {\n e.target.select();\n open();\n },\n [open]\n );\n\n const onBlur = useCallback(() => {\n setInputValue(formatValue(value, actualFormat));\n prevInputValueRef.current = '';\n }, [value, actualFormat]);\n\n const onClear = useCallback(() => {\n setValue?.(undefined);\n setInputValue('');\n }, [setValue]);\n\n if (isNext) {\n return (\n <TextInputNext\n value={inputValue}\n inputContainerRef={ref}\n label={label}\n onFocus={onFocus}\n onBlur={onBlur}\n className={className}\n testId={testId}\n suffix={<CalendarThreeIcon />}\n placeholder={placeholder}\n onChange={onChange}\n readOnly={readOnly}\n clearable={clearable}\n focusOnClear={focusOnClear}\n labelPlacement={labelPlacement}\n size={size}\n elementsClassNames={elementsClassNames}\n />\n );\n }\n\n return (\n <TextInput\n value={inputValue}\n ref={ref as never}\n label={label}\n onFocus={open}\n onBlur={onBlur}\n forceLabelShrink={isOpen}\n className={className}\n testId={testId}\n suffix={<CalendarThreeIcon />}\n placeholder={placeholder}\n onChange={onChange}\n readOnly={readOnly}\n onClear={clearable ? onClear : undefined}\n focusOnClear={focusOnClear}\n />\n );\n }\n);\n"],"names":["formatValue","value","format","Array","isArray","filter","item","map","moment","join","parseStringDate","type","parsedMoment","concat","_toConsumableArray","InputParseFormats","isValid","toDate","undefined","Input","forwardRef","_ref","ref","label","open","className","testId","placeholder","range","readOnly","setValue","focusOnClear","labelPlacement","size","elementsClassNames","isNext","isOpen","clearable","actualFormat","getDefaultFormat","useState","_useState2","_slicedToArray","_useState","inputValue","setInputValue","_useState4","_useState3","prevValue","setPrevValue","prevInputValueRef","useRef","newInputValue","current","onChange","useCallback","typedValue","trim","newValue","autocompleteValue","dateParts","split","part","length","minDate","getMinDate","maxDate","getMaxDate","maybeDate","onFocus","e","target","select","onBlur","onClear","_jsx","TextInputNext","inputContainerRef","suffix","CalendarThreeIcon","TextInput","forceLabelShrink"],"mappings":"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"}
@@ -6,7 +6,14 @@ export declare const applyOffsetSeconds: (date: Date, offset: number) => Date;
6
6
  export declare const DefaultFormatByType: Record<DatePickerType, string>;
7
7
  export declare const DefaultFormatByTypeRange: Record<DatePickerType, string>;
8
8
  export declare const getDefaultFormat: (type: DatePickerType, range?: boolean) => string;
9
- export declare const FallbackInputFormats: Record<DatePickerType, string[]>;
9
+ export declare const InputAutocompleteFormats: Record<DatePickerType, string>;
10
+ export declare const InputParseFormats: Record<DatePickerType, string[]>;
11
+ export declare const autocompleteValue: ({ value, type, range, prevValue, }: {
12
+ type: DatePickerType;
13
+ range?: boolean;
14
+ value: string;
15
+ prevValue: string;
16
+ }) => string;
10
17
  export declare const isSameMonth: (a?: Date, b?: Date) => boolean;
11
18
  export declare const isSameDay: (a?: Date, b?: Date) => boolean;
12
19
  export declare const getMinDate: (a?: Date, b?: Date) => Date | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/componentsV2/DatePicker/utils.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,OAAO,GAAG,SAAS,GAAG,KAAK,IAAI,OAAO,SAC9E,SAAS,GACT,KAAK,GACL,IAAI,GAAG,SAAS,GAChB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC;AAE7B,MAAM,MAAM,uBAAuB,CAAC,OAAO,SAAS,OAAO,GAAG,SAAS,GAAG,KAAK,IAAI,CACjF,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,KAC5B,IAAI,CAAC;AAMV,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnF,eAAO,MAAM,kBAAkB,SAAU,IAAI,UAAU,MAAM,SACA,CAAC;AAE9D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAI9D,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAInE,CAAC;AAEF,eAAO,MAAM,gBAAgB,SAAU,cAAc,UAAU,OAAO,WAGrE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAIjE,CAAC;AAEF,eAAO,MAAM,WAAW,OAAQ,IAAI,MAAM,IAAI,YACsC,CAAC;AAErF,eAAO,MAAM,SAAS,OAAQ,IAAI,MAAM,IAAI,YAAuD,CAAC;AAEpG,eAAO,MAAM,UAAU,OAAQ,IAAI,MAAM,IAAI,qBAM5C,CAAC;AAEF,eAAO,MAAM,UAAU,OAAQ,IAAI,MAAM,IAAI,qBAM5C,CAAC;AAEF,eAAO,MAAM,YAAY;;;;GAaxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/componentsV2/DatePicker/utils.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,OAAO,GAAG,SAAS,GAAG,KAAK,IAAI,OAAO,SAC9E,SAAS,GACT,KAAK,GACL,IAAI,GAAG,SAAS,GAChB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC;AAE7B,MAAM,MAAM,uBAAuB,CAAC,OAAO,SAAS,OAAO,GAAG,SAAS,GAAG,KAAK,IAAI,CACjF,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,KAC5B,IAAI,CAAC;AAMV,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnF,eAAO,MAAM,kBAAkB,SAAU,IAAI,UAAU,MAAM,SACA,CAAC;AAE9D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAI9D,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAInE,CAAC;AAEF,eAAO,MAAM,gBAAgB,SAAU,cAAc,UAAU,OAAO,WAGrE,CAAC;AAOF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAInE,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAI9D,CAAC;AA+BF,eAAO,MAAM,iBAAiB,uCAK3B;IACD,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,WAoBA,CAAC;AAEF,eAAO,MAAM,WAAW,OAAQ,IAAI,MAAM,IAAI,YACsC,CAAC;AAErF,eAAO,MAAM,SAAS,OAAQ,IAAI,MAAM,IAAI,YAAuD,CAAC;AAEpG,eAAO,MAAM,UAAU,OAAQ,IAAI,MAAM,IAAI,qBAM5C,CAAC;AAEF,eAAO,MAAM,UAAU,OAAQ,IAAI,MAAM,IAAI,qBAM5C,CAAC;AAEF,eAAO,MAAM,YAAY;;;;GAaxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,OAAO,CAAC"}
@@ -1,2 +1,2 @@
1
- import t from"moment";var e=function(e,l){return t(e).startOf("day").add(l,"seconds").toDate()},l={date:"DD MMM YYYY",dateTime:"DD MMM YYYY hh:mm A",month:"MMMM YYYY"},Y={date:"DD/MM/YYYY",dateTime:"DD/MM/YYYY hh:mm A",month:"MMM YYYY"},i=function(t,e){return(e?Y:l)[t]},u={month:["MMMM YYYY","MMM YYYY"],date:["DD/MM/YYYY","D/M/YYYY"],dateTime:["DD/MM/YYYY hh:mm A","D/M/YYYY hh:mm A"]},M=function(t,e){return!!t&&!!e&&t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()},n=function(t,e){return M(t,e)&&(null==t?void 0:t.getDate())===(null==e?void 0:e.getDate())},r=function(t,e){return t&&e?t<e?t:e:t||e},d=function(t,e){return t&&e?t>e?t:e:t||e},a=[{id:1,title:"Jan",fullTitle:"January"},{id:2,title:"Feb",fullTitle:"February"},{id:3,title:"Mar",fullTitle:"March"},{id:4,title:"Apr",fullTitle:"April"},{id:5,title:"May",fullTitle:"May"},{id:6,title:"Jun",fullTitle:"June"},{id:7,title:"Jul",fullTitle:"July"},{id:8,title:"Aug",fullTitle:"August"},{id:9,title:"Sep",fullTitle:"September"},{id:10,title:"Oct",fullTitle:"October"},{id:11,title:"Nov",fullTitle:"November"},{id:12,title:"Dec",fullTitle:"December"}];export{l as DefaultFormatByType,Y as DefaultFormatByTypeRange,u as FallbackInputFormats,a as MonthOptions,e as applyOffsetSeconds,i as getDefaultFormat,d as getMaxDate,r as getMinDate,n as isSameDay,M as isSameMonth};
1
+ import t from"moment";var e=function(e,l){return t(e).startOf("day").add(l,"seconds").toDate()},l={date:"DD MMM YYYY",dateTime:"DD MMM YYYY hh:mm A",month:"MMMM YYYY"},n={date:"DD/MM/YYYY",dateTime:"DD/MM/YYYY hh:mm A",month:"MMM YYYY"},i=function(t,e){return(e?n:l)[t]},r=["D","M","Y","h","m","s","S"],Y=[].concat(r,["A"]),u=new RegExp("^([^".concat(Y.join(""),"]+)"),"gi"),a={month:"MM/YYYY",date:"DD/MM/YYYY",dateTime:"DD/MM/YYYY hh:mm A"},o={month:[a.month,"MMMM YYYY","MMM YYYY"],date:[a.date,"D/M/YYYY"],dateTime:[a.dateTime,"D/M/YYYY hh:mm A"]},M=function(t){var e=t.value,l=t.type,n=t.range,i=t.prevValue,Y=a[l],o=n?"".concat(Y," - ").concat(Y):Y,M=e.toLocaleLowerCase().replace(/([ap])m/gi,"$1");if(e.length<=i.length||!function(t,e){return e.length<=t.length&&e.split("").every((function(e,l){var n,i=t[l];if(r.includes(i))return null==(n=e)?void 0:n.match(/\d/);if("A"===i){var Y=e.toLocaleLowerCase();return"a"===Y||"p"===Y}return i===e}))}(o,M)||o.length<=M.length)return e;var c=function(t,e){var l;return(null===(l=t.substring(e).match(u))||void 0===l?void 0:l[0])||""}(o,M.length);return"".concat(e).concat(c)},c=function(t,e){return!!t&&!!e&&t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()},d=function(t,e){return c(t,e)&&(null==t?void 0:t.getDate())===(null==e?void 0:e.getDate())},m=function(t,e){return t&&e?t<e?t:e:t||e},f=function(t,e){return t&&e?t>e?t:e:t||e},h=[{id:1,title:"Jan",fullTitle:"January"},{id:2,title:"Feb",fullTitle:"February"},{id:3,title:"Mar",fullTitle:"March"},{id:4,title:"Apr",fullTitle:"April"},{id:5,title:"May",fullTitle:"May"},{id:6,title:"Jun",fullTitle:"June"},{id:7,title:"Jul",fullTitle:"July"},{id:8,title:"Aug",fullTitle:"August"},{id:9,title:"Sep",fullTitle:"September"},{id:10,title:"Oct",fullTitle:"October"},{id:11,title:"Nov",fullTitle:"November"},{id:12,title:"Dec",fullTitle:"December"}];export{l as DefaultFormatByType,n as DefaultFormatByTypeRange,a as InputAutocompleteFormats,o as InputParseFormats,h as MonthOptions,e as applyOffsetSeconds,M as autocompleteValue,i as getDefaultFormat,f as getMaxDate,m as getMinDate,d as isSameDay,c as isSameMonth};
2
2
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/componentsV2/DatePicker/utils.tsx"],"sourcesContent":["import moment from 'moment';\n\nexport type DatePickerType = 'date' | 'dateTime' | 'month';\n\nexport type DatePickerValue<IsRange extends boolean | undefined = false> = IsRange extends\n | undefined\n | false\n ? Date | undefined\n : [Date, Date] | undefined;\n\nexport type DatePickerChangeHandler<IsRange extends boolean | undefined = false> = (\n value: DatePickerValue<IsRange>\n) => void;\n\n// startDate - initial state, no start date selected\n// startTime - start date selected, no time selected\n// endDate - start done, no end date selected\n// endTime - end date selected, no time selected\nexport type RangeSelectionStep = 'startDate' | 'startTime' | 'endDate' | 'endTime';\n\nexport const applyOffsetSeconds = (date: Date, offset: number) =>\n moment(date).startOf('day').add(offset, 'seconds').toDate();\n\nexport const DefaultFormatByType: Record<DatePickerType, string> = {\n date: 'DD MMM YYYY',\n dateTime: 'DD MMM YYYY hh:mm A',\n month: 'MMMM YYYY',\n};\n\nexport const DefaultFormatByTypeRange: Record<DatePickerType, string> = {\n date: 'DD/MM/YYYY',\n dateTime: 'DD/MM/YYYY hh:mm A',\n month: 'MMM YYYY',\n};\n\nexport const getDefaultFormat = (type: DatePickerType, range?: boolean) => {\n const map = range ? DefaultFormatByTypeRange : DefaultFormatByType;\n return map[type];\n};\n\nexport const FallbackInputFormats: Record<DatePickerType, string[]> = {\n month: ['MMMM YYYY', 'MMM YYYY'],\n date: ['DD/MM/YYYY', 'D/M/YYYY'],\n dateTime: ['DD/MM/YYYY hh:mm A', 'D/M/YYYY hh:mm A'],\n};\n\nexport const isSameMonth = (a?: Date, b?: Date) =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n\nexport const isSameDay = (a?: Date, b?: Date) => isSameMonth(a, b) && a?.getDate() === b?.getDate();\n\nexport const getMinDate = (a?: Date, b?: Date) => {\n if (a && b) {\n return a < b ? a : b;\n }\n\n return a || b;\n};\n\nexport const getMaxDate = (a?: Date, b?: Date) => {\n if (a && b) {\n return a > b ? a : b;\n }\n\n return a || b;\n};\n\nexport const MonthOptions = [\n { id: 1, title: 'Jan', fullTitle: 'January' },\n { id: 2, title: 'Feb', fullTitle: 'February' },\n { id: 3, title: 'Mar', fullTitle: 'March' },\n { id: 4, title: 'Apr', fullTitle: 'April' },\n { id: 5, title: 'May', fullTitle: 'May' },\n { id: 6, title: 'Jun', fullTitle: 'June' },\n { id: 7, title: 'Jul', fullTitle: 'July' },\n { id: 8, title: 'Aug', fullTitle: 'August' },\n { id: 9, title: 'Sep', fullTitle: 'September' },\n { id: 10, title: 'Oct', fullTitle: 'October' },\n { id: 11, title: 'Nov', fullTitle: 'November' },\n { id: 12, title: 'Dec', fullTitle: 'December' },\n];\n\nexport type DatePickerCalendarView = 'year' | 'month';\n"],"names":["applyOffsetSeconds","date","offset","moment","startOf","add","toDate","DefaultFormatByType","dateTime","month","DefaultFormatByTypeRange","getDefaultFormat","type","range","FallbackInputFormats","isSameMonth","a","b","getFullYear","getMonth","isSameDay","getDate","getMinDate","getMaxDate","MonthOptions","id","title","fullTitle"],"mappings":"sBAoBO,IAAMA,EAAqB,SAACC,EAAYC,GAAc,OAC3DC,EAAOF,GAAMG,QAAQ,OAAOC,IAAIH,EAAQ,WAAWI,QAAQ,EAEhDC,EAAsD,CACjEN,KAAM,cACNO,SAAU,sBACVC,MAAO,aAGIC,EAA2D,CACtET,KAAM,aACNO,SAAU,qBACVC,MAAO,YAGIE,EAAmB,SAACC,EAAsBC,GAErD,OADYA,EAAQH,EAA2BH,GACpCK,EACb,EAEaE,EAAyD,CACpEL,MAAO,CAAC,YAAa,YACrBR,KAAM,CAAC,aAAc,YACrBO,SAAU,CAAC,qBAAsB,qBAGtBO,EAAc,SAACC,EAAUC,GAAQ,QAC1CD,KAAOC,GAAKD,EAAEE,gBAAkBD,EAAEC,eAAiBF,EAAEG,aAAeF,EAAEE,UAAU,EAEvEC,EAAY,SAACJ,EAAUC,GAAQ,OAAKF,EAAYC,EAAGC,KAAMD,aAAC,EAADA,EAAGK,cAAcJ,aAAAA,EAAAA,EAAGI,UAAS,EAEtFC,EAAa,SAACN,EAAUC,GACnC,OAAID,GAAKC,EACAD,EAAIC,EAAID,EAAIC,EAGdD,GAAKC,CACd,EAEaM,EAAa,SAACP,EAAUC,GACnC,OAAID,GAAKC,EACAD,EAAIC,EAAID,EAAIC,EAGdD,GAAKC,CACd,EAEaO,EAAe,CAC1B,CAAEC,GAAI,EAAGC,MAAO,MAAOC,UAAW,WAClC,CAAEF,GAAI,EAAGC,MAAO,MAAOC,UAAW,YAClC,CAAEF,GAAI,EAAGC,MAAO,MAAOC,UAAW,SAClC,CAAEF,GAAI,EAAGC,MAAO,MAAOC,UAAW,SAClC,CAAEF,GAAI,EAAGC,MAAO,MAAOC,UAAW,OAClC,CAAEF,GAAI,EAAGC,MAAO,MAAOC,UAAW,QAClC,CAAEF,GAAI,EAAGC,MAAO,MAAOC,UAAW,QAClC,CAAEF,GAAI,EAAGC,MAAO,MAAOC,UAAW,UAClC,CAAEF,GAAI,EAAGC,MAAO,MAAOC,UAAW,aAClC,CAAEF,GAAI,GAAIC,MAAO,MAAOC,UAAW,WACnC,CAAEF,GAAI,GAAIC,MAAO,MAAOC,UAAW,YACnC,CAAEF,GAAI,GAAIC,MAAO,MAAOC,UAAW"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/componentsV2/DatePicker/utils.tsx"],"sourcesContent":["import moment from 'moment';\n\nexport type DatePickerType = 'date' | 'dateTime' | 'month';\n\nexport type DatePickerValue<IsRange extends boolean | undefined = false> = IsRange extends\n | undefined\n | false\n ? Date | undefined\n : [Date, Date] | undefined;\n\nexport type DatePickerChangeHandler<IsRange extends boolean | undefined = false> = (\n value: DatePickerValue<IsRange>\n) => void;\n\n// startDate - initial state, no start date selected\n// startTime - start date selected, no time selected\n// endDate - start done, no end date selected\n// endTime - end date selected, no time selected\nexport type RangeSelectionStep = 'startDate' | 'startTime' | 'endDate' | 'endTime';\n\nexport const applyOffsetSeconds = (date: Date, offset: number) =>\n moment(date).startOf('day').add(offset, 'seconds').toDate();\n\nexport const DefaultFormatByType: Record<DatePickerType, string> = {\n date: 'DD MMM YYYY',\n dateTime: 'DD MMM YYYY hh:mm A',\n month: 'MMMM YYYY',\n};\n\nexport const DefaultFormatByTypeRange: Record<DatePickerType, string> = {\n date: 'DD/MM/YYYY',\n dateTime: 'DD/MM/YYYY hh:mm A',\n month: 'MMM YYYY',\n};\n\nexport const getDefaultFormat = (type: DatePickerType, range?: boolean) => {\n const map = range ? DefaultFormatByTypeRange : DefaultFormatByType;\n return map[type];\n};\n\nconst NumericLetters = ['D', 'M', 'Y', 'h', 'm', 's', 'S'];\nconst AllLetters = [...NumericLetters, 'A'];\nconst GetSeparatorRegex = new RegExp(`^([^${AllLetters.join('')}]+)`, 'gi');\n\n// These formats should be composed only of `AllLetters` as placeholders only\nexport const InputAutocompleteFormats: Record<DatePickerType, string> = {\n month: 'MM/YYYY',\n date: 'DD/MM/YYYY',\n dateTime: 'DD/MM/YYYY hh:mm A',\n};\n\nexport const InputParseFormats: Record<DatePickerType, string[]> = {\n month: [InputAutocompleteFormats.month, 'MMMM YYYY', 'MMM YYYY'],\n date: [InputAutocompleteFormats.date, 'D/M/YYYY'],\n dateTime: [InputAutocompleteFormats.dateTime, 'D/M/YYYY hh:mm A'],\n};\n\nconst isDigit = (symbol?: string) => symbol?.match(/\\d/);\n\nconst isInFormatSoFar = (format: string, value: string) => {\n if (value.length <= format.length) {\n const valueArr = value.split('');\n\n return valueArr.every((valueChar, pos) => {\n const formatChar = format[pos];\n\n if (NumericLetters.includes(formatChar)) {\n return isDigit(valueChar);\n }\n\n if (formatChar === 'A') {\n const lcChar = valueChar.toLocaleLowerCase();\n return lcChar === 'a' || lcChar === 'p';\n }\n\n return formatChar === valueChar;\n });\n }\n\n return false;\n};\n\nconst getSeparator = (format: string, startIndex: number) => {\n return format.substring(startIndex).match(GetSeparatorRegex)?.[0] || '';\n};\n\nexport const autocompleteValue = ({\n value,\n type,\n range,\n prevValue,\n}: {\n type: DatePickerType;\n range?: boolean;\n value: string;\n prevValue: string;\n}) => {\n const formatPart = InputAutocompleteFormats[type];\n const format = range ? `${formatPart} - ${formatPart}` : formatPart;\n\n const preparedValue = value.toLocaleLowerCase().replace(/([ap])m/gi, '$1');\n\n if (\n value.length <= prevValue.length ||\n !isInFormatSoFar(format, preparedValue) ||\n format.length <= preparedValue.length\n ) {\n return value;\n }\n\n // Only autocomplete if user types something\n // Check if conforms to format so far\n // Adding separators if needed\n const separator = getSeparator(format, preparedValue.length);\n\n return `${value}${separator}`;\n};\n\nexport const isSameMonth = (a?: Date, b?: Date) =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n\nexport const isSameDay = (a?: Date, b?: Date) => isSameMonth(a, b) && a?.getDate() === b?.getDate();\n\nexport const getMinDate = (a?: Date, b?: Date) => {\n if (a && b) {\n return a < b ? a : b;\n }\n\n return a || b;\n};\n\nexport const getMaxDate = (a?: Date, b?: Date) => {\n if (a && b) {\n return a > b ? a : b;\n }\n\n return a || b;\n};\n\nexport const MonthOptions = [\n { id: 1, title: 'Jan', fullTitle: 'January' },\n { id: 2, title: 'Feb', fullTitle: 'February' },\n { id: 3, title: 'Mar', fullTitle: 'March' },\n { id: 4, title: 'Apr', fullTitle: 'April' },\n { id: 5, title: 'May', fullTitle: 'May' },\n { id: 6, title: 'Jun', fullTitle: 'June' },\n { id: 7, title: 'Jul', fullTitle: 'July' },\n { id: 8, title: 'Aug', fullTitle: 'August' },\n { id: 9, title: 'Sep', fullTitle: 'September' },\n { id: 10, title: 'Oct', fullTitle: 'October' },\n { id: 11, title: 'Nov', fullTitle: 'November' },\n { id: 12, title: 'Dec', fullTitle: 'December' },\n];\n\nexport type DatePickerCalendarView = 'year' | 'month';\n"],"names":["applyOffsetSeconds","date","offset","moment","startOf","add","toDate","DefaultFormatByType","dateTime","month","DefaultFormatByTypeRange","getDefaultFormat","type","range","NumericLetters","AllLetters","concat","GetSeparatorRegex","RegExp","join","InputAutocompleteFormats","InputParseFormats","autocompleteValue","_ref","value","prevValue","formatPart","format","preparedValue","toLocaleLowerCase","replace","length","split","every","valueChar","pos","symbol","formatChar","includes","match","lcChar","isInFormatSoFar","separator","startIndex","_format$substring$mat","substring","getSeparator","isSameMonth","a","b","getFullYear","getMonth","isSameDay","getDate","getMinDate","getMaxDate","MonthOptions","id","title","fullTitle"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- declare function useSignedURL(fileName: any, contentDisposition?: string): string;
1
+ declare function useSignedURL(fileName: any, contentDisposition?: string): any;
2
2
  export default useSignedURL;
3
3
  //# sourceMappingURL=useSignedURL.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSignedURL.d.ts","sourceRoot":"","sources":["../../src/effects/useSignedURL.js"],"names":[],"mappings":"AAIA,iBAAS,YAAY,CAAC,QAAQ,KAAA,EAAE,kBAAkB,SAAe,UA0BhE;eAEc,YAAY"}
1
+ {"version":3,"file":"useSignedURL.d.ts","sourceRoot":"","sources":["../../src/effects/useSignedURL.js"],"names":[],"mappings":"AAIA,iBAAS,YAAY,CAAC,QAAQ,KAAA,EAAE,kBAAkB,SAAe,OA4BhE;eAEc,YAAY"}
@@ -1,2 +1,2 @@
1
- import r from"@babel/runtime/helpers/slicedToArray";import{useState as t,useEffect as n}from"react";import{getS3DownloadLink as o}from"../clients/jsonApi/index.js";function e(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"attachment",c=t(""),a=r(c,2),u=a[0],f=a[1];return n((function(){var r=!0;return f(""),e&&o(e,i).then((function(t){r&&f(t.url)})).catch((function(t){console.error(t),r&&f("")})),function(){r=!1}}),[e,i]),u}export{e as default};
1
+ import r from"@babel/runtime/helpers/slicedToArray";import{useState as t,useEffect as n}from"react";import{peekSignedLink as e,getSignedLink as o}from"../utils/signedLinkCache.js";function i(i){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"attachment",u=t((function(){return i&&e(i,c)||""})),a=r(u,2),f=a[0],m=a[1];return n((function(){var r=!0;return m(i&&e(i,c)||""),i&&o(i,c).then((function(t){r&&m(t)})).catch((function(t){console.error(t),r&&m("")})),function(){r=!1}}),[i,c]),f}export{i as default};
2
2
  //# sourceMappingURL=useSignedURL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSignedURL.js","sources":["../../src/effects/useSignedURL.js"],"sourcesContent":["import { useState, useEffect } from 'react';\n\nimport { getS3DownloadLink } from '~/clients/jsonApi';\n\nfunction useSignedURL(fileName, contentDisposition = 'attachment') {\n const [signedURL, setSignedURL] = useState('');\n\n useEffect(() => {\n let isActive = true;\n\n // Drop the previous link right away: keeping it would describe the new file with the old URL.\n setSignedURL('');\n\n if (fileName) {\n getS3DownloadLink(fileName, contentDisposition)\n .then(response => {\n if (isActive) setSignedURL(response.url);\n })\n .catch(error => {\n console.error(error);\n if (isActive) setSignedURL('');\n });\n }\n\n return () => {\n isActive = false;\n };\n }, [fileName, contentDisposition]);\n\n return signedURL;\n}\n\nexport default useSignedURL;\n"],"names":["useSignedURL","fileName","contentDisposition","useState","_useState2","_slicedToArray","_useState","signedURL","setSignedURL","useEffect","isActive","getS3DownloadLink","then","response","url","catch","error","console"],"mappings":"oKAIA,SAASA,EAAaC,GAA6C,IAAnCC,yDAAqB,aACjBC,EAAAA,EAAS,IAAGC,EAAAC,EAAAC,EAAA,GAAvCC,EAASH,EAAA,GAAEI,EAAYJ,EAAA,GAwB9B,OAtBAK,GAAU,WACR,IAAIC,GAAW,EAgBf,OAbAF,EAAa,IAETP,GACFU,EAAkBV,EAAUC,GACzBU,MAAK,SAAAC,GACAH,GAAUF,EAAaK,EAASC,IACtC,IACCC,OAAM,SAAAC,GACLC,QAAQD,MAAMA,GACVN,GAAUF,EAAa,GAC7B,IAGG,WACLE,GAAW,EAEf,GAAG,CAACT,EAAUC,IAEPK,CACT"}
1
+ {"version":3,"file":"useSignedURL.js","sources":["../../src/effects/useSignedURL.js"],"sourcesContent":["import { useState, useEffect } from 'react';\n\nimport { getSignedLink, peekSignedLink } from '~/utils/signedLinkCache';\n\nfunction useSignedURL(fileName, contentDisposition = 'attachment') {\n const [signedURL, setSignedURL] = useState(\n () => (fileName && peekSignedLink(fileName, contentDisposition)) || ''\n );\n\n useEffect(() => {\n let isActive = true;\n\n // Drop the previous link right away: keeping it would describe the new file with the old URL.\n setSignedURL((fileName && peekSignedLink(fileName, contentDisposition)) || '');\n\n if (fileName) {\n getSignedLink(fileName, contentDisposition)\n .then(url => {\n if (isActive) setSignedURL(url);\n })\n .catch(error => {\n console.error(error);\n if (isActive) setSignedURL('');\n });\n }\n\n return () => {\n isActive = false;\n };\n }, [fileName, contentDisposition]);\n\n return signedURL;\n}\n\nexport default useSignedURL;\n"],"names":["useSignedURL","fileName","contentDisposition","_useState","useState","peekSignedLink","_useState2","_slicedToArray","signedURL","setSignedURL","useEffect","isActive","getSignedLink","then","url","catch","error","console"],"mappings":"oLAIA,SAASA,EAAaC,GAA6C,IAAnCC,yDAAqB,aACnDC,EAAkCC,GAChC,WAAA,OAAOH,GAAYI,EAAeJ,EAAUC,IAAwB,MACrEI,EAAAC,EAAAJ,EAAA,GAFMK,EAASF,EAAA,GAAEG,EAAYH,EAAA,GA0B9B,OAtBAI,GAAU,WACR,IAAIC,GAAW,EAgBf,OAbAF,EAAcR,GAAYI,EAAeJ,EAAUC,IAAwB,IAEvED,GACFW,EAAcX,EAAUC,GACrBW,MAAK,SAAAC,GACAH,GAAUF,EAAaK,EAC7B,IACCC,OAAM,SAAAC,GACLC,QAAQD,MAAMA,GACVL,GAAUF,EAAa,GAC7B,IAGG,WACLE,GAAW,EAEf,GAAG,CAACV,EAAUC,IAEPM,CACT"}
@@ -248,7 +248,7 @@ const validateDsn = dsn => {
248
248
 
249
249
  const MCP_SERVER_VERSION = '1.5.0';
250
250
 
251
- var version = "3.75.0-14";
251
+ var version = "3.75.0-16";
252
252
 
253
253
  const CORVA_UI_VERSION = version;
254
254
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@corva/ui",
3
- "version": "3.75.0-14",
3
+ "version": "3.75.0-16",
4
4
  "license": "UNLICENSED",
5
5
  "description": "Shared components/utils for Corva ui projects",
6
6
  "repository": {