@fragmentsx/render-react 1.4.0 → 1.5.1

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.
package/dist/index.cjs.js CHANGED
@@ -3309,34 +3309,128 @@ const Instance = (props) => {
3309
3309
  }
3310
3310
  ) });
3311
3311
  };
3312
- const useArea = (options) => {
3313
- var _a;
3314
- const { manager: resultGlobalManager } = useGlobalManager(
3312
+ const IDLE_STATE = {
3313
+ data: null,
3314
+ fetching: false,
3315
+ error: null
3316
+ };
3317
+ const useAsyncLoadArea = (globalManager, areaCode, skip) => {
3318
+ const [state, setState] = react.useState(IDLE_STATE);
3319
+ const areaCodeRef = react.useRef(areaCode);
3320
+ if (areaCodeRef.current !== areaCode) {
3321
+ areaCodeRef.current = areaCode;
3322
+ setState(IDLE_STATE);
3323
+ }
3324
+ react.useEffect(() => {
3325
+ var _a, _b;
3326
+ if (skip || !globalManager || !areaCode) return;
3327
+ const cache = getSuspenseCache(globalManager);
3328
+ const cacheKey = `area:${areaCode}`;
3329
+ if (cache.has(cacheKey)) {
3330
+ try {
3331
+ const cached = cache.get(cacheKey).read();
3332
+ setState({ data: cached, fetching: false, error: null });
3333
+ return;
3334
+ } catch (e) {
3335
+ if (!(e instanceof Promise)) {
3336
+ setState({ data: null, fetching: false, error: e });
3337
+ return;
3338
+ }
3339
+ }
3340
+ }
3341
+ const valueOrPromise = cache.has(cacheKey) ? void 0 : (_b = (_a = globalManager.$load) == null ? void 0 : _a.loadArea) == null ? void 0 : _b.call(_a, areaCode);
3342
+ if (valueOrPromise != null && !(valueOrPromise instanceof Promise)) {
3343
+ createSuspenseResource(cacheKey, valueOrPromise, cache);
3344
+ setState({ data: valueOrPromise, fetching: false, error: null });
3345
+ return;
3346
+ }
3347
+ if (valueOrPromise instanceof Promise) {
3348
+ createSuspenseResource(cacheKey, valueOrPromise, cache);
3349
+ }
3350
+ setState({ data: null, fetching: true, error: null });
3351
+ let cancelled = false;
3352
+ const resource = cache.get(cacheKey);
3353
+ if (!resource) return;
3354
+ try {
3355
+ const data = resource.read();
3356
+ if (!cancelled) {
3357
+ setState({ data, fetching: false, error: null });
3358
+ }
3359
+ } catch (e) {
3360
+ if (e instanceof Promise) {
3361
+ e.then(() => {
3362
+ if (cancelled) return;
3363
+ try {
3364
+ const data = resource.read();
3365
+ setState({ data, fetching: false, error: null });
3366
+ } catch (err) {
3367
+ if (!cancelled) {
3368
+ setState({ data: null, fetching: false, error: err });
3369
+ }
3370
+ }
3371
+ });
3372
+ } else if (!cancelled) {
3373
+ setState({ data: null, fetching: false, error: e });
3374
+ }
3375
+ }
3376
+ return () => {
3377
+ cancelled = true;
3378
+ };
3379
+ }, [skip, globalManager, areaCode]);
3380
+ if (skip) return IDLE_STATE;
3381
+ return state;
3382
+ };
3383
+ const useArea = (areaCode, options) => {
3384
+ const { manager: globalManager } = useGlobalManager(
3315
3385
  options == null ? void 0 : options.globalManager
3316
3386
  );
3317
- const ssr = ((_a = options == null ? void 0 : options.options) == null ? void 0 : _a.ssr) ?? true;
3318
- const areaData = useSuspenseLoadArea(
3319
- resultGlobalManager,
3320
- options.areaCode,
3321
- !(isBrowser || ssr)
3387
+ const suspense = (options == null ? void 0 : options.suspense) ?? false;
3388
+ const ssr = (options == null ? void 0 : options.ssr) ?? true;
3389
+ const skip = !globalManager || !(isBrowser || ssr);
3390
+ const suspenseData = useSuspenseLoadArea(
3391
+ globalManager,
3392
+ areaCode,
3393
+ !suspense || skip
3394
+ );
3395
+ const asyncState = useAsyncLoadArea(
3396
+ globalManager,
3397
+ areaCode,
3398
+ suspense || skip
3399
+ );
3400
+ if (skip) {
3401
+ return { data: null, fetching: false, error: null };
3402
+ }
3403
+ if (suspense) {
3404
+ return {
3405
+ data: suspenseData ?? null,
3406
+ fetching: false,
3407
+ error: null
3408
+ };
3409
+ }
3410
+ const throwOnError = (options == null ? void 0 : options.throwOnError) ?? true;
3411
+ if (throwOnError && asyncState.error) {
3412
+ throw asyncState.error;
3413
+ }
3414
+ return asyncState;
3415
+ };
3416
+ const AreaInitial = (areaProps) => {
3417
+ var _a;
3418
+ const { data: areaData } = useArea(areaProps.areaCode, {
3419
+ suspense: true,
3420
+ ssr: (_a = areaProps.options) == null ? void 0 : _a.ssr,
3421
+ globalManager: areaProps.globalManager
3422
+ });
3423
+ const { manager: globalManager } = useGlobalManager(
3424
+ areaProps.globalManager
3322
3425
  );
3323
3426
  const { manager: fragmentManager } = useFragmentManager(
3324
3427
  areaData == null ? void 0 : areaData.fragmentId,
3325
- resultGlobalManager
3428
+ globalManager
3326
3429
  );
3327
3430
  const resultProps = react.useMemo(
3328
- () => ({ ...(areaData == null ? void 0 : areaData.props) ?? {}, ...(options == null ? void 0 : options.props) ?? {} }),
3329
- [areaData, options]
3431
+ () => ({ ...(areaData == null ? void 0 : areaData.props) ?? {}, ...(areaProps == null ? void 0 : areaProps.props) ?? {} }),
3432
+ [areaData, areaProps]
3330
3433
  );
3331
- return {
3332
- ...areaData,
3333
- fragmentManager,
3334
- props: resultProps,
3335
- globalManager: resultGlobalManager
3336
- };
3337
- };
3338
- const AreaInitial = (areaProps) => {
3339
- const areaData = useArea(areaProps);
3340
3434
  if (!areaData) return null;
3341
3435
  const areaManager = react.useMemo(
3342
3436
  () => clientCore.createAreaManager({
@@ -3350,14 +3444,14 @@ const AreaInitial = (areaProps) => {
3350
3444
  return /* @__PURE__ */ jsxRuntime.jsx(AreaManagerProvider, { value: areaManager, children: /* @__PURE__ */ jsxRuntime.jsx(
3351
3445
  Scope,
3352
3446
  {
3353
- fragmentManager: areaData.fragmentManager,
3447
+ fragmentManager,
3354
3448
  layerKey: "Area",
3355
3449
  value: {
3356
3450
  type: definition.definition.scopeTypes.AreaScope,
3357
3451
  areaManager,
3358
3452
  ...areaData ?? {}
3359
3453
  },
3360
- children: /* @__PURE__ */ jsxRuntime.jsx(Instance, { fragmentId: areaData.fragmentId, props: areaData == null ? void 0 : areaData.props })
3454
+ children: /* @__PURE__ */ jsxRuntime.jsx(Instance, { fragmentId: areaData.fragmentId, props: resultProps })
3361
3455
  }
3362
3456
  ) });
3363
3457
  };
package/dist/index.es.js CHANGED
@@ -3307,34 +3307,128 @@ const Instance = (props) => {
3307
3307
  }
3308
3308
  ) });
3309
3309
  };
3310
- const useArea = (options) => {
3311
- var _a;
3312
- const { manager: resultGlobalManager } = useGlobalManager(
3310
+ const IDLE_STATE = {
3311
+ data: null,
3312
+ fetching: false,
3313
+ error: null
3314
+ };
3315
+ const useAsyncLoadArea = (globalManager, areaCode, skip) => {
3316
+ const [state, setState] = useState(IDLE_STATE);
3317
+ const areaCodeRef = useRef(areaCode);
3318
+ if (areaCodeRef.current !== areaCode) {
3319
+ areaCodeRef.current = areaCode;
3320
+ setState(IDLE_STATE);
3321
+ }
3322
+ useEffect(() => {
3323
+ var _a, _b;
3324
+ if (skip || !globalManager || !areaCode) return;
3325
+ const cache = getSuspenseCache(globalManager);
3326
+ const cacheKey = `area:${areaCode}`;
3327
+ if (cache.has(cacheKey)) {
3328
+ try {
3329
+ const cached = cache.get(cacheKey).read();
3330
+ setState({ data: cached, fetching: false, error: null });
3331
+ return;
3332
+ } catch (e) {
3333
+ if (!(e instanceof Promise)) {
3334
+ setState({ data: null, fetching: false, error: e });
3335
+ return;
3336
+ }
3337
+ }
3338
+ }
3339
+ const valueOrPromise = cache.has(cacheKey) ? void 0 : (_b = (_a = globalManager.$load) == null ? void 0 : _a.loadArea) == null ? void 0 : _b.call(_a, areaCode);
3340
+ if (valueOrPromise != null && !(valueOrPromise instanceof Promise)) {
3341
+ createSuspenseResource(cacheKey, valueOrPromise, cache);
3342
+ setState({ data: valueOrPromise, fetching: false, error: null });
3343
+ return;
3344
+ }
3345
+ if (valueOrPromise instanceof Promise) {
3346
+ createSuspenseResource(cacheKey, valueOrPromise, cache);
3347
+ }
3348
+ setState({ data: null, fetching: true, error: null });
3349
+ let cancelled = false;
3350
+ const resource = cache.get(cacheKey);
3351
+ if (!resource) return;
3352
+ try {
3353
+ const data = resource.read();
3354
+ if (!cancelled) {
3355
+ setState({ data, fetching: false, error: null });
3356
+ }
3357
+ } catch (e) {
3358
+ if (e instanceof Promise) {
3359
+ e.then(() => {
3360
+ if (cancelled) return;
3361
+ try {
3362
+ const data = resource.read();
3363
+ setState({ data, fetching: false, error: null });
3364
+ } catch (err) {
3365
+ if (!cancelled) {
3366
+ setState({ data: null, fetching: false, error: err });
3367
+ }
3368
+ }
3369
+ });
3370
+ } else if (!cancelled) {
3371
+ setState({ data: null, fetching: false, error: e });
3372
+ }
3373
+ }
3374
+ return () => {
3375
+ cancelled = true;
3376
+ };
3377
+ }, [skip, globalManager, areaCode]);
3378
+ if (skip) return IDLE_STATE;
3379
+ return state;
3380
+ };
3381
+ const useArea = (areaCode, options) => {
3382
+ const { manager: globalManager } = useGlobalManager(
3313
3383
  options == null ? void 0 : options.globalManager
3314
3384
  );
3315
- const ssr = ((_a = options == null ? void 0 : options.options) == null ? void 0 : _a.ssr) ?? true;
3316
- const areaData = useSuspenseLoadArea(
3317
- resultGlobalManager,
3318
- options.areaCode,
3319
- !(isBrowser || ssr)
3385
+ const suspense = (options == null ? void 0 : options.suspense) ?? false;
3386
+ const ssr = (options == null ? void 0 : options.ssr) ?? true;
3387
+ const skip = !globalManager || !(isBrowser || ssr);
3388
+ const suspenseData = useSuspenseLoadArea(
3389
+ globalManager,
3390
+ areaCode,
3391
+ !suspense || skip
3392
+ );
3393
+ const asyncState = useAsyncLoadArea(
3394
+ globalManager,
3395
+ areaCode,
3396
+ suspense || skip
3397
+ );
3398
+ if (skip) {
3399
+ return { data: null, fetching: false, error: null };
3400
+ }
3401
+ if (suspense) {
3402
+ return {
3403
+ data: suspenseData ?? null,
3404
+ fetching: false,
3405
+ error: null
3406
+ };
3407
+ }
3408
+ const throwOnError = (options == null ? void 0 : options.throwOnError) ?? true;
3409
+ if (throwOnError && asyncState.error) {
3410
+ throw asyncState.error;
3411
+ }
3412
+ return asyncState;
3413
+ };
3414
+ const AreaInitial = (areaProps) => {
3415
+ var _a;
3416
+ const { data: areaData } = useArea(areaProps.areaCode, {
3417
+ suspense: true,
3418
+ ssr: (_a = areaProps.options) == null ? void 0 : _a.ssr,
3419
+ globalManager: areaProps.globalManager
3420
+ });
3421
+ const { manager: globalManager } = useGlobalManager(
3422
+ areaProps.globalManager
3320
3423
  );
3321
3424
  const { manager: fragmentManager } = useFragmentManager(
3322
3425
  areaData == null ? void 0 : areaData.fragmentId,
3323
- resultGlobalManager
3426
+ globalManager
3324
3427
  );
3325
3428
  const resultProps = useMemo(
3326
- () => ({ ...(areaData == null ? void 0 : areaData.props) ?? {}, ...(options == null ? void 0 : options.props) ?? {} }),
3327
- [areaData, options]
3429
+ () => ({ ...(areaData == null ? void 0 : areaData.props) ?? {}, ...(areaProps == null ? void 0 : areaProps.props) ?? {} }),
3430
+ [areaData, areaProps]
3328
3431
  );
3329
- return {
3330
- ...areaData,
3331
- fragmentManager,
3332
- props: resultProps,
3333
- globalManager: resultGlobalManager
3334
- };
3335
- };
3336
- const AreaInitial = (areaProps) => {
3337
- const areaData = useArea(areaProps);
3338
3432
  if (!areaData) return null;
3339
3433
  const areaManager = useMemo(
3340
3434
  () => createAreaManager({
@@ -3348,14 +3442,14 @@ const AreaInitial = (areaProps) => {
3348
3442
  return /* @__PURE__ */ jsx(AreaManagerProvider, { value: areaManager, children: /* @__PURE__ */ jsx(
3349
3443
  Scope,
3350
3444
  {
3351
- fragmentManager: areaData.fragmentManager,
3445
+ fragmentManager,
3352
3446
  layerKey: "Area",
3353
3447
  value: {
3354
3448
  type: definition.scopeTypes.AreaScope,
3355
3449
  areaManager,
3356
3450
  ...areaData ?? {}
3357
3451
  },
3358
- children: /* @__PURE__ */ jsx(Instance, { fragmentId: areaData.fragmentId, props: areaData == null ? void 0 : areaData.props })
3452
+ children: /* @__PURE__ */ jsx(Instance, { fragmentId: areaData.fragmentId, props: resultProps })
3359
3453
  }
3360
3454
  ) });
3361
3455
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Area.d.ts","sourceRoot":"","sources":["../../../src/nodes/Area/Area.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;CACH;AAmCD,eAAO,MAAM,IAAI,UAAW,SAAS,4CAYpC,CAAC"}
1
+ {"version":3,"file":"Area.d.ts","sourceRoot":"","sources":["../../../src/nodes/Area/Area.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;CACH;AAqDD,eAAO,MAAM,IAAI,UAAW,SAAS,4CAYpC,CAAC"}
@@ -1,8 +1,3 @@
1
- import { AreaProps } from '../Area';
2
- export declare const useArea: (options: AreaProps) => {
3
- fragmentManager: any;
4
- props: {};
5
- globalManager: import('@graph-state/core').GraphState<import('@graph-state/core').SystemFields, string> | null;
6
- fragmentId?: number | undefined;
7
- };
1
+ import { UseAreaOptions, UseAreaResult } from './useArea.types';
2
+ export declare const useArea: (areaCode: string, options?: UseAreaOptions) => UseAreaResult;
8
3
  //# sourceMappingURL=useArea.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useArea.d.ts","sourceRoot":"","sources":["../../../../src/nodes/Area/hooks/useArea.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMpC,eAAO,MAAM,OAAO,YAAa,SAAS;;;;;CA4BzC,CAAC"}
1
+ {"version":3,"file":"useArea.d.ts","sourceRoot":"","sources":["../../../../src/nodes/Area/hooks/useArea.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAY,MAAM,iBAAiB,CAAC;AAE/E,eAAO,MAAM,OAAO,aACR,MAAM,YACN,cAAc,KACvB,aAwCF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useArea.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useArea.test.d.ts","sourceRoot":"","sources":["../../../../src/nodes/Area/hooks/useArea.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ export interface UseAreaOptions {
2
+ /** @default false */
3
+ suspense?: boolean;
4
+ throwOnError?: boolean;
5
+ globalManager?: unknown;
6
+ /** Загружать данные при SSR. @default true */
7
+ ssr?: boolean;
8
+ }
9
+ export interface AreaData {
10
+ fragmentId: number;
11
+ props: unknown;
12
+ areaId: string;
13
+ campaignId: string;
14
+ variantId: string;
15
+ areaProperties?: unknown;
16
+ }
17
+ export interface UseAreaResult {
18
+ data: AreaData | null;
19
+ fetching: boolean;
20
+ error: unknown;
21
+ }
22
+ //# sourceMappingURL=useArea.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useArea.types.d.ts","sourceRoot":"","sources":["../../../../src/nodes/Area/hooks/useArea.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB"}
@@ -0,0 +1,15 @@
1
+ import { GraphState } from '@graph-state/core';
2
+ import { AreaData } from './useArea.types';
3
+ interface AsyncLoadState {
4
+ data: AreaData | null;
5
+ fetching: boolean;
6
+ error: unknown;
7
+ }
8
+ /**
9
+ * Хук для асинхронной загрузки данных Area без Suspense.
10
+ * Возвращает { data, fetching, error } — классический паттерн async state.
11
+ * Использует suspense-кеш для совместимости с Suspense-версией.
12
+ */
13
+ export declare const useAsyncLoadArea: (globalManager: GraphState | null | undefined, areaCode: string, skip: boolean) => AsyncLoadState;
14
+ export {};
15
+ //# sourceMappingURL=useAsyncLoadArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncLoadArea.d.ts","sourceRoot":"","sources":["../../../../src/nodes/Area/hooks/useAsyncLoadArea.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,UAAU,cAAc;IACtB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAQD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,kBACZ,UAAU,GAAG,IAAI,GAAG,SAAS,YAClC,MAAM,QACV,OAAO,KACZ,cAuFF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useAsyncLoadArea.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncLoadArea.test.d.ts","sourceRoot":"","sources":["../../../../src/nodes/Area/hooks/useAsyncLoadArea.test.tsx"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
1
  export { Area } from './Area';
2
2
  export type { AreaProps } from './Area';
3
3
  export { useArea } from './hooks/useArea';
4
+ export type { UseAreaOptions, UseAreaResult, AreaData, } from './hooks/useArea.types';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/nodes/Area/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/nodes/Area/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,YAAY,EACV,cAAc,EACd,aAAa,EACb,QAAQ,GACT,MAAM,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fragmentsx/render-react",
3
3
  "private": false,
4
- "version": "1.4.0",
4
+ "version": "1.5.1",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"
@@ -27,8 +27,8 @@
27
27
  "@graph-state/core": "^0.13.2",
28
28
  "@graph-state/react": "^0.8.3",
29
29
  "react-use-measure": "^2.1.7",
30
- "@fragmentsx/client-core": "0.4.0",
31
30
  "@fragmentsx/definition": "0.2.2",
31
+ "@fragmentsx/client-core": "0.4.0",
32
32
  "@fragmentsx/utils": "0.2.0"
33
33
  },
34
34
  "devDependencies": {