4
4
// links component state tree to library
5
5
// changes the setState method to also update our snapshot
6
6
const Tree = require ( './tree' ) ;
7
+ const astParser = require ( './astParser.js' ) ;
7
8
8
9
module . exports = ( snap , mode ) => {
9
10
let fiberRoot = null ;
11
+ let astHooks ;
10
12
11
13
function sendSnapshot ( ) {
12
14
// don't send messages while jumping or while paused
@@ -23,14 +25,12 @@ module.exports = (snap, mode) => {
23
25
function changeSetState ( component ) {
24
26
// check that setState hasn't been changed yet
25
27
if ( component . setState . linkFiberChanged ) return ;
26
-
27
28
// make a copy of setState
28
29
const oldSetState = component . setState . bind ( component ) ;
29
-
30
30
// replace component's setState so developer doesn't change syntax
31
31
// component.setState = newSetState.bind(component);
32
- component . setState = ( state , callback = ( ) => { } ) => {
33
- // dont do anything if state is locked
32
+ component . setState = ( state , callback = ( ) => { } ) => {
33
+ // don't do anything if state is locked
34
34
// UNLESS we are currently jumping through time
35
35
if ( mode . locked && ! mode . jumping ) return ;
36
36
// continue normal setState functionality, except add sending message middleware
@@ -43,43 +43,45 @@ module.exports = (snap, mode) => {
43
43
component . setState . linkFiberChanged = true ;
44
44
}
45
45
46
- function changeUseState ( component ) {
46
+ function changeUseState ( component ) {
47
47
if ( component . queue . dispatch . linkFiberChanged ) return ;
48
- // storing the original dispatch function definition somewhere
49
- const oldDispatch = component . queue . dispatch . bind ( component . queue ) ;
50
- // redefining the dispatch function so we can inject our code
51
- component . queue . dispatch = function ( fiber , queue , action ) {
52
- console . log ( 'mode' , mode ) ;
53
- if ( mode . locked && ! mode . jumping ) return ;
48
+ // store the original dispatch function definition
49
+ const oldDispatch = component . queue . dispatch . bind ( component . queue ) ; ;
50
+ // redefine the dispatch function so we can inject our code
51
+ component . queue . dispatch = ( fiber , queue , action ) => {
52
+ // don't do anything if state is locked
53
+ if ( mode . locked && ! mode . jumping ) return ;
54
54
oldDispatch ( fiber , queue , action ) ;
55
55
setTimeout ( ( ) => {
56
- console . log ( 'Updating the snapshot tree after an action has been dispatched' ) ;
57
56
updateSnapShotTree ( ) ;
58
57
sendSnapshot ( ) ;
59
58
} , 100 ) ;
60
59
} ;
61
60
component . queue . dispatch . linkFiberChanged = true ;
62
- } ;
63
-
61
+ }
62
+
64
63
// Helper function to traverse through the memoized state
64
+ // TODO: WE NEED TO CLEAN IT UP A BIT
65
65
function traverseHooks ( memoizedState ) {
66
66
// Declare variables and assigned to 0th index and an empty object, respectively
67
- let index = 0 ;
68
- const memoizedObj = { } ;
67
+ const memoized = { } ;
68
+ let index = 0 ;
69
+ astHooks = Object . values ( astHooks ) ;
69
70
// while memoizedState is truthy, save the value to the object
70
- while ( memoizedState ) {
71
+ while ( memoizedState && astHooks ) {
71
72
changeUseState ( memoizedState ) ;
72
- // Increment the index by 1
73
- memoizedObj [ `state${ index += 1 } ` ] = memoizedState . memoizedState ;
73
+ memoized [ astHooks [ index ] ] = memoizedState . memoizedState ;
74
74
// Reassign memoizedState to its next value
75
75
memoizedState = memoizedState . next ;
76
+ // Increment the index by 2
77
+ index += 2 ;
76
78
}
77
- return memoizedObj ;
79
+ return memoized ;
78
80
}
79
81
80
82
function createTree ( currentFiber , tree = new Tree ( 'root' ) ) {
81
83
if ( ! currentFiber ) return tree ;
82
-
84
+
83
85
const {
84
86
sibling,
85
87
stateNode,
@@ -96,10 +98,9 @@ module.exports = (snap, mode) => {
96
98
changeSetState ( stateNode ) ;
97
99
}
98
100
// Check if the component uses hooks
99
- // TODO: Refactor the conditionals - think about the edge case where a stateful
100
- // component might have a key called 'baseState' in the state
101
101
if ( memoizedState && memoizedState . hasOwnProperty ( 'baseState' ) ) {
102
- console . log ( "I'm not supposed to run" , currentFiber ) ;
102
+ // Add a traversed property and initialize to the evaluated result
103
+ // of invoking traverseHooks, and reassign nextTree
103
104
memoizedState . traversed = traverseHooks ( memoizedState ) ;
104
105
nextTree = tree . appendChild ( memoizedState ) ;
105
106
}
@@ -113,23 +114,23 @@ module.exports = (snap, mode) => {
113
114
114
115
function updateSnapShotTree ( ) {
115
116
const { current } = fiberRoot ;
116
- console . log ( 'current' , current ) ;
117
117
snap . tree = createTree ( current ) ;
118
118
}
119
119
120
- return {
121
- _ ( container ) {
122
- const {
123
- _reactRootContainer : { _internalRoot } ,
124
- _reactRootContainer,
125
- } = container ;
126
- // only assign internal root if it actually exists
127
- fiberRoot = _internalRoot || _reactRootContainer ;
128
- updateSnapShotTree ( ) ;
129
- // send the initial snapshot once the content script has started up
130
- window . addEventListener ( 'message' , ( { data : { action } } ) => {
131
- if ( action === 'contentScriptStarted' ) sendSnapshot ( ) ;
132
- } ) ;
133
- } ,
134
- } ;
120
+ return ( container , entryFile ) => {
121
+ const {
122
+ _reactRootContainer : { _internalRoot } ,
123
+ _reactRootContainer,
124
+ } = container ;
125
+ // only assign internal rootp if it actually exists
126
+ fiberRoot = _internalRoot || _reactRootContainer ;
127
+ // If hooks are implemented, traverse through the source code
128
+ if ( entryFile ) astHooks = astParser ( entryFile ) ;
129
+
130
+ updateSnapShotTree ( ) ;
131
+ // send the initial snapshot once the content script has started up
132
+ window . addEventListener ( 'message' , ( { data : { action } } ) => {
133
+ if ( action === 'contentScriptStarted' ) sendSnapshot ( ) ;
134
+ } ) ;
135
+ }
135
136
} ;
0 commit comments