From 648293e1f86062e8ef56089a2c0077ddf663b289 Mon Sep 17 00:00:00 2001 From: Erol Haagenrud Date: Thu, 13 Aug 2026 15:01:59 +0200 Subject: [PATCH] =?UTF-8?q?Reduser=20str=C3=B8mforbruk=20for=20avstandsind?= =?UTF-8?q?ikatoren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Brukerrapport om høyt batteriforbruk. To justeringer i hole-target-distance.tsx: maximumAge 1000ms -> 4000ms (umerkelig ved gangfart, sjeldnere GPS-fix), og watchPosition pauses helt når fanen/appen ikke er synlig (document.visibilitychange), gjenopptas automatisk. enableHighAccuracy uendret -- lav nøyaktighet ville gjort front/midt/bak-tallene meningsløse. Verifisert i nettleser: clearWatch bekreftet kalt ved backgrounding, watchPosition bekreftet kalt på nytt ved retur, ingen konsollfeil. Co-Authored-By: Claude Sonnet 5 --- CHANGELOG.md | 29 +++++++++ frontend/components/hole-target-distance.tsx | 66 +++++++++++++++----- 2 files changed, 80 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f90ef0..834f074 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10834,3 +10834,32 @@ Neste steg: backend/migrasjon rørt) -- `docker compose build teecup_frontend && up -d teecup_frontend`. Ingen konsollfeil på `https://teecup.golf/logg-inn` etter omstart. + + **Tillegg samme dag (del 4) -- strømsparing.** Bruker rapporterte + høyt batteriforbruk nå som GPS-en er aktivert. To justeringer i + `hole-target-distance.tsx`, foreslått med tradeoffs FØR bygging (jf. + "Gi meg forslag før..."-arbeidsmåten): (1) `maximumAge` økt fra + 1000ms til 4000ms -- en golfer beveger seg ~1,5 m/s, oppdatering + hvert 4. sekund er umerkelig men ber GPS-brikken om et ferskt fix + langt sjeldnere. (2) `watchPosition` pauses nå helt når fanen/appen + ikke er synlig (`document.visibilitychange`) -- ingen vits å holde + GPS aktiv for en skjerm ingen ser på (skjerm låst, annen app i + forgrunnen) -- og gjenopptas automatisk når brukeren kommer tilbake. + `enableHighAccuracy` bevisst UENDRET -- lav nøyaktighet ville gitt + titalls meters feilmargin, for upresist til at front/midt/bak- + tallene gir mening. + + **Verifisert:** ny scratch-runde (samme fixture-cachede Tjøme-data), + ekte innlogging/import/runde, geolocation-emulering + + `initScript`-injisert `watchPosition`/`clearWatch`-spion (telte + faktiske kall). Bekreftet i nettleseren: `document.hidden = true` + + `visibilitychange` → `clearWatch` kalt umiddelbart, visningen gikk + til "Ikke live — sist målte posisjon" (siste kjente tall beholdt, + ikke nullstilt); `document.hidden = false` + `visibilitychange` → + `watchPosition` kalt på nytt (kall-telleren gikk fra 1 til 2), "● + Live" gjenopprettet. `tsc --noEmit` rent, 45/45 vitest, ingen + konsollfeil. Scratch-ressurser ryddet opp, `teecup_db` uendret. + + **Rullet ut 2026-08-13**, samme økt. Ren frontend-endring -- + `docker compose build teecup_frontend && up -d teecup_frontend`. + Ingen konsollfeil på `https://teecup.golf/logg-inn` etter omstart. diff --git a/frontend/components/hole-target-distance.tsx b/frontend/components/hole-target-distance.tsx index 40af087..32bc639 100644 --- a/frontend/components/hole-target-distance.tsx +++ b/frontend/components/hole-target-distance.tsx @@ -8,14 +8,25 @@ import { haversineMeters, type LatLng } from "@/lib/geo" // front/midt/bak, hindringer) og kombinerer dem klient-side med spillerens // LIVE GPS-posisjon via samme watchPosition-mønster som map-point-picker.tsx // allerede bruker for slagmåling (ADR-048 tillegg 2026-08-08 del 2) -- -// `enableHighAccuracy`, `maximumAge: 1000`, grasiøs degradering ved avslått -// tillatelse, `clearWatch` ved avmontering. `TargetDistance` selv forblir -// "dum" (V0-eksportert, ren visning) -- all logikk bor her. Ingen egen +// `enableHighAccuracy`, grasiøs degradering ved avslått tillatelse, +// `clearWatch` ved avmontering. `TargetDistance` selv forblir "dum" +// (V0-eksportert, ren visning) -- all logikk bor her. Ingen egen // rad-wrapper (border/padding) her -- kalleren styrer plassering/bredde. // Montert i PlayerHoleCards sin hull-navigator (round-detail.tsx), // size="full" -- IKKE i ScoringWizard-headeren (der den satt først, // 2026-08-12): brukeren pekte ut hovedvisningen som riktig sted og ba // om mer bredde enn den opprinnelige kompaktvarianten, 2026-08-13. +// +// Strømsparing (2026-08-13, brukerrapport om høyt batteriforbruk): +// (1) `maximumAge` satt til 4000ms (var 1000ms) -- en golfer beveger seg +// ~1,5 m/s, oppdatering hvert 4. sekund er umerkelig i praksis men ber +// GPS-brikken om et ferskt fix mye sjeldnere. (2) `watchPosition` pauses +// helt når fanen/appen ikke er synlig (`document.visibilitychange`) -- +// ingen vits å holde GPS-en aktiv for en skjerm ingen ser på (skjerm låst, +// annen app i forgrunnen), og gjenopptas automatisk når brukeren kommer +// tilbake. `enableHighAccuracy` beholdt UENDRET -- lav nøyaktighet ville +// gitt titalls meters feilmargin, for upresist til at front/midt/bak- +// tallene gir mening. type ApiTargetPoint = { poi_type: string @@ -68,24 +79,49 @@ export function HoleTargetDistance({ // dette hullet -- unngår unødvendig batteribruk/tillatelses-prompt. if (!points || points.length === 0) return if (typeof navigator === "undefined" || !navigator.geolocation) return + if (typeof document === "undefined") return - watchIdRef.current = navigator.geolocation.watchPosition( - (pos) => { - setLivePosition({ lat: pos.coords.latitude, lng: pos.coords.longitude }) - setIsLive(true) - }, - () => { - // Avslått/feilet -- degraderer grasiøst, komponenten viser bare "ingen data". - setIsLive(false) - }, - { enableHighAccuracy: true, maximumAge: 1000 }, - ) - return () => { + function startWatch() { + watchIdRef.current = navigator.geolocation.watchPosition( + (pos) => { + setLivePosition({ lat: pos.coords.latitude, lng: pos.coords.longitude }) + setIsLive(true) + }, + () => { + // Avslått/feilet -- degraderer grasiøst, komponenten viser bare "ingen data". + setIsLive(false) + }, + { enableHighAccuracy: true, maximumAge: 4000 }, + ) + } + + function stopWatch() { if (watchIdRef.current !== null && typeof navigator !== "undefined" && navigator.geolocation) { navigator.geolocation.clearWatch(watchIdRef.current) } watchIdRef.current = null } + + // Pauser GPS-sporingen helt når fanen/appen ikke er synlig (skjerm + // låst, annen app i forgrunnen) -- gjenopptas automatisk når brukeren + // kommer tilbake. `isLive` settes til false mens pauset, så visningen + // tydelig viser "ikke live" fremfor å late som tallet fortsatt oppdateres. + function handleVisibilityChange() { + if (document.hidden) { + stopWatch() + setIsLive(false) + } else { + startWatch() + } + } + + if (!document.hidden) startWatch() + document.addEventListener("visibilitychange", handleVisibilityChange) + + return () => { + document.removeEventListener("visibilitychange", handleVisibilityChange) + stopWatch() + } }, [points]) // Fortsatt laster, ELLER banen har rett og slett ingen koordinatdata