@asteby/metacore-runtime-react 39.2.10 → 41.0.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/agent-result-registry.d.ts +44 -0
  3. package/dist/agent-result-registry.d.ts.map +1 -0
  4. package/dist/agent-result-registry.js +78 -0
  5. package/dist/attribute-classes.d.ts +46 -0
  6. package/dist/attribute-classes.d.ts.map +1 -0
  7. package/dist/attribute-classes.js +124 -0
  8. package/dist/dialogs/dynamic-record.d.ts +2 -2
  9. package/dist/dialogs/dynamic-record.d.ts.map +1 -1
  10. package/dist/dialogs/dynamic-record.js +14 -9
  11. package/dist/dynamic-form-schema.d.ts +6 -0
  12. package/dist/dynamic-form-schema.d.ts.map +1 -1
  13. package/dist/dynamic-form-schema.js +12 -1
  14. package/dist/index.d.ts +6 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +6 -1
  17. package/dist/motion.d.ts +19 -0
  18. package/dist/motion.d.ts.map +1 -0
  19. package/dist/motion.js +35 -0
  20. package/dist/types.d.ts +8 -1
  21. package/dist/types.d.ts.map +1 -1
  22. package/dist/use-flip-animation.d.ts +30 -0
  23. package/dist/use-flip-animation.d.ts.map +1 -0
  24. package/dist/use-flip-animation.js +123 -0
  25. package/dist/use-optimistic-mutation.d.ts +73 -0
  26. package/dist/use-optimistic-mutation.d.ts.map +1 -0
  27. package/dist/use-optimistic-mutation.js +153 -0
  28. package/package.json +3 -3
  29. package/src/__tests__/motion.test.ts +29 -0
  30. package/src/__tests__/use-flip-animation.test.tsx +109 -0
  31. package/src/__tests__/use-optimistic-mutation.test.tsx +201 -0
  32. package/src/agent-result-registry.test.tsx +52 -0
  33. package/src/agent-result-registry.tsx +129 -0
  34. package/src/attribute-classes.test.ts +79 -0
  35. package/src/attribute-classes.ts +147 -0
  36. package/src/dialogs/dynamic-record.tsx +22 -7
  37. package/src/dynamic-form-schema.ts +13 -1
  38. package/src/index.ts +35 -0
  39. package/src/motion.ts +47 -0
  40. package/src/types.ts +8 -1
  41. package/src/use-flip-animation.ts +157 -0
  42. package/src/use-optimistic-mutation.ts +218 -0
  43. package/tsconfig.json +1 -1
package/dist/index.js CHANGED
@@ -20,6 +20,9 @@ export { useStageOverrides, } from './stage-overrides';
20
20
  export { DynamicView, resolveViewRenderer, readViewFromSearch, resolveActiveView, } from './dynamic-view';
21
21
  export { useDynamicFilters, } from './use-dynamic-filters';
22
22
  export { useDebouncedValue, SEARCH_DEBOUNCE_MS } from './use-debounced-value';
23
+ export { useOptimisticMutation, } from './use-optimistic-mutation';
24
+ export { useFlipAnimation } from './use-flip-animation';
25
+ export { motionDuration, motionEasing, prefersReducedMotion, MOTION_DEFAULTS, } from './motion';
23
26
  export { useResource, useMutation, } from './use-resource';
24
27
  export * from './dynamic-form';
25
28
  export { FilePickButton, } from './file-pick-button';
@@ -73,11 +76,12 @@ export { DynamicCRUDPage, } from './dynamic-crud-page';
73
76
  export { DynamicRelation, buildRelationFilterParams, buildCreatePayload, deriveRelationFormFields, relationRowKey, } from './dynamic-relation';
74
77
  export { DynamicRelations, resolveParentId, buildRelationFilters, isEmbedded, } from './dynamic-relations';
75
78
  export { registerModelExtension, getModelExtension, clearModelExtensions, } from './model-extension-registry';
