Resolve errors and pass tests
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { memo, useCallback, useId, useState, useEffect } from "react";
|
||||
import { memo, useCallback, useId, useState } from "react";
|
||||
import { CheckboxGroupView } from "./CheckboxGroup.view";
|
||||
import type { CheckboxGroupProps } from "./CheckboxGroup.types";
|
||||
|
||||
@@ -18,15 +18,11 @@ const CheckboxGroupContainer = ({
|
||||
const generatedId = useId();
|
||||
const groupId = name || `checkbox-group-${generatedId}`;
|
||||
|
||||
// Internal state to track checked values
|
||||
const [checkedValues, setCheckedValues] = useState<string[]>(value || []);
|
||||
|
||||
// Sync internal state with external value prop
|
||||
useEffect(() => {
|
||||
if (value !== undefined) {
|
||||
setCheckedValues(value);
|
||||
}
|
||||
}, [value]);
|
||||
// Internal state to track checked values (only used if value prop is not provided)
|
||||
const [internalCheckedValues, setInternalCheckedValues] = useState<string[]>([]);
|
||||
|
||||
// Use controlled value if provided, otherwise use internal state
|
||||
const checkedValues = value !== undefined ? value : internalCheckedValues;
|
||||
|
||||
const handleOptionChange = useCallback(
|
||||
(optionValue: string, checked: boolean) => {
|
||||
@@ -36,13 +32,16 @@ const CheckboxGroupContainer = ({
|
||||
? [...checkedValues, optionValue]
|
||||
: checkedValues.filter((v) => v !== optionValue);
|
||||
|
||||
setCheckedValues(newCheckedValues);
|
||||
// Only update internal state if uncontrolled
|
||||
if (value === undefined) {
|
||||
setInternalCheckedValues(newCheckedValues);
|
||||
}
|
||||
|
||||
if (onChange) {
|
||||
onChange({ value: newCheckedValues });
|
||||
}
|
||||
},
|
||||
[disabled, checkedValues, onChange],
|
||||
[disabled, checkedValues, onChange, value],
|
||||
);
|
||||
|
||||
return (
|
||||
|
||||
@@ -16,7 +16,6 @@ const RadioButtonContainer = ({
|
||||
value,
|
||||
ariaLabel,
|
||||
className = "",
|
||||
...props
|
||||
}: RadioButtonProps) => {
|
||||
const isInverse = mode === "inverse";
|
||||
const isStandard = mode === "standard";
|
||||
@@ -82,23 +81,6 @@ const RadioButtonContainer = ({
|
||||
|
||||
const combinedBoxStyles = getBoxStyles();
|
||||
|
||||
// Dot color per Figma
|
||||
// Selected state: light cream/yellow (#fefcc9)
|
||||
// Selected hover state: darker yellow/brown (#333000 or rgba(51, 48, 0, 1))
|
||||
const getDotColor = (): string => {
|
||||
if (!checked) return "transparent";
|
||||
|
||||
if (isStandard) {
|
||||
// Use CSS to handle hover state - default is light cream, hover is darker
|
||||
return "var(--color-content-default-brand-primary, #fefcc9)";
|
||||
}
|
||||
|
||||
// Inverse mode: black dot
|
||||
return "var(--color-content-default-primary, #000000)";
|
||||
};
|
||||
|
||||
const dotColor = getDotColor();
|
||||
|
||||
// Label color
|
||||
const labelColor = isInverse
|
||||
? "var(--color-content-inverse-primary)"
|
||||
@@ -139,7 +121,6 @@ const RadioButtonContainer = ({
|
||||
ariaLabel={ariaLabel}
|
||||
className={className}
|
||||
combinedBoxStyles={combinedBoxStyles}
|
||||
dotColor={dotColor}
|
||||
labelColor={labelColor}
|
||||
onToggle={handleToggle}
|
||||
onKeyDown={handleKeyDown}
|
||||
|
||||
@@ -24,7 +24,6 @@ export interface RadioButtonViewProps {
|
||||
ariaLabel?: string;
|
||||
className: string;
|
||||
combinedBoxStyles: string;
|
||||
dotColor: string;
|
||||
labelColor: string;
|
||||
onToggle: (_e: React.MouseEvent | React.KeyboardEvent) => void;
|
||||
onKeyDown: (_e: React.KeyboardEvent<HTMLSpanElement>) => void;
|
||||
|
||||
@@ -11,7 +11,6 @@ export function RadioButtonView({
|
||||
ariaLabel,
|
||||
className,
|
||||
combinedBoxStyles,
|
||||
dotColor,
|
||||
labelColor,
|
||||
onToggle,
|
||||
onKeyDown,
|
||||
|
||||
@@ -59,7 +59,6 @@ export function SelectInputView({
|
||||
menuRef,
|
||||
ariaLabelledby,
|
||||
ariaInvalid,
|
||||
...props
|
||||
}: SelectInputViewProps) {
|
||||
// Styles based on Figma design
|
||||
const containerClasses = "flex flex-col gap-[8px]";
|
||||
|
||||
Reference in New Issue
Block a user