A React Native Expo app that mimics the core functionality of Airbnb, built with TypeScript and modern navigation patterns.
- Bottom Tab Navigation: Explore and Profile tabs
- Stack Navigation: Multiple screens within Explore tab
- Interactive Maps: Using React Native Maps
- Advanced Filtering: Date selection with React Native Calendars
- State Management: Zustand for lightweight state management
- Firebase Integration: Ready for authentication, Firestore, and storage
- Modern UI: Beautiful and responsive design
BottomTabs
├── ExploreTab (Stack Navigator)
│ ├── ExploreList
│ ├── ExploreMap
│ ├── ListingDetail
│ └── FiltersModal (Modal)
└── Profile
- Framework: React Native with Expo (managed workflow)
- Language: TypeScript
- Package Manager: Yarn (better dependency resolution for React Native)
- Navigation: React Navigation v6 (Bottom Tabs + Stack)
- Maps: React Native Maps
- Calendar: React Native Calendars
- State Management: Zustand
- Backend: Firebase (Auth, Firestore, Storage)
- UI: Custom components with modern design
src/
├── api/
│ └── firebase.ts # Firebase configuration
├── components/
│ ├── ListingCard.tsx # Listing display component
│ ├── ImageCarousel.tsx # Image carousel component
│ └── index.ts # Component exports
├── navigation/
│ ├── BottomTabNavigator.tsx
│ └── ExploreStack.tsx
├── screens/
│ ├── ExploreListScreen.tsx
│ ├── ExploreMapScreen.tsx
│ ├── ListingDetailScreen.tsx
│ ├── FiltersModalScreen.tsx
│ ├── ProfileScreen.tsx
│ └── index.ts # Screen exports
├── store/
│ └── useFilters.ts # Zustand store for filters
└── types/
└── Listing.ts # TypeScript interfaces
- Node.js (v16 or later)
- Yarn (recommended for React Native projects)
- Expo CLI (
yarn global add @expo/cli) - iOS Simulator (for iOS development)
- Android Studio/Emulator (for Android development)
This project uses Yarn as the package manager because:
- Better dependency resolution: Yarn's algorithm is more reliable for React Native projects
- Faster installs: Parallel downloads and caching improve performance
- Deterministic builds: yarn.lock ensures consistent installations across environments
- React Native compatibility: Yarn handles React Native's complex dependency tree better
-
Clone and install dependencies:
cd airbnb-app yarn install -
Configure Firebase:
- Create a Firebase project at Firebase Console
- Add iOS and Android apps to your project
- Download configuration files:
GoogleService-Info.plistfor iOSgoogle-services.jsonfor Android
- Update
src/api/firebase.tswith your configuration
-
Update Firebase configuration:
// src/api/firebase.ts export const firebaseConfig = { apiKey: "your-actual-api-key", authDomain: "your-project.firebaseapp.com", projectId: "your-project-id", storageBucket: "your-project.appspot.com", messagingSenderId: "123456789", appId: "your-app-id", };
-
Run the development server:
yarn start
- iOS Simulator: Press
iin the terminal or scan QR code with Expo Go - Android Emulator: Press
ain the terminal or scan QR code with Expo Go - Physical Device: Install Expo Go app and scan the QR code
The Listing interface in src/types/Listing.ts defines the structure for property listings, matching Firestore document format.
The useFilters store manages filter state including:
- Date range selection
- Price range
- Minimum rating
- Room counts
- Amenities
- Bottom tabs for main sections
- Stack navigation for explore flow
- Modal presentation for filters
- Theme Colors: Update colors in component styles (primary:
#FF5A5F) - Firebase Collections: Modify
src/api/firebase.tsfor your data structure - Map Configuration: Update initial region in
ExploreMapScreen.tsx - Filter Options: Customize filter options in
FiltersModalScreen.tsx
# Install EAS CLI
yarn global add eas-cli
# Configure EAS
eas build:configure
# Build for development
eas build --profile development --platform all# Build for production
eas build --profile production --platform all- Authentication: User sign-in/sign-up
- Firestore: Store listing data, user preferences
- Storage: Upload and store images
listings/
├── {listingId}
│ ├── title: string
│ ├── description: string
│ ├── price: number
│ ├── location: object
│ ├── images: array
│ └── ...other fields
users/
├── {userId}
│ ├── name: string
│ ├── email: string
│ ├── favorites: array
│ └── bookings: array
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project is for educational purposes. Please respect Airbnb's trademarks and intellectual property.
- Metro bundler issues: Clear cache with
yarn clearoryarn start --clear - iOS build issues: Ensure Xcode is properly configured
- Android build issues: Check Android SDK configuration
- Firebase connection: Verify configuration files are properly placed
- Check Expo Documentation
- Review React Navigation docs
- Firebase setup: React Native Firebase
Built with ❤️ using React Native and Expo