dynim-react 1.0.71 → 1.0.72

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.
@@ -13,6 +13,7 @@ export interface DynimConfig {
13
13
  getSession?: () => Promise<{
14
14
  token: string;
15
15
  refreshToken?: string;
16
+ cssVersion?: string | null;
16
17
  }>;
17
18
  /** Called when an error occurs */
18
19
  onError?: (error: Event | Error) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"DynimProvider.d.ts","sourceRoot":"","sources":["../src/DynimProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAc,EASZ,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAWf,OAAO,KAAK,EAKV,WAAW,EACX,UAAU,EACV,aAAa,EAGd,MAAM,YAAY,CAAC;AA2FpB,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;IACzC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,qBAAqB;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,yBAAyB;IACzB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,oCAAoC;IACpC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5C,mEAAmE;IACnE,iBAAiB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACpE,kDAAkD;IAClD,WAAW,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,WAAW,EAAE,WAAW,CAAC;IACzB,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,gCAAgC;IAChC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAW,GACZ,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAuelC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C"}
1
+ {"version":3,"file":"DynimProvider.d.ts","sourceRoot":"","sources":["../src/DynimProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAc,EASZ,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAWf,OAAO,KAAK,EAKV,WAAW,EACX,UAAU,EACV,aAAa,EAGd,MAAM,YAAY,CAAC;AA2FpB,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;IACzC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,qBAAqB;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,yBAAyB;IACzB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,oCAAoC;IACpC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5C,mEAAmE;IACnE,iBAAiB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACpE,kDAAkD;IAClD,WAAW,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,WAAW,EAAE,WAAW,CAAC;IACzB,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,gCAAgC;IAChC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAW,GACZ,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAggBlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C"}
@@ -103,6 +103,8 @@ export function DynimProvider({ children, config = {}, }) {
103
103
  // Cached auth token
104
104
  const cachedTokenRef = useRef(null);
105
105
  const tokenPromiseRef = useRef(null);
106
+ // CSS version for cache invalidation (null = no CSS exists)
107
+ const [cssVersion, setCSSVersion] = useState(null);
106
108
  // Bundle load signal
107
109
  const [bundleLoadSignal, setBundleLoadSignal] = useState(0);
108
110
  const pendingBundleProjectIdRef = useRef(null);
@@ -152,6 +154,10 @@ export function DynimProvider({ children, config = {}, }) {
152
154
  try {
153
155
  const session = await getSession();
154
156
  cachedTokenRef.current = session.token;
157
+ // Store CSS version for versioned URL building
158
+ if (session.cssVersion !== undefined) {
159
+ setCSSVersion(session.cssVersion ?? null);
160
+ }
155
161
  return session.token;
156
162
  }
157
163
  catch {
@@ -250,6 +256,7 @@ export function DynimProvider({ children, config = {}, }) {
250
256
  return cssLoaderRef.current;
251
257
  }, []);
252
258
  // Build CSS URL with project/customer IDs from cached token
259
+ // Returns null if no CSS exists (cssVersion is null)
253
260
  const buildCSSUrl = useCallback((temp = false) => {
254
261
  const token = cachedTokenRef.current;
255
262
  if (!token)
@@ -257,9 +264,20 @@ export function DynimProvider({ children, config = {}, }) {
257
264
  const claims = decodeJwtPayload(token);
258
265
  if (!claims?.sub || !claims?.project)
259
266
  return null;
260
- const params = `project_id=${claims.project}&customer_id=${claims.sub}`;
261
- return temp ? `/api/code/css?${params}&temp=true` : `/api/code/css?${params}`;
262
- }, []);
267
+ const base = `/api/code/css?project_id=${claims.project}&customer_id=${claims.sub}`;
268
+ if (temp) {
269
+ // Temp/preview CSS - use cache busting
270
+ return `${base}&temp=true&_t=${Date.now()}`;
271
+ }
272
+ else if (cssVersion) {
273
+ // Versioned URL for saved CSS - enables immutable caching
274
+ return `${base}&v=${cssVersion}`;
275
+ }
276
+ else {
277
+ // No CSS exists for this customer
278
+ return null;
279
+ }
280
+ }, [cssVersion]);
263
281
  // Load bundle (JS + CSS)
264
282
  const loadBundle = useCallback(async (bundleUrl, loadCSS = true) => {
265
283
  const loader = getBundleLoader();
@@ -279,14 +297,18 @@ export function DynimProvider({ children, config = {}, }) {
279
297
  if (cssUrl) {
280
298
  const cssLoader = getCSSLoader();
281
299
  if (isTemp) {
282
- // Temp/preview CSS - bust cache to get latest
283
- cssLoader.loadWithCacheBust(cssUrl);
300
+ // Temp/preview CSS - cache busting already in URL
301
+ cssLoader.load(cssUrl);
284
302
  }
285
303
  else {
286
- // Saved CSS - let browser cache
304
+ // Saved CSS with version - browser can cache immutably
287
305
  cssLoader.load(cssUrl);
288
306
  }
289
307
  }
308
+ else if (!isTemp) {
309
+ // No saved CSS exists - unload any existing CSS
310
+ getCSSLoader().unload();
311
+ }
290
312
  }
291
313
  }
292
314
  catch (error) {
@@ -413,21 +435,21 @@ export function DynimProvider({ children, config = {}, }) {
413
435
  await codeClientRef.current?.sendCode(query);
414
436
  }, []);
415
437
  const saveCode = useCallback(async () => {
416
- await codeClientRef.current?.saveCode();
438
+ if (codeClientRef.current) {
439
+ const result = await codeClientRef.current.saveCode();
440
+ // Update CSS version from save response
441
+ if (result && result.css_version) {
442
+ setCSSVersion(result.css_version);
443
+ }
444
+ }
445
+ // Load saved bundle - CSS will use new version in URL
417
446
  await loadSavedBundle();
418
- // Invalidate browser cache and reload fresh CSS
419
- const cssUrl = buildCSSUrl(false);
420
- if (cssUrl)
421
- await getCSSLoader().invalidateAndReload(cssUrl);
422
- }, [loadSavedBundle, getCSSLoader, buildCSSUrl]);
447
+ }, [loadSavedBundle]);
423
448
  const abandonCode = useCallback(async () => {
424
449
  await codeClientRef.current?.abandonCode();
450
+ // Load saved bundle - cssVersion state unchanged, will use existing version
425
451
  await loadSavedBundle();
426
- // Invalidate browser cache and reload saved CSS
427
- const cssUrl = buildCSSUrl(false);
428
- if (cssUrl)
429
- await getCSSLoader().invalidateAndReload(cssUrl);
430
- }, [loadSavedBundle, getCSSLoader, buildCSSUrl]);
452
+ }, [loadSavedBundle]);
431
453
  const getCheckpoints = useCallback(async () => {
432
454
  return codeClientRef.current?.getCheckpoints() ?? [];
433
455
  }, []);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dynim-react",
3
- "version": "1.0.71",
3
+ "version": "1.0.72",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -27,7 +27,7 @@
27
27
  "dev": "tsc --watch"
28
28
  },
29
29
  "dependencies": {
30
- "dynim-core": "^1.0.45"
30
+ "dynim-core": "^1.0.46"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "react": ">=17.0.0",