# V3-02 — Settings screen **Phase** Foundations · **Depends on** nothing (pairs with V3-01, V3-03) · **Size** S · **Status** Not started ## Goal One place for the preferences that currently have nowhere to live. ## Context `Config` already holds `uploadEndpoint`, `deviceId` and `mapEnabled`, but there is no UI for any of them. The map toggle sits on trip detail because a single switch did not justify a screen. V3-01 and V3-03 both add preferences, which finally does justify one. The upload endpoint has **never** had UI, in the native app or the port. This is where it stops being a code-only setting. ## Design Reached from the record screen. Sections: - **Recording** — default activity (V3-01), units (V3-03) - **Map** — render maps on trip detail; later, live map (V3-04) - **Sync** — upload endpoint, with the device id shown read-only and copyable - **About** — version, a link to the privacy policy, licences Keep it plain. This is not a screen anyone should spend time in. ## Implementation 1. `SettingsScreen` + a `go_router` route 2. Make `Config` reactive — it is currently read once into a provider; settings need writes to propagate. A `ConfigNotifier` over `shared_preferences`. 3. Move the map toggle off trip detail 4. Endpoint field validates it parses as a URL and is http(s) ## Acceptance criteria - [ ] Every `Config` value is viewable and editable - [ ] Changing the map toggle takes effect without an app restart - [ ] An invalid endpoint is rejected with a readable message, not silently stored - [ ] Device id is copyable — it is the only way to identify this install to a server ## Tests - Widget: each control renders and writes through to `Config` - Widget: invalid URL rejected - Changing the map toggle rebuilds trip detail ## Risks `Config` is currently loaded once at startup into a `StateProvider`. Making it writable without introducing a second source of truth is the only subtle part. ## Out of scope Account settings (v4). Theme selection (V3-16).