A modern React Native mobile application connecting users with local service providers
Famous Connect is a premium mobile marketplace that seamlessly connects users with local service providers including plumbers, electricians, cleaners, painters, and movers. Built with React Native, Expo, and TypeScript, it delivers a modern, performant experience across iOS and Android platforms.
- Secure Authentication with Supabase (email/password)
- Persistent Sessions across app restarts
- User Profile with stats and settings
- Password Recovery flow
- Browse Services by categories
- Real-time Search with debouncing
- Category Filtering for quick access
- Pagination with infinite scroll
- Pull-to-Refresh for latest updates
- Save Services for quick access
- Persistent Storage with AsyncStorage
- Toggle Favorites from any screen
- Favorites Screen with management
- Comprehensive Information (price, rating, description)
- Image Gallery with swipeable photos
- Contact Options (call, chat)
- Book Now functionality
- Share Services with others
- Instant Messaging with service providers
- Real-time Updates using Supabase subscriptions
- Message History persistence
- Typing Indicators and online status
- Dark Mode with system preference detection
- Smooth Animations and transitions
- Custom Icons from Lucide React Native
- Responsive Design for all screen sizes
- Professional Theme System with consistent styling
| Technology | Version | Purpose |
|---|---|---|
| React Native | 0.81.5 | Cross-platform mobile framework |
| Expo | ~54.0.32 | Development platform & tooling |
| TypeScript | ~5.9.2 | Type safety and better DX |
| Node.js | ≥18.0.0 | Runtime environment |
| Library | Version | Purpose |
|---|---|---|
| @react-navigation/native | ^7.1.28 | Navigation framework |
| @react-navigation/native-stack | ^7.11.0 | Native stack navigator |
| @react-navigation/bottom-tabs | ^7.10.1 | Bottom tab navigation |
| react-native-screens | ~4.16.0 | Native screen optimization |
| react-native-gesture-handler | ~2.28.0 | Gesture handling |
| Library | Version | Purpose |
|---|---|---|
| @tanstack/react-query | ^5.90.20 | Server state management |
| @supabase/supabase-js | ^2.93.1 | Backend & authentication |
| axios | ^1.13.3 | HTTP client |
| formik | ^2.4.9 | Form management |
| yup | ^1.7.1 | Schema validation |
| Library | Version | Purpose |
|---|---|---|
| @react-native-async-storage/async-storage | 2.2.0 | Local persistence |
| react-native-get-random-values | ~1.11.0 | Crypto polyfill |
| react-native-url-polyfill | ^3.0.0 | URL API polyfill |
| lucide-react-native | ^0.563.0 | Icon library |
famous-connect/
├── App.tsx # Root component with providers
├── index.ts # App entry point
├── app.json # Expo configuration
├── tsconfig.json # TypeScript configuration
├── package.json # Dependencies
├── .env # Environment variables
│
├── assets/ # Static assets (images, icons)
│ ├── icon.png
│ ├── splash-icon.png
│ └── adaptive-icon.png
│
└── src/
├── api/ # API clients & services
│ ├── supabase.ts # Supabase client setup
│ └── services.ts # API service methods
│
├── components/ # Reusable UI components
│ ├── common/ # Generic components
│ │ ├── Input.tsx # Text input with validation
│ │ └── PrimaryButton.tsx # Customizable button
│ └── services/ # Service-specific components
│ └── ServiceCard.tsx # Service listing card
│
├── hooks/ # Custom React hooks
│ └── useAuth.tsx # Authentication context & hook
│
├── navigation/ # Navigation configuration
│ ├── RootNavigator.tsx # Root navigation switcher
│ ├── AuthNavigator.tsx # Authentication flow stack
│ ├── MainNavigator.tsx # Main app stack
│ └── TabNavigator.tsx # Bottom tab navigator
│
├── screens/ # Screen components
│ ├── auth/ # Authentication screens
│ │ ├── LoginScreen.tsx
│ │ ├── SignupScreen.tsx
│ │ └── ForgotPasswordScreen.tsx
│ └── main/ # Main app screens
│ ├── HomeScreen.tsx
│ ├── ServicesScreen.tsx
│ ├── ServiceDetailsScreen.tsx
│ ├── SearchScreen.tsx
│ ├── FavoritesScreen.tsx
│ ├── ProfileScreen.tsx
│ └── ChatScreen.tsx
│
├── storage/ # Local storage services
│ └── favorites.ts # Favorites persistence
│
├── theme/ # Theme system
│ └── index.ts # Colors, typography, spacing
│
├── types/ # TypeScript definitions
│ └── index.ts # Shared interfaces & types
│
└── utils/ # Utility functions
└── (future utilities)
Before you begin, ensure you have the following installed:
- Node.js (v18.0.0 or higher) - Download
- npm or yarn package manager
- Expo Go app on your mobile device:
- Git - Download
git clone https://github.com/your-username/famous-connect.git
cd famous-connectnpm installThis will install all required packages including:
- React Native and Expo dependencies
- Navigation libraries
- Supabase client
- Form management tools
- UI icon library
Create a .env file in the root directory:
EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-hereTo get your Supabase credentials:
- Go to Supabase and create a free account
- Create a new project
- Go to Settings → API
- Copy the Project URL and anon/public key
- Paste them into your
.envfile
Note: The app includes mock authentication for development if Supabase is not configured.
npm startOr use specific platform commands:
# Start for Android
npm run android
# Start for iOS
npm run ios
# Start for Web
npm run web- Ensure your computer and mobile device are on the same Wi-Fi network
- Open the Expo Go app on your device
- Scan the QR code displayed in the terminal or browser
- Launch the app
- Tap "Sign Up" on the login screen
- Enter your name, email, and password
- Confirm password
- Tap "Sign Up"
- Check your email for verification (if Supabase is configured)
- Enter your registered email and password
- Tap "Login"
- You'll be redirected to the home screen
- Tap "Forgot Password?" on login screen
- Enter your email address
- Check your email for reset instructions
- View trending services in your area
- Browse service categories (Plumbing, Cleaning, etc.)
- Tap category cards to filter services
- Use the search bar for specific services
- View all available services
- Filter by category using chips at the top
- Scroll to load more services (pagination)
- Pull down to refresh the list
- Tap the search icon
- Enter search keywords
- Results appear as you type (debounced)
- Tap any service to view details
- View comprehensive service information
- Swipe through service image gallery
- Check pricing and ratings
- Read detailed descriptions
- Add to Favorites - Heart icon in top right
- Share Service - Share icon
- Call Provider - Tap call button
- Chat with Provider - Tap chat button
- Book Now - Bottom button to book the service
- Add Favorite: Tap heart icon on any service card
- View Favorites: Go to Favorites tab
- Remove Favorite: Tap heart icon again
- Favorites are stored locally and persist across sessions
- Open a service detail page
- Tap "Chat" button
- Type your message in the input field
- Tap send icon
- Messages appear in real-time (if Supabase is configured)
- Online status indicator shows provider availability
- View your booking statistics
- See favorites count and rating
- Edit Profile - Update name and picture
- Notifications - Manage notification preferences
- Settings - App preferences
- Logout - Sign out of your account
Atomic Design Principles:
- Atoms: Input, Button (common components)
- Molecules: ServiceCard (composed components)
- Organisms: HomeScreen sections, ServiceDetails
- Templates: Screen layouts with navigation
- Pages: Complete screens with business logic
Three-Tier Approach:
-
Server State (TanStack Query)
- API data caching
- Background refetching
- Automatic invalidation
- Loading/error states
-
Global State (Context API)
- Authentication state (useAuth)
- User information
- Theme preferences
-
Local State (useState/useReducer)
- Component-specific state
- Form inputs
- UI toggles
Conditional Root
├── Not Authenticated → Auth Stack
│ ├── Login
│ ├── Signup
│ └── Forgot Password
│
└── Authenticated → Main Stack
├── Home Tabs (Bottom Navigator)
│ ├── Home
│ ├── Services
│ ├── Favorites
│ └── Profile
├── Service Details (Modal)
├── Search (Full Screen)
└── Chat (Full Screen)
- API Request → Axios client
- Response → TanStack Query cache
- State Update → React component
- UI Render → Themed components
// Color Palette
Primary: #6366f1 (Indigo)
Secondary: #10b981 (Green)
Accent: #f59e0b (Amber)
Error: #ef4444 (Red)
// Light Theme
Background: #f8fafc
Surface: #ffffff
Text Primary: #0f172a
// Dark Theme
Background: #0f172a
Surface: #1e293b
Text Primary: #f8fafcH1: 32px / Bold / 40px line height
H2: 24px / Bold / 32px line height
H3: 20px / Semibold / 28px line height
Body: 16px / Regular / 24px line height
Caption: 14px / Regular / 20px line heightXS: 4px // Minimal spacing
SM: 8px // Small spacing
MD: 16px // Standard spacing
LG: 24px // Large spacing
XL: 32px // Extra large
XXL: 48px // Maximum spacing{
"expo": {
"name": "famous-connect",
"slug": "famous-connect",
"version": "1.0.0",
"orientation": "portrait",
"newArchEnabled": true,
"android": {
"edgeToEdgeEnabled": true,
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png"
}
},
"ios": {
"supportsTablet": true
}
}
}{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true
}
}# Unit Testing
npm install --save-dev jest @testing-library/react-native
# E2E Testing
npm install --save-dev detox
# Type Checking
npm run type-check# Install EAS CLI
npm install -g eas-cli
# Login to Expo
eas login
# Configure build
eas build:configure
# Build APK
eas build --platform android --profile preview# Build for iOS
eas build --platform ios --profile preview# Publish update
eas update --branch production --message "Bug fixes"- Build production version:
eas build --platform ios --profile production - Download IPA file
- Upload to App Store Connect
- Submit for review
- Build production APK/AAB:
eas build --platform android --profile production - Download AAB file
- Upload to Google Play Console
- Submit for review
# Kill existing processes
npx react-native start --reset-cache- Ensure both devices are on the same network
- Check firewall settings
- Try restarting the Expo server
# Clear TypeScript cache
npm run type-check
# Restart TypeScript server in VS Code
Cmd+Shift+P → "TypeScript: Restart TS Server"- Verify environment variables are set correctly
- Check Supabase project status
- Ensure anon key has proper permissions
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow TypeScript best practices
- Use functional components with hooks
- Write meaningful commit messages
- Add comments for complex logic
- Ensure no TypeScript errors
- Expo for the amazing development platform
- Supabase for backend services
- React Navigation for navigation
- TanStack Query for state management
- Lucide for beautiful icons
- DummyJSON for API data
Made with ❤️ using React Native & Expo
-
Start the development server:
npx expo start
-
Run on your device: Scan the QR code appearing in your terminal with the Expo Go app.
src/api: Axios and Supabase clients.src/components: Atomic UI components (Common, Home, Services).src/hooks: Custom hooks (useAuth,useTheme).src/navigation: App navigation logic (Tabs, Stacks).src/screens: Main application screens.src/theme: Centralized design system.src/types: TypeScript interfaces.
If you see "Something went wrong" after scanning:
- Ensure your phone and computer are on the same Wi-Fi network.
- Clear the Metro bundler cache:
npx expo start -c. - Check that the
.envfile exists and is correctly formatted.
This project is licensed under the MIT License - see the LICENSE file for details.
- Kinshuk Saxena
- Email: kinshuksaxena3@gmail.com
- LinkedIn: linkedin.com/in/Kinshuk-Saxena-
- GitHub: github.com/Kinshukkush
- Portfolio: kinshuksaxena.vercel.app
For support, email kinshuksaxena3@gmail.com or join our Slack channel.