@@ -10,14 +10,15 @@ import {
1010 Tag ,
1111 Trash2 ,
1212} from "lucide-react"
13- import { useState , type FocusEvent } from "react"
13+ import { useRef , useState , type FocusEvent , type PointerEvent } from "react"
1414
1515import { cn , titleize } from "../../lib/utils"
1616import { ShareModeHidden , blurFocusedMenuItem } from "./deck-actions"
1717import { DeckCardAllocationMenu , DeckCardTagButton } from "./deck-card-allocation"
1818import { cardImageUrl } from "./deck-card-model"
1919import { GameChangerBadge } from "./deck-card-display"
2020import { deckCardTag } from "./deck-card-tags"
21+ import { shouldRevealDeckStackCardOnPointerDown } from "./deck-stack-interactions"
2122import type { DeckCardEntry , DeckCardTag } from "./deck-types"
2223import { DECK_CARD_TAGS } from "./deck-types"
2324
@@ -41,6 +42,7 @@ export function DeckStackCard({
4142 onPreview,
4243 onSetCommander,
4344 onTag,
45+ onTouchReveal,
4446 onToggleProxy,
4547 onToggleSelected,
4648 shareMode = false ,
@@ -66,6 +68,7 @@ export function DeckStackCard({
6668 onPreview : ( ) => void
6769 onSetCommander : ( ) => void
6870 onToggleProxy : ( ) => void
71+ onTouchReveal : ( ) => void
6972 onTag : ( tag : DeckCardTag | null ) => void
7073 onToggleSelected : ( selectRange ?: boolean ) => void
7174 shareMode ?: boolean
@@ -74,6 +77,7 @@ export function DeckStackCard({
7477} ) {
7578 const [ hasFocusWithin , setHasFocusWithin ] = useState ( false )
7679 const [ isAllocationMenuOpen , setIsAllocationMenuOpen ] = useState ( false )
80+ const touchRevealWasActivatedRef = useRef ( false )
7781 const imageUrl = cardImageUrl ( deckCard , "imageUrl" )
7882 const name = deckCard . card ?. name || "Unknown card"
7983 const printing = deckCard . preferredPrinting || deckCard . card ?. printings ?. [ 0 ]
@@ -88,6 +92,22 @@ export function DeckStackCard({
8892 }
8993 }
9094
95+ function handlePointerDown ( event : PointerEvent < HTMLButtonElement > ) {
96+ touchRevealWasActivatedRef . current = false
97+
98+ if (
99+ ! shouldRevealDeckStackCardOnPointerDown ( {
100+ isActive,
101+ pointerType : event . pointerType ,
102+ } )
103+ ) {
104+ return
105+ }
106+
107+ touchRevealWasActivatedRef . current = true
108+ onTouchReveal ( )
109+ }
110+
91111 return (
92112 < article
93113 className = { cn (
@@ -264,7 +284,13 @@ export function DeckStackCard({
264284 type = "button"
265285 className = "block w-full cursor-pointer text-left"
266286 aria-label = { `View ${ name } details` }
287+ onPointerDown = { handlePointerDown }
267288 onClick = { ( event ) => {
289+ if ( touchRevealWasActivatedRef . current ) {
290+ touchRevealWasActivatedRef . current = false
291+ event . preventDefault ( )
292+ return
293+ }
268294 if ( isSelecting ) onToggleSelected ( event . shiftKey )
269295 else onPreview ( )
270296 } }
0 commit comments