1+ function _defineProperty ( obj , key , value ) { if ( key in obj ) { Object . defineProperty ( obj , key , { value : value , enumerable : true , configurable : true , writable : true } ) ; } else { obj [ key ] = value ; } return obj ; }
2+
3+ import React from 'react' ;
4+ import './retool.css' ;
5+
6+ class Retool extends React . Component {
7+ constructor ( props ) {
8+ super ( props ) ;
9+
10+ _defineProperty ( this , "startListening" , ( ) => {
11+ window . addEventListener ( 'message' , e => this . handle ( e ) ) ;
12+ } ) ;
13+
14+ _defineProperty ( this , "startWatchers" , ( ) => {
15+ var watcherKeys = Object . keys ( this . state . elementWatchers ) ;
16+
17+ for ( var i = 0 ; i < watcherKeys . length ; i ++ ) {
18+ var key = watcherKeys [ i ] ;
19+ var watcher = this . state . elementWatchers [ key ] ;
20+ var selector = watcher . selector ;
21+ var node = document . querySelector ( selector ) ;
22+ var value = node ?. textContent ;
23+
24+ if ( value !== watcher . prevValue ) {
25+ watcher . prevValue = value ;
26+ watcher . iframe . contentWindow . postMessage ( {
27+ type : 'PARENT_WINDOW_RESULT' ,
28+ result : value ,
29+ id : watcher . queryId ,
30+ pageName : watcher . pageName
31+ } , '*' ) ;
32+ }
33+ }
34+
35+ setTimeout ( this . startWatchers , 100 ) ;
36+ } ) ;
37+
38+ _defineProperty ( this , "createOrReplaceWatcher" , ( selector , pageName , queryId ) => {
39+ var watcherId = pageName + '-' + queryId ;
40+ var watchers = { ...this . state . elementWatchers
41+ } ;
42+ watchers [ watcherId ] = {
43+ iframe : this . iframe ,
44+ selector : selector ,
45+ pageName : pageName ,
46+ queryId : queryId ,
47+ prevValue : null
48+ } ;
49+ this . setState ( {
50+ elementWatchers : watchers
51+ } ) ;
52+ } ) ;
53+
54+ _defineProperty ( this , "handle" , event => {
55+ if ( ! this . iframe . contentWindow ) return ;
56+ var node ;
57+
58+ if ( event . data . type === 'PARENT_WINDOW_QUERY' ) {
59+ node = document . querySelector ( event . data . selector ) ;
60+ this . createOrReplaceWatcher ( event . data . selector , event . data . pageName , event . data . id ) ;
61+ this . iframe . contentWindow . postMessage ( {
62+ type : 'PARENT_WINDOW_RESULT' ,
63+ result : node ?. textContent ,
64+ id : event . data . id ,
65+ pageName : event . data . pageName
66+ } , '*' ) ;
67+ }
68+
69+ if ( event . data . type === 'PARENT_WINDOW_PREVIEW_QUERY' ) {
70+ node = document . querySelector ( event . data . selector ) ;
71+ this . iframe . contentWindow . postMessage ( {
72+ type : 'PARENT_WINDOW_PREVIEW_RESULT' ,
73+ result : node ?. textContent ,
74+ id : event . data . id
75+ } , '*' ) ;
76+ }
77+ } ) ;
78+
79+ this . state = {
80+ url : props . url ,
81+ elementWatchers : { }
82+ } ;
83+ }
84+
85+ componentDidMount ( ) {
86+ this . startListening ( ) ;
87+ this . startWatchers ( ) ;
88+ }
89+
90+ render ( ) {
91+ return /*#__PURE__*/ React . createElement ( "iframe" , {
92+ frameBorder : "none" ,
93+ src : this . state . url ,
94+ ref : e => {
95+ this . iframe = e ;
96+ }
97+ } ) ;
98+ }
99+
100+ }
101+
102+ export default Retool ;
0 commit comments