IconBase.tsx 755 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { generate } from './utils'
  2. import type { AbstractNode } from './utils'
  3. export type IconData = {
  4. name: string
  5. icon: AbstractNode
  6. }
  7. export type IconBaseProps = {
  8. data: IconData
  9. className?: string
  10. onClick?: React.MouseEventHandler<SVGElement>
  11. style?: React.CSSProperties
  12. }
  13. const IconBase = (
  14. {
  15. ref,
  16. ...props
  17. }: IconBaseProps & {
  18. ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
  19. },
  20. ) => {
  21. const { data, className, onClick, style, ...restProps } = props
  22. return generate(data.icon, `svg-${data.name}`, {
  23. className,
  24. onClick,
  25. style,
  26. 'data-icon': data.name,
  27. 'aria-hidden': 'true',
  28. ...restProps,
  29. 'ref': ref,
  30. })
  31. }
  32. IconBase.displayName = 'IconBase'
  33. export default IconBase