@fragmentsx/render-react 1.4.0 → 1.5.0

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,130 @@ 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 resolveSuspense = (options) => {
3384
+ if ((options == null ? void 0 : options.suspense) !== void 0) return options.suspense;
3385
+ if ((options == null ? void 0 : options.ssr) !== void 0) return options.ssr;
3386
+ return false;
3387
+ };
3388
+ const useArea = (areaCode, options) => {
3389
+ const { manager: globalManager } = useGlobalManager(
3315
3390
  options == null ? void 0 : options.globalManager
3316
3391
  );
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)
3392
+ const suspense = resolveSuspense(options);
3393
+ const skip = !globalManager || !(isBrowser || suspense);
3394
+ const suspenseData = useSuspenseLoadArea(
3395
+ globalManager,
3396
+ areaCode,
3397
+ !suspense || skip
3398
+ );
3399
+ const asyncState = useAsyncLoadArea(
3400
+ globalManager,
3401
+ areaCode,
3402
+ suspense || skip
3403
+ );
3404
+ if (skip) {
3405
+ return { data: null, fetching: false, error: null };
3406
+ }
3407
+ if (suspense) {
3408
+ return {
3409
+ data: suspenseData ?? null,
3410
+ fetching: false,
3411
+ error: null
3412
+ };
3413
+ }
3414
+ const throwOnError = (options == null ? void 0 : options.throwOnError) ?? true;
3415
+ if (throwOnError && asyncState.error) {
3416
+ throw asyncState.error;
3417
+ }
3418
+ return asyncState;
3419
+ };
3420
+ const AreaInitial = (areaProps) => {
3421
+ const { data: areaData } = useArea(areaProps.areaCode, {
3422
+ suspense: true,
3423
+ globalManager: areaProps.globalManager
3424
+ });
3425
+ const { manager: globalManager } = useGlobalManager(
3426
+ areaProps.globalManager
3322
3427
  );
3323
3428
  const { manager: fragmentManager } = useFragmentManager(
3324
3429
  areaData == null ? void 0 : areaData.fragmentId,
3325
- resultGlobalManager
3430
+ globalManager
3326
3431
  );
3327
3432
  const resultProps = react.useMemo(
3328
- () => ({ ...(areaData == null ? void 0 : areaData.props) ?? {}, ...(options == null ? void 0 : options.props) ?? {} }),
3329
- [areaData, options]
3433
+ () => ({ ...(areaData == null ? void 0 : areaData.props) ?? {}, ...(areaProps == null ? void 0 : areaProps.props) ?? {} }),
3434
+ [areaData, areaProps]
3330
3435
  );
3331
- return {
3332
- ...areaData,
3333
- fragmentManager,
3334
- props: resultProps,
3335
- globalManager: resultGlobalManager
3336
- };
3337
- };
3338
- const AreaInitial = (areaProps) => {
3339
- const areaData = useArea(areaProps);
3340
3436
  if (!areaData) return null;
3341
3437
  const areaManager = react.useMemo(
3342
3438
  () => clientCore.createAreaManager({
@@ -3350,14 +3446,14 @@ const AreaInitial = (areaProps) => {
3350
3446
  return /* @__PURE__ */ jsxRuntime.jsx(AreaManagerProvider, { value: areaManager, children: /* @__PURE__ */ jsxRuntime.jsx(
3351
3447
  Scope,
3352
3448
  {
3353
- fragmentManager: areaData.fragmentManager,
3449
+ fragmentManager,
3354
3450
  layerKey: "Area",
3355
3451
  value: {
3356
3452
  type: definition.definition.scopeTypes.AreaScope,
3357
3453
  areaManager,
3358
3454
  ...areaData ?? {}
3359
3455
  },
3360
- children: /* @__PURE__ */ jsxRuntime.jsx(Instance, { fragmentId: areaData.fragmentId, props: areaData == null ? void 0 : areaData.props })
3456
+ children: /* @__PURE__ */ jsxRuntime.jsx(Instance, { fragmentId: areaData.fragmentId, props: resultProps })
3361
3457
  }
3362
3458
  ) });
3363
3459
  };
package/dist/index.es.js CHANGED
@@ -3307,34 +3307,130 @@ 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 resolveSuspense = (options) => {
3382
+ if ((options == null ? void 0 : options.suspense) !== void 0) return options.suspense;
3383
+ if ((options == null ? void 0 : options.ssr) !== void 0) return options.ssr;
3384
+ return false;
3385
+ };
3386
+ const useArea = (areaCode, options) => {
3387
+ const { manager: globalManager } = useGlobalManager(
3313
3388
  options == null ? void 0 : options.globalManager
3314
3389
  );
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)
3390
+ const suspense = resolveSuspense(options);
3391
+ const skip = !globalManager || !(isBrowser || suspense);
3392
+ const suspenseData = useSuspenseLoadArea(
3393
+ globalManager,
3394
+ areaCode,
3395
+ !suspense || skip
3396
+ );
3397
+ const asyncState = useAsyncLoadArea(
3398
+ globalManager,
3399
+ areaCode,
3400
+ suspense || skip
3401
+ );
3402
+ if (skip) {
3403
+ return { data: null, fetching: false, error: null };
3404
+ }
3405
+ if (suspense) {
3406
+ return {
3407
+ data: suspenseData ?? null,
3408
+ fetching: false,
3409
+ error: null
3410
+ };
3411
+ }
3412
+ const throwOnError = (options == null ? void 0 : options.throwOnError) ?? true;
3413
+ if (throwOnError && asyncState.error) {
3414
+ throw asyncState.error;
3415
+ }
3416
+ return asyncState;
3417
+ };
3418
+ const AreaInitial = (areaProps) => {
3419
+ const { data: areaData } = useArea(areaProps.areaCode, {
3420
+ suspense: true,
3421
+ globalManager: areaProps.globalManager
3422
+ });
3423
+ const { manager: globalManager } = useGlobalManager(
3424
+ areaProps.globalManager
3320
3425
  );
3321
3426
  const { manager: fragmentManager } = useFragmentManager(
3322
3427
  areaData == null ? void 0 : areaData.fragmentId,
3323
- resultGlobalManager
3428
+ globalManager
3324
3429
  );
3325
3430
  const resultProps = useMemo(
3326
- () => ({ ...(areaData == null ? void 0 : areaData.props) ?? {}, ...(options == null ? void 0 : options.props) ?? {} }),
3327
- [areaData, options]
3431
+ () => ({ ...(areaData == null ? void 0 : areaData.props) ?? {}, ...(areaProps == null ? void 0 : areaProps.props) ?? {} }),
3432
+ [areaData, areaProps]
3328
3433
  );
3329
- return {
3330
- ...areaData,
3331
- fragmentManager,
3332
- props: resultProps,
3333
- globalManager: resultGlobalManager
3334
- };
3335
- };
3336
- const AreaInitial = (areaProps) => {
3337
- const areaData = useArea(areaProps);
3338
3434
  if (!areaData) return null;
3339
3435
  const areaManager = useMemo(
3340
3436
  () => createAreaManager({
@@ -3348,14 +3444,14 @@ const AreaInitial = (areaProps) => {
3348
3444
  return /* @__PURE__ */ jsx(AreaManagerProvider, { value: areaManager, children: /* @__PURE__ */ jsx(
3349
3445
  Scope,
3350
3446
  {
3351
- fragmentManager: areaData.fragmentManager,
3447
+ fragmentManager,
3352
3448
  layerKey: "Area",
3353
3449
  value: {
3354
3450
  type: definition.scopeTypes.AreaScope,
3355
3451
  areaManager,
3356
3452
  ...areaData ?? {}
3357
3453
  },
3358
- children: /* @__PURE__ */ jsx(Instance, { fragmentId: areaData.fragmentId, props: areaData == null ? void 0 : areaData.props })
3454
+ children: /* @__PURE__ */ jsx(Instance, { fragmentId: areaData.fragmentId, props: resultProps })
3359
3455
  }
3360
3456
  ) });
3361
3457
  };
@@ -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;AAoDD,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;AAQ/E,eAAO,MAAM,OAAO,aACR,MAAM,YACN,cAAc,KACvB,aAuCF,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
+ /** @deprecated Используйте suspense. ssr = suspense */
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,uDAAuD;IACvD,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.0",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"