Location-based discovery app built with React Native (Expo) and a Node.js + Express backend. The app retrieves the user’s current location, fetches nearby points of interest using the Google Places API, and displays results on both an interactive map and a searchable list.
- Location permission handling (iOS-compatible via Expo Go).
- Accurate current-location retrieval using
expo-location. - Interactive map using
react-native-maps. - Nearby places search with filters:
- Category filtering
- Keyword search
- List and Map views with independent refresh and loading logic.
- Place detail screen with:
- Address
- Opening hours
- Ratings
- Website
- Phone
- Navigation link
- Express server providing:
/api/places/nearby/api/places/details/:placeId/api/places/categories
- Internal service layer using Axios for Google Places API.
- CORS configured for Expo development.
- Error handling middleware.
- React Native (Expo)
- TypeScript
- React Navigation (Stack + Tabs)
- react-native-maps
- expo-location
- Axios
- Context API for state
- Node.js + Express
- Axios
- Google Places API
- Helmet + Morgan
- dotenv
WhatsAroundMe/
│
├── server/
│ ├── src/
│ │ ├── controllers/
│ │ ├── middleware/
│ │ ├── routes/
│ │ ├── services/
│ │ └── server.js
│ └── .env
│
├── src/
│ ├── screens/
│ ├── navigation/
│ ├── context/
│ ├── services/
│ ├── components/
│ ├── constants/
│ └── types/
│
├── App.tsx
├── app.json
├── .env
└── package.json
API_URL=http://YOUR_LOCAL_IP:3001/api
PORT=3001
NODE_ENV=development
GOOGLE_PLACES_API_KEY=YOUR_KEY
CORS_ORIGIN=http://localhost:3000,exp://192.168.*.*:8081
cd server
npm install
npm run dev
npm install
npm run dev
Open the Expo Go app on iOS and scan the QR code. Ensure backend IP matches your LAN network IP.
Query params:
latlngradius(optional)type(optional)keyword(optional)
- Request foreground permission.
- Retrieve coordinates.
- Update global context.
- Trigger nearby search.
- Mobile calls backend with coordinates.
- Backend calls Google Places Nearby Search.
- Response normalized.
- Results displayed in map/list.
- Filters modify query.
- Mobile calls
/details/:placeId. - Backend queries Place Details API.
- Response normalized for display.
- iOS builds require Mac or EAS.
- Google Places API quota limits.
- No marker clustering yet.
- No offline caching.
- Favorites.
- Marker clustering.
- Infinite scrolling.
- Offline caching.
- Reviews.
- Theme switching.