diff --git a/src/Collapse/Collapse.stories.tsx b/src/Collapse/Collapse.stories.tsx index 2f19ecb8..e68f53a0 100644 --- a/src/Collapse/Collapse.stories.tsx +++ b/src/Collapse/Collapse.stories.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useState } from 'react' import { Story, Meta } from '@storybook/react' import Collapse, { CollapseProps } from '.' @@ -83,3 +83,75 @@ export const CustomColorsWithFocusCheckbox: Story = (args) => { ) } + +export const HandlingEvents: Story = (args) => { + const [isOpen, setIsOpen] = useState(false) + + const handleToggle = () => { + console.log('toggled!') + } + + const handleOpen = () => { + setIsOpen(true) + } + + const handleClose = () => { + setIsOpen(false) + } + + return ( +
+ Checkbox is {isOpen ? 'open' : 'closed'}. + + + Click me to show/hide content + + +

tabindex="0" attribute is necessary to make the div focusable

+
+
+
+ ) +} + +export const CheckboxEvents: Story = (args) => { + const [isOpen, setIsOpen] = useState(false) + const handleToggle = () => { + console.log('toggled!') + } + + const handleOpen = () => { + setIsOpen(true) + } + + const handleClose = () => { + setIsOpen(false) + } + + return ( +
+ Checkbox is {isOpen ? 'open' : 'closed'}. + + + Click me to show/hide content + + +

tabindex="0" attribute is necessary to make the div focusable

+
+
+
+ ) +} diff --git a/src/Collapse/Collapse.tsx b/src/Collapse/Collapse.tsx index 06392988..cdda3c20 100644 --- a/src/Collapse/Collapse.tsx +++ b/src/Collapse/Collapse.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { MutableRefObject, useEffect, useRef } from 'react' import clsx from 'clsx' import { twMerge } from 'tailwind-merge' @@ -12,11 +12,25 @@ export type CollapseProps = React.HTMLAttributes & checkbox?: boolean icon?: 'arrow' | 'plus' open?: boolean + onOpen?: () => void + onClose?: () => void + onToggle?: () => void } const Collapse = React.forwardRef( ( - { children, checkbox, icon, open, dataTheme, className, ...props }, + { + children, + checkbox, + icon, + open, + dataTheme, + className, + onOpen, + onClose, + onToggle, + ...props + }, ref ): JSX.Element => { const classes = twMerge( @@ -29,6 +43,34 @@ const Collapse = React.forwardRef( }) ) + const checkboxRef = useRef(null) + + // Handle events for checkbox changes + const handleCheckboxChange = () => { + if (onToggle) { + onToggle() + } + if (onOpen && checkboxRef.current?.checked) { + onOpen() + } else if (onClose && !checkboxRef.current?.checked) { + onClose() + } + } + + // Handle blur events, specifically handling open/close for non checkbox types + const handleBlur = (event: React.FocusEvent) => { + if (!checkbox && onToggle) onToggle() + if (!checkbox && onClose) onClose() + if (props.onBlur) props.onBlur(event) + } + + // Handle focus events, specifically handling open/close for non checkbox types + const handleFocus = (event: React.FocusEvent) => { + if (!checkbox && onToggle) onToggle() + if (!checkbox && onOpen) onOpen() + if (props.onFocus) props.onFocus(event) + } + return (
( tabIndex={0} data-theme={dataTheme} className={classes} + onBlur={handleBlur} + onFocus={handleFocus} > - {checkbox && } + {checkbox && ( + + )} {children}
)