├── .expo-shared
└── assets.json
├── .gitignore
├── App.js
├── README.md
├── app.json
├── assets
├── app.gif
├── banner.png
├── icon.png
├── logo.png
├── movie1.jpg
├── movie2.jpg
├── movie3.jpg
├── movie4.jpg
├── poster.jpg
├── splash.png
└── splash2.png
├── babel.config.js
├── components
├── Header.js
├── Hero.js
└── Movies.js
├── package.json
├── screen
└── Home.js
└── yarn.lock
/.expo-shared/assets.json:
--------------------------------------------------------------------------------
1 | {
2 | "12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true,
3 | "40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true
4 | }
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/**/*
2 | .expo/*
3 | npm-debug.*
4 | *.jks
5 | *.p8
6 | *.p12
7 | *.key
8 | *.mobileprovision
9 | *.orig.*
10 | web-build/
11 | web-report/
12 |
13 | # macOS
14 | .DS_Store
15 |
--------------------------------------------------------------------------------
/App.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | import Home from './screen/Home'
4 |
5 | const App = () => {
6 | return
7 | }
8 |
9 | export default App
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Netflix React Native
7 |
8 |
9 | Recreating Netflix React Native with styled components
10 | Watch on Youtube
11 |
12 |
18 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "expo": {
3 | "name": "Netflix",
4 | "slug": "Netflix",
5 | "platforms": ["ios", "android", "web"],
6 | "version": "1.0.0",
7 | "orientation": "portrait",
8 | "icon": "./assets/icon.png",
9 | "splash": {
10 | "image": "./assets/splash2.png",
11 | "resizeMode": "cover",
12 | "backgroundColor": "#000000"
13 | },
14 | "updates": {
15 | "fallbackToCacheTimeout": 0
16 | },
17 | "assetBundlePatterns": ["**/*"],
18 | "ios": {
19 | "supportsTablet": true
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/assets/app.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/app.gif
--------------------------------------------------------------------------------
/assets/banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/banner.png
--------------------------------------------------------------------------------
/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/icon.png
--------------------------------------------------------------------------------
/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/logo.png
--------------------------------------------------------------------------------
/assets/movie1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/movie1.jpg
--------------------------------------------------------------------------------
/assets/movie2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/movie2.jpg
--------------------------------------------------------------------------------
/assets/movie3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/movie3.jpg
--------------------------------------------------------------------------------
/assets/movie4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/movie4.jpg
--------------------------------------------------------------------------------
/assets/poster.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/poster.jpg
--------------------------------------------------------------------------------
/assets/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/splash.png
--------------------------------------------------------------------------------
/assets/splash2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reginaldop/netflix-react-native/718a46fb28a5f805fe6e67823a45d640685d1157/assets/splash2.png
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = function(api) {
2 | api.cache(true);
3 | return {
4 | presets: ['babel-preset-expo'],
5 | };
6 | };
7 |
--------------------------------------------------------------------------------
/components/Header.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | import styled from 'styled-components/native'
4 |
5 | const Container = styled.View`
6 | align-items: center;
7 | flex-direction: row;
8 | justify-content: space-between;
9 | padding: 25px 25px 0 25px;
10 | width: 100%;
11 | `
12 |
13 | const Logo = styled.Image`
14 | width: 20px;
15 | height: 40px;
16 | `
17 |
18 | const Menu = styled.Text`
19 | font-size: 18px;
20 | color: #fff;
21 | letter-spacing: 0.1px;
22 | `
23 |
24 | const Header = () => {
25 | return (
26 |
27 |
28 |
29 |
30 |
31 |
32 | )
33 | }
34 |
35 | export default Header
36 |
--------------------------------------------------------------------------------
/components/Hero.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | import styled from 'styled-components/native'
4 |
5 | import { Feather, Ionicons } from '@expo/vector-icons'
6 |
7 | const Container = styled.View`
8 | position: absolute;
9 | width: 100%;
10 | align-items: center;
11 | bottom: 8px;
12 | `
13 |
14 | const Banner = styled.Image`
15 | height: 100px;
16 | `
17 |
18 | const Tags = styled.View`
19 | justify-content: center;
20 | margin-top: 20px;
21 | flex-direction: row;
22 | `
23 |
24 | const MenuTag = styled.Text`
25 | color: #fff;
26 | padding: 0 8px;
27 | font-size: 13px;
28 | `
29 |
30 | const Separator = styled.View`
31 | width: 3px;
32 | height: 3px;
33 | background-color: #e8e8e8;
34 | margin: 6px 0;
35 | border-radius: 3px;
36 | `
37 |
38 | const MenuHero = styled.View`
39 | width: 90%;
40 | margin-top: 15px;
41 | flex-direction: row;
42 | justify-content: space-between;
43 | align-items: center;
44 | `
45 |
46 | const Button = styled.TouchableOpacity`
47 | align-items: center;
48 | `
49 |
50 | const TextButton = styled.Text`
51 | color: #fff;
52 | font-size: 13px;
53 | margin-top: 3px;
54 | `
55 |
56 | const Play = styled.TouchableOpacity`
57 | flex-direction: row;
58 | background-color: #fff;
59 | width: 142px;
60 | height: 32px;
61 | border-radius: 2px;
62 | align-items: center;
63 | justify-content: center;
64 | `
65 |
66 | const TextButtonPlay = styled.Text`
67 | font-size: 15px;
68 | font-weight: bold;
69 | padding-left: 5px;
70 | `
71 |
72 | const Hero = () => {
73 | return (
74 |
75 |
76 |
77 | Envolvente
78 |
79 | Empolgantes
80 |
81 |
82 |
86 |
87 |
88 |
89 | Assistir
90 |
91 |
92 |
96 |
97 |
98 | )
99 | }
100 |
101 | export default Hero
102 |
--------------------------------------------------------------------------------
/components/Movies.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Dimensions } from 'react-native'
3 |
4 | import styled from 'styled-components/native'
5 |
6 | const Container = styled.View`
7 | padding: 20px 0;
8 | `
9 |
10 | const Label = styled.Text`
11 | color: #fff;
12 | font-size: 16px;
13 | margin: 0 0 5px 10px;
14 | `
15 | const MovieScroll = styled.ScrollView`
16 | padding-left: 10px;
17 | `
18 |
19 | const MoviePoster = styled.Image`
20 | width: ${Math.round((Dimensions.get('window').width * 28) / 100)}px;
21 | height: 150px;
22 | `
23 |
24 | const MovieCard = styled.View`
25 | padding-right: 9px;
26 | `
27 |
28 | const Movies = ({ label, item }) => {
29 | return (
30 |
31 |
32 |
33 | {item.map((movie, item) => {
34 | return (
35 |
36 |
37 |
38 | )
39 | })}
40 |
41 |
42 | )
43 | }
44 |
45 | export default Movies
46 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "main": "node_modules/expo/AppEntry.js",
3 | "scripts": {
4 | "start": "expo start",
5 | "android": "expo start --android",
6 | "ios": "expo start --ios",
7 | "web": "expo start --web",
8 | "eject": "expo eject"
9 | },
10 | "dependencies": {
11 | "expo": "^37.0.0",
12 | "react": "16.9.0",
13 | "react-dom": "16.9.0",
14 | "react-native": "https://github.com/expo/react-native/archive/sdk-37.0.1.tar.gz",
15 | "react-native-web": "^0.11.7",
16 | "styled-components": "^5.1.0"
17 | },
18 | "devDependencies": {
19 | "@babel/core": "^7.8.6",
20 | "babel-preset-expo": "^8.1.0"
21 | },
22 | "private": true
23 | }
24 |
--------------------------------------------------------------------------------
/screen/Home.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | import { StatusBar, Dimensions } from 'react-native'
4 |
5 | import { LinearGradient } from 'expo-linear-gradient'
6 |
7 | import styled from 'styled-components/native'
8 |
9 | import Header from '../components/Header'
10 | import Hero from '../components/Hero'
11 | import Movies from '../components/Movies'
12 |
13 | const api = [
14 | require('../assets/movie1.jpg'),
15 | require('../assets/movie2.jpg'),
16 | require('../assets/movie3.jpg'),
17 | require('../assets/movie4.jpg')
18 | ]
19 |
20 | const Container = styled.ScrollView`
21 | flex: 1;
22 | background-color: #000;
23 | `
24 |
25 | const Poster = styled.ImageBackground`
26 | width: 100%;
27 | height: ${(Dimensions.get('window').height * 81) / 100}px;
28 | `
29 |
30 | const Gradient = styled(LinearGradient)`
31 | height: 100%;
32 | `
33 |
34 | const Home = () => {
35 | return (
36 | <>
37 |
42 |
43 |
44 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | >
60 | )
61 | }
62 |
63 | export default Home
64 |
--------------------------------------------------------------------------------