├── .gitignore ├── App.js ├── README.md ├── app.json ├── assets ├── adaptive-icon.png ├── favicon.png ├── icon.png ├── images │ ├── altosAdventure.png │ ├── angryBirds.png │ ├── clashofclans.png │ ├── emptyStar.png │ ├── frag.png │ ├── freeFire.png │ ├── fullStar.png │ ├── shadowFight.png │ ├── subway.png │ ├── valorArena.png │ ├── zooba.png │ └── zoobaGame.png └── splash.png ├── babel.config.js ├── components ├── gameCard.js └── gradientButton.js ├── navigation └── appNavigation.js ├── package-lock.json ├── package.json ├── screens ├── HomeScreen.js └── StoreScreen.js ├── tailwind.config.js └── theme └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .expo/ 3 | dist/ 4 | npm-debug.* 5 | *.jks 6 | *.p8 7 | *.p12 8 | *.key 9 | *.mobileprovision 10 | *.orig.* 11 | web-build/ 12 | 13 | # macOS 14 | .DS_Store 15 | 16 | # Temporary files created by Metro to check the health of the file watcher 17 | .metro-health-check* 18 | -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import { StatusBar } from 'expo-status-bar'; 2 | import { SafeAreaView, StyleSheet, Text, View } from 'react-native'; 3 | import AppNavigation from './navigation/appNavigation'; 4 | 5 | // import { NavigationContainer } from '@react-navigation/native'; 6 | // import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; 7 | // import HomeScreen from './screens/HomeScreen'; 8 | // import GameStore from './screens/gameStore'; 9 | 10 | // const Tab = createBottomTabNavigator(); 11 | 12 | 13 | export default function App() { 14 | return ( 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # App-Store-React-Native-App 2 | 3 | ![Image](https://cdn.dribbble.com/userupload/5614167/file/original-ffb1248e901ee525e6bb208d172a967b.png?compress=1&resize=2048x1536) 4 | 5 |

6 | Youtube 7 |

8 | Watch Tutorial on YouTube App Store UI in React Native 9 |

10 | 11 |

12 | 13 | 14 | ## Get Started 15 | 16 | install dev dependencies 17 | 18 | ### `npm install` or `yarn install` 19 | 20 | ## Then 21 | 22 | Run The app 23 | 24 | ### `npm start` or `yarn start` 25 | 26 | Runs your app in development mode. 27 | 28 | Open it in the [Expo app](https://expo.io) on your phone to view it. It will reload if you save edits to your files, and you will see build errors and logs in the terminal. 29 | 30 | #### `npm run ios` or `yarn run ios` 31 | 32 | Like `npm start` / `yarn start`, but also attempts to open your app in the iOS Simulator if you're on a Mac and have it installed. 33 | 34 | #### `npm run android` or `yarn run android` 35 | 36 | Like `npm start` / `yarn start`, but also attempts to open your app on a connected Android device or emulator. Requires an installation of Android build tools (see [React Native docs](https://facebook.github.io/react-native/docs/getting-started.html) for detailed setup). 37 | 38 |
39 | 40 | 💙 If you like this project, give it a ⭐ and share it with friends! 41 | 42 |

43 | Youtube 44 | Twitter 45 |

