Files
material-you-react/src/primitive-components/button-components/button-layout/button-layout.tsx

43 lines
1.3 KiB
TypeScript
Raw Normal View History

2024-02-01 01:58:19 +04:00
'use client';
2024-02-01 16:23:59 +04:00
import { bool, string } from 'prop-types';
import { RippleArea } from '../../ripple/ripple-area';
2024-02-01 16:23:59 +04:00
import { ButtonLayoutProps } from './button-layout.types';
import useRippleEffect from '../../ripple/hooks/useRippleEffect';
2024-02-01 16:23:59 +04:00
import React, { forwardRef, useId, useRef, useState } from 'react';
2024-02-01 01:58:19 +04:00
2024-02-01 16:23:59 +04:00
export const ButtonLayout = forwardRef<HTMLButtonElement, ButtonLayoutProps>(
2024-02-02 14:39:02 +04:00
({ centralRipple = false, ...props }, ref) => {
2024-02-01 16:23:59 +04:00
const [isActive, setIsActive] = useState<boolean>(false),
ripplesRef = useRef(null),
buttonId = useId(),
events = useRippleEffect(ripplesRef, setIsActive);
2024-02-01 01:58:19 +04:00
2024-02-02 14:39:02 +04:00
const classes =
`m3${isActive ? ' is-active' : ''} ${props.className ?? ''}`.trimEnd();
2024-02-01 01:58:19 +04:00
2024-02-01 16:23:59 +04:00
return (
<button
{...props}
{...events}
className={classes}
2024-02-01 22:24:37 +04:00
disabled={props.disabled}
2024-02-01 16:23:59 +04:00
id={buttonId}
ref={ref}
>
{props.children}
<RippleArea
callback={setIsActive}
central={centralRipple}
ref={ripplesRef}
/>
</button>
);
},
);
2024-02-01 01:58:19 +04:00
2024-02-01 16:23:59 +04:00
ButtonLayout.propTypes = {
children: string,
2024-02-02 14:39:02 +04:00
centralRipple: bool,
2024-02-01 16:23:59 +04:00
};