79
+ export { registerAgentResultRenderer, resolveAgentResultRenderer, listAgentResultRenderers, clearAgentResultRenderers, useAgentResultRegistryVersion, AgentResultView, } from './agent-result-registry';
76
80
  export { isColumnVisibleInTable, isColumnVisibleInModal, isColumnVisibleInLineSubtable, AUDIT_SUBTABLE_COLUMN_KEYS, getSearchableColumnKeys, } from './column-visibility';
77
81
  export { batchGet, loadQueryPart, nameBatchTokens, narrowInToken, optionsBatchToken, optionsModelFromUrl, rememberInRows, invalidateQueryBatchData, resetQueryBatchCache, splitInToken, tokenForGet, } from './query-batch';
78
82
  export { useOptionsResolver, invalidateOptionsCache, projectOption, } from './use-options-resolver';
79
83
  export { setOrgConfigBridge, getOrgConfigBridge, resolveValidatorToken, } from './use-org-config-bridge';
80
- export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, scopeValueFromFilterToken, buildListScopeValues, evaluateVisibleWhenForListScope, applyLineItemRowFormulas, computeLineItemTotals, toNumber, } from './dynamic-form-schema';
84
+ export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, ATTRIBUTE_CLASSES_KEY, scopeValueFromFilterToken, buildListScopeValues, evaluateVisibleWhenForListScope, applyLineItemRowFormulas, computeLineItemTotals, toNumber, } from './dynamic-form-schema';
81
85
  export { BranchCreateGateProvider, useBranchCreateGate, } from './branch-create-gate';
82
86
  export { ActivityValueRenderer, } from './activity-value-renderer';
83
87
  export { ActivityDiff, } from './activity-diff';
@@ -90,3 +94,4 @@ export { WidgetRenderer, WidgetSkeleton, SIZE_SPAN, SIZE_CLASS, } from './widget
90
94
  export { WidgetCard, DeltaChip, WidgetEmpty, WidgetError, } from './widgets/widget-card';
91
95
  export { formatWidgetValue, formatAxisTick, formatDelta, accentClasses, paletteColor, CHART_PALETTE, } from './widgets/widget-format';
92
96
  export { AssistInterview, AssistCardView } from './assist-interview';
