@@ -38,6 +38,11 @@ export interface FieldInfo {
3838 value ?: any ;
3939}
4040
41+ export interface DownloadRequestData {
42+ blob : Blob ;
43+ fields : FieldInfo [ ] ;
44+ }
45+
4146export interface SuperDocESignProps {
4247 // Document
4348 document : string | File | Blob ;
@@ -55,12 +60,14 @@ export interface SuperDocESignProps {
5560 // Element selectors (for finding signature/consent elements)
5661 signatureSelector ?: string ;
5762 consentSelector ?: string ;
63+ downloadSelector ?: string ;
5864
5965 // Callbacks
6066 onReady ?: ( ) => void ;
6167 onChange ?: ( status : Status ) => void ;
6268 onAccept ?: ( data : AuditData ) => void | Promise < void > ;
6369 onFieldsDiscovered ?: ( fields : FieldInfo [ ] ) => void ;
70+ onDownloadRequest ?: ( data : DownloadRequestData ) => void | Promise < void > ;
6471
6572 // Style
6673 className ?: string ;
@@ -73,6 +80,7 @@ export interface SuperDocESignHandle {
7380 updateFields : ( fields : FieldUpdate [ ] ) => void ;
7481 getStatus : ( ) => Status ;
7582 getFields : ( ) => FieldInfo [ ] ;
83+ requestDownload : ( ) => Promise < DownloadRequestData | false > ;
7684 superdoc : SuperDoc | null ;
7785}
7886
@@ -84,10 +92,12 @@ const SuperDocESign = forwardRef<SuperDocESignHandle, SuperDocESignProps>(
8492 fields : initialFields = [ ] ,
8593 signatureSelector = "[data-esign-signature]" ,
8694 consentSelector = "[data-esign-consent]" ,
95+ downloadSelector = "[data-esign-download]" ,
8796 onReady,
8897 onChange,
8998 onAccept,
9099 onFieldsDiscovered,
100+ onDownloadRequest,
91101 className,
92102 style,
93103 } ,
@@ -452,6 +462,52 @@ const SuperDocESign = forwardRef<SuperDocESignHandle, SuperDocESignProps>(
452462 return Array . from ( fields . values ( ) ) ;
453463 } , [ fields ] ) ;
454464
465+ const requestDownload = useCallback ( async ( ) : Promise < DownloadRequestData | false > => {
466+ if ( ! superdocRef . current ) return false ;
467+
468+ try {
469+ const result = await superdocRef . current . export ( {
470+ exportType : [ 'docx' ] ,
471+ isFinalDoc : true ,
472+ triggerDownload : false ,
473+ } ) ;
474+
475+ if ( ! result ) return false ;
476+
477+ const downloadData : DownloadRequestData = {
478+ blob : result ,
479+ fields : Array . from ( fields . values ( ) ) ,
480+ } ;
481+
482+ await onDownloadRequest ?.( downloadData ) ;
483+ return downloadData ;
484+ } catch ( error ) {
485+ console . error ( 'Download request failed:' , error ) ;
486+ return false ;
487+ }
488+ } , [ fields , onDownloadRequest ] ) ;
489+
490+ // Track download button clicks
491+ useEffect ( ( ) => {
492+ if ( ! isReady ) return ;
493+
494+ const handleDownloadClick = ( e : Event ) => {
495+ e . preventDefault ( ) ;
496+ requestDownload ( ) ;
497+ } ;
498+
499+ const downloadElements = globalThis . document . querySelectorAll ( downloadSelector ) ;
500+ downloadElements . forEach ( ( el ) => {
501+ el . addEventListener ( 'click' , handleDownloadClick ) ;
502+ } ) ;
503+
504+ return ( ) => {
505+ downloadElements . forEach ( ( el ) => {
506+ el . removeEventListener ( 'click' , handleDownloadClick ) ;
507+ } ) ;
508+ } ;
509+ } , [ downloadSelector , isReady , requestDownload ] ) ;
510+
455511 // Expose methods via ref
456512 useImperativeHandle (
457513 ref ,
@@ -461,9 +517,10 @@ const SuperDocESign = forwardRef<SuperDocESignHandle, SuperDocESignProps>(
461517 updateFields,
462518 getStatus,
463519 getFields,
520+ requestDownload,
464521 superdoc : superdocRef . current ,
465522 } ) ,
466- [ accept , reset , updateFields , getStatus , getFields ] ,
523+ [ accept , reset , updateFields , getStatus , getFields , requestDownload ] ,
467524 ) ;
468525
469526 return < div ref = { containerRef } className = { className } style = { style } /> ;
0 commit comments