@alpaca-editor/core 1.0.3841 → 1.0.3842

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,31 +1,49 @@
1
- import { useEffect, useState } from "react";
1
+ import { useEffect, useRef, useState } from "react";
2
2
  import { loadPlaceholderInsertOptions, } from "../services/editService";
3
3
  export function usePageModel(itemsRepository, pageItemDescriptor) {
4
4
  const [page, setPage] = useState();
5
5
  const [pageSkeleton, setPageSkeleton] = useState();
6
6
  const [insertOptions, setInsertOptions] = useState([]);
7
+ const insertOptionsCache = useRef({});
8
+ // 2) whenever the descriptor changes, reset skeleton, page and clear cache
7
9
  useEffect(() => {
8
10
  setPage(undefined);
9
11
  setPageSkeleton(undefined);
12
+ insertOptionsCache.current = {};
13
+ setInsertOptions([]);
10
14
  }, [pageItemDescriptor]);
15
+ // 3) collect all placeholder-keys in a skeleton
16
+ const collectPlaceholderKeys = (skeleton) => {
17
+ const keys = [];
18
+ const collect = (c) => {
19
+ c.placeholders.forEach((ph) => {
20
+ keys.push(ph.key);
21
+ ph.components.forEach(collect);
22
+ });
23
+ };
24
+ collect(skeleton.rootComponent);
25
+ return keys;
26
+ };
27
+ // 4) load only missing insertOptions
11
28
  useEffect(() => {
12
29
  const loadInsertOptions = async () => {
13
30
  if (!pageSkeleton)
14
31
  return;
15
- const collectPlaceholderKeys = (skeleton) => {
16
- const keys = [];
17
- const collectFromComponent = (component) => {
18
- component.placeholders.forEach((placeholder) => {
19
- keys.push(placeholder.key);
20
- placeholder.components.forEach((c) => collectFromComponent(c));
21
- });
22
- };
23
- collectFromComponent(skeleton.rootComponent);
24
- return keys;
25
- };
26
- const placeholderKeys = collectPlaceholderKeys(pageSkeleton);
27
- const options = await loadPlaceholderInsertOptions(pageSkeleton.item, placeholderKeys);
28
- setInsertOptions(options);
32
+ const allKeys = collectPlaceholderKeys(pageSkeleton);
33
+ // find which keys we haven’t cached yet
34
+ const missingKeys = allKeys.filter((k) => !(k in insertOptionsCache.current));
35
+ if (missingKeys.length) {
36
+ const newlyFetched = await loadPlaceholderInsertOptions(pageSkeleton.item, missingKeys);
37
+ // stash them in our cache
38
+ newlyFetched.forEach((opt) => {
39
+ insertOptionsCache.current[opt.key] = opt;
40
+ });
41
+ }
42
+ // now build the full list in the original placeholder order
43
+ const optionsInOrder = allKeys
44
+ .map((k) => insertOptionsCache.current[k])
45
+ .filter((opt) => !!opt);
46
+ setInsertOptions(optionsInOrder);
29
47
  };
30
48
  loadInsertOptions();
31
49
  }, [pageSkeleton]);
@@ -1 +1 @@
1
- {"version":3,"file":"pageModelBuilder.js","sourceRoot":"","sources":["../../../src/editor/client/pageModelBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pageModelBuilder.js","sourceRoot":"","sources":["../../../src/editor/client/pageModelBuilder.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const version = "1.0.3841";
2
- export declare const buildDate = "2025-04-24 19:28:53";
1
+ export declare const version = "1.0.3842";
2
+ export declare const buildDate = "2025-04-25 01:49:52";
package/dist/revision.js CHANGED
@@ -1,3 +1,3 @@
1
- export const version = "1.0.3841";
2
- export const buildDate = "2025-04-24 19:28:53";
1
+ export const version = "1.0.3842";
2
+ export const buildDate = "2025-04-25 01:49:52";
3
3
  //# sourceMappingURL=revision.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alpaca-editor/core",
3
- "version": "1.0.3841",
3
+ "version": "1.0.3842",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -1,4 +1,4 @@
1
- import { useEffect, useState } from "react";
1
+ import { useEffect, useRef, useState } from "react";
2
2
  import {
3
3
  Component,
4
4
  ComponentSkeleton,
@@ -26,34 +26,61 @@ export function usePageModel(
26
26
  PlaceholderInsertOptions[]
27
27
  >([]);
28
28
 
29
+ const insertOptionsCache = useRef<Record<string, PlaceholderInsertOptions>>(
30
+ {},
31
+ );
32
+
33
+ // 2) whenever the descriptor changes, reset skeleton, page and clear cache
29
34
  useEffect(() => {
30
35
  setPage(undefined);
31
36
  setPageSkeleton(undefined);
37
+ insertOptionsCache.current = {};
38
+ setInsertOptions([]);
32
39
  }, [pageItemDescriptor]);
33
40
 
41
+ // 3) collect all placeholder-keys in a skeleton
42
+ const collectPlaceholderKeys = (skeleton: PageSkeleton): string[] => {
43
+ const keys: string[] = [];
44
+ const collect = (c: ComponentSkeleton) => {
45
+ c.placeholders.forEach((ph) => {
46
+ keys.push(ph.key);
47
+ ph.components.forEach(collect);
48
+ });
49
+ };
50
+ collect(skeleton.rootComponent);
51
+ return keys;
52
+ };
53
+
54
+ // 4) load only missing insertOptions
34
55
  useEffect(() => {
35
56
  const loadInsertOptions = async () => {
36
57
  if (!pageSkeleton) return;
37
58
 
38
- const collectPlaceholderKeys = (skeleton: PageSkeleton): string[] => {
39
- const keys: string[] = [];
40
- const collectFromComponent = (component: ComponentSkeleton) => {
41
- component.placeholders.forEach((placeholder) => {
42
- keys.push(placeholder.key);
43
- placeholder.components.forEach((c) => collectFromComponent(c));
44
- });
45
- };
46
- collectFromComponent(skeleton.rootComponent);
47
- return keys;
48
- };
49
-
50
- const placeholderKeys = collectPlaceholderKeys(pageSkeleton);
51
- const options = await loadPlaceholderInsertOptions(
52
- pageSkeleton.item,
53
- placeholderKeys,
59
+ const allKeys = collectPlaceholderKeys(pageSkeleton);
60
+ // find which keys we haven’t cached yet
61
+ const missingKeys = allKeys.filter(
62
+ (k) => !(k in insertOptionsCache.current),
54
63
  );
55
- setInsertOptions(options);
64
+
65
+ if (missingKeys.length) {
66
+ const newlyFetched = await loadPlaceholderInsertOptions(
67
+ pageSkeleton.item,
68
+ missingKeys,
69
+ );
70
+ // stash them in our cache
71
+ newlyFetched.forEach((opt) => {
72
+ insertOptionsCache.current[opt.key] = opt;
73
+ });
74
+ }
75
+
76
+ // now build the full list in the original placeholder order
77
+ const optionsInOrder = allKeys
78
+ .map((k) => insertOptionsCache.current[k])
79
+ .filter((opt): opt is PlaceholderInsertOptions => !!opt);
80
+
81
+ setInsertOptions(optionsInOrder);
56
82
  };
83
+
57
84
  loadInsertOptions();
58
85
  }, [pageSkeleton]);
59
86
 
package/src/revision.ts CHANGED
@@ -1,2 +1,2 @@
1
- export const version = "1.0.3841";
2
- export const buildDate = "2025-04-24 19:28:53";
1
+ export const version = "1.0.3842";
2
+ export const buildDate = "2025-04-25 01:49:52";