Skip to content

Commit 6d80d6c

Browse files
committed
Refactor ToggleSelection component
1 parent 39527e5 commit 6d80d6c

File tree

1 file changed

+28
-32
lines changed

1 file changed

+28
-32
lines changed

src/Playground.res

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@ module DropdownSelect = {
4242
}
4343

4444
module ToggleSelection = {
45+
module SelectionOption = {
46+
@react.component
47+
let make = (~label, ~isActive, ~disabled, ~onClick) => {
48+
<button
49+
className={"mr-1 px-2 py-1 rounded inline-block " ++ if isActive {
50+
"bg-fire text-white font-bold"
51+
} else {
52+
"bg-gray-80 opacity-50 hover:opacity-80"
53+
}}
54+
onClick
55+
disabled>
56+
{React.string(label)}
57+
</button>
58+
}
59+
}
60+
4561
@react.component
4662
let make = (
4763
~onChange: 'a => unit,
@@ -58,41 +74,21 @@ module ToggleSelection = {
5874
values
5975
}
6076

61-
let selectedIndex = switch Belt.Array.getIndexBy(values, lang => lang === selected) {
62-
| Some(i) => i
63-
| None => 0
64-
}
65-
66-
let elements = Array.mapWithIndex(values, (value, i) => {
67-
let active = i === selectedIndex ? "bg-fire text-white font-bold" : "bg-gray-80 opacity-50"
68-
let label = toLabel(value)
69-
70-
let onMouseDown = evt => {
71-
ReactEvent.Mouse.preventDefault(evt)
72-
ReactEvent.Mouse.stopPropagation(evt)
73-
74-
if i !== selectedIndex {
75-
switch values[i] {
76-
| Some(value) => onChange(value)
77-
| None => ()
77+
<div className={(disabled ? "opacity-25" : "") ++ "flex w-full"}>
78+
{values
79+
->Array.map(value => {
80+
let label = toLabel(value)
81+
let isActive = value === selected
82+
let onClick = _event => {
83+
if !isActive {
84+
onChange(value)
7885
}
7986
}
80-
}
8187

82-
// Required for iOS Safari 12
83-
let onClick = _ => ()
84-
85-
<button
86-
disabled
87-
onMouseDown
88-
onClick
89-
key=label
90-
className={"mr-1 px-2 py-1 rounded inline-block " ++ active}>
91-
{React.string(label)}
92-
</button>
93-
})
94-
95-
<div className={(disabled ? "opacity-25" : "") ++ "flex w-full"}> {React.array(elements)} </div>
88+
<SelectionOption key={label} label isActive onClick disabled />
89+
})
90+
->React.array}
91+
</div>
9692
}
9793
}
9894

0 commit comments

Comments
 (0)