Skip to content

Commit 889ee37

Browse files
committed
Migrate RLDailog,RLLIcon and RlLRagioGroup to Shoelace React components
1 parent efabe67 commit 889ee37

3 files changed

Lines changed: 56 additions & 98 deletions

File tree

src/components/RLDialog/RLDialog.tsx

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,9 @@
11
import { forwardRef, useImperativeHandle, useCallback, useRef } from 'react'
2+
import SlDialog from '@shoelace-style/shoelace/dist/react/dialog/index.js'
3+
import type SlDialogElement from '@shoelace-style/shoelace/dist/components/dialog/dialog.js'
24
import type { RLDialogProps, RLDialogRef } from './types'
35
import type { SlRequestCloseEvent } from '../utils/types'
46

5-
declare global {
6-
namespace JSX {
7-
interface IntrinsicElements {
8-
'sl-dialog': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
9-
label?: string
10-
open?: boolean
11-
noHeader?: boolean
12-
class?: string
13-
onSlShow?: (event: Event) => void
14-
onSlAfterShow?: (event: Event) => void
15-
onSlHide?: (event: Event) => void
16-
onSlAfterHide?: (event: Event) => void
17-
onSlInitialFocus?: (event: Event) => void
18-
onSlRequestClose?: (event: Event) => void
19-
}
20-
}
21-
}
22-
}
23-
247
export const RLDialog = forwardRef<RLDialogRef, RLDialogProps>(
258
(
269
{
@@ -40,7 +23,7 @@ export const RLDialog = forwardRef<RLDialogRef, RLDialogProps>(
4023
},
4124
ref
4225
) => {
43-
const dialogRef = useRef<HTMLElement & { open: boolean; show: () => void; hide: () => void }>(null)
26+
const dialogRef = useRef<SlDialogElement>(null)
4427

4528
useImperativeHandle(ref, () => ({
4629
open: dialogRef.current?.open,
@@ -49,8 +32,8 @@ export const RLDialog = forwardRef<RLDialogRef, RLDialogProps>(
4932
}))
5033

5134
const handleRequestClose = useCallback(
52-
(event: Event) => {
53-
const evt = event as unknown as SlRequestCloseEvent
35+
(event: CustomEvent) => {
36+
const evt = event as SlRequestCloseEvent
5437
if (noCloseOnOutsideClick && evt.detail.source === 'overlay') {
5538
evt.preventDefault()
5639
return
@@ -63,47 +46,47 @@ export const RLDialog = forwardRef<RLDialogRef, RLDialogProps>(
6346
)
6447

6548
const handleShow = useCallback(
66-
(event: Event) => {
67-
onShow?.(event as unknown as Parameters<NonNullable<typeof onShow>>[0])
49+
(event: CustomEvent) => {
50+
onShow?.(event)
6851
},
6952
[onShow]
7053
)
7154

7255
const handleAfterShow = useCallback(
73-
(event: Event) => {
74-
onAfterShow?.(event as unknown as Parameters<NonNullable<typeof onAfterShow>>[0])
56+
(event: CustomEvent) => {
57+
onAfterShow?.(event)
7558
},
7659
[onAfterShow]
7760
)
7861

7962
const handleHide = useCallback(
80-
(event: Event) => {
81-
onHide?.(event as unknown as Parameters<NonNullable<typeof onHide>>[0])
63+
(event: CustomEvent) => {
64+
onHide?.(event)
8265
},
8366
[onHide]
8467
)
8568

8669
const handleAfterHide = useCallback(
87-
(event: Event) => {
88-
onAfterHide?.(event as unknown as Parameters<NonNullable<typeof onAfterHide>>[0])
70+
(event: CustomEvent) => {
71+
onAfterHide?.(event)
8972
},
9073
[onAfterHide]
9174
)
9275

9376
const handleInitialFocus = useCallback(
94-
(event: Event) => {
95-
onInitialFocus?.(event as unknown as Parameters<NonNullable<typeof onInitialFocus>>[0])
77+
(event: CustomEvent) => {
78+
onInitialFocus?.(event)
9679
},
9780
[onInitialFocus]
9881
)
9982

10083
return (
101-
<sl-dialog
84+
<SlDialog
10285
ref={dialogRef}
103-
class={className ?? 'dialog'}
86+
className={className ?? 'dialog'}
10487
label={label}
105-
open={open || undefined}
106-
noHeader={noHeader || undefined}
88+
open={open}
89+
noHeader={noHeader}
10790
onSlShow={handleShow}
10891
onSlAfterShow={handleAfterShow}
10992
onSlHide={handleHide}
@@ -112,7 +95,7 @@ export const RLDialog = forwardRef<RLDialogRef, RLDialogProps>(
11295
onSlRequestClose={handleRequestClose}
11396
>
11497
{children}
115-
</sl-dialog>
98+
</SlDialog>
11699
)
117100
}
118101
)

src/components/RLIcon/RLIcon.tsx

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
11
import { forwardRef } from 'react'
2+
import SlIcon from '@shoelace-style/shoelace/dist/react/icon/index.js'
3+
import type SlIconElement from '@shoelace-style/shoelace/dist/components/icon/icon.js'
24
import type { RLIconProps } from './types'
35

4-
declare global {
5-
namespace JSX {
6-
interface IntrinsicElements {
7-
'sl-icon': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
8-
name?: string
9-
library?: string
10-
class?: string
11-
}
12-
}
13-
}
14-
}
15-
16-
export const RLIcon = forwardRef<HTMLElement, RLIconProps>(
6+
export const RLIcon = forwardRef<SlIconElement, RLIconProps>(
177
({ name, library = 'default', className, onClick, slot }, ref) => {
188
return (
19-
<sl-icon
9+
<SlIcon
2010
ref={ref}
21-
class={className}
11+
className={className}
2212
library={library}
2313
name={name}
2414
onClick={onClick}

src/components/RLRadioGroup/RLRadioGroup.tsx

Lines changed: 31 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,11 @@
11
import { forwardRef, useImperativeHandle, useCallback, useEffect } from 'react'
2+
import SlRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group/index.js'
3+
import SlRadio from '@shoelace-style/shoelace/dist/react/radio/index.js'
4+
import type SlRadioGroupElement from '@shoelace-style/shoelace/dist/components/radio-group/radio-group.js'
25
import type { RLRadioGroupProps, RLRadioGroupRef } from './types'
36
import { ErrorMessage } from '../utils/ErrorMessage'
47
import { useValidation } from '../../hooks/useValidation'
58

6-
declare global {
7-
namespace JSX {
8-
interface IntrinsicElements {
9-
'sl-radio-group': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
10-
value?: string
11-
label?: string
12-
helpText?: string
13-
name?: string
14-
size?: string
15-
form?: string
16-
required?: boolean
17-
class?: string
18-
}
19-
'sl-radio': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
20-
value?: string
21-
disabled?: boolean
22-
class?: string
23-
}
24-
}
25-
}
26-
}
27-
289
export const RLRadioGroup = forwardRef<RLRadioGroupRef, RLRadioGroupProps>(
2910
(
3011
{
@@ -60,55 +41,59 @@ export const RLRadioGroup = forwardRef<RLRadioGroupRef, RLRadioGroupProps>(
6041
}))
6142

6243
const handleChange = useCallback(
63-
(event: Event) => {
64-
const target = event.target as HTMLInputElement
65-
onChange?.(target?.value ?? '')
66-
onSlChange?.(event as unknown as Parameters<NonNullable<typeof onSlChange>>[0])
44+
(event: CustomEvent) => {
45+
const target = event.target as SlRadioGroupElement
46+
const newValue = target?.value ?? ''
47+
validate(newValue)
48+
onChange?.(newValue)
49+
onSlChange?.(event)
6750
},
68-
[onChange, onSlChange]
51+
[onChange, onSlChange, validate]
6952
)
7053

7154
const handleInput = useCallback(
72-
(event: Event) => {
73-
onInput?.(event as unknown as Parameters<NonNullable<typeof onInput>>[0])
55+
(event: CustomEvent) => {
56+
onInput?.(event)
7457
},
7558
[onInput]
7659
)
7760

7861
const handleInvalid = useCallback(
79-
(event: Event) => {
80-
onInvalid?.(event as unknown as Parameters<NonNullable<typeof onInvalid>>[0])
62+
(event: CustomEvent) => {
63+
onInvalid?.(event)
8164
},
8265
[onInvalid]
8366
)
8467

68+
const combinedClassName = errorMessage ? 'error' : undefined
69+
8570
return (
8671
<div className="relative">
87-
<sl-radio-group
88-
class={errorMessage ? 'error' : undefined}
72+
<SlRadioGroup
73+
className={combinedClassName}
8974
value={value}
90-
label={label || undefined}
91-
helpText={helpText || undefined}
92-
name={name || undefined}
75+
label={label}
76+
helpText={helpText}
77+
name={name}
9378
size={size}
94-
form={form || undefined}
95-
required={required || undefined}
96-
onlsl-change={handleChange}
97-
onsl-invalid={handleInvalid}
98-
onsl-input={handleInput}
79+
form={form}
80+
required={required}
81+
onSlChange={handleChange}
82+
onSlInvalid={handleInvalid}
83+
onSlInput={handleInput}
9984
>
10085
{options.map((radio) => (
101-
<sl-radio
86+
<SlRadio
10287
key={radio.value}
103-
class={errorMessage ? 'error' : undefined}
88+
className={combinedClassName}
10489
value={radio.value}
105-
disabled={radio.disabled || undefined}
90+
disabled={radio.disabled}
10691
>
10792
{radio.label}
108-
</sl-radio>
93+
</SlRadio>
10994
))}
11095
{children}
111-
</sl-radio-group>
96+
</SlRadioGroup>
11297
{errorMessage && <ErrorMessage>{errorMessage}</ErrorMessage>}
11398
</div>
11499
)

0 commit comments

Comments
 (0)