@builder.io/sdk-svelte 0.1.4 → 0.1.5
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/package/--package.json +5 -1
- package/package/CHANGELOG.md +8 -0
- package/package/components/render-block/render-block.helpers.js +1 -1
- package/package/components/render-block/render-block.svelte +18 -1
- package/package/components/render-block/render-component.svelte.d.ts +8 -1
- package/package/components/render-block/render-repeated-block.svelte +1 -0
- package/package/components/render-content/components/render-styles.helpers.d.ts +15 -0
- package/package/components/render-content/components/render-styles.helpers.js +59 -0
- package/package/components/render-content/components/render-styles.svelte +12 -54
- package/package/components/render-content/components/render-styles.svelte.d.ts +3 -8
- package/package/components/render-content/render-content.helpers.d.ts +7 -0
- package/package/components/render-content/render-content.helpers.js +30 -0
- package/package/components/render-content/render-content.svelte +90 -87
- package/package/components/render-content/render-content.svelte.d.ts +2 -17
- package/package/components/render-content/render-content.types.d.ts +27 -0
- package/package/components/render-content/render-content.types.js +1 -0
- package/package/constants/builder-registered-components.js +6 -6
- package/package/context/builder.context.d.ts +1 -0
- package/package/context/builder.context.js +1 -0
- package/package/context/types.d.ts +1 -0
- package/package/index-helpers/blocks-exports.d.ts +6 -6
- package/package/index-helpers/blocks-exports.js +6 -6
- package/package/types/builder-content.d.ts +1 -2
- package/package/types/input.d.ts +117 -0
- package/package/types/input.js +1 -0
- package/package.json +1 -1
- package/src/components/render-block/render-block.helpers.ts +1 -1
- package/src/components/render-block/render-block.svelte +25 -2
- package/src/components/render-block/render-component.svelte +9 -1
- package/src/components/render-block/render-repeated-block.svelte +1 -0
- package/src/components/render-content/components/render-styles.helpers.ts +79 -0
- package/src/components/render-content/components/render-styles.svelte +13 -64
- package/src/components/render-content/render-content.helpers.ts +48 -0
- package/src/components/render-content/render-content.svelte +99 -115
- package/src/components/render-content/render-content.types.ts +31 -0
- package/src/constants/builder-registered-components.ts +6 -6
- package/src/context/builder.context.ts +1 -0
- package/src/context/types.ts +1 -0
- package/src/index-helpers/blocks-exports.ts +6 -6
- package/src/types/builder-content.ts +1 -3
- package/src/types/input.ts +120 -0
package/package/--package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@builder.io/sdk-svelte",
|
|
3
3
|
"description": "Builder.io SDK for Svelte",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"package",
|
|
@@ -72,9 +72,12 @@
|
|
|
72
72
|
"./components/render-block/types": "./components/render-block/types.js",
|
|
73
73
|
"./components/render-blocks.svelte": "./components/render-blocks.svelte",
|
|
74
74
|
"./components/render-content/builder-editing.svelte": "./components/render-content/builder-editing.svelte",
|
|
75
|
+
"./components/render-content/components/render-styles.helpers": "./components/render-content/components/render-styles.helpers.js",
|
|
75
76
|
"./components/render-content/components/render-styles.svelte": "./components/render-content/components/render-styles.svelte",
|
|
76
77
|
"./components/render-content": "./components/render-content/index.js",
|
|
78
|
+
"./components/render-content/render-content.helpers": "./components/render-content/render-content.helpers.js",
|
|
77
79
|
"./components/render-content/render-content.svelte": "./components/render-content/render-content.svelte",
|
|
80
|
+
"./components/render-content/render-content.types": "./components/render-content/render-content.types.js",
|
|
78
81
|
"./components/render-inlined-styles.svelte": "./components/render-inlined-styles.svelte",
|
|
79
82
|
"./constants/builder-registered-components": "./constants/builder-registered-components.js",
|
|
80
83
|
"./constants/device-sizes": "./constants/device-sizes.js",
|
|
@@ -142,6 +145,7 @@
|
|
|
142
145
|
"./types/components": "./types/components.js",
|
|
143
146
|
"./types/deep-partial": "./types/deep-partial.js",
|
|
144
147
|
"./types/element": "./types/element.js",
|
|
148
|
+
"./types/input": "./types/input.js",
|
|
145
149
|
"./types/targets": "./types/targets.js",
|
|
146
150
|
"./types/typescript": "./types/typescript.js"
|
|
147
151
|
},
|
package/package/CHANGELOG.md
CHANGED
|
@@ -26,7 +26,7 @@ export const isEmptyHtmlElement = (tagName) => {
|
|
|
26
26
|
};
|
|
27
27
|
export const getComponent = ({ block, context, }) => {
|
|
28
28
|
const componentName = getProcessedBlock({
|
|
29
|
-
block
|
|
29
|
+
block,
|
|
30
30
|
state: context.state,
|
|
31
31
|
context: context.context,
|
|
32
32
|
shouldEvaluateBindings: false,
|
|
@@ -43,10 +43,26 @@ $: useBlock = () => {
|
|
|
43
43
|
shouldEvaluateBindings: true,
|
|
44
44
|
});
|
|
45
45
|
};
|
|
46
|
+
$: proxyState = () => {
|
|
47
|
+
if (typeof Proxy === "undefined") {
|
|
48
|
+
console.error("no Proxy available in this environment, cannot proxy state.");
|
|
49
|
+
return context.state;
|
|
50
|
+
}
|
|
51
|
+
const useState = new Proxy(context.state, {
|
|
52
|
+
set: (obj, prop, value) => {
|
|
53
|
+
// set the value on the state object, so that the event handler instantly gets the update.
|
|
54
|
+
obj[prop] = value;
|
|
55
|
+
// set the value in the context, so that the rest of the app gets the update.
|
|
56
|
+
context.setState?.(obj);
|
|
57
|
+
return true;
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
return useState;
|
|
61
|
+
};
|
|
46
62
|
$: actions = () => {
|
|
47
63
|
return getBlockActions({
|
|
48
64
|
block: useBlock(),
|
|
49
|
-
state:
|
|
65
|
+
state: proxyState(),
|
|
50
66
|
context: context.context,
|
|
51
67
|
});
|
|
52
68
|
};
|
|
@@ -114,6 +130,7 @@ $: childrenContext = () => {
|
|
|
114
130
|
state: context.state,
|
|
115
131
|
content: context.content,
|
|
116
132
|
context: context.context,
|
|
133
|
+
setState: context.setState,
|
|
117
134
|
registeredComponents: context.registeredComponents,
|
|
118
135
|
inheritedStyles: getInheritedTextStyles(),
|
|
119
136
|
};
|
|
@@ -2,9 +2,16 @@ import { SvelteComponentTyped } from "svelte";
|
|
|
2
2
|
import type { BuilderBlock } from "../../types/builder-block.js";
|
|
3
3
|
import type { BuilderContextInterface } from "../../context/types.js";
|
|
4
4
|
import type { Breakpoints } from "../../types/builder-content.js";
|
|
5
|
+
declare type ComponentOptions = {
|
|
6
|
+
[index: string]: any;
|
|
7
|
+
customBreakpoints?: Breakpoints;
|
|
8
|
+
attributes?: {
|
|
9
|
+
[index: string]: any;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
5
12
|
export interface RenderComponentProps {
|
|
6
13
|
componentRef: any;
|
|
7
|
-
componentOptions:
|
|
14
|
+
componentOptions: ComponentOptions;
|
|
8
15
|
blockChildren: BuilderBlock[];
|
|
9
16
|
context: BuilderContextInterface;
|
|
10
17
|
customBreakpoints?: Breakpoints;
|
|
@@ -17,6 +17,7 @@ export let repeatContext;
|
|
|
17
17
|
setContext(BuilderContext.key, {
|
|
18
18
|
content: repeatContext.content,
|
|
19
19
|
state: repeatContext.state,
|
|
20
|
+
setState: repeatContext.setState,
|
|
20
21
|
context: repeatContext.context,
|
|
21
22
|
apiKey: repeatContext.apiKey,
|
|
22
23
|
registeredComponents: repeatContext.registeredComponents,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface CustomFont {
|
|
2
|
+
family?: string;
|
|
3
|
+
kind?: string;
|
|
4
|
+
fileUrl?: string;
|
|
5
|
+
files?: {
|
|
6
|
+
[key: string]: string;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare const getFontCss: ({ customFonts }: {
|
|
10
|
+
customFonts?: CustomFont[] | undefined;
|
|
11
|
+
}) => string;
|
|
12
|
+
export declare const getCss: ({ cssCode, contentId, }: {
|
|
13
|
+
cssCode?: string | undefined;
|
|
14
|
+
contentId?: string | undefined;
|
|
15
|
+
}) => string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const getCssFromFont = (font) => {
|
|
2
|
+
// TODO: compute what font sizes are used and only load those.......
|
|
3
|
+
const family = font.family +
|
|
4
|
+
(font.kind && !font.kind.includes('#') ? ', ' + font.kind : '');
|
|
5
|
+
const name = family.split(',')[0];
|
|
6
|
+
const url = font.fileUrl ?? font?.files?.regular;
|
|
7
|
+
let str = '';
|
|
8
|
+
if (url && family && name) {
|
|
9
|
+
str += `
|
|
10
|
+
@font-face {
|
|
11
|
+
font-family: "${family}";
|
|
12
|
+
src: local("${name}"), url('${url}') format('woff2');
|
|
13
|
+
font-display: fallback;
|
|
14
|
+
font-weight: 400;
|
|
15
|
+
}
|
|
16
|
+
`.trim();
|
|
17
|
+
}
|
|
18
|
+
if (font.files) {
|
|
19
|
+
for (const weight in font.files) {
|
|
20
|
+
const isNumber = String(Number(weight)) === weight;
|
|
21
|
+
if (!isNumber) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
// TODO: maybe limit number loaded
|
|
25
|
+
const weightUrl = font.files[weight];
|
|
26
|
+
if (weightUrl && weightUrl !== url) {
|
|
27
|
+
str += `
|
|
28
|
+
@font-face {
|
|
29
|
+
font-family: "${family}";
|
|
30
|
+
src: url('${weightUrl}') format('woff2');
|
|
31
|
+
font-display: fallback;
|
|
32
|
+
font-weight: ${weight};
|
|
33
|
+
}
|
|
34
|
+
`.trim();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return str;
|
|
39
|
+
};
|
|
40
|
+
export const getFontCss = ({ customFonts }) => {
|
|
41
|
+
// TODO: flag for this
|
|
42
|
+
// if (!this.builder.allowCustomFonts) {
|
|
43
|
+
// return '';
|
|
44
|
+
// }
|
|
45
|
+
// TODO: separate internal data from external
|
|
46
|
+
return customFonts?.map((font) => getCssFromFont(font))?.join(' ') || '';
|
|
47
|
+
};
|
|
48
|
+
export const getCss = ({ cssCode, contentId, }) => {
|
|
49
|
+
if (!cssCode) {
|
|
50
|
+
return '';
|
|
51
|
+
}
|
|
52
|
+
if (!contentId) {
|
|
53
|
+
return cssCode;
|
|
54
|
+
}
|
|
55
|
+
// Allow using `&` in custom CSS code like @emotion
|
|
56
|
+
// E.g. `& .foobar { ... }` to scope CSS
|
|
57
|
+
// TODO: handle if '&' is within a string like `content: "&"`
|
|
58
|
+
return cssCode?.replace(/&/g, `div[builder-content-id="${contentId}"]`) || '';
|
|
59
|
+
};
|
|
@@ -1,62 +1,20 @@
|
|
|
1
1
|
<script context="module"></script>
|
|
2
2
|
|
|
3
3
|
<script>import RenderInlinedStyles from "../../render-inlined-styles.svelte";
|
|
4
|
+
import { getCss } from "./render-styles.helpers";
|
|
5
|
+
import { getFontCss } from "./render-styles.helpers";
|
|
4
6
|
export let cssCode;
|
|
7
|
+
export let contentId;
|
|
5
8
|
export let customFonts;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const url = font.fileUrl ?? font?.files?.regular;
|
|
12
|
-
let str = "";
|
|
13
|
-
if (url && family && name) {
|
|
14
|
-
str += `
|
|
15
|
-
@font-face {
|
|
16
|
-
font-family: "${family}";
|
|
17
|
-
src: local("${name}"), url('${url}') format('woff2');
|
|
18
|
-
font-display: fallback;
|
|
19
|
-
font-weight: 400;
|
|
20
|
-
}
|
|
21
|
-
`.trim();
|
|
22
|
-
}
|
|
23
|
-
if (font.files) {
|
|
24
|
-
for (const weight in font.files) {
|
|
25
|
-
const isNumber = String(Number(weight)) === weight;
|
|
26
|
-
if (!isNumber) {
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
// TODO: maybe limit number loaded
|
|
30
|
-
const weightUrl = font.files[weight];
|
|
31
|
-
if (weightUrl && weightUrl !== url) {
|
|
32
|
-
str += `
|
|
33
|
-
@font-face {
|
|
34
|
-
font-family: "${family}";
|
|
35
|
-
src: url('${weightUrl}') format('woff2');
|
|
36
|
-
font-display: fallback;
|
|
37
|
-
font-weight: ${weight};
|
|
38
|
-
}
|
|
39
|
-
`.trim();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return str;
|
|
44
|
-
}
|
|
45
|
-
function getFontCss({ customFonts }) {
|
|
46
|
-
// TODO: flag for this
|
|
47
|
-
// if (!this.builder.allowCustomFonts) {
|
|
48
|
-
// return '';
|
|
49
|
-
// }
|
|
50
|
-
// TODO: separate internal data from external
|
|
51
|
-
return (customFonts?.map((font) => this.getCssFromFont(font))?.join(" ") || "");
|
|
52
|
-
}
|
|
53
|
-
$: injectedStyles = () => {
|
|
54
|
-
return `
|
|
55
|
-
${cssCode || ""}
|
|
9
|
+
let injectedStyles = `
|
|
10
|
+
${getCss({
|
|
11
|
+
cssCode: cssCode,
|
|
12
|
+
contentId: contentId,
|
|
13
|
+
})}
|
|
56
14
|
${getFontCss({
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
15
|
+
customFonts: customFonts,
|
|
16
|
+
})}
|
|
17
|
+
`;
|
|
60
18
|
</script>
|
|
61
19
|
|
|
62
|
-
<RenderInlinedStyles styles={injectedStyles
|
|
20
|
+
<RenderInlinedStyles styles={injectedStyles} />
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
|
|
3
|
-
family?: string;
|
|
4
|
-
kind?: string;
|
|
5
|
-
fileUrl?: string;
|
|
6
|
-
files?: {
|
|
7
|
-
[key: string]: string;
|
|
8
|
-
};
|
|
9
|
-
}
|
|
2
|
+
import type { CustomFont } from "./render-styles.helpers";
|
|
10
3
|
interface Props {
|
|
11
4
|
cssCode?: string;
|
|
12
5
|
customFonts?: CustomFont[];
|
|
6
|
+
contentId?: string;
|
|
13
7
|
}
|
|
14
8
|
declare const __propDef: {
|
|
15
9
|
props: {
|
|
16
10
|
cssCode: Props["cssCode"];
|
|
11
|
+
contentId: Props["contentId"];
|
|
17
12
|
customFonts: Props["customFonts"];
|
|
18
13
|
};
|
|
19
14
|
events: {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BuilderContent } from '../../types/builder-content';
|
|
2
|
+
import type { Nullable } from '../../types/typescript';
|
|
3
|
+
import type { RenderContentProps } from './render-content.types';
|
|
4
|
+
export declare const getContextStateInitialValue: ({ content, data, locale, }: Pick<RenderContentProps, 'content' | 'data' | 'locale'>) => {
|
|
5
|
+
[x: string]: unknown;
|
|
6
|
+
};
|
|
7
|
+
export declare const getContentInitialValue: ({ content, data, }: Pick<RenderContentProps, 'content' | 'data'>) => Nullable<BuilderContent>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const getContextStateInitialValue = ({ content, data, locale, }) => {
|
|
2
|
+
const defaultValues = {};
|
|
3
|
+
// set default values for content state inputs
|
|
4
|
+
content?.data?.inputs?.forEach((input) => {
|
|
5
|
+
if (input.name &&
|
|
6
|
+
input.defaultValue !== undefined &&
|
|
7
|
+
content?.data?.state &&
|
|
8
|
+
content.data.state[input.name] === undefined) {
|
|
9
|
+
defaultValues[input.name] = input.defaultValue;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
const stateToUse = {
|
|
13
|
+
...content?.data?.state,
|
|
14
|
+
...data,
|
|
15
|
+
...(locale ? { locale } : {}),
|
|
16
|
+
};
|
|
17
|
+
return { ...defaultValues, ...stateToUse };
|
|
18
|
+
};
|
|
19
|
+
export const getContentInitialValue = ({ content, data, }) => {
|
|
20
|
+
return !content
|
|
21
|
+
? undefined
|
|
22
|
+
: {
|
|
23
|
+
...content,
|
|
24
|
+
data: {
|
|
25
|
+
...content?.data,
|
|
26
|
+
...data,
|
|
27
|
+
},
|
|
28
|
+
meta: content?.meta,
|
|
29
|
+
};
|
|
30
|
+
};
|
|
@@ -17,32 +17,43 @@ import builderContext from "../../context/builder.context.js";
|
|
|
17
17
|
import { registerInsertMenu, setupBrowserForEditing, } from "../../scripts/init-editing.js";
|
|
18
18
|
import { checkIsDefined } from "../../helpers/nullable.js";
|
|
19
19
|
import { getInteractionPropertiesForEvent } from "../../functions/track/interaction.js";
|
|
20
|
+
import { getContentInitialValue, getContextStateInitialValue, } from "./render-content.helpers.js";
|
|
20
21
|
export let content;
|
|
21
22
|
export let data;
|
|
22
23
|
export let canTrack;
|
|
23
24
|
export let locale;
|
|
24
|
-
export let context;
|
|
25
25
|
export let customComponents;
|
|
26
26
|
export let model;
|
|
27
|
+
export let context;
|
|
27
28
|
export let apiKey;
|
|
28
29
|
export let includeRefs;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
30
|
+
function mergeNewContent(newContent) {
|
|
31
|
+
useContent = {
|
|
32
|
+
...useContent,
|
|
33
|
+
...newContent,
|
|
34
|
+
data: {
|
|
35
|
+
...useContent?.data,
|
|
36
|
+
...newContent?.data,
|
|
37
|
+
},
|
|
38
|
+
meta: {
|
|
39
|
+
...useContent?.meta,
|
|
40
|
+
...newContent?.meta,
|
|
41
|
+
breakpoints: newContent?.meta?.breakpoints || useContent?.meta?.breakpoints,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function setBreakpoints(breakpoints) {
|
|
46
|
+
useContent = {
|
|
47
|
+
...useContent,
|
|
48
|
+
meta: {
|
|
49
|
+
...useContent?.meta,
|
|
50
|
+
breakpoints,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function setContextState(newState) {
|
|
55
|
+
contentState = newState;
|
|
56
|
+
}
|
|
46
57
|
function processMessage(event) {
|
|
47
58
|
const { data } = event;
|
|
48
59
|
if (data) {
|
|
@@ -50,10 +61,12 @@ function processMessage(event) {
|
|
|
50
61
|
case "builder.configureSdk": {
|
|
51
62
|
const messageContent = data.data;
|
|
52
63
|
const { breakpoints, contentId } = messageContent;
|
|
53
|
-
if (!contentId || contentId !== useContent?.
|
|
64
|
+
if (!contentId || contentId !== useContent?.id) {
|
|
54
65
|
return;
|
|
55
66
|
}
|
|
56
|
-
|
|
67
|
+
if (breakpoints) {
|
|
68
|
+
setBreakpoints(breakpoints);
|
|
69
|
+
}
|
|
57
70
|
forceReRenderCount = forceReRenderCount + 1; // This is a hack to force Qwik to re-render.
|
|
58
71
|
break;
|
|
59
72
|
}
|
|
@@ -65,7 +78,7 @@ function processMessage(event) {
|
|
|
65
78
|
messageContent.modelName;
|
|
66
79
|
const contentData = messageContent.data;
|
|
67
80
|
if (key === model) {
|
|
68
|
-
|
|
81
|
+
mergeNewContent(contentData);
|
|
69
82
|
forceReRenderCount = forceReRenderCount + 1; // This is a hack to force Qwik to re-render.
|
|
70
83
|
}
|
|
71
84
|
break;
|
|
@@ -79,19 +92,19 @@ function processMessage(event) {
|
|
|
79
92
|
}
|
|
80
93
|
function evaluateJsCode() {
|
|
81
94
|
// run any dynamic JS code attached to content
|
|
82
|
-
const jsCode = useContent?.
|
|
95
|
+
const jsCode = useContent?.data?.jsCode;
|
|
83
96
|
if (jsCode) {
|
|
84
97
|
evaluate({
|
|
85
98
|
code: jsCode,
|
|
86
|
-
context:
|
|
87
|
-
state: contentState
|
|
99
|
+
context: context || {},
|
|
100
|
+
state: contentState,
|
|
88
101
|
});
|
|
89
102
|
}
|
|
90
103
|
}
|
|
91
104
|
function onClick(event) {
|
|
92
|
-
if (useContent
|
|
93
|
-
const variationId = useContent?.
|
|
94
|
-
const contentId = useContent?.
|
|
105
|
+
if (useContent) {
|
|
106
|
+
const variationId = useContent?.testVariationId;
|
|
107
|
+
const contentId = useContent?.id;
|
|
95
108
|
_track({
|
|
96
109
|
type: "click",
|
|
97
110
|
canTrack: canTrackToUse,
|
|
@@ -109,26 +122,26 @@ function onClick(event) {
|
|
|
109
122
|
function evalExpression(expression) {
|
|
110
123
|
return expression.replace(/{{([^}]+)}}/g, (_match, group) => evaluate({
|
|
111
124
|
code: group,
|
|
112
|
-
context:
|
|
113
|
-
state: contentState
|
|
125
|
+
context: context || {},
|
|
126
|
+
state: contentState,
|
|
114
127
|
}));
|
|
115
128
|
}
|
|
116
129
|
function handleRequest({ url, key }) {
|
|
117
130
|
fetch(url)
|
|
118
131
|
.then((response) => response.json())
|
|
119
132
|
.then((json) => {
|
|
120
|
-
const
|
|
121
|
-
...
|
|
133
|
+
const newState = {
|
|
134
|
+
...contentState,
|
|
122
135
|
[key]: json,
|
|
123
136
|
};
|
|
124
|
-
|
|
137
|
+
setContextState(newState);
|
|
125
138
|
})
|
|
126
139
|
.catch((err) => {
|
|
127
140
|
console.log("error fetching dynamic data", url, err);
|
|
128
141
|
});
|
|
129
142
|
}
|
|
130
143
|
function runHttpRequests() {
|
|
131
|
-
const requests = useContent?.
|
|
144
|
+
const requests = useContent?.data?.httpRequests ?? {};
|
|
132
145
|
Object.entries(requests).forEach(([key, url]) => {
|
|
133
146
|
if (url && (!httpReqsData[key] || isEditing())) {
|
|
134
147
|
const evaluatedUrl = evalExpression(url);
|
|
@@ -143,7 +156,7 @@ function emitStateUpdate() {
|
|
|
143
156
|
if (isEditing()) {
|
|
144
157
|
window.dispatchEvent(new CustomEvent("builder:component:stateChange", {
|
|
145
158
|
detail: {
|
|
146
|
-
state: contentState
|
|
159
|
+
state: contentState,
|
|
147
160
|
ref: {
|
|
148
161
|
name: model,
|
|
149
162
|
},
|
|
@@ -151,52 +164,24 @@ function emitStateUpdate() {
|
|
|
151
164
|
}));
|
|
152
165
|
}
|
|
153
166
|
}
|
|
154
|
-
$: useContent = () => {
|
|
155
|
-
if (!content && !overrideContent) {
|
|
156
|
-
return undefined;
|
|
157
|
-
}
|
|
158
|
-
return {
|
|
159
|
-
...content,
|
|
160
|
-
...overrideContent,
|
|
161
|
-
data: {
|
|
162
|
-
...content?.data,
|
|
163
|
-
...data,
|
|
164
|
-
...overrideContent?.data,
|
|
165
|
-
},
|
|
166
|
-
meta: {
|
|
167
|
-
...content?.meta,
|
|
168
|
-
...overrideContent?.meta,
|
|
169
|
-
breakpoints: useBreakpoints ||
|
|
170
|
-
overrideContent?.meta?.breakpoints ||
|
|
171
|
-
content?.meta?.breakpoints,
|
|
172
|
-
},
|
|
173
|
-
};
|
|
174
|
-
};
|
|
175
|
-
$: contentState = () => {
|
|
176
|
-
return {
|
|
177
|
-
...content?.data?.state,
|
|
178
|
-
...data,
|
|
179
|
-
...(locale
|
|
180
|
-
? {
|
|
181
|
-
locale: locale,
|
|
182
|
-
}
|
|
183
|
-
: {}),
|
|
184
|
-
...overrideState,
|
|
185
|
-
};
|
|
186
|
-
};
|
|
187
167
|
$: shouldRenderContentStyles = () => {
|
|
188
|
-
return Boolean((useContent?.
|
|
189
|
-
useContent?.()?.data?.customFonts?.length) &&
|
|
168
|
+
return Boolean((useContent?.data?.cssCode || useContent?.data?.customFonts?.length) &&
|
|
190
169
|
TARGET !== "reactNative");
|
|
191
170
|
};
|
|
192
171
|
let elementRef;
|
|
193
172
|
let forceReRenderCount = 0;
|
|
194
173
|
let overrideContent = null;
|
|
174
|
+
let useContent = getContentInitialValue({
|
|
175
|
+
content: content,
|
|
176
|
+
data: data,
|
|
177
|
+
});
|
|
195
178
|
let update = 0;
|
|
196
|
-
let useBreakpoints = null;
|
|
197
179
|
let canTrackToUse = checkIsDefined(canTrack) ? canTrack : true;
|
|
198
|
-
let
|
|
199
|
-
|
|
180
|
+
let contentState = getContextStateInitialValue({
|
|
181
|
+
content: content,
|
|
182
|
+
data: data,
|
|
183
|
+
locale: locale,
|
|
184
|
+
});
|
|
200
185
|
let allRegisteredComponents = [
|
|
201
186
|
...getDefaultRegisteredComponents(),
|
|
202
187
|
// While this `components` object is deprecated, we must maintain support for it.
|
|
@@ -239,9 +224,9 @@ onMount(() => {
|
|
|
239
224
|
window.addEventListener("message", processMessage);
|
|
240
225
|
window.addEventListener("builder:component:stateChangeListenerActivated", emitStateUpdate);
|
|
241
226
|
}
|
|
242
|
-
if (useContent
|
|
243
|
-
const variationId = useContent?.
|
|
244
|
-
const contentId = useContent?.
|
|
227
|
+
if (useContent) {
|
|
228
|
+
const variationId = useContent?.testVariationId;
|
|
229
|
+
const contentId = useContent?.id;
|
|
245
230
|
_track({
|
|
246
231
|
type: "impression",
|
|
247
232
|
canTrack: canTrackToUse,
|
|
@@ -272,7 +257,7 @@ onMount(() => {
|
|
|
272
257
|
apiKey: apiKey,
|
|
273
258
|
}).then((content) => {
|
|
274
259
|
if (content) {
|
|
275
|
-
|
|
260
|
+
mergeNewContent(content);
|
|
276
261
|
}
|
|
277
262
|
});
|
|
278
263
|
}
|
|
@@ -285,15 +270,35 @@ onMount(() => {
|
|
|
285
270
|
function onUpdateFn_0() {
|
|
286
271
|
evaluateJsCode();
|
|
287
272
|
}
|
|
288
|
-
$: onUpdateFn_0(...[useContent?.
|
|
273
|
+
$: onUpdateFn_0(...[useContent?.data?.jsCode, contentState]);
|
|
289
274
|
function onUpdateFn_1() {
|
|
290
275
|
runHttpRequests();
|
|
291
276
|
}
|
|
292
|
-
$: onUpdateFn_1(...[useContent?.
|
|
277
|
+
$: onUpdateFn_1(...[useContent?.data?.httpRequests]);
|
|
293
278
|
function onUpdateFn_2() {
|
|
294
279
|
emitStateUpdate();
|
|
295
280
|
}
|
|
296
|
-
$: onUpdateFn_2(...[contentState
|
|
281
|
+
$: onUpdateFn_2(...[contentState]);
|
|
282
|
+
setContext(builderContext.key, {
|
|
283
|
+
get content() {
|
|
284
|
+
return useContent;
|
|
285
|
+
},
|
|
286
|
+
get state() {
|
|
287
|
+
return contentState;
|
|
288
|
+
},
|
|
289
|
+
get setState() {
|
|
290
|
+
return setContextState;
|
|
291
|
+
},
|
|
292
|
+
get context() {
|
|
293
|
+
return context || {};
|
|
294
|
+
},
|
|
295
|
+
get apiKey() {
|
|
296
|
+
return apiKey;
|
|
297
|
+
},
|
|
298
|
+
get registeredComponents() {
|
|
299
|
+
return allRegisteredComponents;
|
|
300
|
+
},
|
|
301
|
+
});
|
|
297
302
|
onDestroy(() => {
|
|
298
303
|
if (isBrowser()) {
|
|
299
304
|
window.removeEventListener("message", processMessage);
|
|
@@ -302,24 +307,22 @@ onDestroy(() => {
|
|
|
302
307
|
});
|
|
303
308
|
</script>
|
|
304
309
|
|
|
305
|
-
{#if useContent
|
|
310
|
+
{#if useContent}
|
|
306
311
|
<div
|
|
307
312
|
bind:this={elementRef}
|
|
308
313
|
on:click={(event) => {
|
|
309
314
|
onClick(event);
|
|
310
315
|
}}
|
|
311
|
-
builder-content-id={useContent?.
|
|
316
|
+
builder-content-id={useContent?.id}
|
|
312
317
|
builder-model={model}
|
|
313
318
|
>
|
|
314
319
|
{#if shouldRenderContentStyles()}
|
|
315
320
|
<RenderContentStyles
|
|
316
|
-
|
|
317
|
-
|
|
321
|
+
contentId={useContent?.id}
|
|
322
|
+
cssCode={useContent?.data?.cssCode}
|
|
323
|
+
customFonts={useContent?.data?.customFonts}
|
|
318
324
|
/>
|
|
319
325
|
{/if}
|
|
320
|
-
<RenderBlocks
|
|
321
|
-
blocks={useContent?.()?.data?.blocks}
|
|
322
|
-
key={forceReRenderCount}
|
|
323
|
-
/>
|
|
326
|
+
<RenderBlocks blocks={useContent?.data?.blocks} key={forceReRenderCount} />
|
|
324
327
|
</div>
|
|
325
328
|
{/if}
|
|
@@ -1,29 +1,14 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type {
|
|
3
|
-
import type { BuilderContent } from "../../types/builder-content.js";
|
|
4
|
-
import type { Nullable } from "../../types/typescript.js";
|
|
5
|
-
export declare type RenderContentProps = {
|
|
6
|
-
content?: Nullable<BuilderContent>;
|
|
7
|
-
model?: string;
|
|
8
|
-
data?: {
|
|
9
|
-
[key: string]: any;
|
|
10
|
-
};
|
|
11
|
-
context?: BuilderRenderContext;
|
|
12
|
-
apiKey: string;
|
|
13
|
-
customComponents?: RegisteredComponent[];
|
|
14
|
-
canTrack?: boolean;
|
|
15
|
-
locale?: string;
|
|
16
|
-
includeRefs?: boolean;
|
|
17
|
-
};
|
|
2
|
+
import type { RenderContentProps } from "./render-content.types.js";
|
|
18
3
|
declare const __propDef: {
|
|
19
4
|
props: {
|
|
20
5
|
content: RenderContentProps["content"];
|
|
21
6
|
data: RenderContentProps["data"];
|
|
22
7
|
canTrack: RenderContentProps["canTrack"];
|
|
23
8
|
locale: RenderContentProps["locale"];
|
|
24
|
-
context: RenderContentProps["context"];
|
|
25
9
|
customComponents: RenderContentProps["customComponents"];
|
|
26
10
|
model: RenderContentProps["model"];
|
|
11
|
+
context: RenderContentProps["context"];
|
|
27
12
|
apiKey: RenderContentProps["apiKey"];
|
|
28
13
|
includeRefs: RenderContentProps["includeRefs"];
|
|
29
14
|
};
|