Skip to content

Commit 76951ea

Browse files
committed
refactor: update PropTypes
1 parent 718bcbe commit 76951ea

31 files changed

+168
-105
lines changed

src/components/Types.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import PropTypes from 'prop-types'
2+
13
export type Breakpoints = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'
24

35
export type Colors =
@@ -11,6 +13,20 @@ export type Colors =
1113
| 'light'
1214
| string
1315

16+
export const colorPropType = PropTypes.oneOfType([
17+
PropTypes.oneOf([
18+
'primary',
19+
'secondary',
20+
'success',
21+
'danger',
22+
'warning',
23+
'info',
24+
'dark',
25+
'light',
26+
]),
27+
PropTypes.string,
28+
])
29+
1430
export type Placements =
1531
| 'auto'
1632
| 'auto-start'
@@ -29,6 +45,24 @@ export type Placements =
2945
| 'left-end'
3046
| undefined
3147

48+
export const placementPropType = PropTypes.oneOf<Placements>([
49+
'auto',
50+
'auto-start',
51+
'auto-end',
52+
'top-end',
53+
'top',
54+
'top-start',
55+
'bottom-end',
56+
'bottom',
57+
'bottom-start',
58+
'right-start',
59+
'right',
60+
'right-end',
61+
'left-start',
62+
'left',
63+
'left-end'
64+
])
65+
3266
export type Shapes =
3367
| 'rounded'
3468
| 'rounded-top'
@@ -43,4 +77,23 @@ export type Shapes =
4377
| 'rounded-3'
4478
| string
4579

80+
export const shapePropType = PropTypes.oneOfType([
81+
PropTypes.oneOf([
82+
'rounded',
83+
'rounded-top',
84+
'rounded-end',
85+
'rounded-bottom',
86+
'rounded-start',
87+
'rounded-circle',
88+
'rounded-pill',
89+
'rounded-0',
90+
'rounded-1',
91+
'rounded-2',
92+
'rounded-3',
93+
]),
94+
PropTypes.string,
95+
])
96+
4697
export type Triggers = 'hover' | 'focus' | 'click'
98+
99+
export const triggerPropType = PropTypes.oneOf<Triggers>(['hover', 'focus', 'click'])

src/components/alert/CAlert.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'
33
import classNames from 'classnames'
44
import { Transition } from 'react-transition-group'
55

6-
import { Colors } from '../Types'
6+
import { Colors, colorPropType } from '../Types'
77
import { CButtonClose } from '../button/CButtonClose'
88

