11import type { ReactNode } from "react"
2- import { useEffect , useMemo , useState } from "react"
3- import { clsx } from "clsx"
4-
5- import { ChevronLeftIcon } from "@/icons"
2+ import { useMemo } from "react"
63
74export interface CheckboxTreeItem {
85 id : string
@@ -38,7 +35,7 @@ export function CheckboxTree({
3835} : CheckboxTreeProps ) {
3936 const normalizedSearch = searchQuery ?. trim ( ) . toLowerCase ( ) ?? ""
4037
41- const { allParentIds , defaultExpanded , preparedItems } = useMemo ( ( ) => {
38+ const { preparedItems } = useMemo ( ( ) => {
4239 const parentIds = new Set < string > ( )
4340 const defaultOpen = new Set < string > ( )
4441
@@ -70,23 +67,10 @@ export function CheckboxTree({
7067
7168 return {
7269 allParentIds : parentIds ,
73- defaultExpanded : defaultOpen ,
7470 preparedItems : enhance ( items , 0 ) ,
7571 }
7672 } , [ items , normalizedSearch ] )
7773
78- const [ expandedItems , setExpandedItems ] = useState (
79- ( ) => new Set ( defaultExpanded ) ,
80- )
81-
82- useEffect ( ( ) => {
83- if ( ! normalizedSearch ) {
84- setExpandedItems ( new Set ( defaultExpanded ) )
85- return
86- }
87- setExpandedItems ( new Set ( allParentIds ) )
88- } , [ normalizedSearch , allParentIds , defaultExpanded ] )
89-
9074 const filteredTree = useMemo ( ( ) => {
9175 function markVisibility ( node : PreparedTree ) : PreparedTree | null {
9276 const { children } = node
@@ -121,21 +105,8 @@ export function CheckboxTree({
121105 }
122106 }
123107
124- const toggleExpand = ( id : string ) => {
125- setExpandedItems ( prev => {
126- const next = new Set ( prev )
127- if ( next . has ( id ) ) {
128- next . delete ( id )
129- } else {
130- next . add ( id )
131- }
132- return next
133- } )
134- }
135-
136108 const renderTree = ( nodes : PreparedTree [ ] ) : ReactNode => {
137109 return nodes . map ( node => {
138- const isExpanded = expandedItems . has ( node . id )
139110 const isSelectable = Boolean ( node . value )
140111 const checkboxId = `checkbox-tree-${ node . id } `
141112
@@ -145,24 +116,6 @@ export function CheckboxTree({
145116 className = "flex items-start gap-2 py-1"
146117 style = { { paddingInlineStart : node . depth * 16 } }
147118 >
148- { node . children && node . children . length > 0 ? (
149- < button
150- type = "button"
151- aria-expanded = { isExpanded }
152- onClick = { ( ) => toggleExpand ( node . id ) }
153- className = "mt-0.5 flex size-5 items-center justify-center text-neu-500 transition-colors hover:text-pri-base"
154- >
155- < ChevronLeftIcon
156- className = { clsx (
157- "size-4 transition-transform" ,
158- isExpanded ? "-rotate-90" : "rotate-180" ,
159- ) }
160- />
161- </ button >
162- ) : (
163- < span className = "mt-0.5 block size-5" aria-hidden />
164- ) }
165-
166119 { isSelectable ? (
167120 < label
168121 htmlFor = { checkboxId }
@@ -196,7 +149,7 @@ export function CheckboxTree({
196149 ) }
197150 </ div >
198151
199- { node . children && node . children . length > 0 && isExpanded ? (
152+ { node . children && node . children . length > 0 ? (
200153 < div > { renderTree ( node . children ) } </ div >
201154 ) : null }
202155 </ div >
0 commit comments