46 | 47 | ☕ Buy me a coffee 48 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "app-ui", 4 | "slug": "app-ui", 5 | "version": "1.0.0", 6 | "orientation": "portrait", 7 | "icon": "./assets/icon.png", 8 | "userInterfaceStyle": "light", 9 | "splash": { 10 | "image": "./assets/splash.png", 11 | "resizeMode": "contain", 12 | "backgroundColor": "#ffffff" 13 | }, 14 | "assetBundlePatterns": [ 15 | "**/*" 16 | ], 17 | "ios": { 18 | "supportsTablet": true 19 | }, 20 | "android": { 21 | "adaptiveIcon": { 22 | "foregroundImage": "./assets/adaptive-icon.png", 23 | "backgroundColor": "#ffffff" 24 | } 25 | }, 26 | "web": { 27 | "favicon": "./assets/favicon.png" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /assets/adaptive-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/adaptive-icon.png -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/favicon.png -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/icon.png -------------------------------------------------------------------------------- /assets/images/altosAdventure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/altosAdventure.png -------------------------------------------------------------------------------- /assets/images/angryBirds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/angryBirds.png -------------------------------------------------------------------------------- /assets/images/clashofclans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/clashofclans.png -------------------------------------------------------------------------------- /assets/images/emptyStar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/emptyStar.png -------------------------------------------------------------------------------- /assets/images/frag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/frag.png -------------------------------------------------------------------------------- /assets/images/freeFire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/freeFire.png -------------------------------------------------------------------------------- /assets/images/fullStar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/fullStar.png -------------------------------------------------------------------------------- /assets/images/shadowFight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/shadowFight.png -------------------------------------------------------------------------------- /assets/images/subway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/subway.png -------------------------------------------------------------------------------- /assets/images/valorArena.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/valorArena.png -------------------------------------------------------------------------------- /assets/images/zooba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/zooba.png -------------------------------------------------------------------------------- /assets/images/zoobaGame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/images/zoobaGame.png -------------------------------------------------------------------------------- /assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syednomishah/App-Store-React-Native-App/548ef7ecc31693d2fdb9662723638469a8cd0e02/assets/splash.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'], 5 | plugins: ["nativewind/babel"], 6 | }; 7 | }; 8 | -------------------------------------------------------------------------------- /components/gameCard.js: -------------------------------------------------------------------------------- 1 | import { View, Text, Image, TouchableOpacity } from 'react-native' 2 | import React, { useState } from 'react' 3 | import { LinearGradient } from 'expo-linear-gradient' 4 | import { ArrowDownTrayIcon, HeartIcon } from 'react-native-heroicons/solid' 5 | import { storeColors } from '../theme'; 6 | import StarRating from 'react-native-star-rating'; 7 | 8 | export default function GameCard({game}) { 9 | const [isFavourite, setFavourite] = useState(false); 10 | return ( 11 | 12 | 13 | 15 | 16 | setFavourite(!isFavourite)} 18 | className="p-3 rounded-full" 19 | style={{backgroundColor: 'rgba(255,255,255,0.3)'}} 20 | > 21 | 22 | 23 | 24 | 25 | 34 | 35 | {game.title} 36 | 37 | 38 | 39 | 40 | {game.downloads} Downloads 41 | 42 | 43 | 44 | 45 | 46 | ) 47 | } -------------------------------------------------------------------------------- /components/gradientButton.js: -------------------------------------------------------------------------------- 1 | import { View, Text, TouchableOpacity } from 'react-native' 2 | import React from 'react' 3 | import { LinearGradient } from 'expo-linear-gradient' 4 | 5 | export default function GradientButton(props) { 6 | return ( 7 | 13 | 14 | 15 | {props.value} 16 | 17 | 18 | 19 | 20 | ) 21 | } -------------------------------------------------------------------------------- /navigation/appNavigation.js: -------------------------------------------------------------------------------- 1 | import { View, Text } from 'react-native' 2 | import React from 'react' 3 | import { NavigationContainer } from '@react-navigation/native'; 4 | import { createNativeStackNavigator } from '@react-navigation/native-stack'; 5 | import HomeScreen from '../screens/HomeScreen'; 6 | import StoreScreen from '../screens/StoreScreen'; 7 | const Stack = createNativeStackNavigator(); 8 | 9 | 10 | export default function AppNavigation() { 11 | return ( 12 | 13 | 14 | 15 | 16 | 17 | 18 | ) 19 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app-ui", 3 | "version": "1.0.0", 4 | "main": "node_modules/expo/AppEntry.js", 5 | "scripts": { 6 | "start": "expo start", 7 | "android": "expo start --android", 8 | "ios": "expo start --ios", 9 | "web": "expo start --web" 10 | }, 11 | "dependencies": { 12 | "@react-navigation/bottom-tabs": "^6.5.7", 13 | "@react-navigation/native": "^6.1.6", 14 | "@react-navigation/native-stack": "^6.9.12", 15 | "expo": "~48.0.6", 16 | "expo-linear-gradient": "^12.1.2", 17 | "expo-status-bar": "~1.4.4", 18 | "nativewind": "^2.0.11", 19 | "react": "18.2.0", 20 | "react-native": "0.71.3", 21 | "react-native-heroicons": "^3.2.0", 22 | "react-native-ratings": "^8.1.0", 23 | "react-native-safe-area-context": "4.5.0", 24 | "react-native-screens": "~3.20.0", 25 | "react-native-star-rating": "^1.1.0", 26 | "react-native-svg": "13.4.0", 27 | "tailwindcss": "^3.2.7" 28 | }, 29 | "devDependencies": { 30 | "@babel/core": "^7.20.0", 31 | "babel-plugin-module-resolver": "^5.0.0", 32 | "deprecated-react-native-prop-types": "^4.0.0" 33 | }, 34 | "private": true 35 | } 36 | -------------------------------------------------------------------------------- /screens/HomeScreen.js: -------------------------------------------------------------------------------- 1 | import { View, Text } from 'react-native' 2 | import React from 'react' 3 | import { SafeAreaFrameContext } from 'react-native-safe-area-context' 4 | 5 | export default function HomeScreen() { 6 | return ( 7 | 8 | Home Screen 9 | 10 | ) 11 | } -------------------------------------------------------------------------------- /screens/StoreScreen.js: -------------------------------------------------------------------------------- 1 | import { View, Text, ScrollView, TouchableOpacity, Image} from 'react-native' 2 | import React, { useState } from 'react' 3 | import { SafeAreaView } from 'react-native-safe-area-context' 4 | import { LinearGradient } from 'expo-linear-gradient' 5 | import {ArrowDownTrayIcon, Bars3CenterLeftIcon, BellIcon} from 'react-native-heroicons/solid' 6 | import {storeColors} from '../theme'; 7 | import GradientButton from '../components/gradientButton' 8 | import GameCard from '../components/gameCard' 9 | 10 | 11 | /////// subscribe for more videos like this :) 12 | 13 | const categories = ['Action', 'Family', 'Puzzle', 'Adventure', 'Racing', 'Education', 'Others']; 14 | const featured = [ 15 | { 16 | id: 1, 17 | title: 'Zooba', 18 | image: require('../assets/images/zooba.png'), 19 | downloads: '200k', 20 | stars: 4 21 | }, 22 | { 23 | id: 2, 24 | title: 'Subway Surfer', 25 | image: require('../assets/images/subway.png'), 26 | downloads: '5M', 27 | stars: 4 28 | }, 29 | { 30 | id: 3, 31 | title: 'Free Fire', 32 | image: require('../assets/images/freeFire.png'), 33 | downloads: '100M', 34 | stars: 3 35 | }, 36 | 37 | { 38 | id: 4, 39 | title: "Alto's Adventure", 40 | image: require('../assets/images/altosAdventure.png'), 41 | downloads: '20k', 42 | stars: 4 43 | }, 44 | ] 45 | 46 | const games = [ 47 | { 48 | id: 1, 49 | title: 'Shadow Fight', 50 | image: require('../assets/images/shadowFight.png'), 51 | downloads: '20M', 52 | stars: 4.5 53 | }, 54 | { 55 | id: 2, 56 | title: 'Valor Arena', 57 | image: require('../assets/images/valorArena.png'), 58 | downloads: '10k', 59 | stars: 3.4 60 | }, 61 | { 62 | id: 3, 63 | title: 'Frag', 64 | image: require('../assets/images/frag.png'), 65 | downloads: '80k', 66 | stars: 4.6 67 | }, 68 | { 69 | id: 4, 70 | title: "Zooba Wildlife", 71 | image: require('../assets/images/zoobaGame.png'), 72 | downloads: '40k', 73 | stars: 3.5 74 | }, 75 | { 76 | id: 4, 77 | title: "Clash of Clans", 78 | image: require('../assets/images/clashofclans.png'), 79 | downloads: '20k', 80 | stars: 4.2 81 | }, 82 | ]; 83 | 84 | export default function StoreScreen() { 85 | const [activeCategory, setActiveCategory] = useState('Action'); 86 | const [selectedGame, setSelectedGame] = useState(null); 87 | return ( 88 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | {/* categories */} 100 | 101 | 105 | Browse Games 106 | 107 | 108 | 109 | { 110 | categories.map(cat=> { 111 | if(cat==activeCategory){ 112 | // show gradient category 113 | return ( 114 | 115 | ) 116 | }else{ 117 | // show normal category 118 | return ( 119 | setActiveCategory(cat)} 121 | key={cat} 122 | className="bg-blue-200 p-3 px-4 rounded-full mr-2"> 123 | 124 | {cat} 125 | 126 | 127 | 128 | ) 129 | } 130 | 131 | }) 132 | } 133 | 134 | 135 | 136 | 137 | {/* featured row */} 138 | 139 | 142 | Featured Games 143 | 144 | 145 | 146 | { 147 | featured.map((item, index)=>{ 148 | return ( 149 | 150 | ) 151 | }) 152 | } 153 | 154 | 155 | 156 | 157 | {/* top action games list */} 158 | 159 | 160 | 163 | Top Action Games 164 | 165 | 166 | 167 | See All 168 | 169 | 170 | 171 | 172 | { 173 | games.map((game, index)=>{ 174 | let bg= game.id==selectedGame? 'rgba(255,255,255,0.4)': 'transparent'; 175 | 176 | return ( 177 | setSelectedGame(game.id)} 181 | key={index}> 182 | 184 | 185 | 187 | {game.title} 188 | 189 | 190 | 191 | 193 | 194 | {game.stars} stars 195 | 196 | 197 | 198 | 199 | 200 | {game.downloads} 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | ) 210 | }) 211 | } 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | ) 220 | } -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./App.{js,jsx,ts,tsx}", 5 | "./screens/**/*.{js,jsx,ts,tsx}", 6 | "./components/**/*.{js,jsx,ts,tsx}" 7 | ], 8 | theme: { 9 | extend: {}, 10 | }, 11 | plugins: [], 12 | } 13 | -------------------------------------------------------------------------------- /theme/index.js: -------------------------------------------------------------------------------- 1 | export const storeColors = { 2 | text: '#0D163A', 3 | redHeart: '#F73434' 4 | } 5 | --------------------------------------------------------------------------------