Skip to content

Commit 8a78105

Browse files
philibeaprotobuf-ci-cd
authored andcommitted
fix(Toggle): side effect broken e2e test
Signed-off-by: protobuf-ci-cd <[email protected]>
1 parent b28f612 commit 8a78105

File tree

3 files changed

+45
-21
lines changed

3 files changed

+45
-21
lines changed

e2e/tests/toggle/render.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Button, Checkbox, Stack, Toggle } from '@ultraviolet/ui'
2+
import { useReducer } from 'react'
3+
4+
const Render = () => {
5+
const [checkbox, toggleCheckbox] = useReducer(r => !r, false)
6+
const [toggle, toggleToggle] = useReducer(r => !r, false)
7+
8+
return (
9+
<Stack gap={1} flex={1}>
10+
<Button name="click me">Click Me</Button>
11+
12+
<Toggle
13+
name="toggle"
14+
label="toggle label"
15+
checked={toggle}
16+
onChange={toggleToggle}
17+
/>
18+
19+
<Checkbox
20+
name="checkbox"
21+
aria-label="checkbox"
22+
checked={checkbox}
23+
onChange={toggleCheckbox}
24+
/>
25+
</Stack>
26+
)
27+
}
28+
export default Render

e2e/tests/toggle/test.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { test } from '@playwright/test'
2+
3+
// replace [Change me] by the name of your test
4+
test('[Change me]', async ({ page, baseURL }) => {
5+
await page.goto(`${baseURL}/toggle`) // replace "template" by the folder name. Foldername should be camelCase.
6+
7+
await page.getByRole('button', { name: 'Click me' }).click()
8+
await page.getByLabel('toggle label').check()
9+
await page.getByLabel('checkbox').check()
10+
})

packages/ui/src/components/Toggle/index.tsx

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
import styled from '@emotion/styled'
44
import type {
5-
ChangeEvent,
65
ChangeEventHandler,
76
InputHTMLAttributes,
87
ReactNode,
98
Ref,
109
} from 'react'
11-
import { forwardRef, useCallback, useEffect, useId, useState } from 'react'
10+
import { forwardRef, useId } from 'react'
1211
import { Row } from '../Row'
1312
import { Stack } from '../Stack'
1413
import { Text } from '../Text'
@@ -151,7 +150,7 @@ const StyledLabel = styled.label<{
151150
labelPosition === 'left' ? 'row' : 'row-reverse'};
152151
153152
&:active ${StyledToggle}[data-disabled='false']:after {
154-
width: ${({ size, theme }) => `calc(${theme.sizing[SIZES[size].ball]} * 1.3775)`};
153+
width: ${({ size, theme }) => `calc(${theme.sizing[SIZES[size].ball]} * 1.3775)`};
155154
}
156155
157156
&[aria-disabled="true"] {
@@ -206,27 +205,14 @@ export const Toggle = forwardRef(
206205
}: ToggleProps,
207206
ref: Ref<HTMLInputElement>,
208207
) => {
209-
const [state, setState] = useState(checked)
210208
const uniqueId = useId()
211-
212-
const onLocalChange = useCallback(
213-
(event: ChangeEvent<HTMLInputElement>) => {
214-
if (onChange) onChange?.(event)
215-
else setState(event.target.checked)
216-
},
217-
[onChange, setState],
218-
)
219-
220-
useEffect(() => {
221-
setState(checked)
222-
}, [checked, setState])
209+
const isCheck = checked ? checked : false
223210

224211
return (
225212
<Tooltip text={tooltip}>
226213
<StyledLabel
227214
aria-disabled={disabled}
228215
size={size}
229-
onClick={evt => evt.stopPropagation()}
230216
className={className}
231217
data-testid={dataTestId}
232218
labelPosition={labelPosition}
@@ -277,17 +263,17 @@ export const Toggle = forwardRef(
277263
</Stack>
278264
<StyledToggle
279265
size={size}
280-
data-checked={state}
266+
data-checked={isCheck}
281267
data-disabled={disabled}
282268
data-error={!!error}
283269
>
284270
<StyledCheckbox
285271
id={id || uniqueId}
286-
checked={state}
287-
aria-checked={state}
272+
checked={isCheck}
273+
aria-checked={isCheck}
288274
disabled={disabled}
289275
name={name}
290-
onChange={onLocalChange}
276+
onChange={onChange}
291277
type="checkbox"
292278
ref={ref}
293279
value={value}

0 commit comments

Comments
 (0)