Skip to content

Commit 8cbaa74

Browse files
Prevent clicking toggle while isLoading is true
1 parent 9f8f546 commit 8cbaa74

File tree

3 files changed

+62
-6
lines changed

3 files changed

+62
-6
lines changed

src/ui/Toggle/Toggle.stories.tsx

+14-4
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,23 @@ export const DisabledToggle: Story = {
4848
}
4949

5050
export const LoadingToggle: Story = {
51-
args: {
52-
isLoading: true,
53-
},
5451
render: (args) => {
5552
const [toggle, setToggle] = useState(false)
53+
const [isLoading, setIsLoading] = useState(false)
54+
const toggler = async () => {
55+
setIsLoading(true)
56+
setTimeout(() => {
57+
setToggle(!toggle)
58+
setIsLoading(false)
59+
}, 2000)
60+
}
5661
return (
57-
<Toggle value={toggle} {...args} onClick={() => setToggle(!toggle)} />
62+
<Toggle
63+
value={toggle}
64+
isLoading={isLoading}
65+
{...args}
66+
onClick={toggler}
67+
/>
5868
)
5969
},
6070
}

src/ui/Toggle/Toggle.test.tsx

+46
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,29 @@ describe('Toggle', () => {
198198
const spinner = screen.getByTestId('toggle-loading-spinner')
199199
expect(spinner).toBeInTheDocument()
200200
})
201+
202+
describe('and is clicked', () => {
203+
it('does not fire onClick', async () => {
204+
const { user } = setup()
205+
const mockFn = vi.fn()
206+
render(
207+
<Toggle
208+
label="🐕"
209+
dataMarketing="marketing"
210+
value={false}
211+
disabled={false}
212+
onClick={mockFn}
213+
isLoading={true}
214+
/>
215+
)
216+
217+
const button = screen.getByRole('button')
218+
219+
await user.click(button)
220+
221+
expect(mockFn).not.toHaveBeenCalled()
222+
})
223+
})
201224
})
202225

203226
describe('when isLoading is false', () => {
@@ -216,6 +239,29 @@ describe('Toggle', () => {
216239
const spinner = screen.queryByTestId('toggle-loading-spinner')
217240
expect(spinner).not.toBeInTheDocument()
218241
})
242+
243+
describe('and is clicked', () => {
244+
it('does fire onClick', async () => {
245+
const { user } = setup()
246+
const mockFn = vi.fn()
247+
render(
248+
<Toggle
249+
label="🐕"
250+
dataMarketing="marketing"
251+
value={false}
252+
disabled={false}
253+
onClick={mockFn}
254+
isLoading={false}
255+
/>
256+
)
257+
258+
const button = screen.getByRole('button')
259+
260+
await user.click(button)
261+
262+
expect(mockFn).toHaveBeenCalled()
263+
})
264+
})
219265
})
220266
})
221267
})

src/ui/Toggle/Toggle.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function Toggle({
2626
<div
2727
data-marketing={`${ID}-${dataMarketing}`}
2828
onClick={() => {
29-
if (!disabled) {
29+
if (!disabled && !isLoading) {
3030
onClick()
3131
}
3232
}}
@@ -45,7 +45,7 @@ function Toggle({
4545
'bg-toggle-active': value,
4646
'bg-toggle-inactive': !value && !disabled,
4747
'bg-toggle-disabled': disabled,
48-
'cursor-not-allowed': disabled,
48+
'cursor-not-allowed': disabled || isLoading,
4949
}
5050
)}
5151
aria-pressed="false"

0 commit comments

Comments
 (0)