feat(app,ui): add map-based location picker and geocoding

- introduce LocationPickerScreen with flutter_map for selecting and confirming
  locations, including markers and loading states
- integrate manual location editing in ReviewScreen and persist updated
  coordinates/address in the report
- add GeocodingService with Nominatim search, Photon fallback, reverse
  geocoding, debounced queries, caching, and timeouts
- update i18n (en) with new map/location strings; remove unused onboarding
  and welcome texts
This commit is contained in:
2025-09-27 12:55:36 +08:00
parent ed63a0cbc8
commit a8eae96f7f
9 changed files with 1266 additions and 28 deletions

View File

@@ -33,6 +33,10 @@
"btn.ok": "OK",
"btn.yes": "Yes",
"btn.no": "No",
"btn.editLocation": "Edit Location",
"btn.searchLocation": "Search Location",
"btn.useThisLocation": "Use This Location",
"btn.currentLocation": "Use Current Location",
"label.category": "Category",
"label.severity": "Severity",
"label.status": "Status",
@@ -81,20 +85,6 @@
"settings.theme.dark": "Dark",
"lang.en": "English",
"lang.ms": "Bahasa Malaysia",
"welcome.title": "Snap. Detect. Fix.",
"welcome.subtitle": "Report city issues in seconds with AI-powered detection. Help create safer, better communities together.",
"cta.continueGuest": "Continue as guest",
"cta.signIn": "Sign in",
"cta.skip": "Skip",
"cta.next": "Next",
"cta.getStarted": "Get started",
"onboarding.header": "Welcome to CityPulse",
"onboarding.title1": "Fast Issue Reporting",
"onboarding.body1": "Simply take a photo of any urban issue - our AI automatically identifies and categorizes the problem in seconds.",
"onboarding.title2": "Smart City Mapping",
"onboarding.body2": "View all reported issues on an interactive map with intelligent clustering and filtering options.",
"onboarding.title3": "Track Progress",
"onboarding.body3": "Follow the status of your reports from submission to resolution. Help make your community better.",
"auth.title": "Sign in",
"auth.signInWithApple": "Sign in with Apple",
"auth.signInWithGoogle": "Sign in with Google",
@@ -153,5 +143,16 @@
"confirm.logout.title": "Logout?",
"confirm.logout.message": "You will be returned to the welcome screen.",
"label.createdAt": "Created At",
"error.clearData": "Failed to clear data"
"error.clearData": "Failed to clear data",
"map.searchHint": "Search for a location...",
"map.selectLocation": "Select Location",
"map.selectedLocation": "Selected Location",
"map.confirmLocation": "Confirm this location?",
"map.currentLocation": "Current Location",
"map.searching": "Searching...",
"map.noResults": "No results found",
"map.moveMapToSelect": "Move the map to select a location",
"map.loadingMap": "Loading map...",
"map.gettingAddress": "Getting address...",
"map.continueAnyway": "Continue Anyway"
}