1- import React from ' react' ;
2- import ' ./retool.css' ;
1+ import React from " react" ;
2+ import " ./retool.css" ;
33
44class Retool extends React . Component {
5- constructor ( props ) {
6- super ( props ) ;
7-
8- if ( ! this . props . url ) throw new Error ( 'Please pass a url into the Retool component.' )
9-
10- this . state = {
11- url : props . url ,
12- elementWatchers : { }
13- }
14- }
5+ constructor ( props ) {
6+ super ( props ) ;
157
16- componentDidMount ( ) {
17- this . startListening ( )
18- this . startWatchers ( )
19- }
8+ if ( ! this . props . url )
9+ throw new Error ( "Please pass a url into the Retool component." ) ;
10+
11+ this . state = {
12+ url : props . url ,
13+ elementWatchers : { } ,
14+ } ;
15+ }
2016
21- startListening = ( ) => {
22- if ( this . iframe ) {
23- window . addEventListener ( 'message' , ( e ) => this . handle ( e ) ) ;
24- }
17+ componentDidMount ( ) {
18+ this . startListening ( ) ;
19+ this . startWatchers ( ) ;
20+ }
21+
22+ startListening = ( ) => {
23+ if ( this . iframe ) {
24+ window . addEventListener ( "message" , ( e ) => this . handle ( e ) ) ;
2525 }
26+ } ;
27+
28+ startWatchers = ( ) => {
29+ var watcherKeys = Object . keys ( this . state . elementWatchers ) ;
2630
27- startWatchers = ( ) => {
28- var watcherKeys = Object . keys ( this . state . elementWatchers )
29-
30- for ( var i = 0 ; i < watcherKeys . length ; i ++ ) {
31- var key = watcherKeys [ i ]
32- var watcher = this . state . elementWatchers [ key ]
33- var selector = watcher . selector
34- var node = document . querySelector ( selector )
35- var value = node ?. textContent
36- if ( value !== watcher . prevValue ) {
37- watcher . prevValue = value
38- watcher . iframe . contentWindow . postMessage (
39- {
40- type : 'PARENT_WINDOW_RESULT' ,
41- result : value ,
42- id : watcher . queryId ,
43- pageName : watcher . pageName ,
44- } ,
45- '*' ,
46- )
47- }
48- }
49-
50- setTimeout ( this . startWatchers , 100 )
31+ for ( var i = 0 ; i < watcherKeys . length ; i ++ ) {
32+ var key = watcherKeys [ i ] ;
33+ var watcher = this . state . elementWatchers [ key ] ;
34+ var selector = watcher . selector ;
35+ var node = document . querySelector ( selector ) ;
36+ var value = node ?. textContent ;
37+ if ( value !== watcher . prevValue ) {
38+ watcher . prevValue = value ;
39+ watcher . iframe . contentWindow . postMessage (
40+ {
41+ type : "PARENT_WINDOW_RESULT" ,
42+ result : value ,
43+ id : watcher . queryId ,
44+ pageName : watcher . pageName ,
45+ } ,
46+ "*"
47+ ) ;
48+ }
5149 }
5250
53- createOrReplaceWatcher = ( selector , pageName , queryId ) => {
54- var watcherId = pageName + '-' + queryId
55- var watchers = { ...this . state . elementWatchers }
51+ setTimeout ( this . startWatchers , 100 ) ;
52+ } ;
5653
57- watchers [ watcherId ] = {
58- iframe : this . iframe ,
59- selector : selector ,
60- pageName : pageName ,
61- queryId : queryId ,
62- prevValue : null ,
63- }
54+ createOrReplaceWatcher = ( selector , pageName , queryId ) => {
55+ var watcherId = pageName + "-" + queryId ;
56+ var watchers = { ...this . state . elementWatchers } ;
6457
65- this . setState ( { elementWatchers : watchers } )
66- }
58+ watchers [ watcherId ] = {
59+ iframe : this . iframe ,
60+ selector : selector ,
61+ pageName : pageName ,
62+ queryId : queryId ,
63+ prevValue : null ,
64+ } ;
6765
68- handle = ( event ) => {
69- if ( ! this . iframe . contentWindow ) return
70-
71- var node ;
72-
73- if ( event . data . type === 'PARENT_WINDOW_QUERY' ) {
74- node = document . querySelector ( event . data . selector )
75- this . createOrReplaceWatcher ( event . data . selector , event . data . pageName , event . data . id )
76-
77- this . iframe . contentWindow . postMessage (
78- {
79- type : 'PARENT_WINDOW_RESULT' ,
80- result : node ?. textContent ,
81- id : event . data . id ,
82- pageName : event . data . pageName ,
83- } ,
84- '*' ,
85- )
86- }
87-
88- if ( event . data . type === 'PARENT_WINDOW_PREVIEW_QUERY' ) {
89- node = document . querySelector ( event . data . selector )
90- this . iframe . contentWindow . postMessage (
91- {
92- type : 'PARENT_WINDOW_PREVIEW_RESULT' ,
93- result : node ?. textContent ,
94- id : event . data . id ,
95- } ,
96- '*' ,
97- )
98- }
99-
66+ this . setState ( { elementWatchers : watchers } ) ;
67+ } ;
68+
69+ handle = ( event ) => {
70+ if ( ! this . iframe . contentWindow ) return ;
71+
72+ var node ;
73+
74+ if ( event . data . type === "PARENT_WINDOW_QUERY" ) {
75+ node = document . querySelector ( event . data . selector ) ;
76+ this . createOrReplaceWatcher (
77+ event . data . selector ,
78+ event . data . pageName ,
79+ event . data . id
80+ ) ;
81+
82+ this . iframe . contentWindow . postMessage (
83+ {
84+ type : "PARENT_WINDOW_RESULT" ,
85+ result : node ?. textContent ,
86+ id : event . data . id ,
87+ pageName : event . data . pageName ,
88+ } ,
89+ "*"
90+ ) ;
10091 }
10192
102- render ( ) {
103- return (
104- < iframe
105- frameBorder = "none"
106- src = { this . state . url }
107- ref = { e => {
108- this . iframe = e
109- } }
110- >
111- </ iframe >
112- ) ;
93+ if ( event . data . type === "PARENT_WINDOW_PREVIEW_QUERY" ) {
94+ node = document . querySelector ( event . data . selector ) ;
95+ this . iframe . contentWindow . postMessage (
96+ {
97+ type : "PARENT_WINDOW_PREVIEW_RESULT" ,
98+ result : node ?. textContent ,
99+ id : event . data . id ,
100+ } ,
101+ "*"
102+ ) ;
113103 }
104+ } ;
105+
106+ render ( ) {
107+ return (
108+ < iframe
109+ frameBorder = "none"
110+ src = { this . state . url }
111+ ref = { ( e ) => {
112+ this . iframe = e ;
113+ } }
114+ title = "retool"
115+ > </ iframe >
116+ ) ;
117+ }
114118}
115-
116- export default Retool ;
117-
119+
120+ export default Retool ;
0 commit comments