Skip to content

Commit f089aaa

Browse files
committed
fix: mobile deck view
1 parent 103c133 commit f089aaa

4 files changed

Lines changed: 72 additions & 1 deletion

File tree

‎assets/react/src/pages/decks/deck-stack-card.tsx‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

1515
import { cn, titleize } from "../../lib/utils"
1616
import { ShareModeHidden, blurFocusedMenuItem } from "./deck-actions"
1717
import { DeckCardAllocationMenu, DeckCardTagButton } from "./deck-card-allocation"
1818
import { cardImageUrl } from "./deck-card-model"
1919
import { GameChangerBadge } from "./deck-card-display"
2020
import { deckCardTag } from "./deck-card-tags"
21+
import { shouldRevealDeckStackCardOnPointerDown } from "./deck-stack-interactions"
2122
import type { DeckCardEntry, DeckCardTag } from "./deck-types"
2223
import { 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
}}

‎assets/react/src/pages/decks/deck-stack-group.tsx‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ export function DeckStackGroup({
179179
onMove={() => onMove(deckCard)}
180180
onPreview={() => onPreview(deckCard)}
181181
onSetCommander={() => onSetCommander(deckCard)}
182+
onTouchReveal={() => {
183+
clearDeckCardHoverDelay()
184+
setHoveredIndex(null)
185+
setPinnedIndex(index)
186+
}}
182187
onTag={(tag) => onTag(deckCard, tag)}
183188
onToggleProxy={() => onToggleProxy(deckCard)}
184189
onToggleSelected={(selectRange) => onToggleSelected(deckCard.id, selectRange)}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export function shouldRevealDeckStackCardOnPointerDown({
2+
isActive,
3+
pointerType,
4+
}: {
5+
isActive: boolean
6+
pointerType: string
7+
}) {
8+
return pointerType !== "mouse" && !isActive
9+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import test from "node:test"
2+
import assert from "node:assert/strict"
3+
4+
import { shouldRevealDeckStackCardOnPointerDown } from "../src/pages/decks/deck-stack-interactions.ts"
5+
6+
test("touching an inactive deck stack card reveals it instead of activating the card", () => {
7+
assert.equal(
8+
shouldRevealDeckStackCardOnPointerDown({
9+
isActive: false,
10+
pointerType: "touch",
11+
}),
12+
true,
13+
)
14+
})
15+
16+
test("mouse pointers and already-active cards keep their current deck stack behavior", () => {
17+
assert.equal(
18+
shouldRevealDeckStackCardOnPointerDown({
19+
isActive: false,
20+
pointerType: "mouse",
21+
}),
22+
false,
23+
)
24+
assert.equal(
25+
shouldRevealDeckStackCardOnPointerDown({
26+
isActive: true,
27+
pointerType: "touch",
28+
}),
29+
false,
30+
)
31+
})

0 commit comments

Comments
 (0)