2025-06-24 00:04:36 -07:00
|
|
|
import clsx from 'clsx';
|
|
|
|
|
import { motion } from 'motion/react';
|
|
|
|
|
import { forwardRef, ReactNode } from 'react';
|
2025-05-18 14:03:18 -07:00
|
|
|
|
2025-06-24 00:04:36 -07:00
|
|
|
import styles from './player-button.module.css';
|
2025-05-18 14:03:18 -07:00
|
|
|
|
2025-06-24 00:04:36 -07:00
|
|
|
import { ActionIcon, ActionIconProps } from '/@/shared/components/action-icon/action-icon';
|
|
|
|
|
import { Tooltip, TooltipProps } from '/@/shared/components/tooltip/tooltip';
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2025-06-24 00:04:36 -07:00
|
|
|
interface PlayerButtonProps extends Omit<ActionIconProps, 'icon' | 'variant'> {
|
2023-07-01 19:10:05 -07:00
|
|
|
icon: ReactNode;
|
2025-06-24 00:04:36 -07:00
|
|
|
isActive?: boolean;
|
2023-07-01 19:10:05 -07:00
|
|
|
tooltip?: Omit<TooltipProps, 'children'>;
|
|
|
|
|
variant: 'main' | 'secondary' | 'tertiary';
|
2022-12-19 15:59:14 -08:00
|
|
|
}
|
|
|
|
|
|
2023-05-21 07:33:22 -07:00
|
|
|
export const PlayerButton = forwardRef<HTMLDivElement, PlayerButtonProps>(
|
2025-06-24 00:04:36 -07:00
|
|
|
({ icon, isActive, tooltip, variant, ...rest }: PlayerButtonProps, ref) => {
|
2023-07-01 19:10:05 -07:00
|
|
|
if (tooltip) {
|
|
|
|
|
return (
|
|
|
|
|
<Tooltip {...tooltip}>
|
2025-06-24 00:04:36 -07:00
|
|
|
<motion.div
|
|
|
|
|
className={clsx({
|
|
|
|
|
[styles.main]: variant === 'main',
|
|
|
|
|
[styles.motionWrapper]: true,
|
|
|
|
|
})}
|
2023-07-01 19:10:05 -07:00
|
|
|
ref={ref}
|
|
|
|
|
>
|
2025-06-24 00:04:36 -07:00
|
|
|
<ActionIcon
|
|
|
|
|
className={clsx(styles.playerButton, styles[variant], {
|
|
|
|
|
[styles.active]: isActive,
|
|
|
|
|
})}
|
2023-07-01 19:10:05 -07:00
|
|
|
{...rest}
|
2024-09-01 19:42:01 -04:00
|
|
|
onClick={(e) => {
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
rest.onClick?.(e);
|
|
|
|
|
}}
|
2025-06-24 00:04:36 -07:00
|
|
|
variant="transparent"
|
2023-07-01 19:10:05 -07:00
|
|
|
>
|
|
|
|
|
{icon}
|
2025-06-24 00:04:36 -07:00
|
|
|
</ActionIcon>
|
|
|
|
|
</motion.div>
|
2023-07-01 19:10:05 -07:00
|
|
|
</Tooltip>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
2025-06-24 00:04:36 -07:00
|
|
|
<motion.div
|
|
|
|
|
className={clsx({
|
|
|
|
|
[styles.main]: variant === 'main',
|
|
|
|
|
[styles.motionWrapper]: true,
|
|
|
|
|
})}
|
2023-07-01 19:10:05 -07:00
|
|
|
ref={ref}
|
2023-05-21 07:33:22 -07:00
|
|
|
>
|
2025-06-24 00:04:36 -07:00
|
|
|
<ActionIcon
|
|
|
|
|
className={clsx(styles.playerButton, styles[variant], {
|
|
|
|
|
[styles.active]: isActive,
|
|
|
|
|
})}
|
2023-07-01 19:10:05 -07:00
|
|
|
{...rest}
|
2024-09-01 19:42:01 -04:00
|
|
|
onClick={(e) => {
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
rest.onClick?.(e);
|
|
|
|
|
}}
|
2025-06-24 00:04:36 -07:00
|
|
|
size="compact-md"
|
|
|
|
|
variant="transparent"
|
2023-07-01 19:10:05 -07:00
|
|
|
>
|
|
|
|
|
{icon}
|
2025-06-24 00:04:36 -07:00
|
|
|
</ActionIcon>
|
|
|
|
|
</motion.div>
|
2023-07-01 19:10:05 -07:00
|
|
|
);
|
|
|
|
|
},
|
2023-05-21 07:33:22 -07:00
|
|
|
);
|