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
Run this from the project root:
npm install
npm run dev
This starts both:
- the Express backend on port
3001 - the Expo development server for the mobile app
You do not need to run npm run dev inside server/ as well.
Use this only when you want to run the API by itself:
cd server
npm install
npm run dev
Use this only when you want to run the mobile app without starting the backend command from the root script:
npm install
npm start
If you are using Expo Go, make sure API_URL in the root .env points to your computer's LAN IP, for example http://192.168.x.x:3001/api.
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.