Skip to content
Open
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 48 additions & 6 deletions src/components/Common/ResourceDefinitionCategoryPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
Star,
X,
} from "lucide-react";
import { useEffect, useMemo, useState } from "react";
import { useEffect, useMemo, useRef, useState } from "react";
import { useTranslation } from "react-i18next";

import { Badge } from "@/components/ui/badge";
Expand Down Expand Up @@ -159,6 +159,8 @@ export function ResourceDefinitionCategoryPicker<T>({
);
const [searchQuery, setSearchQuery] = useState("");
const [breadcrumbsExpanded, setBreadcrumbsExpanded] = useState(false);
// Set on touch/pen pointerup to avoid double selection from the following onSelect.
const pointerSelectedRef = useRef(false);
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

// Sync open state with defaultOpen prop for controlled auto-open behavior
useEffect(() => {
Expand Down Expand Up @@ -580,9 +582,19 @@ export function ResourceDefinitionCategoryPicker<T>({
<CommandItem
key={category.id}
value={category.title}
onSelect={() =>
handleCategorySelect(category.slug, category.title)
}
onSelect={() => {
if (pointerSelectedRef.current) {
pointerSelectedRef.current = false;
return;
}
handleCategorySelect(category.slug, category.title);
}}
onPointerUp={(e) => {
if (e.pointerType !== "mouse") {
pointerSelectedRef.current = true;
handleCategorySelect(category.slug, category.title);
}
}}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
className="flex items-center justify-between p-3 cursor-pointer hover:bg-gray-50 hover:text-gray-900 transition-colors duration-150 border-b border-gray-200"
>
<div className="flex items-center gap-2 min-w-0 flex-1">
Expand All @@ -609,7 +621,19 @@ export function ResourceDefinitionCategoryPicker<T>({
<CommandItem
key={category.id}
value={category.title}
onSelect={() => handleCategorySelect(category.slug, category.title)}
onSelect={() => {
if (pointerSelectedRef.current) {
pointerSelectedRef.current = false;
return;
}
handleCategorySelect(category.slug, category.title);
}}
onPointerUp={(e) => {
if (e.pointerType !== "mouse") {
pointerSelectedRef.current = true;
handleCategorySelect(category.slug, category.title);
}
}}
className="flex items-center justify-between p-3 cursor-pointer hover:bg-gray-50 hover:text-gray-900 transition-colors duration-150 border-b border-gray-200"
>
<div className="flex items-center gap-2 min-w-0 flex-1">
Expand Down Expand Up @@ -639,7 +663,22 @@ export function ResourceDefinitionCategoryPicker<T>({
<CommandItem
key={definition.id}
value={`${definition.title}-${definition.id}`}
onSelect={() => handleDefinitionSelect(definition)}
onSelect={() => {
if (pointerSelectedRef.current) {
pointerSelectedRef.current = false;
return;
}
handleDefinitionSelect(definition);
}}
onPointerUp={(e) => {
if (e.pointerType !== "mouse") {
// Ignore taps on the favorite toggle button
if (e.target instanceof Element && e.target.closest("button"))
return;
pointerSelectedRef.current = true;
handleDefinitionSelect(definition);
}
}}
className={cn(
"flex items-center justify-between p-3 cursor-pointer hover:bg-gray-50 hover:text-gray-900 transition-colors duration-150 border-b border-gray-200 last:border-b-0",
searchQuery && definition.category && "py-1",
Expand Down Expand Up @@ -688,6 +727,7 @@ export function ResourceDefinitionCategoryPicker<T>({

const renderRecentItems = () => (
<div
data-vaul-no-drag
className={cn(
"overflow-auto min-h-0",
isMobile ? "max-h-full" : "max-h-[40vh]",
Expand Down Expand Up @@ -726,6 +766,7 @@ export function ResourceDefinitionCategoryPicker<T>({

const renderFavoriteItems = () => (
<div
data-vaul-no-drag
className={cn(
"overflow-auto min-h-0",
isMobile ? "max-h-full" : "max-h-[40vh]",
Expand Down Expand Up @@ -776,6 +817,7 @@ export function ResourceDefinitionCategoryPicker<T>({
{renderSearchInput()}
{renderBreadcrumbs()}
<CommandList
data-vaul-no-drag
className={cn(isMobile ? "max-h-full h-[40vh]" : "max-h-[40vh]")}
>
{renderEmptyState()}
Expand Down
Loading