All checks were successful
build-apk / build (push) Successful in 10m38s
Adds the City of Sandpoint's printed "Downtown & Waterfront Public Parking" map as a georeferenced overlay, and lets you track your time on any of its areas without ever touching the ParkSmarter/IPS API. Georeferencing (tools/citymap/) - The PDF carries no geo metadata, so the page->WebMercator affine is recovered by fitting the drawing to OSM street centrelines. - pdftocairo writes stroked street segments with per-path matrix() transforms in local coords while filled lots are absolute; both are handled. The five legend swatches share the real geometry's colours and are identified by stroke-width and position, then dropped. - 49 areas, fitted to RMS 4.1 m (X) / 3.5 m (Y). On-street segments land a mean 4.0 m from the nearest OSM road. sp-039/040 sit further out because they are angled bays along the old rail corridor, on no named road at all. - Sandpoint's grid jogs 38 m between N 2nd Ave and S 2nd Ave; the page shows the same jog at the fitted scale, which independently confirms the fit. App - Map tab: "City map" layer in the legend's colours, tappable. - "Park here" pins the car from GPS and auto-detects the containing area (40 m snap). With no fix it asks you to tap the spot instead, so the pin never depends on GPS working. - The pin lives in its own storage key, not inside the session: pinning the car without starting a timer must survive backing out of the screen. - Durations cap at the posted limit — a 2-hour space is not offered a 4-hour timer. Lots and no-limit spots get the long options. - Reuses the existing foreground-service countdown. The second notification button reads "+1 hr" for a city area rather than "Extend": there is nothing to buy, so it edits the local timer and says so. - Account -> Align city map: nudge/scale/rotate the whole overlay against a live GPS fix. Save-on-phone needs no admin token, since the person who can see the misalignment is the one standing on the street. Server - parking_areas + map_overlay tables, public read, admin replace-all. The areas come from one source document, so replacement is wholesale rather than an upsert. Dropped geometryCenter from the geo module: on the real data it returns a point in the water for the crescent City Beach lot and mid-block for L-shaped runs. Nothing used it. Tests: 8 geometry tests in app/, 5 area/overlay tests in server/. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
44 lines
1.4 KiB
JSON
44 lines
1.4 KiB
JSON
{
|
|
"name": "bigbrainparking-app",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"main": "index.ts",
|
|
"scripts": {
|
|
"start": "expo start --dev-client",
|
|
"android": "expo run:android",
|
|
"prebuild": "expo prebuild --platform android --clean",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "node --import tsx --test test/*.test.ts",
|
|
"ios": "expo run:ios"
|
|
},
|
|
"dependencies": {
|
|
"parksmarter-client": "*",
|
|
"expo": "~53.0.0",
|
|
"expo-file-system": "~18.1.11",
|
|
"expo-sharing": "~13.1.5",
|
|
"expo-secure-store": "~14.0.0",
|
|
"expo-location": "~18.0.0",
|
|
"expo-notifications": "~0.29.0",
|
|
"expo-constants": "~17.0.0",
|
|
"expo-localization": "~16.0.0",
|
|
"expo-linking": "~7.0.0",
|
|
"expo-status-bar": "~2.0.0",
|
|
"@react-navigation/native": "^7.0.0",
|
|
"@react-navigation/native-stack": "^7.0.0",
|
|
"@react-navigation/bottom-tabs": "^7.0.0",
|
|
"react-native-screens": "~4.11.1",
|
|
"react-native-safe-area-context": "5.4.0",
|
|
"@react-native-async-storage/async-storage": "2.1.2",
|
|
"@maplibre/maplibre-react-native": "^10.0.0",
|
|
"react-native-vision-camera": "^4.6.0",
|
|
"react-native-unifiedpush-connector": "^0.4.0",
|
|
"react": "19.0.0",
|
|
"react-native": "0.79.0"
|
|
},
|
|
"devDependencies": {
|
|
"@types/react": "~19.0.0",
|
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
"tsx": "^4.23.12",
|
|
"typescript": "~5.4.0"
|
|
}
|
|
}
|