-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBasefn__Modal.res
More file actions
74 lines (67 loc) · 1.84 KB
/
Basefn__Modal.res
File metadata and controls
74 lines (67 loc) · 1.84 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
%%raw(`import './Basefn__Modal.css'`)
open Xote
type size = Sm | Md | Lg | Xl
let sizeToString = (size: size) => {
switch size {
| Sm => "sm"
| Md => "md"
| Lg => "lg"
| Xl => "xl"
}
}
@jsx.component
let make = (
~isOpen: Signal.t<bool>,
~onClose: unit => unit,
~title: option<string>=?,
~size: size=Md,
~closeOnBackdrop: bool=true,
~showCloseButton: bool=true,
~children: Node.node,
~footer: option<Node.node>=?,
) => {
let handleBackdropClick = evt => {
if closeOnBackdrop {
// Only close if clicking the backdrop itself, not the modal content
let target = Obj.magic(evt)["target"]
let currentTarget = Obj.magic(evt)["currentTarget"]
if target === currentTarget {
onClose()
}
}
}
let getModalClass = () => {
let sizeClass = "basefn-modal--" ++ sizeToString(size)
"basefn-modal " ++ sizeClass
}
let content = Computed.make(() => {
if Signal.get(isOpen) {
[
<div class="basefn-modal-backdrop" onClick={handleBackdropClick}>
<div class={getModalClass()}>
{switch title {
| Some(titleText) =>
<div class="basefn-modal__header">
<h2 class="basefn-modal__title"> {Node.text(titleText)} </h2>
{showCloseButton
? <button class="basefn-modal__close" onClick={_ => onClose()}>
{Node.text("\u00d7")}
</button>
: <> </>}
</div>
| None => <> </>
}}
<div class="basefn-modal__body"> {children} </div>
{switch footer {
| Some(footerContent) => <div class="basefn-modal__footer"> {footerContent} </div>
| None => <> </>
}}
</div>
</div>,
]
} else {
[]
}
})
Node.signalFragment(content)
}