├── .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 | 
4 |
5 |
6 |
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 |
44 |
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 |
--------------------------------------------------------------------------------