1- import { forwardRef , useImperativeHandle , useCallback , useEffect } from 'react'
1+ import { forwardRef , useImperativeHandle , useCallback , useEffect , useRef } from 'react'
2+ import SlCheckbox from '@shoelace-style/shoelace/dist/react/checkbox/index.js'
3+ import type SlCheckboxElement from '@shoelace-style/shoelace/dist/components/checkbox/checkbox.js'
24import type { RLCheckboxProps , RLCheckboxRef } from './types'
3- import type { SlInputEvent } from '../utils/types'
45import { ErrorMessage } from '../utils/ErrorMessage'
56import { useValidation } from '../../hooks/useValidation'
67
7- declare global {
8- namespace JSX {
9- interface IntrinsicElements {
10- 'sl-checkbox' : React . DetailedHTMLProps < React . HTMLAttributes < HTMLElement > , HTMLElement > & {
11- name ?: string
12- value ?: boolean
13- size ?: string
14- disabled ?: boolean
15- checked ?: boolean
16- indeterminate ?: boolean
17- defaultChecked ?: boolean
18- form ?: string
19- required ?: boolean
20- class ?: string
21- onSlInput ?: ( event : Event ) => void
22- onSlChange ?: ( event : Event ) => void
23- onSlBlur ?: ( event : Event ) => void
24- onSlFocus ?: ( event : Event ) => void
25- onSlInvalid ?: ( event : Event ) => void
26- }
27- }
28- }
29- }
30-
318export const RLCheckbox = forwardRef < RLCheckboxRef , RLCheckboxProps > (
329 (
3310 {
@@ -52,6 +29,13 @@ export const RLCheckbox = forwardRef<RLCheckboxRef, RLCheckboxProps>(
5229 ref
5330 ) => {
5431 const { errorMessage, isValid, validate } = useValidation ( { rules, externalError : error } )
32+ const checkboxRef = useRef < SlCheckboxElement > ( null )
33+
34+ useEffect ( ( ) => {
35+ if ( checkboxRef . current && checked !== undefined && checkboxRef . current . checked !== checked ) {
36+ checkboxRef . current . checked = checked
37+ }
38+ } , [ checked ] )
5539
5640 useEffect ( ( ) => {
5741 if ( checked !== undefined ) {
@@ -64,59 +48,61 @@ export const RLCheckbox = forwardRef<RLCheckboxRef, RLCheckboxProps>(
6448 validate : ( ) => validate ( checked )
6549 } ) )
6650
67- const handleInput = useCallback (
68- ( event : Event ) => {
69- const evt = event as unknown as SlInputEvent
70- const target = evt . target as HTMLInputElement & { checked : boolean }
71- onChange ?.( target ?. checked ?? false )
72- onInput ?.( evt )
51+ const handleChange = useCallback (
52+ ( event : CustomEvent ) => {
53+ const target = event . target as SlCheckboxElement
54+ const newChecked = target ?. checked ?? false
55+ validate ( newChecked )
56+ onChange ?.( newChecked )
57+ onSlChange ?.( event )
7358 } ,
74- [ onChange , onInput ]
59+ [ onChange , onSlChange , validate ]
7560 )
7661
77- const handleChange = useCallback (
78- ( event : Event ) => {
79- onSlChange ?.( event as unknown as Parameters < NonNullable < typeof onSlChange > > [ 0 ] )
62+ const handleInput = useCallback (
63+ ( event : CustomEvent ) => {
64+ onInput ?.( event )
8065 } ,
81- [ onSlChange ]
66+ [ onInput ]
8267 )
8368
8469 const handleBlur = useCallback (
85- ( event : Event ) => {
86- onBlur ?.( event as unknown as Parameters < NonNullable < typeof onBlur > > [ 0 ] )
70+ ( event : CustomEvent ) => {
71+ onBlur ?.( event )
8772 } ,
8873 [ onBlur ]
8974 )
9075
9176 const handleFocus = useCallback (
92- ( event : Event ) => {
93- onFocus ?.( event as unknown as Parameters < NonNullable < typeof onFocus > > [ 0 ] )
77+ ( event : CustomEvent ) => {
78+ onFocus ?.( event )
9479 } ,
9580 [ onFocus ]
9681 )
9782
9883 const handleInvalid = useCallback (
99- ( event : Event ) => {
100- onInvalid ?.( event as unknown as Parameters < NonNullable < typeof onInvalid > > [ 0 ] )
84+ ( event : CustomEvent ) => {
85+ onInvalid ?.( event )
10186 } ,
10287 [ onInvalid ]
10388 )
10489
90+ const combinedClassName = `flex items-center ${ errorMessage ? 'error' : '' } `
91+
10592 return (
10693 < div className = "relative" >
107- < sl-checkbox
108- class = { `flex items-center ${ errorMessage ? 'error' : '' } ` }
109- value = { checked }
110- name = { name || undefined }
94+ < SlCheckbox
95+ ref = { checkboxRef }
96+ className = { combinedClassName }
97+ name = { name }
11198 size = { size }
112- disabled = { disabled || undefined }
113- checked = { checked || undefined }
114- indeterminate = { indeterminate || undefined }
115- defaultChecked = { defaultChecked || undefined }
116- form = { form || undefined }
117- required = { required || undefined }
118- onSlInput = { handleInput }
99+ disabled = { disabled }
100+ defaultChecked = { checked ?? defaultChecked }
101+ indeterminate = { indeterminate }
102+ form = { form }
103+ required = { required }
119104 onSlChange = { handleChange }
105+ onSlInput = { handleInput }
120106 onSlBlur = { handleBlur }
121107 onSlFocus = { handleFocus }
122108 onSlInvalid = { handleInvalid }
@@ -126,7 +112,7 @@ export const RLCheckbox = forwardRef<RLCheckboxRef, RLCheckboxProps>(
126112 { label }
127113 </ span >
128114 ) }
129- </ sl-checkbox >
115+ </ SlCheckbox >
130116 { errorMessage && < ErrorMessage > { errorMessage } </ ErrorMessage > }
131117 </ div >
132118 )
0 commit comments