A beautifully designed, premium dark-mode Food Delivery Application built in React Native using Expo. This project heavily focuses on complex React Navigation patterns, including Deep Linking, Auth Persistence, and heavily nested navigators (Stack, Bottom Tabs, and Drawers).
This app provides a complete UI workflow for a white-label restaurant delivery platform. Users can browse a feed of restaurants, search for cuisines, add items to their cart, view order history, and manage their profile.
It achieves 100% of the React Navigation Assignment Parameters.
TLDraw Architecture Diagram: View Architecture on TLDraw (Mock Link)
- Framework: React Native + Expo
- Navigation:
@react-navigation/native,native-stack,bottom-tabs,drawer - State Persistence:
@react-native-async-storage/async-storage - Styling: React Native StyleSheet (Premium Dark Mode)
- Icons:
@expo/vector-icons(Ionicons)
- Clone the repository:
git clone <your-repo-link> cd food-Delivery-project
- Install dependencies:
npm install
- Start the Expo server:
npx expo start
- Run on Device / Emulator:
- Press
ato open on Android emulator - Press
ito open on iOS simulator - Or scan the QR code using the Expo Go app on your physical device.
- Press
The app uses standard React Navigation to manage state, dropping expo-router for full manual control as requested.
NavigationContainer
│
└── Stack.Navigator (Root - Conditional Initial Route)
│
├── AuthStack (Stack Navigator)
│ ├── GetStarted
│ ├── Signup
│ └── Login
│
└── MainStack (Stack Navigator)
├── MainTabs (Bottom Tab Navigator)
│ ├── Home
│ ├── Search
│ ├── Orders (Tab with Badge)
│ └── ProfileDrawer (Nested Drawer Navigator!)
│ ├── ProfileDashboard
│ ├── Settings
│ ├── Help
│ └── Logout
│
├── RestaurantDetails (Stack Screen - Hides Tab Bar)
└── Cart (Stack Screen - Hides Tab Bar)
The app is configured to handle the foodapp:// scheme. You can test deep linking using Expo's CLI:
npx uri-scheme open foodapp://restaurant/1 --android
# OR
npx uri-scheme open foodapp://restaurant/2 --iosLinking Configuration:
const linking = {
prefixes: ["foodapp://"],
config: {
screens: {
Main: {
screens: {
RestaurantDetails: "restaurant/:id",
},
},
},
},
};When this URI is triggered, the NavigationContainer automatically routes to RestaurantDetails passing { id: "1" } as a parameter!
- Mock Authentication: A dummy token is stored in
AsyncStoragewhen "Login" or "Register" is clicked. This prevents users from seeing the Auth flow upon hot-reloads until they explicitly hit "Logout" in the drawer. - Cart Screen vs Orders Tab: The assignment requested an "Orders" tab and a "Cart" screen that hides the tab bar. Therefore, "Orders" was repurposed to show Order History (My Orders), and a dedicated floating "Checkout" action routes the user to a standalone
Cartstack screen. - No Context: The assignment did not require global Context, so auth state is purely managed at the
App.tsxroot layout viaAsyncStoragechecks, and parameter passing between Home and Details uses strict React Navigation route params (route.params.name).