|
171 | 171 | // });
|
172 | 172 | // })();
|
173 | 173 |
|
174 |
| - |
175 | 174 | (function () {
|
176 | 175 | console.log('[Reactime Debug] Initial override script loaded');
|
177 | 176 |
|
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) { |
197 | 178 | console.log('[Reactime Debug] Setting up useReducer override');
|
198 | 179 |
|
199 | 180 | 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 |
204 | 181 | const originalUseReducer = renderer?.currentDispatcher?.useReducer;
|
205 | 182 |
|
206 | 183 | if (!originalUseReducer) {
|
|
224 | 201 | }
|
225 | 202 | }
|
226 | 203 |
|
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()); |
231 | 206 |
|
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; |
239 | 214 | }
|
| 215 | + |
| 216 | + console.warn('[Reactime Debug] No valid renderer with useReducer found.'); |
| 217 | + return null; |
240 | 218 | }
|
241 | 219 |
|
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; |
245 | 222 |
|
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++; |
251 | 225 |
|
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); |
256 | 235 | }
|
| 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(); |
257 | 257 | })();
|
0 commit comments