Skip to content

App store links - #4

Open
flockhopper3 wants to merge 219 commits into
flockhopper3:masterfrom
FoggedLens:app-store-links
Open

App store links#4
flockhopper3 wants to merge 219 commits into
flockhopper3:masterfrom
FoggedLens:app-store-links

Conversation

@flockhopper3

Copy link
Copy Markdown
Owner

fix flockhopper links

frillweeman and others added 30 commits May 24, 2026 15:20
* fix iframe

* remove redundant isEmbed checks
* use pmtiles byte range without cf workers

* update tiles url

* remove unrealted changes

* hardcode for now
fixed map loading issues "failed to initialize" + minor UI tweaks
Replace the old promo component with FlockHopperStoreButtons and
FlockHopperLearnMore from FlockHopperCTA. The empty state now displays
a concise tagline, store buttons, and learn-more link. Remove the
obsolete FlockHopperAppPromo component.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
calculateRoutes captured origin/destination at call start but wrote
results unconditionally on resolve. If the user swapped, changed, or
map-picked a new endpoint while the request was in flight, the stale
result overwrote the fresh state. Guard both the success and error
paths with a get() re-check against the captured origin/destination,
resetting isCalculating to false so FloatingRouteCard's auto-calc
effect can re-fire for the new endpoints.
…ns route status

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…te survives tab switches

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…flow

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Fix dropdown's search action row to show during in-flight fetches
- Update intro paragraph to reflect new How-it-works affordances

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- flag button above the layers control switches camera datasets;
  Canada loads lazily on first select and persists via ?country=ca
- US-only modes (Route/Analysis/Network) dim and auto-return to Map
  when Canada is active
- mobile drawer shows a live cameras-in-view count and swipe-up hint
  in map mode
- mobile de-bloat: hide zoom buttons, merge layers+geolocate into one
  group, move attribution to bottom-left
- fix stale spatial-grid cache that kept serving the previous
  country's data after a switch
- worker: register cameras-ca.geojson.gz fetcher (Overpass ISO3166-1=CA)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EvaJ843Vj8tnEoxroYaMeq
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EvaJ843Vj8tnEoxroYaMeq
flockhopper3 and others added 30 commits July 18, 2026 21:47
Big number per route with camera/time/distance inline beside it, verdict
moved into the footer strip with watermark and a shortened Edit action.
Card marked data-route-scoreboard so the route fit measures it and centers
the line below (mobile pins it across the top of the map); fitBounds
padding derives from the measured card instead of a fixed 80.

(Work from a concurrent session in this checkout, committed as found.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Suppress the retry pill in geojson/heatmap mode (avoids a misleading
pill and pill stacking); refresh stale GeoJSON-fallback wording in
store field docs and tile-error logs; drop a JSDoc em dash.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…path

New cameraIndexService consumes the hourly FHIX index built alongside the
tile archives (columnar int32 lat/lng microdegrees + uint8 brandId, ~1MB
for the US): background-fetched after map load, decoded straight into
typed arrays, bucketed into a 0.5-degree CSR grid. Counting a viewport is
sub-millisecond at any zoom, so the in-view counter updates live during
the gesture (throttled ~8Hz) like the old geojson grid did.

This replaces queryRenderedFeatures as the primary counter in unfiltered
tiles mode. That path was both the zoomed-out drag jank (~112k features
deserialized per gesture) and simply wrong at city zoom: measured 117k on
a fresh z12 load and 6.2k after a nudge for a viewport whose true content
is ~600. The index count matches geometry-derived ground truth within
0.1% in e2e against the live CF artifacts.

The query path remains as fallback (filter-tiles mode, index unavailable)
with the stale-count heuristic. Once the index is in, a persistent
map-idle recount keeps the value self-healing: one-shot corrections
proved flaky when a boot-time count landed against half-loaded tiles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The hourly manifest and filter TileJSON are served with 24h edge caching
and expire independently, so a user can receive the pair from two
different builds (observed 12.6h vs 2.8h old entries on 2026-07-18).
The build-pairing check then reports mismatch and filters degrade to
showing all cameras — the "filters stopped working" report.

On mismatch the store now refetches both files once with a cache-busting
param, which pulls a coherent pair from origin past any stale edge entry.
Only a fresh pair that still mismatches degrades. Server-side follow-up
tracked separately: shorter TTLs on the paired artifacts + purge on
publish, like the index files already have.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sheet rendered a grab handle but never wired drag. Drag now starts
from the handle/header via useDragControls; releasing past 80px or a
fast flick dismisses, upward drag stays locked, and the scrollable body
keeps its own touch gestures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
portalOnly now defaults off so the whole network is visible; non-portal
selections compute no arcs until the new flag is on. Gate lives in one
helper used by selection, adjacency backfill, and the toggle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Warning card with inline enable button while gated, inferred-connections
info banner when unlocked, no-ring legend row, and an Inferred
Connections switch with sub-labels in options.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The mt-11 was reserving room for a search facade that no longer exists;
mt-3 matches every other peek. Portal agencies now show their
transparency-portal link without expanding the sheet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
onMove reverts to countInBounds (O(cells) interior fast path); the
per-member tally and stats derivation run only in the idle recount, and
the store write is gated on value equality so identical stats never
cause a React commit. The breakdown lags the gesture by design.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Stale is liveCount vs stats.total disagreement, a boolean selector that
flips twice per gesture; the live total moves into its own span so 8Hz
ticks re-render nothing else. Approved treatment C from mockups.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Matches the route peek's CTA idiom and fills the card's dead bottom
space. Tightened margins so the bar fits inside UNIFORM_PEEK_HEIGHT;
the sheet height is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add a Layers control with States/Counties/Municipalities switches that render
the boundaries-us vector tileset beneath the camera layers. The vector source
mounts lazily, so no boundary tiles are requested until a level is enabled.
Hovering a boundary highlights it and shows a name/context card; clicking pins
that card (works as tap on mobile).

Replaces the dormant GeoJSON boundary overlay (boundaryDataService plus the
mapModeStore overlay slice), which had no live consumers. Camera state
filtering (stateFilterService) is unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cloudflare Worker and tile-pipeline changes from the camera-tiles refactor:
per-country camera fetchers, retry-with-backoff, dependency-free safety guards,
email alerting, CORS tweaks, and overpass fetcher updates, with accompanying
tests and a local-testing guide. Refresh the flockhopper-tiles build script and
wrangler config.

Committed on behalf of the concurrent worker-side work sharing this checkout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ra count

Country switch (MapStyleControl) now renders only on map + Explore, where
switching countries is meaningful. On mobile, the "N in view" camera count
no longer shows on Network — that view has its own "agencies in view" count.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants