1+ // --- FLUSSO INIZIALIZZAZIONE WALLET ---
2+ // (Incluso dentro window.onload nell'originale)
3+ if ( initBtn && ! initBtn . hasInitHandler ) {
4+ initBtn . addEventListener ( "click" , async ( e ) => {
5+ e . preventDefault ( ) ;
6+ const selectedIdpRadio = document . querySelector ( 'input[name="idpRadio"]:checked' ) ;
7+ if ( ! selectedIdpRadio ) {
8+ result . innerHTML = `<div class="alert alert-warning...>Scegli come verificare la tua identità.</div>` ;
9+ return ;
10+ }
11+ const selectedState = selectElement . value ;
12+ if ( ! selectedState ) {
13+ result . innerHTML = `<div class="alert alert-warning...">Seleziona uno stato membro...</div>` ;
14+ return ;
15+ }
16+
17+ result . innerHTML = `` ;
18+ spinner . style . display = "flex" ;
19+ const url = `/itwallet/init?idp=${ selectedIdpRadio . value } &country=${ encodeURIComponent ( selectedState ) } ` ;
20+
21+ try {
22+ const response = await executeFetch ( url ) ;
23+ if ( ! response . ok ) throw new Error ( await getErrorMessage ( response ) ) ;
24+ const data = await response . json ( ) ;
25+
26+ if ( data . success ) {
27+ result . innerHTML = "" ;
28+ const redirectUrl = data ?. data ?. redirect_url ;
29+ const popupWidth = 500 ;
30+ const popupHeight = 660 ;
31+ const left = window . screenX + ( window . outerWidth - popupWidth ) / 2 ;
32+ const top = window . screenY + ( window . outerHeight - popupHeight ) / 2 ;
33+
34+ popupHtml = window . open ( redirectUrl , "walletPopup" , `width=${ popupWidth } ,height=${ popupHeight } ,left=${ left } ,top=${ top } ,resizable=yes,scrollbars=yes` ) ;
35+ if ( ! popupHtml ) { alert ( "Popup bloccato!" ) ; return ; }
36+ popupHtml . focus ( ) ;
37+
38+ const popupInterval = setInterval ( ( ) => {
39+ try {
40+ if ( popupHtml . closed ) { clearInterval ( popupInterval ) ; window . focus ( ) ; spinner . style . display = "none" ; }
41+ } catch { /* cross-origin */ }
42+ } , 500 ) ;
43+ } else {
44+ result . innerHTML = `<div class="alert alert-danger...">...</div>` ;
45+ }
46+ } catch ( err ) {
47+ result . innerHTML = `<div class="alert alert-danger...">Errore: ${ err . message } </div>` ;
48+ } finally {
49+ if ( ! popupHtml ) spinner . style . display = "none" ;
50+ }
51+ } ) ;
52+ initBtn . hasInitHandler = true ;
53+ }
54+
55+ // --- COMPLETAMENTO DA POPUP EXTERNO (OIDC/OAuth PostMessage) ---
56+ window . addEventListener ( "message" , async ( event ) => {
57+ if ( event . data ?. event === "wallet_flow_complete" ) {
58+ spinner . style . display = "flex" ;
59+ spinner . classList . add ( "force-visible" ) ;
60+ result . innerHTML = `<div class="flash-container flash-success"><p>Autenticazione completata, recupero PID...</p></div>` ;
61+
62+ try {
63+ const response = await executeFetch ( "/itwallet/init/complete" , "GET" ) ;
64+ if ( ! response . ok ) throw new Error ( await getErrorMessage ( response ) ) ;
65+ const data = await response . json ( ) ;
66+
67+ if ( data . success ) {
68+ result . innerHTML = `<div class="flash-container flash-success"><p>Wallet inizializzato con successo!</p></div>` ;
69+ addButton ( data ?. data ?. credential_id ) ; // Nota: deve essere definita altrove
70+
71+ // Toggle visibilità elementi UI post-inizializzazione
72+ initBtn . style . display = "none" ;
73+ addBtn . style . display = "inline-flex" ;
74+ rpBtn . style . display = "inline-flex" ;
75+ statesDiv . style . display = "none" ;
76+ idpDiv . style . display = "none" ;
77+ credentialsBtnDiv . style . display = "flex" ;
78+ trashIcon . style . display = "block" ;
79+ memoryIcon . style . display = "block" ;
80+ } else {
81+ result . innerHTML = `<div class="flash-container flash-error"><p>${ data ?. data ?. error } </p></div>` ;
82+ }
83+ } catch ( error ) {
84+ result . innerHTML = `<div class="flash-container flash-error"><p>${ error . message } </p></div>` ;
85+ } finally {
86+ spinner . classList . remove ( "force-visible" ) ;
87+ spinner . style . display = "none" ;
88+ }
89+ }
90+ } ) ;
91+
92+ // --- RESET DEL WALLET (TRASH CONFIRM) ---
93+ if ( trashPopupConfirm && ! trashPopupConfirm . hasTrashPopupConfirmHandler ) {
94+ trashPopupConfirm . addEventListener ( "click" , async ( ) => {
95+ trashPopup . classList . remove ( "popup-visible" ) ;
96+ spinner . style . display = "flex" ;
97+ await new Promise ( resolve => setTimeout ( resolve , 300 ) ) ;
98+
99+ try {
100+ const response = await executeFetch ( "/itwallet/reset" ) ;
101+ if ( ! response . ok ) throw new Error ( await getErrorMessage ( response ) ) ;
102+
103+ result . innerHTML = `<div class="alert alert-success...">Il Wallet è stato resettato correttamente</div>` ;
104+
105+ // Reset grafico dell'interfaccia allo stato iniziale
106+ if ( addBtn ) addBtn . style . display = "none" ;
107+ if ( rpBtn ) rpBtn . style . display = "none" ;
108+ if ( credentialsBtnDiv ) { credentialsBtnDiv . style . display = "none" ; credentialsBtnDiv . innerHTML = "" ; }
109+ if ( statesDiv ) { statesDiv . style . display = "block" ; selectElement . value = "" ; }
110+ if ( initBtn ) { initBtn . style . display = "inline-flex" ; initBtn . disabled = true ; }
111+ if ( idpDiv ) idpDiv . style . display = "block" ;
112+ } catch ( err ) {
113+ result . innerHTML = `<div class="alert alert-danger..."><strong>Error:</strong> ${ err . message } </div>` ;
114+ } finally {
115+ spinner . style . display = "none" ;
116+ }
117+ } ) ;
118+ trashPopupConfirm . hasTrashPopupConfirmHandler = true ;
119+ }
0 commit comments