-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBasefn__Alert.res
More file actions
68 lines (60 loc) · 1.63 KB
/
Basefn__Alert.res
File metadata and controls
68 lines (60 loc) · 1.63 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
%%raw(`import './Basefn__Alert.css'`)
open Xote
type variant = Info | Success | Warning | Error
let variantToString = (variant: variant) => {
switch variant {
| Info => "info"
| Success => "success"
| Warning => "warning"
| Error => "error"
}
}
@jsx.component
let make = (
~title: option<string>=?,
~message: Signal.t<string>,
~variant: variant=Info,
~dismissible: bool=false,
~onDismiss: option<unit => unit>=?,
) => {
let isVisible = Signal.make(true)
let handleDismiss = () => {
Signal.set(isVisible, false)
switch onDismiss {
| Some(callback) => callback()
| None => ()
}
}
let getClassName = () => {
let variantClass = "basefn-alert--" ++ variantToString(variant)
"basefn-alert " ++ variantClass
}
// Use computed signal to reactively determine which nodes to render
let content = Computed.make(() => {
if Signal.get(isVisible) {
[
<div class={getClassName()}>
<div class="basefn-alert__content">
{switch title {
| Some(titleText) =>
<div class="basefn-alert__title"> {Node.text(titleText)} </div>
| None => <> </>
}}
<div class="basefn-alert__message">
{Node.signalText(() => Signal.get(message))}
</div>
</div>
{dismissible
? <button class="basefn-alert__dismiss" onClick={_ => handleDismiss()}>
{Node.text("\u00d7")}
</button>
: <> </>}
</div>,
]
} else {
[]
}
})
// Use signalFragment to reactively render the content
Node.signalFragment(content)
}