1- import React , { useEffect , useCallback } from 'react' ;
1+ import React , { useEffect } from 'react' ;
22import { useDispatch } from 'react-redux' ;
3- import { Decode , Encode , Hook , Unhook } from 'console-feed' ;
3+ import { Decode } from 'console-feed' ;
44import { isEqual } from 'lodash' ;
55import { dispatchConsoleEvent } from '../actions/console' ;
66import { stopSketch , expandConsole } from '../actions/console' ;
7- import handleConsoleExpressions from '../../../utils/evaluateConsole ' ;
7+ import { listen } from '../../../utils/dispatcher ' ;
88
9- function useMessageEvent ( callback ) {
10- useEffect ( ( ) => {
11- window . addEventListener ( 'message' , callback ) ;
12- return ( ) => window . removeEventListener ( 'message' , callback ) ;
13- } , [ callback ] ) ;
14- }
15-
16- function MessageHandler ( ) {
9+ function useHandleMessageEvent ( ) {
1710 const dispatch = useDispatch ( ) ;
1811
19- const handleMessageEvent = useCallback ( ( messageEvent ) => {
20- if ( messageEvent . origin !== window . origin ) return ;
21- if ( Array . isArray ( messageEvent . data ) ) {
22- const decodedMessages = messageEvent . data . map ( message => Object . assign (
23- Decode ( message . log ) ,
24- { source : message . source }
25- ) ) ;
12+ const handleMessageEvent = ( data ) => {
13+ const { source, messages } = data ;
14+ if ( source === 'sketch' && Array . isArray ( messages ) ) {
15+ const decodedMessages = messages . map ( message => Decode ( message . log ) ) ;
2616 decodedMessages . every ( ( message , index , arr ) => {
27- const { data : args , source } = message ;
28- if ( source === 'console' ) {
29- let consoleInfo = '' ;
30- const consoleBuffer = [ ] ;
31- const LOGWAIT = 100 ;
32- Hook ( window . console , ( log ) => {
33- consoleBuffer . push ( {
34- log,
35- source : 'sketch'
36- } ) ;
37- } ) ;
38- setInterval ( ( ) => {
39- if ( consoleBuffer . length > 0 ) {
40- window . postMessage ( consoleBuffer , '*' ) ;
41- consoleBuffer . length = 0 ;
42- }
43- } , LOGWAIT ) ;
44- consoleInfo = handleConsoleExpressions ( args ) ;
45- Unhook ( window . console ) ;
46- if ( ! consoleInfo ) {
47- return false ;
48- }
49- window . postMessage ( [ {
50- log : Encode ( { method : 'result' , data : Encode ( consoleInfo ) } ) ,
51- source : 'sketch'
52- } ] , '*' ) ;
53- }
17+ const { data : args } = message ;
5418 let hasInfiniteLoop = false ;
5519 Object . keys ( args ) . forEach ( ( key ) => {
5620 if ( typeof args [ key ] === 'string' && args [ key ] . includes ( 'Exiting potential infinite loop' ) ) {
@@ -66,6 +30,7 @@ function MessageHandler() {
6630 Object . assign ( message , { times : 1 } ) ;
6731 return false ;
6832 }
33+ // this should be done in the reducer probs
6934 const cur = Object . assign ( message , { times : 1 } ) ;
7035 const nextIndex = index + 1 ;
7136 while ( isEqual ( cur . data , arr [ nextIndex ] . data ) && cur . method === arr [ nextIndex ] . method ) {
@@ -77,12 +42,20 @@ function MessageHandler() {
7742 }
7843 return true ;
7944 } ) ;
80-
8145 dispatch ( dispatchConsoleEvent ( decodedMessages ) ) ;
8246 }
83- } ) ;
47+ } ;
48+ return handleMessageEvent ;
49+ }
8450
85- useMessageEvent ( handleMessageEvent ) ;
51+ function MessageHandler ( ) {
52+ const handleMessageEvent = useHandleMessageEvent ( ) ;
53+ useEffect ( ( ) => {
54+ const unsubscribe = listen ( handleMessageEvent ) ;
55+ return function cleanup ( ) {
56+ unsubscribe ( ) ;
57+ } ;
58+ } ) ;
8659 return null ;
8760}
8861
0 commit comments