From 62ce637e6368524442ac0def4d3d4cc38d6a6f89 Mon Sep 17 00:00:00 2001 From: jzgom067 Date: Sun, 12 Jul 2026 17:59:07 -0400 Subject: [PATCH 1/5] Create usePointerType hook --- frontend/src/lib/hooks/use-pointer-type.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 frontend/src/lib/hooks/use-pointer-type.ts diff --git a/frontend/src/lib/hooks/use-pointer-type.ts b/frontend/src/lib/hooks/use-pointer-type.ts new file mode 100644 index 00000000..96bb745d --- /dev/null +++ b/frontend/src/lib/hooks/use-pointer-type.ts @@ -0,0 +1,20 @@ +"use client"; + +import { useEffect, useState } from "react"; + +type PointerType = "coarse" | "fine"; + +export default function usePointerType() { + const [pointerType, setPointerType] = useState(); + useEffect(() => { + const mediaQuery = window.matchMedia("(pointer: coarse)"); + setPointerType(mediaQuery.matches ? "coarse" : "fine"); + + const listener = (e: MediaQueryListEvent) => + setPointerType(e.matches ? "coarse" : "fine"); + mediaQuery.addEventListener("change", listener); + return () => mediaQuery.removeEventListener("change", listener); + }, []); + + return pointerType; +} From ff05d4b870523961419c3459f5593bc2a6de1e6a Mon Sep 17 00:00:00 2001 From: jzgom067 Date: Sun, 12 Jul 2026 20:52:55 -0400 Subject: [PATCH 2/5] Add initial null type to pointer type --- frontend/src/lib/hooks/use-pointer-type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/hooks/use-pointer-type.ts b/frontend/src/lib/hooks/use-pointer-type.ts index 96bb745d..fb6993c2 100644 --- a/frontend/src/lib/hooks/use-pointer-type.ts +++ b/frontend/src/lib/hooks/use-pointer-type.ts @@ -5,7 +5,7 @@ import { useEffect, useState } from "react"; type PointerType = "coarse" | "fine"; export default function usePointerType() { - const [pointerType, setPointerType] = useState(); + const [pointerType, setPointerType] = useState(null); useEffect(() => { const mediaQuery = window.matchMedia("(pointer: coarse)"); setPointerType(mediaQuery.matches ? "coarse" : "fine"); From 3a9b9c23b58f9130d810cc1e5e9f4c4536acbc44 Mon Sep 17 00:00:00 2001 From: jzgom067 Date: Sun, 12 Jul 2026 20:53:24 -0400 Subject: [PATCH 3/5] Add pointer type hook to info point --- frontend/src/components/info-point.tsx | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/frontend/src/components/info-point.tsx b/frontend/src/components/info-point.tsx index 7e0ccf0c..c8396992 100644 --- a/frontend/src/components/info-point.tsx +++ b/frontend/src/components/info-point.tsx @@ -1,9 +1,10 @@ -import { useEffect, useState } from "react"; +import { useState } from "react"; import { CircleQuestionMarkIcon } from "lucide-react"; import { FloatingDrawer } from "@/features/drawer"; import Tooltip, { TooltipSide } from "@/features/system-feedback/tooltip/base"; +import usePointerType from "@/lib/hooks/use-pointer-type"; type InfoPointProps = { /** @@ -44,21 +45,13 @@ export default function InfoPoint({ className, }: InfoPointProps) { const [drawerOpen, setDrawerOpen] = useState(false); - const [isTouchDevice, setIsTouchDevice] = useState(false); - useEffect(() => { - const mediaQuery = window.matchMedia("(pointer: coarse)"); - setIsTouchDevice(mediaQuery.matches); - - const listener = (e: MediaQueryListEvent) => setIsTouchDevice(e.matches); - mediaQuery.addEventListener("change", listener); - return () => mediaQuery.removeEventListener("change", listener); - }, []); + const pointerType = usePointerType(); return ( <>