import { useMemo, useState } from "react";
import Checkbox, { type CheckboxValue } from "@peppermint-design/devreadykit";
type Task = { id: number; name: string; completed: CheckboxValue };
const INITIAL_TASKS: Task[] = [
{ id: 1, name: "Task 1", completed: "checked" },
{ id: 2, name: "Task 2", completed: "unchecked" },
{ id: 3, name: "Task 3", completed: "checked" },
];
export default function CheckboxIndeterminateExample() {
const [tasks, setTasks] = useState<Task[]>(INITIAL_TASKS);
const { allCompleted, selectAllValue } = useMemo(() => {
const allChecked = tasks.every((t) => t.completed === "checked");
const someChecked = tasks.some((t) => t.completed === "checked");
const selectAll: CheckboxValue = allChecked
? "checked"
: someChecked
? "indeterminate"
: "unchecked";
return {
allCompleted: allChecked,
selectAllValue: selectAll,
};
}, [tasks]);
const handleSelectAll = (_: CheckboxValue) => {
const next: CheckboxValue = allCompleted ? "unchecked" : "checked";
setTasks((prev) => prev.map((task) => ({ ...task, completed: next })));
};
const handleTaskChange = (id: number) => (value: CheckboxValue) => {
setTasks((prev) =>
prev.map((task) =>
task.id === id ? { ...task, completed: value } : task
)
);
};
return (
<div className="flex items-center flex-col gap-4 w-full">
<div className="w-full max-w-md space-y-3">
<Checkbox
value={selectAllValue}
onValueChange={handleSelectAll}
label="Select All"
allowIndeterminate
/>
{tasks.map((task) => (
<Checkbox
key={task.id}
value={task.completed}
onValueChange={handleTaskChange(task.id)}
label={task.name}
/>
))}
</div>
</div>
);
}