-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathaddInstanceButton.tsx
More file actions
102 lines (95 loc) · 3.2 KB
/
addInstanceButton.tsx
File metadata and controls
102 lines (95 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import React from "preact/compat";
import classNames from "classnames";
import { visualBuilderStyles } from "../visualBuilder.style";
import { PlusIcon } from "./icons";
import { ISchemaFieldMap } from "../utils/types/index.types";
import { CslpData } from "../../cslp/types/cslp.types";
import visualBuilderPostMessage from "../utils/visualBuilderPostMessage";
import { VisualBuilderPostMessageEvents } from "../utils/types/postMessage.types";
import { Signal } from "@preact/signals";
interface AddInstanceButtonProps {
value: any;
onClick: (event: MouseEvent) => void;
label?: string | undefined;
fieldSchema: ISchemaFieldMap | undefined;
fieldMetadata: CslpData;
index: number;
loading: Signal<boolean>;
}
function AddInstanceButtonComponent(
props: AddInstanceButtonProps
): JSX.Element {
const fieldSchema = props.fieldSchema;
const fieldMetadata = props.fieldMetadata;
const index = props.index;
const loading = props.loading;
const onClick = async (event: MouseEvent) => {
loading.value = true;
try {
await visualBuilderPostMessage?.send(
VisualBuilderPostMessageEvents.ADD_INSTANCE,
{
fieldMetadata,
index,
}
);
} catch (error) {
console.error("Visual Builder: Failed to add instance", error);
}
loading.value = false;
props.onClick(event);
};
const buttonClassName = classNames(
"visual-builder__add-button",
visualBuilderStyles()["visual-builder__add-button"],
{
"visual-builder__add-button--with-label": props.label,
},
{
[visualBuilderStyles()["visual-builder__add-button--loading"]]:
loading.value,
},
visualBuilderStyles()["visual-builder__tooltip"]
);
const maxInstances =
fieldSchema && fieldSchema.data_type !== "block"
? fieldSchema.max_instance
: undefined;
const isMaxInstances = maxInstances
? props.value.length >= maxInstances
: false;
const disabled = loading.value || isMaxInstances;
return (
<button
className={buttonClassName}
data-tooltip={"Add section"}
data-testid="visual-builder-add-instance-button"
disabled={disabled}
title={
maxInstances && isMaxInstances
? `Max ${maxInstances} instances allowed`
: undefined
}
onClick={(e) => {
const event = e as unknown as MouseEvent;
onClick(event);
}}
>
<PlusIcon />
{props.label ? (
<span
title={props.label}
className={classNames(
"visual-builder__add-button-label",
visualBuilderStyles()[
"visual-builder__add-button-label"
]
)}
>
{props.label}
</span>
) : null}
</button>
);
}
export default AddInstanceButtonComponent;