Skip to content

Commit 2603f35

Browse files
committed
working on the interception functionality in order to expand time jump to work with useReducer
1 parent 5641074 commit 2603f35

File tree

1 file changed

+47
-47
lines changed

1 file changed

+47
-47
lines changed

src/extension/overrideReducer.js

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -171,36 +171,13 @@
171171
// });
172172
// })();
173173

174-
175174
(function () {
176175
console.log('[Reactime Debug] Initial override script loaded');
177176

178-
// Retry constants
179-
const MAX_ATTEMPTS = 50;
180-
let attempts = 0;
181-
182-
// Verify React hooks via registered renderers
183-
function verifyReactHooks() {
184-
try {
185-
const renderers = Array.from(
186-
window.__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.values()
187-
);
188-
return renderers.some((renderer) => renderer?.currentDispatcher?.useReducer);
189-
} catch (err) {
190-
console.error('[Reactime Debug] Error verifying React hooks:', err);
191-
return false;
192-
}
193-
}
194-
195-
// Set up the useReducer override
196-
function setupOverride() {
177+
function setupOverride(renderer) {
197178
console.log('[Reactime Debug] Setting up useReducer override');
198179

199180
try {
200-
const renderers = Array.from(
201-
window.__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.values()
202-
);
203-
const renderer = renderers[0]; // Assume first renderer for simplicity
204181
const originalUseReducer = renderer?.currentDispatcher?.useReducer;
205182

206183
if (!originalUseReducer) {
@@ -224,34 +201,57 @@
224201
}
225202
}
226203

227-
// Attempt to detect React and set up override
228-
function checkReact() {
229-
attempts++;
230-
console.log(`[Reactime Debug] Checking for React (attempt ${attempts}/${MAX_ATTEMPTS})`);
204+
function findValidRenderer() {
205+
const renderers = Array.from(window.__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.values());
231206

232-
if (verifyReactHooks()) {
233-
console.log('[Reactime Debug] React hooks found. Setting up overrides.');
234-
setupOverride();
235-
} else if (attempts < MAX_ATTEMPTS) {
236-
setTimeout(checkReact, Math.min(100 * attempts, 2000));
237-
} else {
238-
console.log('[Reactime Debug] Max attempts reached. React hooks not found.');
207+
console.log('[Reactime Debug] Found renderers:', renderers);
208+
209+
const validRenderer = renderers.find((renderer) => renderer?.currentDispatcher?.useReducer);
210+
211+
if (validRenderer) {
212+
console.log('[Reactime Debug] Valid renderer with useReducer found.');
213+
return validRenderer;
239214
}
215+
216+
console.warn('[Reactime Debug] No valid renderer with useReducer found.');
217+
return null;
240218
}
241219

242-
// Hook into the inject method of React DevTools
243-
if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {
244-
const originalInject = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.inject;
220+
function waitForHooks(renderer, maxAttempts = 50, interval = 100) {
221+
let attempts = 0;
245222

246-
window.__REACT_DEVTOOLS_GLOBAL_HOOK__.inject = function (renderer) {
247-
console.log('[Reactime Debug] React renderer registered.');
248-
setupOverride(); // React is registered, so immediately set up overrides
249-
return originalInject.apply(this, arguments);
250-
};
223+
const intervalId = setInterval(() => {
224+
attempts++;
251225

252-
console.log('[Reactime Debug] React DevTools hook overridden.');
253-
} else {
254-
console.log('[Reactime Debug] React DevTools hook not found. Starting manual checks.');
255-
checkReact(); // Start retries if no DevTools hook
226+
if (renderer?.currentDispatcher?.useReducer) {
227+
console.log('[Reactime Debug] useReducer found during render cycle.');
228+
setupOverride(renderer); // Set up hook overrides
229+
clearInterval(intervalId); // Stop polling
230+
} else if (attempts >= maxAttempts) {
231+
console.warn('[Reactime Debug] Max attempts reached. useReducer not found.');
232+
clearInterval(intervalId);
233+
}
234+
}, interval);
256235
}
236+
237+
function initialize() {
238+
if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {
239+
const renderer = findValidRenderer();
240+
241+
if (renderer) {
242+
if (renderer.currentDispatcher?.useReducer) {
243+
// If hooks are immediately available, override them
244+
setupOverride(renderer);
245+
} else {
246+
// If not, wait for hooks to become available
247+
waitForHooks(renderer);
248+
}
249+
}
250+
} else {
251+
console.error('[Reactime Debug] React DevTools hook not found.');
252+
}
253+
}
254+
255+
// Start initialization
256+
initialize();
257257
})();

0 commit comments

Comments
 (0)