From df172a452fc492b207bef9701647906dd9877eee Mon Sep 17 00:00:00 2001 From: YSH Date: Sat, 20 Dec 2025 02:30:58 -0800 Subject: [PATCH 1/3] fix: toggle item gallery detail on mobile --- changelog.md | 2 ++ item-optimizer/src/components/ItemGallery.tsx | 29 +++++++++++++++++-- .../components/__tests__/ItemGallery.test.tsx | 29 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index 729aa5a..232f4ea 100644 --- a/changelog.md +++ b/changelog.md @@ -50,3 +50,5 @@ 2025-11-08 move wiki data loading into a built workspace dependency and add provider tests wiki-data-reader item-optimizer/src/itemDataProvider.ts item-optimizer/src/__tests__ 2025-11-08 add wiki snapshot refresh + parser/update scripts with hero ingestion wiki-data-reader/scripts wiki-data-reader/snapshots 2025-11-09 fetch remote item icon URLs from wiki snapshots and remove local PNGs wiki-data-reader/scripts item-optimizer/src + +2025-12-18 add mobile tap-to-toggle detail previews in Item Gallery item-optimizer/src/components/ItemGallery.tsx diff --git a/item-optimizer/src/components/ItemGallery.tsx b/item-optimizer/src/components/ItemGallery.tsx index b1752b6..8f2d5d6 100644 --- a/item-optimizer/src/components/ItemGallery.tsx +++ b/item-optimizer/src/components/ItemGallery.tsx @@ -1,4 +1,4 @@ -import { useState, useMemo } from "react"; +import { useEffect, useMemo, useState, type MouseEvent } from "react"; import { useAppDispatch, useAppSelector } from "../hooks"; import { clearTooltip, setTooltip } from "../slices/tooltipSlice"; import type { Item, ItemOverride } from "../types"; @@ -27,6 +27,7 @@ interface Props { export default function ItemGallery({ items, heroes, attrTypes }: Props) { const [selected, setSelected] = useState(items[0]); + const [, setMobilePreview] = useState(null); const [editMode, setEditMode] = useState(false); const [showSaved, setShowSaved] = useState(false); const [savedText, setSavedText] = useState(""); @@ -36,6 +37,30 @@ export default function ItemGallery({ items, heroes, attrTypes }: Props) { const dispatch = useAppDispatch(); const overrideVersion = useAppSelector((s) => s.input.present.overrideVersion); const overrides = useMemo(loadLocalOverrides, [overrideVersion]); + const isMobile = useMemo(() => { + if (typeof window === "undefined") return false; + if (window.matchMedia?.("(pointer: coarse)")?.matches) return true; + return window.innerWidth < 640; + }, []); + + useEffect(() => { + return () => { + dispatch(clearTooltip()); + }; + }, [dispatch]); + + function handleItemClick(it: Item, e: MouseEvent) { + setSelected(it); + if (!isMobile) return; + setMobilePreview((current) => { + if (current === it.name) { + dispatch(clearTooltip()); + return null; + } + dispatch(setTooltip({ item: it, x: e.clientX, y: e.clientY })); + return it.name; + }); + } const filtered = items.filter( (it) => @@ -210,7 +235,7 @@ export default function ItemGallery({ items, heroes, attrTypes }: Props) {