@@ -12,58 +12,99 @@ export const useMigrator = () => {
1212 oldDomainUrl : string ,
1313 onSuccess : ( ) => void ,
1414 onError : ( ) => void ,
15- maxRetries = 15 ,
15+ maxRetries = 5 ,
1616 retryIntervalMs = 1000 ,
1717 ) : void {
1818 const expectedOrigin = new URL ( oldDomainUrl ) . origin ;
1919
20- const iframe = document . createElement ( "iframe" ) ;
21- iframe . src = oldDomainUrl ;
22- iframe . style . display = "none" ;
23- document . body . appendChild ( iframe ) ;
24-
25- const messageHandler = ( event : MessageEvent < MigrationMessage > ) => {
26- if ( event . origin !== expectedOrigin ) return ;
27- if ( event . data ?. type !== "migrationDataResponse" ) return ;
20+ const openMigrationWindow = ( ) => {
21+ let success = false ;
22+ window . addEventListener ( "message" , ( event : MessageEvent < MigrationMessage > ) => {
23+ console . log ( event )
24+ if ( event . origin !== expectedOrigin ) return ;
25+ if ( event . data ?. type !== "migrationDataResponse" ) return ;
26+ window . removeEventListener ( "message" , openMigrationWindow ) ;
27+ persistanceService . setState ( event . data . migrationData ) ;
28+ success = true ;
29+ onSuccess ( ) ;
30+ w ?. close ( ) ;
31+ } ) ;
32+ const w = window . open ( oldDomainUrl , "_blank" ) ;
33+ console . log ( w , oldDomainUrl )
34+ setTimeout ( ( ) => {
35+ if ( ! success ) {
36+ window . removeEventListener ( "message" , openMigrationWindow ) ;
37+ fallbackToIframe ( ) ;
38+ w ?. close ( ) ;
39+ }
40+ } , 10000 ) ;
41+ }
2842
29- window . removeEventListener ( "message" , messageHandler ) ;
30- if ( document . body . contains ( iframe ) ) {
31- document . body . removeChild ( iframe ) ;
32- }
43+ openMigrationWindow ( ) ;
3344
34- persistanceService . setState ( event . data . migrationData ) ;
35- onSuccess ( ) ;
36- } ;
45+ const fallbackToIframe = ( ) => {
46+ const iframe = document . createElement ( "iframe" ) ;
47+ iframe . src = oldDomainUrl ;
48+ iframe . style . display = "none" ;
49+ document . body . appendChild ( iframe ) ;
3750
38- window . addEventListener ( "message" , messageHandler ) ;
51+ const messageHandler = ( event : MessageEvent < MigrationMessage > ) => {
52+ if ( event . origin !== expectedOrigin ) return ;
53+ if ( event . data ?. type !== "migrationDataResponse" ) return ;
3954
40- let attempts = 0 ;
41- const sendRequest = ( ) => {
42- if ( attempts >= maxRetries ) {
43- onError ( ) ;
4455 window . removeEventListener ( "message" , messageHandler ) ;
4556 if ( document . body . contains ( iframe ) ) {
4657 document . body . removeChild ( iframe ) ;
4758 }
48- return ;
49- }
5059
51- if ( iframe . contentWindow ) {
52- iframe . contentWindow . postMessage ( { type : "requestMigrationData" } , expectedOrigin ) ;
53- attempts ++ ;
54- setTimeout ( sendRequest , retryIntervalMs ) ;
55- } else {
56- setTimeout ( sendRequest , retryIntervalMs ) ;
57- }
58- } ;
60+ persistanceService . setState ( event . data . migrationData ) ;
61+ onSuccess ( ) ;
62+ } ;
63+
64+ window . addEventListener ( "message" , messageHandler ) ;
5965
60- iframe . onload = ( ) => {
61- sendRequest ( ) ;
62- } ;
66+ let attempts = 0 ;
67+ const sendRequest = ( ) => {
68+ if ( attempts >= maxRetries ) {
69+ window . removeEventListener ( "message" , messageHandler ) ;
70+ if ( document . body . contains ( iframe ) ) {
71+ document . body . removeChild ( iframe ) ;
72+ }
73+ onError ( ) ;
74+ return ;
75+ }
76+
77+ if ( iframe . contentWindow ) {
78+ iframe . contentWindow . postMessage ( { type : "requestMigrationData" } , expectedOrigin ) ;
79+ attempts ++ ;
80+ setTimeout ( sendRequest , retryIntervalMs ) ;
81+ } else {
82+ setTimeout ( sendRequest , retryIntervalMs ) ;
83+ }
84+ } ;
85+
86+ iframe . onload = ( ) => {
87+ sendRequest ( ) ;
88+ } ;
89+ }
6390 }
6491
6592 function setupMigrationDataListener ( allowedOrigin : string ) : void {
6693 console . log ( "Setting up migration data listener" , allowedOrigin ) ;
94+ setInterval ( ( ) => {
95+ const state = persistanceService . getState ( ) ;
96+ if ( state . history . entries . length > 0 ) {
97+ console . log ( "sending state to opener" ) ;
98+ const response : MigrationMessage = {
99+ type : "migrationDataResponse" ,
100+ migrationData : state
101+ } ;
102+
103+ window . opener ?. postMessage ( response , {
104+ targetOrigin : allowedOrigin
105+ } ) ;
106+ }
107+ } , 1000 ) ;
67108 window . addEventListener ( "message" , ( event : MessageEvent < MigrationMessage > ) => {
68109 console . log ( "received message" , event . data ) ;
69110 if ( event . origin !== allowedOrigin ) return ;
0 commit comments