ultisuite-client/components/gmail/use-sidebar-touch-options.ts

41 lines
1.2 KiB
TypeScript

"use client"
import { useCallback, useRef, useState } from "react"
import { useLongPress } from "@/hooks/use-long-press"
/** Long-press / context-menu handlers to open a sidebar row options bottom sheet. */
export function useSidebarTouchOptionsMenu(enabled: boolean) {
const [sheetOpen, setSheetOpen] = useState(false)
const lastOpenRef = useRef(0)
const openSheet = useCallback(() => {
const now = Date.now()
if (now - lastOpenRef.current < 400) return
lastOpenRef.current = now
setSheetOpen(true)
}, [])
const longPress = useLongPress(openSheet, { disabled: !enabled })
const touchRowProps = enabled
? {
onContextMenu: (e: React.MouseEvent) => {
e.preventDefault()
e.stopPropagation()
openSheet()
},
onPointerDown: longPress.onPointerDown,
onPointerUp: longPress.onPointerUp,
onPointerLeave: longPress.onPointerLeave,
onPointerCancel: longPress.onPointerCancel,
onClickCapture: longPress.onClickCapture,
}
: {}
const touchRowClassName = enabled ? "select-none" : undefined
const closeSheet = useCallback(() => setSheetOpen(false), [])
return { sheetOpen, setSheetOpen, touchRowProps, touchRowClassName, closeSheet }
}