99
export interface CAlertProps extends HTMLAttributes<HTMLDivElement> {
@@ -111,7 +111,7 @@ export const CAlert = forwardRef<HTMLDivElement, CAlertProps>(
111111
CAlert.propTypes = {
112112
children: PropTypes.node,
113113
className: PropTypes.string,
114-
color: PropTypes.string.isRequired,
114+
color: colorPropType.isRequired,
115115
dismissible: PropTypes.bool,
116116
onDismiss: PropTypes.func,
117117
onDismissed: PropTypes.func,

src/components/avatar/CAvatar.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { forwardRef, HTMLAttributes } from 'react'
22
import PropTypes from 'prop-types'
33
import classNames from 'classnames'
44

5-
import { Colors, Shapes } from '../Types'
5+
import { Colors, Shapes, colorPropType, shapePropType } from '../Types'
66

77
export interface CAvatarProps extends HTMLAttributes<HTMLDivElement> {
88
/**
@@ -67,8 +67,8 @@ export const CAvatar = forwardRef<HTMLDivElement, CAvatarProps>(
6767
CAvatar.propTypes = {
6868
children: PropTypes.node,
6969
className: PropTypes.string,
70-
color: PropTypes.string,
71-
shape: PropTypes.string,
70+
color: colorPropType,
71+
shape: shapePropType,
7272
size: PropTypes.string,
7373
src: PropTypes.string,
7474
status: PropTypes.string,

src/components/badge/CBadge.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { ElementType, forwardRef, HTMLAttributes } from 'react'
22
import PropTypes from 'prop-types'
33
import classNames from 'classnames'
44

5-
import { Colors, Shapes } from '../Types'
5+
import { Colors, Shapes, colorPropType, shapePropType } from '../Types'
66

77
export interface CBadgeProps extends HTMLAttributes<HTMLDivElement | HTMLSpanElement> {
88
/**
@@ -58,9 +58,9 @@ export const CBadge = forwardRef<HTMLDivElement | HTMLSpanElement, CBadgeProps>(
5858
CBadge.propTypes = {
5959
children: PropTypes.node,
6060
className: PropTypes.string,
61-
color: PropTypes.string,
61+
color: colorPropType,
6262
component: PropTypes.string,
63-
shape: PropTypes.string,
63+
shape: shapePropType,
6464
textColor: PropTypes.string,
6565
}
6666

src/components/button/CButton.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { ButtonHTMLAttributes, ElementType, forwardRef } from 'react'
22
import PropTypes from 'prop-types'
33
import classNames from 'classnames'
44

5-
import { Colors, Shapes } from '../Types'
5+
import { Colors, Shapes, colorPropType } from '../Types'
66
import { CLink } from '../link/CLink'
77

88
export interface CButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
@@ -101,7 +101,7 @@ export const CButton = forwardRef<HTMLButtonElement | HTMLAnchorElement, CButton
101101
CButton.propTypes = {
102102
children: PropTypes.node,
103103
className: PropTypes.string,
104-
color: PropTypes.string,
104+
color: colorPropType,
105105
component: PropTypes.elementType,
106106
shape: PropTypes.string,
107107
size: PropTypes.oneOf(['sm', 'lg']),

src/components/callout/CCallout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { forwardRef, HTMLAttributes } from 'react'
22
import PropTypes from 'prop-types'
33
import classNames from 'classnames'
44

5-
import { Colors } from '../Types'
5+
import { Colors, colorPropType } from '../Types'
66

77
export interface CCalloutProps extends HTMLAttributes<HTMLDivElement> {
88
/**
@@ -38,7 +38,7 @@ export const CCallout = forwardRef<HTMLDivElement, CCalloutProps>(
3838
CCallout.propTypes = {
3939
children: PropTypes.node,
4040
className: PropTypes.string,
41-
color: PropTypes.string,
41+
color: colorPropType,
4242
}
4343

4444
CCallout.displayName = 'CCallout'

src/components/card/CCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { forwardRef, HTMLAttributes } from 'react'
22
import PropTypes from 'prop-types'
33
import classNames from 'classnames'
44

5-
import { Colors } from '../Types'
5+
import { Colors, colorPropType } from '../Types'
66

77
export interface CCardProps extends HTMLAttributes<HTMLDivElement> {
88
/**
@@ -45,7 +45,7 @@ export const CCard = forwardRef<HTMLDivElement, CCardProps>(
4545
CCard.propTypes = {
4646
children: PropTypes.node,
4747
className: PropTypes.string,
48-
color: PropTypes.string,
48+
color: colorPropType,
4949
textColor: PropTypes.string,
5050
}
5151

src/components/dropdown/CDropdown.tsx

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@ import PropTypes from 'prop-types'
1111
import classNames from 'classnames'
1212
import { Manager } from 'react-popper'
1313

14-
import { Placements } from '../Types'
14+
import { Placements, placementPropType } from '../Types'
1515
import { useForkedRef } from '../../utils/hooks'
1616

17-
// import { CDropdownMenuProps } from './CDropdownMenu'
18-
1917
export type Directions = 'start' | 'end'
2018

2119
export type Breakpoints =
@@ -30,7 +28,7 @@ export type Alignments = Directions | Breakpoints
3028

3129
export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIElement> {
3230
/**
33-
* @type { 'left' | 'right' | { xs: 'left' | 'right' } | { sm: 'left' | 'right' } | { md: 'left' | 'right' } | { lg: 'left' | 'right' } | { xl: 'left' | 'right'} | { xxl: 'left' | 'right'} }
31+
* @type { 'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } | { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} | { xxl: 'start' | 'end'} }
3432
*/
3533
alignment?: Alignments
3634
/**
@@ -110,11 +108,6 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
110108
popper = false
111109
}
112110

113-
// Disable popper if dropdown is in nav.
114-
// if (variant === 'nav-item') {
115-
// popper = false
116-
// }
117-
118111
const contextValues = {
119112
alignment,
120113
dark,
@@ -138,12 +131,12 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
138131
useEffect(() => {
139132
window.addEventListener('click', handleClickOutside)
140133
window.addEventListener('keyup', handleKeyup)
141-
// window.addEventListener('mouseover', handleKeyup)
134+
// TODO: consider to add in future releases `window.addEventListener('mouseover', handleKeyup)`
142135

143136
return () => {
144137
window.removeEventListener('click', handleClickOutside)
145138
window.removeEventListener('keyup', handleKeyup)
146-
// window.removeEventListener('mouseover', handleKeyup)
139+
// TODO: consider to add in future releases `window.addEventListener('mouseover', handleKeyup)`
147140
}
148141
})
149142

@@ -181,13 +174,13 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
181174
)
182175

183176
CDropdown.propTypes = {
184-
alignment: PropTypes.any, // TODO: refactor
177+
alignment: PropTypes.any, // TODO: fix; add proper PropTypes
185178
children: PropTypes.node,
186179
className: PropTypes.string,
187180
component: PropTypes.elementType,
188181
dark: PropTypes.bool,
189182
direction: PropTypes.oneOf(['dropup', 'dropend', 'dropstart']),
190-
placement: PropTypes.any, // TODO: refactor
183+
placement: placementPropType,
191184
popper: PropTypes.bool,
192185
variant: PropTypes.oneOf(['btn-group', 'dropdown', 'nav-item']),
193186
visible: PropTypes.bool,

src/components/dropdown/CDropdownToggle.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'
33
import classNames from 'classnames'
44
import { Reference } from 'react-popper'
55

6-
import { Triggers } from '../Types'
6+
import { Triggers, triggerPropType } from '../Types'
77

88
import { CButton, CButtonProps } from '../button/CButton'
99
import { CDropdownContext } from './CDropdown'
@@ -54,7 +54,7 @@ export const CDropdownToggle: FC<CDropdownToggleProps> = ({
5454
onFocus: () => setVisible(true),
5555
onBlur: () => setVisible(false),
5656
}),
57-
// TODO: add hover trigger
57+
// TODO: consider to add in future releases
5858
// ...((trigger === 'hover' || trigger.includes('hover')) && {
5959
// onMouseEnter: () => setVisible(true),
6060
// onMouseLeave: () => setVisible(false),
@@ -67,7 +67,6 @@ export const CDropdownToggle: FC<CDropdownToggleProps> = ({
6767
...triggers,
6868
}
6969

70-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
7170
const Toggler = (ref?: React.Ref<any>) => {
7271
return variant === 'nav-item' ? (
7372
<a href="#" {...togglerProps} ref={ref}>
@@ -89,7 +88,7 @@ CDropdownToggle.propTypes = {
8988
children: PropTypes.node,
9089
className: PropTypes.string,
9190
split: PropTypes.bool,
92-
trigger: PropTypes.any, //TODO: refactor
91+
trigger: triggerPropType
9392
}
9493

9594
CDropdownToggle.displayName = 'CDropdownToggle'

src/components/form/CFormCheck.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { forwardRef, HTMLAttributes } from 'react'
22
import PropTypes from 'prop-types'
33
import classNames from 'classnames'
44

5-
import { Colors, Shapes } from '../Types'
5+
import { Colors, Shapes, colorPropType, shapePropType } from '../Types'
66

77
import { CFormControl } from './CFormControl'
88
import { CFormLabel } from './CFormLabel'
@@ -64,10 +64,10 @@ export interface CFormCheckProps extends HTMLAttributes<HTMLInputElement> {
6464
/**
6565
* Specifies the type of component. [docs]
6666
*
67-
* @type checkbox' | 'radio' | string
67+
* @type checkbox' | 'radio'
6868
* @default 'checkbox'
6969
*/
70-
type?: 'checkbox' | 'radio' | string
70+
type?: 'checkbox' | 'radio'
7171
/**
7272
* Set component validation state to valid. [docs]
7373
*/
@@ -161,8 +161,8 @@ export const CFormCheck = forwardRef<HTMLInputElement, CFormCheckProps>(
161161

162162
CFormCheck.propTypes = {
163163
button: PropTypes.bool,
164-
buttonColor: PropTypes.string,
165-
buttonShape: PropTypes.string,
164+
buttonColor: colorPropType,
165+
buttonShape: shapePropType,
166166
buttonSize: PropTypes.oneOf(['sm', 'lg']),
167167
buttonVariant: PropTypes.oneOf(['outline', 'ghost']),
168168
className: PropTypes.string,
@@ -172,7 +172,7 @@ CFormCheck.propTypes = {
172172
label: PropTypes.string,
173173
size: PropTypes.oneOf(['lg', 'xl']),
174174
switch: PropTypes.bool,
175-
type: PropTypes.string, // TODO: check
175+
type: PropTypes.oneOf(['checkbox', 'radio']),
176176
valid: PropTypes.bool,
177177
}
178178

0 commit comments

Comments
 (0)