97
+ export { useAttributeClasses, resolveAttributeClasses, resetAttributeClassCache, } from './attribute-classes';
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Runtime access to the theme's motion tokens (`--motion-duration-*`,
3
+ * `--motion-ease-*` from @asteby/metacore-theme/tokens.css). Hosts that do
4
+ * not ship those variables get the same defaults, so JS-driven animations
5
+ * (WAAPI, dnd-kit) and CSS transitions stay on one scale.
6
+ */
7
+ export type MotionDuration = 'instant' | 'fast' | 'moderate' | 'slow';
8
+ export type MotionEasing = 'standard' | 'emphasized' | 'exit';
9
+ export declare const MOTION_DEFAULTS: {
10
+ duration: Record<MotionDuration, number>;
11
+ easing: Record<MotionEasing, string>;
12
+ };
13
+ /** True when the user asked the OS for reduced motion. */
14
+ export declare function prefersReducedMotion(): boolean;
15
+ /** Duration token in ms (0 under prefers-reduced-motion). */
16
+ export declare function motionDuration(token: MotionDuration): number;
17
+ /** Easing token as a CSS timing function. */
18
+ export declare function motionEasing(token: MotionEasing): string;
19
+ //# sourceMappingURL=motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;AACrE,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAA;AAE7D,eAAO,MAAM,eAAe;cACyC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC;YAK5F,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC;CAClC,CAAA;AAOD,0DAA0D;AAC1D,wBAAgB,oBAAoB,IAAI,OAAO,CAM9C;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAQ5D;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAExD"}
package/dist/motion.js ADDED
@@ -0,0 +1,35 @@
1
+ export const MOTION_DEFAULTS = {
2
+ duration: { instant: 100, fast: 150, moderate: 220, slow: 320 },
3
+ easing: {
4
+ standard: 'cubic-bezier(0.2, 0, 0, 1)',
5
+ emphasized: 'cubic-bezier(0.3, 0, 0, 1)',
6
+ exit: 'cubic-bezier(0.4, 0, 1, 1)',
7
+ },
8
+ };
9
+ function cssVar(name) {
10
+ if (typeof document === 'undefined' || typeof getComputedStyle !== 'function')
11
+ return '';
12
+ return getComputedStyle(document.documentElement).getPropertyValue(name).trim();
13
+ }
14
+ /** True when the user asked the OS for reduced motion. */
15
+ export function prefersReducedMotion() {
16
+ return (typeof window !== 'undefined' &&
17
+ typeof window.matchMedia === 'function' &&
18
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches);
19
+ }
20
+ /** Duration token in ms (0 under prefers-reduced-motion). */
21
+ export function motionDuration(token) {
22
+ if (prefersReducedMotion())
23
+ return 0;
24
+ const raw = cssVar(`--motion-duration-${token}`);
25
+ if (raw) {
26
+ const n = parseFloat(raw);
27
+ if (Number.isFinite(n))
28
+ return raw.endsWith('ms') || !raw.endsWith('s') ? n : n * 1000;
29
+ }
30
+ return MOTION_DEFAULTS.duration[token];
31
+ }
32
+ /** Easing token as a CSS timing function. */
33
+ export function motionEasing(token) {
34
+ return cssVar(`--motion-ease-${token}`) || MOTION_DEFAULTS.easing[token];
35
+ }
package/dist/types.d.ts CHANGED
@@ -355,9 +355,16 @@ export interface ActionCondition {
355
355
  * values; a hidden field never gates submit (its required-check is skipped).
356
356
  */
357
357
  export interface VisibleWhen {
358
- field: string;
358
+ field?: string;
359
359
  equals?: string;
360
360
  in?: string[];
361
+ /**
362
+ * Attribute class (kernel v3 `visible_when.class`, CONTRACT-item-master):
363
+ * the field shows when the record's category carries this class. Used
364
+ * alone, without `field`. Evaluated against the classes the dialog
365
+ * resolves for the record (see `useAttributeClasses`).
366
+ */
367
+ class?: string;
361
368
  }
362
369
  export interface FieldValidation {
363
370
  regex?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type RefObject } from 'react';
2
+ import { type MotionDuration, type MotionEasing } from './motion';
3
+ export interface UseFlipAnimationOptions {
4
+ /** Elements to animate, queried inside the root. */
5
+ selector?: string;
6
+ /** Stable identity of an element across renders. Default: data-flip-key, then href, then text. */
7
+ keyOf?: (el: HTMLElement) => string | null;
8
+ /**
9
+ * Scroll container used as the coordinate origin, so scrolling between two
10
+ * snapshots does not read as movement. Default: the root.
11
+ */
12
+ scrollContainer?: (root: HTMLElement) => HTMLElement | null;
13
+ /** Motion token (default `moderate`) or explicit ms. */
14
+ duration?: MotionDuration | number;
15
+ /** Motion token (default `standard`) or a CSS timing function. */
16
+ easing?: MotionEasing | string;
17
+ /** Off switch; the hook also stays still under prefers-reduced-motion. */
18
+ disabled?: boolean;
19
+ }
20
+ /**
21
+ * FLIP reorder animation: when `trigger` changes, elements that exist before
22
+ * and after the change glide from their old position to the new one.
23
+ *
24
+ * Positions are snapshotted when the list is at rest (after mount, after each
25
+ * animation, and after pointer interaction inside the root), never in the
26
+ * render path, so a re-render costs nothing. Uses the Web Animations API on
27
+ * `transform` only; with prefers-reduced-motion the change is instant.
28
+ */
29
+ export declare function useFlipAnimation(rootRef: RefObject<HTMLElement | null>, trigger: unknown, options?: UseFlipAnimationOptions): void;
30
+ //# sourceMappingURL=use-flip-animation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-flip-animation.d.ts","sourceRoot":"","sources":["../src/use-flip-animation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC1E,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kGAAkG;IAClG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,MAAM,GAAG,IAAI,CAAA;IAC1C;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAA;IAC3D,wDAAwD;IACxD,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAAA;IAClC,kEAAkE;IAClE,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAUD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACtC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,uBAA4B,GACpC,IAAI,CA4GN"}
@@ -0,0 +1,123 @@
1
+ import { useEffect, useLayoutEffect, useRef } from 'react';
2
+ import { motionDuration, motionEasing, prefersReducedMotion, } from './motion';
3
+ const DEFAULT_SELECTOR = '[data-flip-key]';
4
+ const MOTION_EASING_KEYS = { standard: 1, emphasized: 1, exit: 1 };
5
+ const defaultKeyOf = (el) => el.dataset.flipKey ?? el.getAttribute('href') ?? (el.textContent?.trim() || null);
6
+ /**
7
+ * FLIP reorder animation: when `trigger` changes, elements that exist before
8
+ * and after the change glide from their old position to the new one.
9
+ *
10
+ * Positions are snapshotted when the list is at rest (after mount, after each
11
+ * animation, and after pointer interaction inside the root), never in the
12
+ * render path, so a re-render costs nothing. Uses the Web Animations API on
13
+ * `transform` only; with prefers-reduced-motion the change is instant.
14
+ */
15
+ export function useFlipAnimation(rootRef, trigger, options = {}) {
16
+ const { selector = DEFAULT_SELECTOR, keyOf = defaultKeyOf, scrollContainer, duration = 'moderate', easing = 'standard', disabled = false, } = options;
17
+ const positionsRef = useRef(null);
18
+ const triggerRef = useRef(trigger);
19
+ const configRef = useRef({ selector, keyOf, scrollContainer });
20
+ useEffect(() => {
21
+ configRef.current = { selector, keyOf, scrollContainer };
22
+ });
23
+ const measure = () => {
24
+ const root = rootRef.current;
25
+ if (!root)
26
+ return null;
27
+ const { selector: sel, keyOf: key, scrollContainer: sc } = configRef.current;
28
+ const origin = (sc ? sc(root) : null) ?? root;
29
+ const box = origin.getBoundingClientRect();
30
+ const out = new Map();
31
+ root.querySelectorAll(sel).forEach((el) => {
32
+ const k = key(el);
33
+ if (!k || out.has(k))
34
+ return;
35
+ const r = el.getBoundingClientRect();
36
+ if (r.width === 0 && r.height === 0)
37
+ return;
38
+ out.set(k, {
39
+ top: r.top - box.top + origin.scrollTop,
40
+ left: r.left - box.left + origin.scrollLeft,
41
+ });
42
+ });
43
+ return out;
44
+ };
45
+ const measureRef = useRef(measure);
46
+ useEffect(() => {
47
+ measureRef.current = measure;
48
+ });
49
+ // Snapshot at rest: after mount and after interactions that move things
50
+ // without a trigger change (expanding a collapsible, for instance).
51
+ // Listens on the document and resolves the root per event, so a ref whose
52
+ // element is swapped (remount, mobile sheet) keeps working.
53
+ useEffect(() => {
54
+ let timer = null;
55
+ const schedule = () => {
56
+ if (timer)
57
+ clearTimeout(timer);
58
+ timer = setTimeout(() => {
59
+ positionsRef.current = measureRef.current();
60
+ }, 350);
61
+ };
62
+ const onInteraction = (e) => {
63
+ const root = rootRef.current;
64
+ if (root && e.target instanceof Node && root.contains(e.target))
65
+ schedule();
66
+ };
67
+ schedule();
68
+ document.addEventListener('pointerup', onInteraction, true);
69
+ document.addEventListener('keyup', onInteraction, true);
70
+ window.addEventListener('resize', schedule);
71
+ return () => {
72
+ if (timer)
73
+ clearTimeout(timer);
74
+ document.removeEventListener('pointerup', onInteraction, true);
75
+ document.removeEventListener('keyup', onInteraction, true);
76
+ window.removeEventListener('resize', schedule);
77
+ };
78
+ }, [rootRef]);
79
+ useLayoutEffect(() => {
80
+ if (Object.is(triggerRef.current, trigger))
81
+ return;
82
+ triggerRef.current = trigger;
83
+ const before = positionsRef.current;
84
+ const root = rootRef.current;
85
+ if (!root)
86
+ return;
87
+ const after = measureRef.current();
88
+ positionsRef.current = after;
89
+ if (!before || !after || disabled || prefersReducedMotion())
90
+ return;
91
+ const durationMs = typeof duration === 'number' ? duration : motionDuration(duration);
92
+ if (durationMs <= 0)
93
+ return;
94
+ const timing = easing in MOTION_EASING_KEYS ? motionEasing(easing) : easing;
95
+ const { selector: sel, keyOf: key } = configRef.current;
96
+ // A stale snapshot can report huge jumps; those would read as a glitch.
97
+ const maxJump = root.clientHeight > 0 ? root.clientHeight * 1.5 : Infinity;
98
+ root.querySelectorAll(sel).forEach((el) => {
99
+ const k = key(el);
100
+ if (!k)
101
+ return;
102
+ const from = before.get(k);
103
+ const to = after.get(k);
104
+ if (!to || typeof el.animate !== 'function')
105
+ return;
106
+ if (!from) {
107
+ // Entered with this change: fade in instead of popping.
108
+ el.animate([{ opacity: 0 }, { opacity: 1 }], { duration: durationMs, easing: timing });
109
+ return;
110
+ }
111
+ const dy = from.top - to.top;
112
+ const dx = from.left - to.left;
113
+ if (Math.abs(dy) < 1 && Math.abs(dx) < 1)
114
+ return;
115
+ if (Math.abs(dy) > maxJump)
116
+ return;
117
+ el.animate([
118
+ { transform: `translate(${dx}px, ${dy}px)` },
119
+ { transform: 'translate(0, 0)' },
120
+ ], { duration: durationMs, easing: timing });
121
+ });
122
+ }, [trigger, rootRef, disabled, duration, easing]);
123
+ }
@@ -0,0 +1,73 @@
1
+ import { type QueryKey } from '@tanstack/react-query';
2
+ export interface UseOptimisticMutationOptions<TData, TVariables, TCache> {
3
+ /** Query whose cached value the mutation changes. */
4
+ queryKey: QueryKey;
5
+ mutationFn: (variables: TVariables) => Promise<TData>;
6
+ /**
7
+ * Cache value to show while the request is in flight. Runs synchronously on
8
+ * `mutate`, so the UI repaints on the same frame as the click. Return
9
+ * `undefined` to leave the cache untouched.
10
+ */
11
+ optimistic: (current: TCache | undefined, variables: TVariables) => TCache | undefined;
12
+ /**
13
+ * Cache value once the server confirms. Write/apply endpoints that return
14
+ * the resulting resource should map it here, so nothing is refetched.
15
+ * Default: keep the optimistic value.
16
+ */
17
+ reconcile?: (data: TData, variables: TVariables, current: TCache | undefined) => TCache | undefined;
18
+ /**
19
+ * Coalesce bursts (drag and drop, sliders): the cache updates on every
20
+ * call, and only the last variables are sent once `debounceMs` pass
21
+ * without a new call. Pending work is flushed on unmount.
22
+ */
23
+ debounceMs?: number;
24
+ /**
25
+ * A call equal to the one already in flight is ignored (double clicks).
26
+ * Default: structural equality via JSON.
27
+ */
28
+ isEqual?: (a: TVariables, b: TVariables) => boolean;
29
+ /** Other queries to refresh in the background after a confirmed write. */
30
+ invalidate?: QueryKey[];
31
+ onSuccess?: (data: TData, variables: TVariables) => void;
32
+ /**
33
+ * Runs after the cache was rolled back to the last confirmed value. Only
34
+ * the latest call reports: a superseded write that fails stays silent.
35
+ */
36
+ onError?: (error: unknown, variables: TVariables) => void;
37
+ }
38
+ export interface UseOptimisticMutationResult<TVariables> {
39
+ /** Apply optimistically and persist. Safe to call repeatedly. */
40
+ mutate: (variables: TVariables) => void;
41
+ /** True from the first `mutate` until the last one settles. */
42
+ isPending: boolean;
43
+ /** Variables of the latest unconfirmed call (e.g. which card is applying). */
44
+ pendingVariables: TVariables | undefined;
45
+ error: unknown;
46
+ /** Re-send the variables of the last call that failed (toast "Reintentar"). */
47
+ retry: () => void;
48
+ }
49
+ /**
50
+ * Optimistic write over a TanStack Query cache entry, with rollback.
51
+ *
52
+ * ```tsx
53
+ * const apply = useOptimisticMutation({
54
+ * queryKey: ['org-sidebar-layout'],
55
+ * mutationFn: (key: string) => api.post('/apply', { key }).then((r) => r.data),
56
+ * optimistic: (current, key) => ({ ...current, template_key: key }),
57
+ * reconcile: (server) => server,
58
+ * onError: (_e, key) => toast.error('No se aplicó', {
59
+ * action: { label: 'Reintentar', onClick: () => apply.mutate(key) },
60
+ * }),
61
+ * })
62
+ * <Card aria-busy={apply.pendingVariables === tpl.key} onClick={() => apply.mutate(tpl.key)} />
63
+ * ```
64
+ *
65
+ * - The cache is patched before the request, so the screen answers at once.
66
+ * - Writes to the same `queryKey` run one at a time, in call order (mutation
67
+ * `scope`), so the last click is the last write the server sees.
68
+ * - Only the latest call decides what the cache shows: an older response
69
+ * never overwrites a newer optimistic value. If the latest call fails, the
70
+ * cache returns to the last value the server confirmed.
71
+ */
72
+ export declare function useOptimisticMutation<TData, TVariables, TCache = TData>(options: UseOptimisticMutationOptions<TData, TVariables, TCache>): UseOptimisticMutationResult<TVariables>;
73
+ //# sourceMappingURL=use-optimistic-mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-optimistic-mutation.d.ts","sourceRoot":"","sources":["../src/use-optimistic-mutation.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,uBAAuB,CAAA;AAE9B,MAAM,WAAW,4BAA4B,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM;IACrE,qDAAqD;IACrD,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IACrD;;;;OAIG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,UAAU,KAAK,MAAM,GAAG,SAAS,CAAA;IACtF;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAA;IACnG;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,OAAO,CAAA;IACnD,0EAA0E;IAC1E,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAA;IACvB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,KAAK,IAAI,CAAA;IACxD;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,KAAK,IAAI,CAAA;CAC1D;AAED,MAAM,WAAW,2BAA2B,CAAC,UAAU;IACrD,iEAAiE;IACjE,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,IAAI,CAAA;IACvC,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAA;IAClB,8EAA8E;IAC9E,gBAAgB,EAAE,UAAU,GAAG,SAAS,CAAA;IACxC,KAAK,EAAE,OAAO,CAAA;IACd,+EAA+E;IAC/E,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,EACrE,OAAO,EAAE,4BAA4B,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,GAC/D,2BAA2B,CAAC,UAAU,CAAC,CAoIzC"}
@@ -0,0 +1,153 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { useMutation, useQueryClient, } from '@tanstack/react-query';
3
+ const jsonEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
4
+ /**
5
+ * Optimistic write over a TanStack Query cache entry, with rollback.
6
+ *
7
+ * ```tsx
8
+ * const apply = useOptimisticMutation({
9
+ * queryKey: ['org-sidebar-layout'],
10
+ * mutationFn: (key: string) => api.post('/apply', { key }).then((r) => r.data),
11
+ * optimistic: (current, key) => ({ ...current, template_key: key }),
12
+ * reconcile: (server) => server,
13
+ * onError: (_e, key) => toast.error('No se aplicó', {
14
+ * action: { label: 'Reintentar', onClick: () => apply.mutate(key) },
15
+ * }),
16
+ * })
17
+ * <Card aria-busy={apply.pendingVariables === tpl.key} onClick={() => apply.mutate(tpl.key)} />
18
+ * ```
19
+ *
20
+ * - The cache is patched before the request, so the screen answers at once.
21
+ * - Writes to the same `queryKey` run one at a time, in call order (mutation
22
+ * `scope`), so the last click is the last write the server sees.
23
+ * - Only the latest call decides what the cache shows: an older response
24
+ * never overwrites a newer optimistic value. If the latest call fails, the
25
+ * cache returns to the last value the server confirmed.
26
+ */
27
+ export function useOptimisticMutation(options) {
28
+ const qc = useQueryClient();
29
+ const optionsRef = useRef(options);
30
+ useEffect(() => {
31
+ optionsRef.current = options;
32
+ });
33
+ const seqRef = useRef(0);
34
+ // Last value the server confirmed, captured before the first unconfirmed
35
+ // optimistic write. Null while nothing is in flight.
36
+ const confirmedRef = useRef(null);
37
+ const inFlightRef = useRef(undefined);
38
+ const timerRef = useRef(null);
39
+ const queuedRef = useRef(null);
40
+ const [pendingVariables, setPendingVariables] = useState(undefined);
41
+ const [error, setError] = useState(null);
42
+ const failedRef = useRef(null);
43
+ const scopeId = `optimistic:${JSON.stringify(options.queryKey)}`;
44
+ const settleLatest = useCallback(() => {
45
+ confirmedRef.current = null;
46
+ inFlightRef.current = undefined;
47
+ setPendingVariables(undefined);
48
+ }, []);
49
+ const mutation = useMutation({
50
+ scope: { id: scopeId },
51
+ mutationFn: ({ variables }) => optionsRef.current.mutationFn(variables),
52
+ onSuccess: (data, { variables, seq }) => {
53
+ const opts = optionsRef.current;
54
+ const latest = seq === seqRef.current && queuedRef.current === null;
55
+ if (latest) {
56
+ const current = qc.getQueryData(opts.queryKey);
57
+ const next = opts.reconcile ? opts.reconcile(data, variables, current) : current;
58
+ if (next !== undefined)
59
+ qc.setQueryData(opts.queryKey, next);
60
+ settleLatest();
61
+ setError(null);
62
+ for (const key of opts.invalidate ?? [])
63
+ void qc.invalidateQueries({ queryKey: key });
64
+ }
65
+ else if (confirmedRef.current) {
66
+ // A newer call owns the screen; only move the rollback point forward.
67
+ const base = confirmedRef.current.value;
68
+ const next = opts.reconcile
69
+ ? opts.reconcile(data, variables, base)
70
+ : opts.optimistic(base, variables);
71
+ confirmedRef.current = { value: next ?? base };
72
+ }
73
+ opts.onSuccess?.(data, variables);
74
+ },
75
+ onError: (err, { variables, seq }) => {
76
+ const opts = optionsRef.current;
77
+ const latest = seq === seqRef.current && queuedRef.current === null;
78
+ // A superseded write that fails is moot: the newer call decides what
79
+ // the screen shows and whether the user sees an error.
80
+ if (!latest)
81
+ return;
82
+ const confirmed = confirmedRef.current;
83
+ if (confirmed && confirmed.value !== undefined) {
84
+ qc.setQueryData(opts.queryKey, confirmed.value);
85
+ }
86
+ settleLatest();
87
+ // The server may have partially applied; resync in the background.
88
+ void qc.invalidateQueries({ queryKey: opts.queryKey, exact: true });
89
+ failedRef.current = { variables };
90
+ setError(err);
91
+ opts.onError?.(err, variables);
92
+ },
93
+ });
94
+ const mutateRef = useRef(mutation.mutate);
95
+ useEffect(() => {
96
+ mutateRef.current = mutation.mutate;
97
+ });
98
+ const send = useCallback((envelope) => {
99
+ inFlightRef.current = envelope.variables;
100
+ mutateRef.current(envelope);
101
+ }, []);
102
+ const flush = useCallback(() => {
103
+ if (timerRef.current)
104
+ clearTimeout(timerRef.current);
105
+ timerRef.current = null;
106
+ const queued = queuedRef.current;
107
+ queuedRef.current = null;
108
+ if (queued)
109
+ send(queued);
110
+ }, [send]);
111
+ const mutate = useCallback((variables) => {
112
+ const opts = optionsRef.current;
113
+ const isEqual = opts.isEqual ?? jsonEqual;
114
+ const latestPending = queuedRef.current?.variables ?? inFlightRef.current;
115
+ if (latestPending !== undefined && isEqual(latestPending, variables))
116
+ return;
117
+ const seq = ++seqRef.current;
118
+ if (!confirmedRef.current) {
119
+ confirmedRef.current = { value: qc.getQueryData(opts.queryKey) };
120
+ }
121
+ // A refetch landing mid-write would paint the old value back.
122
+ void qc.cancelQueries({ queryKey: opts.queryKey, exact: true });
123
+ const next = opts.optimistic(qc.getQueryData(opts.queryKey), variables);
124
+ if (next !== undefined)
125
+ qc.setQueryData(opts.queryKey, next);
126
+ setPendingVariables(variables);
127
+ setError(null);
128
+ failedRef.current = null;
129
+ const envelope = { variables, seq };
130
+ if (opts.debounceMs && opts.debounceMs > 0) {
131
+ queuedRef.current = envelope;
132
+ if (timerRef.current)
133
+ clearTimeout(timerRef.current);
134
+ timerRef.current = setTimeout(flush, opts.debounceMs);
135
+ return;
136
+ }
137
+ send(envelope);
138
+ }, [qc, flush, send]);
139
+ // Never drop a debounced write because the editor closed.
140
+ useEffect(() => flush, [flush]);
141
+ const retry = useCallback(() => {
142
+ const failed = failedRef.current;
143
+ if (failed)
144
+ mutate(failed.variables);
145
+ }, [mutate]);
146
+ return {
147
+ mutate,
148
+ isPending: pendingVariables !== undefined,
149
+ pendingVariables,
150
+ error,
151
+ retry,
152
+ };
153
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asteby/metacore-runtime-react",
3
- "version": "39.2.10",
3
+ "version": "41.0.0",
4
4
  "description": "React runtime for metacore hosts — renders addon contributions dynamically",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@asteby/metacore-sdk": "^3.8.0",
30
- "@asteby/metacore-ui": "^2.18.3",
30
+ "@asteby/metacore-ui": "^2.21.0",
31
31
  "@tanstack/react-query": ">=5",
32
32
  "@tanstack/react-router": ">=1.100",
33
33
  "@tanstack/react-table": ">=8",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@asteby/metacore-sdk": "3.8.0",
54
- "@asteby/metacore-ui": "2.18.3",
54
+ "@asteby/metacore-ui": "2.21.0",
55
55
  "@tanstack/react-query": "^5.95.0",
56
56
  "@tanstack/react-router": "^1.168.0",
57
57
  "@tanstack/react-table": "^8.20.0",
@@ -0,0 +1,29 @@
1
+ // @vitest-environment happy-dom
2
+ import { describe, expect, it, afterEach, vi } from 'vitest'
3
+ import { motionDuration, motionEasing, MOTION_DEFAULTS } from '../motion'
4
+
5
+ afterEach(() => {
6
+ document.documentElement.style.cssText = ''
7
+ vi.restoreAllMocks()
8
+ })
9
+
10
+ describe('motion tokens', () => {
11
+ it('falls back to the theme defaults when the host defines no variables', () => {
12
+ expect(motionDuration('moderate')).toBe(MOTION_DEFAULTS.duration.moderate)
13
+ expect(motionEasing('standard')).toBe(MOTION_DEFAULTS.easing.standard)
14
+ })
15
+
16
+ it('reads the host theme variables (ms and s)', () => {
17
+ document.documentElement.style.setProperty('--motion-duration-moderate', '0.3s')
18
+ document.documentElement.style.setProperty('--motion-duration-fast', '90ms')
19
+ document.documentElement.style.setProperty('--motion-ease-standard', 'linear')
20
+ expect(motionDuration('moderate')).toBe(300)
21
+ expect(motionDuration('fast')).toBe(90)
22
+ expect(motionEasing('standard')).toBe('linear')
23
+ })
24
+
25
+ it('is zero under prefers-reduced-motion', () => {
26
+ vi.spyOn(window, 'matchMedia').mockReturnValue({ matches: true } as MediaQueryList)
27
+ expect(motionDuration('slow')).toBe(0)
28
+ })
29
+ })