dynim-react 1.0.17 → 1.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"BuilderProvider.d.ts","sourceRoot":"","sources":["../../src/builder/BuilderProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BuilderProvider.d.ts","sourceRoot":"","sources":["../../src/builder/BuilderProvider.tsx"],"names":[],"mappings":"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"}
@@ -21,10 +21,17 @@ export function BuilderProvider({ children, config = {}, onBuilderReady, }) {
21
21
  const builderRef = useRef(null);
22
22
  const codeClientRef = useRef(null);
23
23
  // Track when we're exiting to prevent auto-load from re-triggering
24
- // Use BOTH ref (for sync checks) and state (for effect dependencies)
25
24
  const isExitingRef = useRef(false);
26
- const [isExiting, setIsExiting] = useState(false);
25
+ // Track builder active state - use BOTH ref (for sync checks in callbacks) and state (for renders)
26
+ const isBuilderActiveRef = useRef(false);
27
27
  const [isBuilderActive, setIsBuilderActive] = useState(false);
28
+ // Signal counter for triggering bundle loads - ONLY incremented when we decide to load
29
+ // This avoids the dependency cascade problem with the old approach
30
+ const [bundleLoadSignal, setBundleLoadSignal] = useState(0);
31
+ const pendingBundleProjectIdRef = useRef(null);
32
+ // Store apiBase in ref so bundle load effect has no config dependency
33
+ const apiBaseRef = useRef(config.apiBase || 'http://localhost:8080');
34
+ apiBaseRef.current = config.apiBase || 'http://localhost:8080';
28
35
  const [isBundleLoaded, setIsBundleLoaded] = useState(false);
29
36
  const [isBundleLoading, setIsBundleLoading] = useState(false);
30
37
  const [codeMessage, setCodeMessage] = useState({
@@ -108,7 +115,7 @@ export function BuilderProvider({ children, config = {}, onBuilderReady, }) {
108
115
  // This prevents race condition where streaming events trigger temp bundle reload
109
116
  onExitStart: () => {
110
117
  isExitingRef.current = true;
111
- setIsExiting(true); // Also update state for effect dependency
118
+ isBuilderActiveRef.current = false; // Mark inactive immediately
112
119
  console.log('[BuilderProvider] Exit started, isExiting=true');
113
120
  // Abort any active streaming to prevent late bundle_ready events
114
121
  codeClientRef.current?.abort();
@@ -128,7 +135,7 @@ export function BuilderProvider({ children, config = {}, onBuilderReady, }) {
128
135
  onEnter: () => {
129
136
  console.log('[BuilderProvider] Visual builder entered');
130
137
  isExitingRef.current = false;
131
- setIsExiting(false); // Reset for next session
138
+ isBuilderActiveRef.current = true;
132
139
  setIsBuilderActive(true);
133
140
  },
134
141
  onExit: () => {
@@ -292,22 +299,46 @@ export function BuilderProvider({ children, config = {}, onBuilderReady, }) {
292
299
  console.log('[BuilderProvider] Loading temp bundle via:', bundleUrl);
293
300
  await loadBundle(bundleUrl);
294
301
  }, [config, loadBundle]);
295
- // Auto-load temp bundle when bundle is ready (only while builder is active and not exiting)
302
+ // Watch for bundleReady and decide if we should queue a load
303
+ // Uses refs for instant checks (no stale closure issues)
296
304
  useEffect(() => {
297
- console.log('[BuilderProvider] Auto-load check:', {
298
- bundleReady: codeMessage.bundleReady,
299
- projectId: codeMessage.projectId,
300
- isBuilderActive,
301
- isExiting, // Use state value for logging
302
- isExitingRef: isExitingRef.current, // Also log ref for debugging
303
- });
304
- // Only auto-load if builder is active AND not in the process of exiting
305
- // Check BOTH state and ref for maximum safety against race conditions
306
- if (isBuilderActive && !isExiting && !isExitingRef.current && codeMessage.bundleReady && codeMessage.projectId) {
307
- console.log('[BuilderProvider] Bundle ready - loading temp bundle:', codeMessage.projectId);
308
- loadTempBundle(codeMessage.projectId);
305
+ if (codeMessage.bundleReady && codeMessage.projectId) {
306
+ // Check refs for current state (not stale closure values)
307
+ if (isBuilderActiveRef.current && !isExitingRef.current) {
308
+ console.log('[BuilderProvider] Bundle ready - queueing load:', codeMessage.projectId);
309
+ pendingBundleProjectIdRef.current = codeMessage.projectId;
310
+ setBundleLoadSignal(s => s + 1);
311
+ }
312
+ else {
313
+ console.log('[BuilderProvider] Bundle ready but skipping (exiting or inactive):', {
314
+ isBuilderActive: isBuilderActiveRef.current,
315
+ isExiting: isExitingRef.current,
316
+ });
317
+ }
318
+ }
319
+ }, [codeMessage.bundleReady, codeMessage.projectId]);
320
+ // Effect that actually loads - ONLY triggered by the signal counter
321
+ // Uses refs for everything so it has ONLY ONE dependency: bundleLoadSignal
322
+ useEffect(() => {
323
+ if (bundleLoadSignal === 0)
324
+ return; // Skip initial render
325
+ const projectId = pendingBundleProjectIdRef.current;
326
+ if (!projectId)
327
+ return;
328
+ // Final safety check before loading
329
+ if (isExitingRef.current) {
330
+ console.log('[BuilderProvider] Skipping load - exit in progress');
331
+ pendingBundleProjectIdRef.current = null;
332
+ return;
333
+ }
334
+ // Use refs to avoid dependency on config/loadTempBundle
335
+ const bundleUrl = `${apiBaseRef.current}/api/code/bundle?_t=${Date.now()}`;
336
+ console.log('[BuilderProvider] Loading temp bundle:', bundleUrl);
337
+ if (loadBundleRef.current) {
338
+ loadBundleRef.current(bundleUrl);
309
339
  }
310
- }, [codeMessage.bundleReady, codeMessage.projectId, isBuilderActive, isExiting, loadTempBundle]);
340
+ pendingBundleProjectIdRef.current = null;
341
+ }, [bundleLoadSignal]); // ONLY depends on the signal!
311
342
  // Unload bundle - show children again
312
343
  const unloadBundle = useCallback(() => {
313
344
  setTenantApp(null);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dynim-react",
3
- "version": "1.0.17",
3
+ "version": "1.0.18",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",