w-funnel/src/components/widgets/RadioAnswersList/RadioAnswersList.tsx
dev.daminik00 22c6d513af fix
2025-09-26 02:19:22 +02:00

65 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client";
import { cn } from "@/lib/utils";
import {
MainButton,
MainButtonProps,
} from "@/components/ui/MainButton/MainButton";
import { useEffect, useState, useRef } from "react";
export interface RadioAnswersListProps extends React.ComponentProps<"div"> {
answers: MainButtonProps[];
activeAnswer: MainButtonProps | null;
onAnswerClick?: (answer: MainButtonProps | null) => void;
onChangeSelectedAnswer?: (answer: MainButtonProps | null) => void;
}
function RadioAnswersList({
className,
answers,
activeAnswer,
onAnswerClick,
onChangeSelectedAnswer,
...props
}: RadioAnswersListProps) {
const [selectedAnswer, setSelectedAnswer] = useState<MainButtonProps | null>(
activeAnswer
);
const isInitialMount = useRef(true);
useEffect(() => {
setSelectedAnswer(activeAnswer ?? null);
}, [activeAnswer]);
const handleAnswerClick = (answer: MainButtonProps) => {
setSelectedAnswer(answer);
onAnswerClick?.(answer);
};
useEffect(() => {
// НЕ вызываем callback при первоначальной загрузке компонента
if (isInitialMount.current) {
isInitialMount.current = false;
return;
}
onChangeSelectedAnswer?.(selectedAnswer);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [selectedAnswer]);
return (
<div className={cn("flex flex-col gap-3 w-full", className)} {...props}>
{answers.map((answer) => (
<MainButton
key={answer.id}
{...answer}
onClick={() => handleAnswerClick(answer)}
active={selectedAnswer?.id === answer.id}
/>
))}
</div>
);
}
export { RadioAnswersList };