Files
feishin/src/renderer/features/search/components/command-item-selectable.tsx
T
Kendall Garner a32fed3bcf chore: upgrade dependencies (#1906)
* upgrade dependencies

* downgrade fast-average-color
2026-04-04 17:10:57 -07:00

40 lines
1.1 KiB
TypeScript

import { Command } from 'cmdk';
import { ComponentPropsWithoutRef, ReactNode, useEffect, useRef, useState } from 'react';
interface CommandItemSelectableProps extends Omit<
ComponentPropsWithoutRef<typeof Command.Item>,
'children'
> {
children: (args: { isHighlighted: boolean }) => ReactNode;
}
export function CommandItemSelectable({ children, ...itemProps }: CommandItemSelectableProps) {
const ref = useRef<HTMLDivElement>(null);
const [isHighlighted, setIsHighlighted] = useState(false);
useEffect(() => {
const el = ref.current;
if (!el) return;
setIsHighlighted(el.getAttribute('aria-selected') === 'true');
const observer = new MutationObserver(() => {
const selected = el.getAttribute('aria-selected') === 'true';
setIsHighlighted(selected);
});
observer.observe(el, {
attributeFilter: ['aria-selected'],
attributes: true,
});
return () => observer.disconnect();
}, []);
return (
<Command.Item {...itemProps} ref={ref}>
{children({ isHighlighted })}
</Command.Item>
);
}