import React from "react";
interface CalendarIconProps {
icon?: string | React.ReactNode;
className?: string;
onClick?: (event: React.MouseEvent) => void;
}
/**
* `CalendarIcon` is a React component that renders an icon for a calendar.
* The icon can be a string representing a CSS class, a React node, or a default SVG icon.
*
* @component
* @prop icon - The icon to be displayed. This can be a string representing a CSS class or a React node.
* @prop className - An optional string representing additional CSS classes to be applied to the icon.
* @prop onClick - An optional function to be called when the icon is clicked.
*
* @example
* // To use a CSS class as the icon
*
*
* @example
* // To use a React node as the icon
* } onClick={myClickHandler} />
*
* @returns The `CalendarIcon` component.
*/
const CalendarIcon: React.FC = ({
icon,
className = "",
onClick,
}: CalendarIconProps): React.ReactElement => {
const defaultClass = "react-datepicker__calendar-icon";
if (typeof icon === "string") {
return (
);
}
if (React.isValidElement(icon)) {
// Because we are checking that typeof icon is string first, we can safely cast icon as React.ReactElement on types level and code level
const iconElement = icon as React.ReactElement<{
className: string;
onClick: (event: React.MouseEvent) => void;
}>;
return React.cloneElement(iconElement, {
className: `${iconElement.props.className || ""} ${defaultClass} ${className}`,
onClick: (event: React.MouseEvent) => {
if (typeof iconElement.props.onClick === "function") {
iconElement.props.onClick(event);
}
if (typeof onClick === "function") {
onClick(event);
}
},
});
}
// Default SVG Icon
return (
);
};
export default CalendarIcon;