import type {FC, ReactNode} from "react"; import {useMemo} from "react"; import {parseToRgba} from "color2k"; import {clsx} from "@heroui/shared-utils"; import {useIsSSR} from "@react-aria/ssr"; export interface SonarPulseProps { children: ReactNode; icon?: ReactNode; size?: number; circlesCount?: number; playState?: "running" | "paused"; color?: string; } export const SonarPulse: FC = ({ children, color = "#FF4ECD", icon, size = 80, circlesCount = 4, playState = "paused", }) => { const isSSR = useIsSSR(); const initialSizeFactor = 1.5; const circleSize = size * initialSizeFactor; const rgbaColors = useMemo(() => { const alpha = 0.4; const length = circlesCount; const factor = alpha / circlesCount; return Array.from({length}).map((_, i) => { const alphaFactor = alpha - i * factor; let rgbaColor = parseToRgba(color); // replace the alpha value by the new one rgbaColor[3] = alphaFactor; return rgbaColor; }); }, [circlesCount, color]); const renderCircles = useMemo(() => { const circles: React.ReactNode[] = []; for (let i = 1; i < circlesCount; i++) { circles.push(
, ); } return circles; }, [rgbaColors, circlesCount, playState, size]); if (isSSR) { return null; } return (
{icon}
{children}
{renderCircles}
); };