([])
33 |
34 | const { user /* , signOut */ } = useAuth()
35 | const { navigate } = useNavigation()
36 |
37 | useEffect(() => {
38 | api.get('providers').then(response => {
39 | setProviders(response.data)
40 | })
41 | }, [])
42 |
43 | const navigateToProfile = useCallback(() => {
44 | navigate('Profile')
45 | }, [navigate])
46 |
47 | const navigateToCreateAppointment = useCallback(
48 | (providerId: string) => {
49 | navigate('CreateAppointment', { providerId })
50 | },
51 | [navigate],
52 | )
53 |
54 | return (
55 |
56 |
57 |
58 | Bem vindo, {'\n'}
59 | {user.name}
60 |
61 |
62 |
69 |
70 |
71 |
72 | provider.id}
75 | ListHeaderComponent={
76 | Cabeleireiros
77 | }
78 | renderItem={({ item: provider }) => (
79 | navigateToCreateAppointment(provider.id)}
81 | >
82 |
89 |
90 |
91 | {provider.name}
92 |
93 |
94 |
95 | Segunda à sexta
96 |
97 |
98 |
99 | 8h às 18h
100 |
101 |
102 |
103 | )}
104 | />
105 |
106 | )
107 | }
108 |
109 | export default Dashboard
110 |
--------------------------------------------------------------------------------
/android/app/src/debug/java/com/appgobarber/ReactNativeFlipper.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) Facebook, Inc. and its affiliates.
3 | *
4 | * This source code is licensed under the MIT license found in the LICENSE file in the root
5 | * directory of this source tree.
6 | */
7 | package com.appgobarber;
8 |
9 | import android.content.Context;
10 | import com.facebook.flipper.android.AndroidFlipperClient;
11 | import com.facebook.flipper.android.utils.FlipperUtils;
12 | import com.facebook.flipper.core.FlipperClient;
13 | import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
14 | import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
15 | import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
16 | import com.facebook.flipper.plugins.inspector.DescriptorMapping;
17 | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
18 | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
19 | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
20 | import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
21 | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
22 | import com.facebook.react.ReactInstanceManager;
23 | import com.facebook.react.bridge.ReactContext;
24 | import com.facebook.react.modules.network.NetworkingModule;
25 | import okhttp3.OkHttpClient;
26 |
27 | public class ReactNativeFlipper {
28 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
29 | if (FlipperUtils.shouldEnableFlipper(context)) {
30 | final FlipperClient client = AndroidFlipperClient.getInstance(context);
31 |
32 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
33 | client.addPlugin(new ReactFlipperPlugin());
34 | client.addPlugin(new DatabasesFlipperPlugin(context));
35 | client.addPlugin(new SharedPreferencesFlipperPlugin(context));
36 | client.addPlugin(CrashReporterPlugin.getInstance());
37 |
38 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
39 | NetworkingModule.setCustomClientBuilder(
40 | new NetworkingModule.CustomClientBuilder() {
41 | @Override
42 | public void apply(OkHttpClient.Builder builder) {
43 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
44 | }
45 | });
46 | client.addPlugin(networkFlipperPlugin);
47 | client.start();
48 |
49 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
50 | // Hence we run if after all native modules have been initialized
51 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
52 | if (reactContext == null) {
53 | reactInstanceManager.addReactInstanceEventListener(
54 | new ReactInstanceManager.ReactInstanceEventListener() {
55 | @Override
56 | public void onReactContextInitialized(ReactContext reactContext) {
57 | reactInstanceManager.removeReactInstanceEventListener(this);
58 | reactContext.runOnNativeModulesQueueThread(
59 | new Runnable() {
60 | @Override
61 | public void run() {
62 | client.addPlugin(new FrescoFlipperPlugin());
63 | }
64 | });
65 | }
66 | });
67 | } else {
68 | client.addPlugin(new FrescoFlipperPlugin());
69 | }
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/ios/appgobarber.xcodeproj/xcshareddata/xcschemes/appgobarber.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
53 |
55 |
61 |
62 |
63 |
64 |
70 |
72 |
78 |
79 |
80 |
81 |
83 |
84 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/ios/appgobarber.xcodeproj/xcshareddata/xcschemes/appgobarber-tvOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
53 |
55 |
61 |
62 |
63 |
64 |
70 |
72 |
78 |
79 |
80 |
81 |
83 |
84 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/ios/appgobarber/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
21 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/pages/CreateAppointment/styles.ts:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components/native'
2 | import { getStatusBarHeight } from 'react-native-iphone-x-helper'
3 | import { FlatList } from 'react-native'
4 | import { RectButton } from 'react-native-gesture-handler'
5 | import { Provider } from './index'
6 |
7 | interface ProviderContainerProps {
8 | selected: boolean
9 | }
10 | interface ProviderNameProps {
11 | selected: boolean
12 | }
13 |
14 | interface HourProps {
15 | available: boolean
16 | selected: boolean
17 | }
18 | interface HourTextProps {
19 | selected: boolean
20 | }
21 |
22 | export const Container = styled.View`
23 | flex: 1;
24 | `
25 |
26 | export const Header = styled.View`
27 | padding: 24px;
28 | padding-top: ${getStatusBarHeight() + 24}px;
29 | background: #28262e;
30 |
31 | flex-direction: row;
32 | justify-content: space-between;
33 | align-items: center;
34 | `
35 |
36 | export const BackButton = styled.TouchableOpacity``
37 |
38 | export const HeaderTitle = styled.Text`
39 | color: #f5ede8;
40 | font-family: 'RobotoSlab-Medium';
41 | font-size: 20px;
42 | margin-left: 16px;
43 | `
44 |
45 | export const UserAvatar = styled.Image`
46 | width: 56px;
47 | height: 56px;
48 | border-radius: 28px;
49 | margin-left: auto;
50 | `
51 |
52 | export const ProvidersListContainer = styled.View`
53 | height: 112px;
54 | `
55 |
56 | export const Content = styled.ScrollView``
57 |
58 | export const ProvidersList = styled(FlatList as new () => FlatList)`
59 | padding: 32px 24px;
60 | `
61 |
62 | export const ProviderContainer = styled(RectButton)`
63 | background: ${props => (props.selected ? '#ff9000' : '#3e3b47')};
64 | flex-direction: row;
65 | align-items: center;
66 | padding: 8px 12px;
67 | margin-right: 16px;
68 | border-radius: 10px;
69 | `
70 |
71 | export const ProviderAvatar = styled.Image`
72 | width: 32px;
73 | height: 32px;
74 | border-radius: 16px;
75 | `
76 |
77 | export const ProviderName = styled.Text`
78 | margin-left: 8px;
79 | font-family: 'RobotoSlab-Medium';
80 | font-size: 16px;
81 | color: ${props => (props.selected ? '#232129' : '#f4ede8')};
82 | `
83 |
84 | export const Calendar = styled.View``
85 |
86 | export const Title = styled.Text`
87 | font-family: 'RobotoSlab-Medium';
88 | color: #f4ede8;
89 | font-size: 24px;
90 | margin: 0 24px 24px;
91 | `
92 |
93 | export const OpenDatePickerButton = styled(RectButton)`
94 | height: 46px;
95 | background: #ff9000;
96 | border-radius: 10px;
97 | align-items: center;
98 | justify-content: center;
99 | margin: 0 24px;
100 | `
101 |
102 | export const OpenDatePickerButtonText = styled.Text`
103 | font-family: 'RobotoSlab-Medium';
104 | font-size: 16px;
105 | color: #232129;
106 | `
107 |
108 | export const Schedule = styled.View`
109 | padding: 24px 0 16px;
110 | `
111 |
112 | export const Section = styled.View`
113 | margin-bottom: 24px;
114 | `
115 |
116 | export const SectionTitle = styled.Text`
117 | font-size: 18px;
118 | color: #999591;
119 | font-family: 'RobotoSlab-Regular';
120 | margin: 0 24px 12px;
121 | `
122 |
123 | export const SectionContent = styled.ScrollView.attrs({
124 | contentContainerStyle: { paddingHorizontal: 24 },
125 | horizontal: true,
126 | showsHorizontalScrollIndicator: false,
127 | })``
128 |
129 | export const Hour = styled(RectButton)`
130 | padding: 12px;
131 | background: ${props => (props.selected ? '#ff9000' : '#3e3b47')};
132 | border-radius: 10px;
133 | margin-right: 8px;
134 |
135 | opacity: ${props => (props.available ? 1 : 0.3)};
136 | `
137 |
138 | export const HourText = styled.Text`
139 | color: ${props => (props.selected ? '#232129' : '#f4ede8')};
140 | font-family: 'RobotoSlab-Regular';
141 | font-size: 16px;
142 | `
143 |
144 | export const CreateAppointmentButton = styled(RectButton)`
145 | height: 50px;
146 | background: #ff9000;
147 | border-radius: 10px;
148 | align-items: center;
149 | justify-content: center;
150 | margin: 0 24px 24px;
151 | `
152 |
153 | export const CreateAppointmentButtonText = styled.Text`
154 | font-family: 'RobotoSlab-Medium';
155 | font-size: 18px;
156 | color: #232129;
157 | `
158 |
--------------------------------------------------------------------------------
/src/pages/SignIn/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { useCallback, useRef, useContext } from 'react'
2 | import {
3 | Image,
4 | KeyboardAvoidingView,
5 | ScrollView,
6 | Platform,
7 | View,
8 | TextInput,
9 | Alert,
10 | } from 'react-native'
11 |
12 | import { ThemeContext } from 'styled-components'
13 |
14 | import Icon from 'react-native-vector-icons/Feather'
15 | import { useNavigation } from '@react-navigation/native'
16 | import * as Yup from 'yup'
17 |
18 | import { Form } from '@unform/mobile'
19 | import { FormHandles } from '@unform/core'
20 |
21 | import { useAuth } from '../../hooks/auth'
22 |
23 | import getValidationErrors from '../../utils/getValidationErrors'
24 |
25 | import Input from '../../components/Input'
26 | import Button from '../../components/Button'
27 |
28 | import {
29 | Container,
30 | Title,
31 | ForgotPassword,
32 | ForgotPasswordText,
33 | CreateAccountButton,
34 | CreateAccountButtonText,
35 | } from './styles'
36 |
37 | interface SignInFormData {
38 | email: string
39 | password: string
40 | }
41 |
42 | const SignIn: React.FC = () => {
43 | const formRef = useRef(null)
44 | const passwordInputRef = useRef(null)
45 |
46 | const navigation = useNavigation()
47 |
48 | const { signIn } = useAuth()
49 |
50 | const handleSignIn = useCallback(
51 | async (data: SignInFormData) => {
52 | try {
53 | formRef.current?.setErrors({})
54 |
55 | const schema = Yup.object().shape({
56 | email: Yup.string()
57 | .required('E-mail obrigatório')
58 | .email('Digite um e-mail válido'),
59 | password: Yup.string().required('Senha obrigatória'),
60 | })
61 |
62 | await schema.validate(data, {
63 | abortEarly: false,
64 | })
65 |
66 | await signIn({
67 | email: data.email,
68 | password: data.password,
69 | })
70 | } catch (err) {
71 | if (err instanceof Yup.ValidationError) {
72 | const errors = getValidationErrors(err)
73 |
74 | formRef.current?.setErrors(errors)
75 |
76 | return
77 | }
78 |
79 | Alert.alert(
80 | 'Erro na autenticação',
81 | 'Ocorreu um erro ao fazer login, cheque as credenciais',
82 | )
83 | }
84 | },
85 | [signIn],
86 | )
87 |
88 | const { logo } = useContext(ThemeContext)
89 |
90 | return (
91 | <>
92 |
97 |
101 |
102 |
103 |
104 |
105 | Faça seu logon
106 |
107 |
108 |
134 |
141 |
142 | {/* eslint-disable-next-line @typescript-eslint/no-empty-function */}
143 | {}}>
144 | Esqueci minha senha
145 |
146 |
147 |
148 |
149 |
150 | navigation.navigate('SignUp')}>
151 |
152 | Criar uma conta
153 |
154 | >
155 | )
156 | }
157 |
158 | export default SignIn
159 |
--------------------------------------------------------------------------------
/src/pages/SignUp/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { useRef, useCallback, useContext } from 'react'
2 | import {
3 | Image,
4 | KeyboardAvoidingView,
5 | ScrollView,
6 | Platform,
7 | View,
8 | TextInput,
9 | Alert,
10 | } from 'react-native'
11 | import Icon from 'react-native-vector-icons/Feather'
12 | import { useNavigation } from '@react-navigation/native'
13 |
14 | import { ThemeContext } from 'styled-components'
15 |
16 | import { Form } from '@unform/mobile'
17 | import { FormHandles } from '@unform/core'
18 | import * as Yup from 'yup'
19 | import api from '../../services/api'
20 |
21 | import getValidationErrors from '../../utils/getValidationErrors'
22 |
23 | import Input from '../../components/Input'
24 | import Button from '../../components/Button'
25 |
26 | import { Container, Title, BackToSignIn, BackToSignInText } from './styles'
27 |
28 | interface SignUpFormData {
29 | name: string
30 | email: string
31 | password: string
32 | }
33 |
34 | const SignUp: React.FC = () => {
35 | const formRef = useRef(null)
36 | const navigation = useNavigation()
37 |
38 | const emailInputRef = useRef(null)
39 | const passwordInputRef = useRef(null)
40 |
41 | const handleSignUp = useCallback(
42 | async (data: SignUpFormData) => {
43 | try {
44 | formRef.current?.setErrors({})
45 |
46 | const schema = Yup.object().shape({
47 | name: Yup.string().required('Nome obrigatório'),
48 | email: Yup.string()
49 | .required('E-mail obrigatório')
50 | .email('Digite um e-mail válido'),
51 | password: Yup.string().min(6, 'No mínimo 6 dígitos'),
52 | })
53 |
54 | await schema.validate(data, {
55 | abortEarly: false,
56 | })
57 |
58 | await api.post('/users', data)
59 |
60 | Alert.alert(
61 | 'Cadastro realizado com sucesso!',
62 | 'Você já pode fazer login na aplicação.',
63 | )
64 |
65 | navigation.goBack()
66 | } catch (err) {
67 | if (err instanceof Yup.ValidationError) {
68 | const errors = getValidationErrors(err)
69 |
70 | formRef.current?.setErrors(errors)
71 |
72 | return
73 | }
74 |
75 | Alert.alert(
76 | 'Erro no cadastro',
77 | 'Ocorreu um erro ao fazer o cadastro, tente novamente!',
78 | )
79 | }
80 | },
81 | [navigation],
82 | )
83 |
84 | const { logo, title } = useContext(ThemeContext)
85 |
86 | return (
87 | <>
88 |
93 |
97 |
98 |
99 |
100 |
101 | Crie sua conta
102 |
103 |
104 |
140 |
147 |
148 |
149 |
150 |
151 | navigation.goBack()}>
152 |
157 | Voltar para o logon
158 |
159 | >
160 | )
161 | }
162 |
163 | export default SignUp
164 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 |
2 | {
3 | "compilerOptions": {
4 | /* Basic Options */
5 | "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
6 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
7 | "lib": ["es6"], /* Specify library files to be included in the compilation. */
8 | "allowJs": true, /* Allow javascript files to be compiled. */
9 | // "checkJs": true, /* Report errors in .js files. */
10 | "jsx": "react-native", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
11 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
12 | // "sourceMap": true, /* Generates corresponding '.map' file. */
13 | // "outFile": "./", /* Concatenate and emit output to single file. */
14 | // "outDir": "./", /* Redirect output structure to the directory. */
15 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
16 | // "removeComments": true, /* Do not emit comments to output. */
17 | "noEmit": true, /* Do not emit outputs. */
18 | // "incremental": true, /* Enable incremental compilation */
19 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
20 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
21 | "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
22 |
23 | /* Strict Type-Checking Options */
24 | "strict": true, /* Enable all strict type-checking options. */
25 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
26 | // "strictNullChecks": true, /* Enable strict null checks. */
27 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
28 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
29 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
30 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
31 |
32 | /* Additional Checks */
33 | // "noUnusedLocals": true, /* Report errors on unused locals. */
34 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
35 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
36 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
37 |
38 | /* Module Resolution Options */
39 | "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
40 | "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
41 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
42 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
43 | // "typeRoots": [], /* List of folders to include type definitions from. */
44 | // "types": [], /* Type declaration files to be included in compilation. */
45 | "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
46 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
47 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
48 |
49 | /* Source Map Options */
50 | // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
51 | // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */
52 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
53 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
54 |
55 | /* Experimental Options */
56 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
57 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
58 | },
59 | "exclude": [
60 | "node_modules", "babel.config.js", "metro.config.js", "jest.config.js"
61 | ],
62 | "include": ["**/src/**/*.ts", "**/src/**/*.tsx"],
63 | "files": ["src/@types/index.d.ts"]
64 | }
65 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | platform :ios, '9.0'
2 | require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
3 |
4 | def add_flipper_pods!(versions = {})
5 | versions['Flipper'] ||= '~> 0.33.1'
6 | versions['DoubleConversion'] ||= '1.1.7'
7 | versions['Flipper-Folly'] ||= '~> 2.1'
8 | versions['Flipper-Glog'] ||= '0.3.6'
9 | versions['Flipper-PeerTalk'] ||= '~> 0.0.4'
10 | versions['Flipper-RSocket'] ||= '~> 1.0'
11 |
12 | pod 'FlipperKit', versions['Flipper'], :configuration => 'Debug'
13 | pod 'FlipperKit/FlipperKitLayoutPlugin', versions['Flipper'], :configuration => 'Debug'
14 | pod 'FlipperKit/SKIOSNetworkPlugin', versions['Flipper'], :configuration => 'Debug'
15 | pod 'FlipperKit/FlipperKitUserDefaultsPlugin', versions['Flipper'], :configuration => 'Debug'
16 | pod 'FlipperKit/FlipperKitReactPlugin', versions['Flipper'], :configuration => 'Debug'
17 |
18 | # List all transitive dependencies for FlipperKit pods
19 | # to avoid them being linked in Release builds
20 | pod 'Flipper', versions['Flipper'], :configuration => 'Debug'
21 | pod 'Flipper-DoubleConversion', versions['DoubleConversion'], :configuration => 'Debug'
22 | pod 'Flipper-Folly', versions['Flipper-Folly'], :configuration => 'Debug'
23 | pod 'Flipper-Glog', versions['Flipper-Glog'], :configuration => 'Debug'
24 | pod 'Flipper-PeerTalk', versions['Flipper-PeerTalk'], :configuration => 'Debug'
25 | pod 'Flipper-RSocket', versions['Flipper-RSocket'], :configuration => 'Debug'
26 | pod 'FlipperKit/Core', versions['Flipper'], :configuration => 'Debug'
27 | pod 'FlipperKit/CppBridge', versions['Flipper'], :configuration => 'Debug'
28 | pod 'FlipperKit/FBCxxFollyDynamicConvert', versions['Flipper'], :configuration => 'Debug'
29 | pod 'FlipperKit/FBDefines', versions['Flipper'], :configuration => 'Debug'
30 | pod 'FlipperKit/FKPortForwarding', versions['Flipper'], :configuration => 'Debug'
31 | pod 'FlipperKit/FlipperKitHighlightOverlay', versions['Flipper'], :configuration => 'Debug'
32 | pod 'FlipperKit/FlipperKitLayoutTextSearchable', versions['Flipper'], :configuration => 'Debug'
33 | pod 'FlipperKit/FlipperKitNetworkPlugin', versions['Flipper'], :configuration => 'Debug'
34 | end
35 |
36 | # Post Install processing for Flipper
37 | def flipper_post_install(installer)
38 | installer.pods_project.targets.each do |target|
39 | if target.name == 'YogaKit'
40 | target.build_configurations.each do |config|
41 | config.build_settings['SWIFT_VERSION'] = '4.1'
42 | end
43 | end
44 | end
45 | end
46 |
47 | target 'appgobarber' do
48 | # Pods for appgobarber
49 | pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
50 | pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
51 | pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
52 | pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
53 | pod 'React', :path => '../node_modules/react-native/'
54 | pod 'React-Core', :path => '../node_modules/react-native/'
55 | pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
56 | pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
57 | pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
58 | pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
59 | pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
60 | pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
61 | pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
62 | pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
63 | pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
64 | pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
65 | pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
66 | pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
67 |
68 | pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
69 | pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
70 | pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
71 | pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
72 | pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon"
73 | pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
74 | pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true
75 |
76 | pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
77 | pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
78 | pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
79 |
80 | target 'appgobarberTests' do
81 | inherit! :complete
82 | # Pods for testing
83 | end
84 |
85 | use_native_modules!
86 |
87 | # Enables Flipper.
88 | #
89 | # Note that if you have use_frameworks! enabled, Flipper will not work and
90 | # you should disable these next few lines.
91 | add_flipper_pods!
92 | post_install do |installer|
93 | flipper_post_install(installer)
94 | end
95 | end
96 |
97 | target 'appgobarber-tvOS' do
98 | # Pods for appgobarber-tvOS
99 |
100 | target 'appgobarber-tvOSTests' do
101 | inherit! :search_paths
102 | # Pods for testing
103 | end
104 | end
--------------------------------------------------------------------------------
/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 | # Determine the Java command to use to start the JVM.
86 | if [ -n "$JAVA_HOME" ] ; then
87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
88 | # IBM's JDK on AIX uses strange locations for the executables
89 | JAVACMD="$JAVA_HOME/jre/sh/java"
90 | else
91 | JAVACMD="$JAVA_HOME/bin/java"
92 | fi
93 | if [ ! -x "$JAVACMD" ] ; then
94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
95 |
96 | Please set the JAVA_HOME variable in your environment to match the
97 | location of your Java installation."
98 | fi
99 | else
100 | JAVACMD="java"
101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
102 |
103 | Please set the JAVA_HOME variable in your environment to match the
104 | location of your Java installation."
105 | fi
106 |
107 | # Increase the maximum file descriptors if we can.
108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
109 | MAX_FD_LIMIT=`ulimit -H -n`
110 | if [ $? -eq 0 ] ; then
111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
112 | MAX_FD="$MAX_FD_LIMIT"
113 | fi
114 | ulimit -n $MAX_FD
115 | if [ $? -ne 0 ] ; then
116 | warn "Could not set maximum file descriptor limit: $MAX_FD"
117 | fi
118 | else
119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
120 | fi
121 | fi
122 |
123 | # For Darwin, add options to specify how the application appears in the dock
124 | if $darwin; then
125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
126 | fi
127 |
128 | # For Cygwin or MSYS, switch paths to Windows format before running java
129 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
132 | JAVACMD=`cygpath --unix "$JAVACMD"`
133 |
134 | # We build the pattern for arguments to be converted via cygpath
135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
136 | SEP=""
137 | for dir in $ROOTDIRSRAW ; do
138 | ROOTDIRS="$ROOTDIRS$SEP$dir"
139 | SEP="|"
140 | done
141 | OURCYGPATTERN="(^($ROOTDIRS))"
142 | # Add a user-defined pattern to the cygpath arguments
143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
145 | fi
146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
147 | i=0
148 | for arg in "$@" ; do
149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
151 |
152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
154 | else
155 | eval `echo args$i`="\"$arg\""
156 | fi
157 | i=$((i+1))
158 | done
159 | case $i in
160 | (0) set -- ;;
161 | (1) set -- "$args0" ;;
162 | (2) set -- "$args0" "$args1" ;;
163 | (3) set -- "$args0" "$args1" "$args2" ;;
164 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
170 | esac
171 | fi
172 |
173 | # Escape application args
174 | save () {
175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
176 | echo " "
177 | }
178 | APP_ARGS=$(save "$@")
179 |
180 | # Collect all arguments for the java command, following the shell quoting and substitution rules
181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
182 |
183 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
184 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
185 | cd "$(dirname "$0")"
186 | fi
187 |
188 | exec "$JAVACMD" "$@"
189 |
--------------------------------------------------------------------------------
/src/pages/Profile/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { useRef, useCallback } from 'react'
2 | import {
3 | KeyboardAvoidingView,
4 | ScrollView,
5 | Platform,
6 | View,
7 | TextInput,
8 | Alert,
9 | } from 'react-native'
10 | import { useNavigation } from '@react-navigation/native'
11 |
12 | import ImagePicker from 'react-native-image-picker'
13 | import { Form } from '@unform/mobile'
14 | import { FormHandles } from '@unform/core'
15 | import * as Yup from 'yup'
16 | import Icon from 'react-native-vector-icons/Feather'
17 | import { useAuth } from '../../hooks/auth'
18 |
19 | import api from '../../services/api'
20 |
21 | import getValidationErrors from '../../utils/getValidationErrors'
22 |
23 | import Input from '../../components/Input'
24 | import Button from '../../components/Button'
25 |
26 | import {
27 | Container,
28 | Title,
29 | BackButton,
30 | UserAvatar,
31 | UserAvatarButton,
32 | } from './styles'
33 |
34 | interface ProfileFormData {
35 | name: string
36 | email: string
37 | password: string
38 | old_password: string
39 | password_confirmation: string
40 | }
41 |
42 | const Profile: React.FC = () => {
43 | const { user, updateUser } = useAuth()
44 |
45 | const formRef = useRef(null)
46 | const navigation = useNavigation()
47 |
48 | const emailInputRef = useRef(null)
49 | const oldPasswordInputRef = useRef(null)
50 | const passwordInputRef = useRef(null)
51 | const confirmPasswordInputRef = useRef(null)
52 |
53 | const handleSignUp = useCallback(
54 | async (data: ProfileFormData) => {
55 | try {
56 | formRef.current?.setErrors({})
57 |
58 | const schema = Yup.object().shape({
59 | name: Yup.string().required('Nome obrigatório'),
60 | email: Yup.string()
61 | .required('E-mail obrigatório')
62 | .email('Digite um e-mail válido'),
63 | old_password: Yup.string(),
64 | password: Yup.string().when('old_password', {
65 | is: val => !!val.length,
66 | then: Yup.string().required('Campo Obrigatório'),
67 | otherwise: Yup.string(),
68 | }),
69 | password_confirmation: Yup.string()
70 | .when('old_password', {
71 | is: val => !!val.length,
72 | then: Yup.string().required('Campo Obrigatório'),
73 | otherwise: Yup.string(),
74 | })
75 | .oneOf([Yup.ref('password'), null], 'Confirmação incorreta'),
76 | })
77 |
78 | await schema.validate(data, {
79 | abortEarly: false,
80 | })
81 |
82 | const {
83 | name,
84 | email,
85 | old_password,
86 | password,
87 | password_confirmation,
88 | } = data
89 |
90 | const formData = {
91 | name,
92 | email,
93 | ...(old_password
94 | ? {
95 | old_password,
96 | password,
97 | password_confirmation,
98 | }
99 | : {}),
100 | }
101 |
102 | const response = await api.put('/profile', formData)
103 |
104 | updateUser(response.data)
105 |
106 | Alert.alert('Perfil atualizado com sucesso!')
107 |
108 | navigation.goBack()
109 | } catch (err) {
110 | if (err instanceof Yup.ValidationError) {
111 | const errors = getValidationErrors(err)
112 |
113 | formRef.current?.setErrors(errors)
114 |
115 | return
116 | }
117 |
118 | Alert.alert(
119 | 'Erro na atualização do perfil',
120 | 'Ocorreu um erro ao atualizar seu perfil, tente novamente!',
121 | )
122 | }
123 | },
124 | [navigation, updateUser],
125 | )
126 |
127 | const handleUpdateAvatar = useCallback(() => {
128 | ImagePicker.showImagePicker(
129 | {
130 | title: 'Selecione uma avatar',
131 | cancelButtonTitle: 'Cancelar',
132 | takePhotoButtonTitle: 'Usar câmera',
133 | chooseFromLibraryButtonTitle: 'Escolha da galeria',
134 | },
135 | response => {
136 | if (response.didCancel) {
137 | return
138 | }
139 |
140 | if (response.error) {
141 | Alert.alert('Erro ao atualizar seu avatar')
142 | return
143 | }
144 |
145 | const data = new FormData()
146 |
147 | data.append('avatar', {
148 | type: 'image/jpeg',
149 | name: `${user.id}.jpg`,
150 | uri: response.uri,
151 | })
152 |
153 | api.patch('users/avatar', data).then(apiResponse => {
154 | updateUser(apiResponse.data)
155 | })
156 | },
157 | )
158 | }, [updateUser, user.id])
159 |
160 | const handleGoBack = useCallback(() => {
161 | navigation.goBack()
162 | }, [navigation])
163 |
164 | return (
165 | <>
166 |
171 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
188 |
189 |
190 |
191 | Meu Perfil
192 |
193 |
194 |
257 |
264 |
265 |
266 |
267 | >
268 | )
269 | }
270 |
271 | export default Profile
272 |
--------------------------------------------------------------------------------
/src/pages/CreateAppointment/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { useCallback, useEffect, useState, useMemo } from 'react'
2 |
3 | import { useRoute, useNavigation } from '@react-navigation/native'
4 | import Icon from 'react-native-vector-icons/Feather'
5 | import { Platform, Alert } from 'react-native'
6 | import { format } from 'date-fns'
7 | import DateTimePicker from '@react-native-community/datetimepicker'
8 |
9 | import { useAuth } from '../../hooks/auth'
10 | import api from '../../services/api'
11 |
12 | import {
13 | Container,
14 | Header,
15 | BackButton,
16 | HeaderTitle,
17 | UserAvatar,
18 | Content,
19 | ProvidersList,
20 | ProvidersListContainer,
21 | ProviderContainer,
22 | ProviderAvatar,
23 | ProviderName,
24 | Calendar,
25 | Title,
26 | OpenDatePickerButton,
27 | OpenDatePickerButtonText,
28 | Schedule,
29 | Section,
30 | SectionTitle,
31 | SectionContent,
32 | Hour,
33 | HourText,
34 | CreateAppointmentButton,
35 | CreateAppointmentButtonText,
36 | } from './styles'
37 |
38 | interface RouteParams {
39 | providerId: string
40 | }
41 |
42 | export interface Provider {
43 | id: string
44 | name: string
45 | avatar_url: string
46 | }
47 |
48 | interface AvailabilityItem {
49 | hour: number
50 | available: boolean
51 | }
52 |
53 | const CreateAppointment: React.FC = () => {
54 | const { user } = useAuth()
55 | const route = useRoute()
56 | const routeParams = route.params as RouteParams
57 | const { goBack, navigate } = useNavigation()
58 |
59 | const [availability, setAvailability] = useState([])
60 | const [selectedDate, setSelectedDate] = useState(new Date())
61 | const [selectedHour, setSelectedHour] = useState(0)
62 | const [showDatePicker, setShowDatePicker] = useState(false)
63 | const [providers, setProviders] = useState([])
64 | const [selectedProvider, setSelectedProvider] = useState(
65 | routeParams.providerId,
66 | )
67 |
68 | useEffect(() => {
69 | api.get('providers').then(response => {
70 | setProviders(response.data)
71 | })
72 | }, [])
73 |
74 | useEffect(() => {
75 | api
76 | .get(`providers/${selectedProvider}/day-availability`, {
77 | params: {
78 | year: selectedDate.getFullYear(),
79 | month: selectedDate.getMonth() + 1,
80 | day: selectedDate.getDate(),
81 | },
82 | })
83 | .then(response => {
84 | setAvailability(response.data)
85 | })
86 | }, [selectedDate, selectedProvider])
87 |
88 | const navigateBack = useCallback(() => {
89 | goBack()
90 | }, [goBack])
91 |
92 | const handleSelectProvider = useCallback((providerId: string) => {
93 | setSelectedProvider(providerId)
94 | }, [])
95 |
96 | const handleToggleDatePicker = useCallback(() => {
97 | setShowDatePicker(state => !state)
98 | }, [])
99 |
100 | const handleDateChanged = useCallback(
101 | (event: any, date: Date | undefined) => {
102 | if (Platform.OS === 'android') {
103 | setShowDatePicker(false)
104 | }
105 |
106 | if (date) {
107 | setSelectedDate(date)
108 | }
109 | },
110 | [],
111 | )
112 |
113 | const handleSelectHour = useCallback((hour: number) => {
114 | setSelectedHour(hour)
115 | }, [])
116 |
117 | const handleCreateAppointment = useCallback(async () => {
118 | try {
119 | const date = new Date(selectedDate)
120 |
121 | date.setHours(selectedHour)
122 | date.setMinutes(0)
123 |
124 | await api.post('/appointments', {
125 | provider_id: selectedProvider,
126 | date,
127 | })
128 |
129 | navigate('AppointmentCreated', { date: date.getTime() })
130 | } catch (err) {
131 | Alert.alert(
132 | 'Erro ao criar agendamento',
133 | 'Ocorreu ao tentar criar o agendamento, tente novamente',
134 | )
135 | }
136 | }, [selectedProvider, selectedDate, selectedHour, navigate])
137 |
138 | const morningAvailability = useMemo(() => {
139 | return availability
140 | .filter(({ hour }) => hour < 12)
141 | .map(({ hour, available }) => {
142 | return {
143 | hour,
144 | available,
145 | hourFormatted: format(new Date().setHours(hour), 'HH:00'),
146 | }
147 | })
148 | }, [availability])
149 |
150 | const afternoonAvailability = useMemo(() => {
151 | return availability
152 | .filter(({ hour }) => hour >= 12)
153 | .map(({ hour, available }) => {
154 | return {
155 | hour,
156 | available,
157 | hourFormatted: format(new Date().setHours(hour), 'HH:00'),
158 | }
159 | })
160 | }, [availability])
161 |
162 | return (
163 |
164 |
165 |
166 |
167 |
168 |
169 | Cabeleireiros
170 |
171 |
178 |
179 |
180 |
181 |
182 | provider.id}
187 | renderItem={({ item: provider }) => (
188 | handleSelectProvider(provider.id)}
190 | selected={provider.id === selectedProvider}
191 | >
192 |
199 |
200 | {provider.name}
201 |
202 |
203 | )}
204 | />
205 |
206 |
207 |
208 | Escolha a data
209 |
210 |
211 |
212 | Selecionar outra data
213 |
214 |
215 |
216 | {showDatePicker && (
217 |
224 | )}
225 |
226 |
227 |
228 | Escolha o horário
229 |
230 |
231 | Manhã
232 |
233 |
234 | {morningAvailability.map(({ hourFormatted, hour, available }) => (
235 | handleSelectHour(hour)}
241 | >
242 |
243 | {hourFormatted}
244 |
245 |
246 | ))}
247 |
248 |
249 |
250 | Tarde
251 |
252 |
253 | {afternoonAvailability.map(
254 | ({ hourFormatted, hour, available }) => (
255 | handleSelectHour(hour)}
261 | >
262 |
263 | {hourFormatted}
264 |
265 |
266 | ),
267 | )}
268 |
269 |
270 |
271 |
272 |
273 | Agendar
274 |
275 |
276 |
277 | )
278 | }
279 | export default CreateAppointment
280 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: "com.android.application"
2 |
3 | import com.android.build.OutputFile
4 |
5 | /**
6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7 | * and bundleReleaseJsAndAssets).
8 | * These basically call `react-native bundle` with the correct arguments during the Android build
9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10 | * bundle directly from the development server. Below you can see all the possible configurations
11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the
12 | * `apply from: "../../node_modules/react-native/react.gradle"` line.
13 | *
14 | * project.ext.react = [
15 | * // the name of the generated asset file containing your JS bundle
16 | * bundleAssetName: "index.android.bundle",
17 | *
18 | * // the entry file for bundle generation. If none specified and
19 | * // "index.android.js" exists, it will be used. Otherwise "index.js" is
20 | * // default. Can be overridden with ENTRY_FILE environment variable.
21 | * entryFile: "index.android.js",
22 | *
23 | * // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format
24 | * bundleCommand: "ram-bundle",
25 | *
26 | * // whether to bundle JS and assets in debug mode
27 | * bundleInDebug: false,
28 | *
29 | * // whether to bundle JS and assets in release mode
30 | * bundleInRelease: true,
31 | *
32 | * // whether to bundle JS and assets in another build variant (if configured).
33 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
34 | * // The configuration property can be in the following formats
35 | * // 'bundleIn${productFlavor}${buildType}'
36 | * // 'bundleIn${buildType}'
37 | * // bundleInFreeDebug: true,
38 | * // bundleInPaidRelease: true,
39 | * // bundleInBeta: true,
40 | *
41 | * // whether to disable dev mode in custom build variants (by default only disabled in release)
42 | * // for example: to disable dev mode in the staging build type (if configured)
43 | * devDisabledInStaging: true,
44 | * // The configuration property can be in the following formats
45 | * // 'devDisabledIn${productFlavor}${buildType}'
46 | * // 'devDisabledIn${buildType}'
47 | *
48 | * // the root of your project, i.e. where "package.json" lives
49 | * root: "../../",
50 | *
51 | * // where to put the JS bundle asset in debug mode
52 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
53 | *
54 | * // where to put the JS bundle asset in release mode
55 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release",
56 | *
57 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
58 | * // require('./image.png')), in debug mode
59 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
60 | *
61 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
62 | * // require('./image.png')), in release mode
63 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
64 | *
65 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means
66 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
67 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle
68 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
69 | * // for example, you might want to remove it from here.
70 | * inputExcludes: ["android/**", "ios/**"],
71 | *
72 | * // override which node gets called and with what additional arguments
73 | * nodeExecutableAndArgs: ["node"],
74 | *
75 | * // supply additional arguments to the packager
76 | * extraPackagerArgs: []
77 | * ]
78 | */
79 |
80 | project.ext.react = [
81 | enableHermes: false, // clean and rebuild if changing
82 | ]
83 |
84 | apply from: "../../node_modules/react-native/react.gradle"
85 |
86 | /**
87 | * Set this to true to create two separate APKs instead of one:
88 | * - An APK that only works on ARM devices
89 | * - An APK that only works on x86 devices
90 | * The advantage is the size of the APK is reduced by about 4MB.
91 | * Upload all the APKs to the Play Store and people will download
92 | * the correct one based on the CPU architecture of their device.
93 | */
94 | def enableSeparateBuildPerCPUArchitecture = false
95 |
96 | /**
97 | * Run Proguard to shrink the Java bytecode in release builds.
98 | */
99 | def enableProguardInReleaseBuilds = false
100 |
101 | /**
102 | * The preferred build flavor of JavaScriptCore.
103 | *
104 | * For example, to use the international variant, you can use:
105 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
106 | *
107 | * The international variant includes ICU i18n library and necessary data
108 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
109 | * give correct results when using with locales other than en-US. Note that
110 | * this variant is about 6MiB larger per architecture than default.
111 | */
112 | def jscFlavor = 'org.webkit:android-jsc:+'
113 |
114 | /**
115 | * Whether to enable the Hermes VM.
116 | *
117 | * This should be set on project.ext.react and mirrored here. If it is not set
118 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
119 | * and the benefits of using Hermes will therefore be sharply reduced.
120 | */
121 | def enableHermes = project.ext.react.get("enableHermes", false);
122 |
123 | android {
124 | compileSdkVersion rootProject.ext.compileSdkVersion
125 |
126 | compileOptions {
127 | sourceCompatibility JavaVersion.VERSION_1_8
128 | targetCompatibility JavaVersion.VERSION_1_8
129 | }
130 |
131 | defaultConfig {
132 | applicationId "com.appgobarber"
133 | minSdkVersion rootProject.ext.minSdkVersion
134 | targetSdkVersion rootProject.ext.targetSdkVersion
135 | versionCode 1
136 | versionName "1.0"
137 | }
138 | splits {
139 | abi {
140 | reset()
141 | enable enableSeparateBuildPerCPUArchitecture
142 | universalApk false // If true, also generate a universal APK
143 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
144 | }
145 | }
146 | signingConfigs {
147 | debug {
148 | storeFile file('debug.keystore')
149 | storePassword 'android'
150 | keyAlias 'androiddebugkey'
151 | keyPassword 'android'
152 | }
153 | }
154 | buildTypes {
155 | debug {
156 | signingConfig signingConfigs.debug
157 | }
158 | release {
159 | // Caution! In production, you need to generate your own keystore file.
160 | // see https://facebook.github.io/react-native/docs/signed-apk-android.
161 | signingConfig signingConfigs.debug
162 | minifyEnabled enableProguardInReleaseBuilds
163 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
164 | }
165 | }
166 |
167 | packagingOptions {
168 | pickFirst "lib/armeabi-v7a/libc++_shared.so"
169 | pickFirst "lib/arm64-v8a/libc++_shared.so"
170 | pickFirst "lib/x86/libc++_shared.so"
171 | pickFirst "lib/x86_64/libc++_shared.so"
172 | }
173 |
174 | // applicationVariants are e.g. debug, release
175 | applicationVariants.all { variant ->
176 | variant.outputs.each { output ->
177 | // For each separate APK per architecture, set a unique version code as described here:
178 | // https://developer.android.com/studio/build/configure-apk-splits.html
179 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
180 | def abi = output.getFilter(OutputFile.ABI)
181 | if (abi != null) { // null for the universal-debug, universal-release variants
182 | output.versionCodeOverride =
183 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
184 | }
185 |
186 | }
187 | }
188 | }
189 |
190 | dependencies {
191 | implementation fileTree(dir: "libs", include: ["*.jar"])
192 | //noinspection GradleDynamicVersion
193 | implementation "com.facebook.react:react-native:+" // From node_modules
194 |
195 | implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
196 |
197 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
198 | exclude group:'com.facebook.fbjni'
199 | }
200 |
201 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
202 | exclude group:'com.facebook.flipper'
203 | }
204 |
205 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
206 | exclude group:'com.facebook.flipper'
207 | }
208 |
209 | if (enableHermes) {
210 | def hermesPath = "../../node_modules/hermes-engine/android/";
211 | debugImplementation files(hermesPath + "hermes-debug.aar")
212 | releaseImplementation files(hermesPath + "hermes-release.aar")
213 | } else {
214 | implementation jscFlavor
215 | }
216 | }
217 |
218 | // Run this once to be able to run the application with BUCK
219 | // puts all compile dependencies into folder libs for BUCK to use
220 | task copyDownloadableDepsToLibs(type: Copy) {
221 | from configurations.compile
222 | into 'libs'
223 | }
224 |
225 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
226 | apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
227 |
--------------------------------------------------------------------------------
/ios/appgobarber.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 00E356F31AD99517003FC87E /* appgobarberTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* appgobarberTests.m */; };
11 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
12 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
13 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
14 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
15 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
16 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
17 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
18 | 2DCD954D1E0B4F2C00145EB5 /* appgobarberTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* appgobarberTests.m */; };
19 | BEC2659A36AA4D2A95C72096 /* RobotoSlab-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1ABA177D55844DF9A8E5750C /* RobotoSlab-Medium.ttf */; };
20 | 96E98ED7844D44A7A3C0922D /* RobotoSlab-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8F3805A9133F49008999D524 /* RobotoSlab-Regular.ttf */; };
21 | /* End PBXBuildFile section */
22 |
23 | /* Begin PBXContainerItemProxy section */
24 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
25 | isa = PBXContainerItemProxy;
26 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
27 | proxyType = 1;
28 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
29 | remoteInfo = appgobarber;
30 | };
31 | 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
32 | isa = PBXContainerItemProxy;
33 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
34 | proxyType = 1;
35 | remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;
36 | remoteInfo = "appgobarber-tvOS";
37 | };
38 | /* End PBXContainerItemProxy section */
39 |
40 | /* Begin PBXFileReference section */
41 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
42 | 00E356EE1AD99517003FC87E /* appgobarberTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = appgobarberTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
43 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
44 | 00E356F21AD99517003FC87E /* appgobarberTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = appgobarberTests.m; sourceTree = ""; };
45 | 13B07F961A680F5B00A75B9A /* appgobarber.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = appgobarber.app; sourceTree = BUILT_PRODUCTS_DIR; };
46 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = appgobarber/AppDelegate.h; sourceTree = ""; };
47 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = appgobarber/AppDelegate.m; sourceTree = ""; };
48 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
49 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = appgobarber/Images.xcassets; sourceTree = ""; };
50 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = appgobarber/Info.plist; sourceTree = ""; };
51 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = appgobarber/main.m; sourceTree = ""; };
52 | 2D02E47B1E0B4A5D006451C7 /* appgobarber-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "appgobarber-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
53 | 2D02E4901E0B4A5D006451C7 /* appgobarber-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "appgobarber-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
54 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
55 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };
56 | 1ABA177D55844DF9A8E5750C /* RobotoSlab-Medium.ttf */ = {isa = PBXFileReference; name = "RobotoSlab-Medium.ttf"; path = "../assets/fonts/RobotoSlab-Medium.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
57 | 8F3805A9133F49008999D524 /* RobotoSlab-Regular.ttf */ = {isa = PBXFileReference; name = "RobotoSlab-Regular.ttf"; path = "../assets/fonts/RobotoSlab-Regular.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
58 | /* End PBXFileReference section */
59 |
60 | /* Begin PBXFrameworksBuildPhase section */
61 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
62 | isa = PBXFrameworksBuildPhase;
63 | buildActionMask = 2147483647;
64 | files = (
65 | );
66 | runOnlyForDeploymentPostprocessing = 0;
67 | };
68 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
69 | isa = PBXFrameworksBuildPhase;
70 | buildActionMask = 2147483647;
71 | files = (
72 | );
73 | runOnlyForDeploymentPostprocessing = 0;
74 | };
75 | 2D02E4781E0B4A5D006451C7 /* Frameworks */ = {
76 | isa = PBXFrameworksBuildPhase;
77 | buildActionMask = 2147483647;
78 | files = (
79 | );
80 | runOnlyForDeploymentPostprocessing = 0;
81 | };
82 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {
83 | isa = PBXFrameworksBuildPhase;
84 | buildActionMask = 2147483647;
85 | files = (
86 | );
87 | runOnlyForDeploymentPostprocessing = 0;
88 | };
89 | /* End PBXFrameworksBuildPhase section */
90 |
91 | /* Begin PBXGroup section */
92 | 00E356EF1AD99517003FC87E /* appgobarberTests */ = {
93 | isa = PBXGroup;
94 | children = (
95 | 00E356F21AD99517003FC87E /* appgobarberTests.m */,
96 | 00E356F01AD99517003FC87E /* Supporting Files */,
97 | );
98 | path = appgobarberTests;
99 | sourceTree = "";
100 | };
101 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
102 | isa = PBXGroup;
103 | children = (
104 | 00E356F11AD99517003FC87E /* Info.plist */,
105 | );
106 | name = "Supporting Files";
107 | sourceTree = "";
108 | };
109 | 13B07FAE1A68108700A75B9A /* appgobarber */ = {
110 | isa = PBXGroup;
111 | children = (
112 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
113 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
114 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
115 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
116 | 13B07FB61A68108700A75B9A /* Info.plist */,
117 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
118 | 13B07FB71A68108700A75B9A /* main.m */,
119 | );
120 | name = appgobarber;
121 | sourceTree = "";
122 | };
123 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
124 | isa = PBXGroup;
125 | children = (
126 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
127 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */,
128 | );
129 | name = Frameworks;
130 | sourceTree = "";
131 | };
132 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
133 | isa = PBXGroup;
134 | children = (
135 | );
136 | name = Libraries;
137 | sourceTree = "";
138 | };
139 | 83CBB9F61A601CBA00E9B192 = {
140 | isa = PBXGroup;
141 | children = (
142 | 13B07FAE1A68108700A75B9A /* appgobarber */,
143 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
144 | 00E356EF1AD99517003FC87E /* appgobarberTests */,
145 | 83CBBA001A601CBA00E9B192 /* Products */,
146 | 2D16E6871FA4F8E400B85C8A /* Frameworks */,
147 | E0533E3367C94307A9F68C93 /* Resources */,
148 | );
149 | indentWidth = 2;
150 | sourceTree = "";
151 | tabWidth = 2;
152 | usesTabs = 0;
153 | };
154 | 83CBBA001A601CBA00E9B192 /* Products */ = {
155 | isa = PBXGroup;
156 | children = (
157 | 13B07F961A680F5B00A75B9A /* appgobarber.app */,
158 | 00E356EE1AD99517003FC87E /* appgobarberTests.xctest */,
159 | 2D02E47B1E0B4A5D006451C7 /* appgobarber-tvOS.app */,
160 | 2D02E4901E0B4A5D006451C7 /* appgobarber-tvOSTests.xctest */,
161 | );
162 | name = Products;
163 | sourceTree = "";
164 | };
165 | E0533E3367C94307A9F68C93 /* Resources */ = {
166 | isa = "PBXGroup";
167 | children = (
168 | 1ABA177D55844DF9A8E5750C /* RobotoSlab-Medium.ttf */,
169 | 8F3805A9133F49008999D524 /* RobotoSlab-Regular.ttf */,
170 | );
171 | name = Resources;
172 | sourceTree = "";
173 | path = "";
174 | };
175 | /* End PBXGroup section */
176 |
177 | /* Begin PBXNativeTarget section */
178 | 00E356ED1AD99517003FC87E /* appgobarberTests */ = {
179 | isa = PBXNativeTarget;
180 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "appgobarberTests" */;
181 | buildPhases = (
182 | 00E356EA1AD99517003FC87E /* Sources */,
183 | 00E356EB1AD99517003FC87E /* Frameworks */,
184 | 00E356EC1AD99517003FC87E /* Resources */,
185 | );
186 | buildRules = (
187 | );
188 | dependencies = (
189 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
190 | );
191 | name = appgobarberTests;
192 | productName = appgobarberTests;
193 | productReference = 00E356EE1AD99517003FC87E /* appgobarberTests.xctest */;
194 | productType = "com.apple.product-type.bundle.unit-test";
195 | };
196 | 13B07F861A680F5B00A75B9A /* appgobarber */ = {
197 | isa = PBXNativeTarget;
198 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "appgobarber" */;
199 | buildPhases = (
200 | FD10A7F022414F080027D42C /* Start Packager */,
201 | 13B07F871A680F5B00A75B9A /* Sources */,
202 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
203 | 13B07F8E1A680F5B00A75B9A /* Resources */,
204 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
205 | );
206 | buildRules = (
207 | );
208 | dependencies = (
209 | );
210 | name = appgobarber;
211 | productName = appgobarber;
212 | productReference = 13B07F961A680F5B00A75B9A /* appgobarber.app */;
213 | productType = "com.apple.product-type.application";
214 | };
215 | 2D02E47A1E0B4A5D006451C7 /* appgobarber-tvOS */ = {
216 | isa = PBXNativeTarget;
217 | buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "appgobarber-tvOS" */;
218 | buildPhases = (
219 | FD10A7F122414F3F0027D42C /* Start Packager */,
220 | 2D02E4771E0B4A5D006451C7 /* Sources */,
221 | 2D02E4781E0B4A5D006451C7 /* Frameworks */,
222 | 2D02E4791E0B4A5D006451C7 /* Resources */,
223 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,
224 | );
225 | buildRules = (
226 | );
227 | dependencies = (
228 | );
229 | name = "appgobarber-tvOS";
230 | productName = "appgobarber-tvOS";
231 | productReference = 2D02E47B1E0B4A5D006451C7 /* appgobarber-tvOS.app */;
232 | productType = "com.apple.product-type.application";
233 | };
234 | 2D02E48F1E0B4A5D006451C7 /* appgobarber-tvOSTests */ = {
235 | isa = PBXNativeTarget;
236 | buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "appgobarber-tvOSTests" */;
237 | buildPhases = (
238 | 2D02E48C1E0B4A5D006451C7 /* Sources */,
239 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */,
240 | 2D02E48E1E0B4A5D006451C7 /* Resources */,
241 | );
242 | buildRules = (
243 | );
244 | dependencies = (
245 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,
246 | );
247 | name = "appgobarber-tvOSTests";
248 | productName = "appgobarber-tvOSTests";
249 | productReference = 2D02E4901E0B4A5D006451C7 /* appgobarber-tvOSTests.xctest */;
250 | productType = "com.apple.product-type.bundle.unit-test";
251 | };
252 | /* End PBXNativeTarget section */
253 |
254 | /* Begin PBXProject section */
255 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
256 | isa = PBXProject;
257 | attributes = {
258 | LastUpgradeCheck = 1130;
259 | TargetAttributes = {
260 | 00E356ED1AD99517003FC87E = {
261 | CreatedOnToolsVersion = 6.2;
262 | TestTargetID = 13B07F861A680F5B00A75B9A;
263 | };
264 | 13B07F861A680F5B00A75B9A = {
265 | LastSwiftMigration = 1120;
266 | };
267 | 2D02E47A1E0B4A5D006451C7 = {
268 | CreatedOnToolsVersion = 8.2.1;
269 | ProvisioningStyle = Automatic;
270 | };
271 | 2D02E48F1E0B4A5D006451C7 = {
272 | CreatedOnToolsVersion = 8.2.1;
273 | ProvisioningStyle = Automatic;
274 | TestTargetID = 2D02E47A1E0B4A5D006451C7;
275 | };
276 | };
277 | };
278 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "appgobarber" */;
279 | compatibilityVersion = "Xcode 3.2";
280 | developmentRegion = en;
281 | hasScannedForEncodings = 0;
282 | knownRegions = (
283 | en,
284 | Base,
285 | );
286 | mainGroup = 83CBB9F61A601CBA00E9B192;
287 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
288 | projectDirPath = "";
289 | projectRoot = "";
290 | targets = (
291 | 13B07F861A680F5B00A75B9A /* appgobarber */,
292 | 00E356ED1AD99517003FC87E /* appgobarberTests */,
293 | 2D02E47A1E0B4A5D006451C7 /* appgobarber-tvOS */,
294 | 2D02E48F1E0B4A5D006451C7 /* appgobarber-tvOSTests */,
295 | );
296 | };
297 | /* End PBXProject section */
298 |
299 | /* Begin PBXResourcesBuildPhase section */
300 | 00E356EC1AD99517003FC87E /* Resources */ = {
301 | isa = PBXResourcesBuildPhase;
302 | buildActionMask = 2147483647;
303 | files = (
304 | );
305 | runOnlyForDeploymentPostprocessing = 0;
306 | };
307 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
308 | isa = PBXResourcesBuildPhase;
309 | buildActionMask = 2147483647;
310 | files = (
311 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
312 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
313 | BEC2659A36AA4D2A95C72096 /* RobotoSlab-Medium.ttf in Resources */,
314 | 96E98ED7844D44A7A3C0922D /* RobotoSlab-Regular.ttf in Resources */,
315 | );
316 | runOnlyForDeploymentPostprocessing = 0;
317 | };
318 | 2D02E4791E0B4A5D006451C7 /* Resources */ = {
319 | isa = PBXResourcesBuildPhase;
320 | buildActionMask = 2147483647;
321 | files = (
322 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,
323 | );
324 | runOnlyForDeploymentPostprocessing = 0;
325 | };
326 | 2D02E48E1E0B4A5D006451C7 /* Resources */ = {
327 | isa = PBXResourcesBuildPhase;
328 | buildActionMask = 2147483647;
329 | files = (
330 | );
331 | runOnlyForDeploymentPostprocessing = 0;
332 | };
333 | /* End PBXResourcesBuildPhase section */
334 |
335 | /* Begin PBXShellScriptBuildPhase section */
336 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
337 | isa = PBXShellScriptBuildPhase;
338 | buildActionMask = 2147483647;
339 | files = (
340 | );
341 | inputPaths = (
342 | );
343 | name = "Bundle React Native code and images";
344 | outputPaths = (
345 | );
346 | runOnlyForDeploymentPostprocessing = 0;
347 | shellPath = /bin/sh;
348 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
349 | };
350 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
351 | isa = PBXShellScriptBuildPhase;
352 | buildActionMask = 2147483647;
353 | files = (
354 | );
355 | inputPaths = (
356 | );
357 | name = "Bundle React Native Code And Images";
358 | outputPaths = (
359 | );
360 | runOnlyForDeploymentPostprocessing = 0;
361 | shellPath = /bin/sh;
362 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
363 | };
364 | FD10A7F022414F080027D42C /* Start Packager */ = {
365 | isa = PBXShellScriptBuildPhase;
366 | buildActionMask = 2147483647;
367 | files = (
368 | );
369 | inputFileListPaths = (
370 | );
371 | inputPaths = (
372 | );
373 | name = "Start Packager";
374 | outputFileListPaths = (
375 | );
376 | outputPaths = (
377 | );
378 | runOnlyForDeploymentPostprocessing = 0;
379 | shellPath = /bin/sh;
380 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
381 | showEnvVarsInLog = 0;
382 | };
383 | FD10A7F122414F3F0027D42C /* Start Packager */ = {
384 | isa = PBXShellScriptBuildPhase;
385 | buildActionMask = 2147483647;
386 | files = (
387 | );
388 | inputFileListPaths = (
389 | );
390 | inputPaths = (
391 | );
392 | name = "Start Packager";
393 | outputFileListPaths = (
394 | );
395 | outputPaths = (
396 | );
397 | runOnlyForDeploymentPostprocessing = 0;
398 | shellPath = /bin/sh;
399 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
400 | showEnvVarsInLog = 0;
401 | };
402 | /* End PBXShellScriptBuildPhase section */
403 |
404 | /* Begin PBXSourcesBuildPhase section */
405 | 00E356EA1AD99517003FC87E /* Sources */ = {
406 | isa = PBXSourcesBuildPhase;
407 | buildActionMask = 2147483647;
408 | files = (
409 | 00E356F31AD99517003FC87E /* appgobarberTests.m in Sources */,
410 | );
411 | runOnlyForDeploymentPostprocessing = 0;
412 | };
413 | 13B07F871A680F5B00A75B9A /* Sources */ = {
414 | isa = PBXSourcesBuildPhase;
415 | buildActionMask = 2147483647;
416 | files = (
417 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
418 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
419 | );
420 | runOnlyForDeploymentPostprocessing = 0;
421 | };
422 | 2D02E4771E0B4A5D006451C7 /* Sources */ = {
423 | isa = PBXSourcesBuildPhase;
424 | buildActionMask = 2147483647;
425 | files = (
426 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,
427 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,
428 | );
429 | runOnlyForDeploymentPostprocessing = 0;
430 | };
431 | 2D02E48C1E0B4A5D006451C7 /* Sources */ = {
432 | isa = PBXSourcesBuildPhase;
433 | buildActionMask = 2147483647;
434 | files = (
435 | 2DCD954D1E0B4F2C00145EB5 /* appgobarberTests.m in Sources */,
436 | );
437 | runOnlyForDeploymentPostprocessing = 0;
438 | };
439 | /* End PBXSourcesBuildPhase section */
440 |
441 | /* Begin PBXTargetDependency section */
442 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
443 | isa = PBXTargetDependency;
444 | target = 13B07F861A680F5B00A75B9A /* appgobarber */;
445 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
446 | };
447 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {
448 | isa = PBXTargetDependency;
449 | target = 2D02E47A1E0B4A5D006451C7 /* appgobarber-tvOS */;
450 | targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;
451 | };
452 | /* End PBXTargetDependency section */
453 |
454 | /* Begin PBXVariantGroup section */
455 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
456 | isa = PBXVariantGroup;
457 | children = (
458 | 13B07FB21A68108700A75B9A /* Base */,
459 | );
460 | name = LaunchScreen.xib;
461 | path = appgobarber;
462 | sourceTree = "";
463 | };
464 | /* End PBXVariantGroup section */
465 |
466 | /* Begin XCBuildConfiguration section */
467 | 00E356F61AD99517003FC87E /* Debug */ = {
468 | isa = XCBuildConfiguration;
469 | buildSettings = {
470 | BUNDLE_LOADER = "$(TEST_HOST)";
471 | GCC_PREPROCESSOR_DEFINITIONS = (
472 | "DEBUG=1",
473 | "$(inherited)",
474 | );
475 | INFOPLIST_FILE = appgobarberTests/Info.plist;
476 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
477 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
478 | OTHER_LDFLAGS = (
479 | "-ObjC",
480 | "-lc++",
481 | "$(inherited)",
482 | );
483 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
484 | PRODUCT_NAME = "$(TARGET_NAME)";
485 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/appgobarber.app/appgobarber";
486 | };
487 | name = Debug;
488 | };
489 | 00E356F71AD99517003FC87E /* Release */ = {
490 | isa = XCBuildConfiguration;
491 | buildSettings = {
492 | BUNDLE_LOADER = "$(TEST_HOST)";
493 | COPY_PHASE_STRIP = NO;
494 | INFOPLIST_FILE = appgobarberTests/Info.plist;
495 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
496 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
497 | OTHER_LDFLAGS = (
498 | "-ObjC",
499 | "-lc++",
500 | "$(inherited)",
501 | );
502 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
503 | PRODUCT_NAME = "$(TARGET_NAME)";
504 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/appgobarber.app/appgobarber";
505 | };
506 | name = Release;
507 | };
508 | 13B07F941A680F5B00A75B9A /* Debug */ = {
509 | isa = XCBuildConfiguration;
510 | buildSettings = {
511 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
512 | CLANG_ENABLE_MODULES = YES;
513 | CURRENT_PROJECT_VERSION = 1;
514 | ENABLE_BITCODE = NO;
515 | GCC_PREPROCESSOR_DEFINITIONS = (
516 | "$(inherited)",
517 | "FB_SONARKIT_ENABLED=1",
518 | );
519 | INFOPLIST_FILE = appgobarber/Info.plist;
520 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
521 | OTHER_LDFLAGS = (
522 | "$(inherited)",
523 | "-ObjC",
524 | "-lc++",
525 | );
526 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
527 | PRODUCT_NAME = appgobarber;
528 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
529 | SWIFT_VERSION = 5.0;
530 | VERSIONING_SYSTEM = "apple-generic";
531 | };
532 | name = Debug;
533 | };
534 | 13B07F951A680F5B00A75B9A /* Release */ = {
535 | isa = XCBuildConfiguration;
536 | buildSettings = {
537 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
538 | CLANG_ENABLE_MODULES = YES;
539 | CURRENT_PROJECT_VERSION = 1;
540 | INFOPLIST_FILE = appgobarber/Info.plist;
541 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
542 | OTHER_LDFLAGS = (
543 | "$(inherited)",
544 | "-ObjC",
545 | "-lc++",
546 | );
547 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
548 | PRODUCT_NAME = appgobarber;
549 | SWIFT_VERSION = 5.0;
550 | VERSIONING_SYSTEM = "apple-generic";
551 | };
552 | name = Release;
553 | };
554 | 2D02E4971E0B4A5E006451C7 /* Debug */ = {
555 | isa = XCBuildConfiguration;
556 | buildSettings = {
557 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
558 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
559 | CLANG_ANALYZER_NONNULL = YES;
560 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
561 | CLANG_WARN_INFINITE_RECURSION = YES;
562 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
563 | DEBUG_INFORMATION_FORMAT = dwarf;
564 | ENABLE_TESTABILITY = YES;
565 | GCC_NO_COMMON_BLOCKS = YES;
566 | INFOPLIST_FILE = "appgobarber-tvOS/Info.plist";
567 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
568 | OTHER_LDFLAGS = (
569 | "$(inherited)",
570 | "-ObjC",
571 | "-lc++",
572 | );
573 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.appgobarber-tvOS";
574 | PRODUCT_NAME = "$(TARGET_NAME)";
575 | SDKROOT = appletvos;
576 | TARGETED_DEVICE_FAMILY = 3;
577 | TVOS_DEPLOYMENT_TARGET = 9.2;
578 | };
579 | name = Debug;
580 | };
581 | 2D02E4981E0B4A5E006451C7 /* Release */ = {
582 | isa = XCBuildConfiguration;
583 | buildSettings = {
584 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
585 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
586 | CLANG_ANALYZER_NONNULL = YES;
587 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
588 | CLANG_WARN_INFINITE_RECURSION = YES;
589 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
590 | COPY_PHASE_STRIP = NO;
591 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
592 | GCC_NO_COMMON_BLOCKS = YES;
593 | INFOPLIST_FILE = "appgobarber-tvOS/Info.plist";
594 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
595 | OTHER_LDFLAGS = (
596 | "$(inherited)",
597 | "-ObjC",
598 | "-lc++",
599 | );
600 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.appgobarber-tvOS";
601 | PRODUCT_NAME = "$(TARGET_NAME)";
602 | SDKROOT = appletvos;
603 | TARGETED_DEVICE_FAMILY = 3;
604 | TVOS_DEPLOYMENT_TARGET = 9.2;
605 | };
606 | name = Release;
607 | };
608 | 2D02E4991E0B4A5E006451C7 /* Debug */ = {
609 | isa = XCBuildConfiguration;
610 | buildSettings = {
611 | BUNDLE_LOADER = "$(TEST_HOST)";
612 | CLANG_ANALYZER_NONNULL = YES;
613 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
614 | CLANG_WARN_INFINITE_RECURSION = YES;
615 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
616 | DEBUG_INFORMATION_FORMAT = dwarf;
617 | ENABLE_TESTABILITY = YES;
618 | GCC_NO_COMMON_BLOCKS = YES;
619 | INFOPLIST_FILE = "appgobarber-tvOSTests/Info.plist";
620 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
621 | OTHER_LDFLAGS = (
622 | "$(inherited)",
623 | "-ObjC",
624 | "-lc++",
625 | );
626 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.appgobarber-tvOSTests";
627 | PRODUCT_NAME = "$(TARGET_NAME)";
628 | SDKROOT = appletvos;
629 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/appgobarber-tvOS.app/appgobarber-tvOS";
630 | TVOS_DEPLOYMENT_TARGET = 10.1;
631 | };
632 | name = Debug;
633 | };
634 | 2D02E49A1E0B4A5E006451C7 /* Release */ = {
635 | isa = XCBuildConfiguration;
636 | buildSettings = {
637 | BUNDLE_LOADER = "$(TEST_HOST)";
638 | CLANG_ANALYZER_NONNULL = YES;
639 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
640 | CLANG_WARN_INFINITE_RECURSION = YES;
641 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
642 | COPY_PHASE_STRIP = NO;
643 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
644 | GCC_NO_COMMON_BLOCKS = YES;
645 | INFOPLIST_FILE = "appgobarber-tvOSTests/Info.plist";
646 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
647 | OTHER_LDFLAGS = (
648 | "$(inherited)",
649 | "-ObjC",
650 | "-lc++",
651 | );
652 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.appgobarber-tvOSTests";
653 | PRODUCT_NAME = "$(TARGET_NAME)";
654 | SDKROOT = appletvos;
655 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/appgobarber-tvOS.app/appgobarber-tvOS";
656 | TVOS_DEPLOYMENT_TARGET = 10.1;
657 | };
658 | name = Release;
659 | };
660 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
661 | isa = XCBuildConfiguration;
662 | buildSettings = {
663 | ALWAYS_SEARCH_USER_PATHS = NO;
664 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
665 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
666 | CLANG_CXX_LIBRARY = "libc++";
667 | CLANG_ENABLE_MODULES = YES;
668 | CLANG_ENABLE_OBJC_ARC = YES;
669 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
670 | CLANG_WARN_BOOL_CONVERSION = YES;
671 | CLANG_WARN_COMMA = YES;
672 | CLANG_WARN_CONSTANT_CONVERSION = YES;
673 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
674 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
675 | CLANG_WARN_EMPTY_BODY = YES;
676 | CLANG_WARN_ENUM_CONVERSION = YES;
677 | CLANG_WARN_INFINITE_RECURSION = YES;
678 | CLANG_WARN_INT_CONVERSION = YES;
679 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
680 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
681 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
682 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
683 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
684 | CLANG_WARN_STRICT_PROTOTYPES = YES;
685 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
686 | CLANG_WARN_UNREACHABLE_CODE = YES;
687 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
688 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
689 | COPY_PHASE_STRIP = NO;
690 | ENABLE_STRICT_OBJC_MSGSEND = YES;
691 | ENABLE_TESTABILITY = YES;
692 | GCC_C_LANGUAGE_STANDARD = gnu99;
693 | GCC_DYNAMIC_NO_PIC = NO;
694 | GCC_NO_COMMON_BLOCKS = YES;
695 | GCC_OPTIMIZATION_LEVEL = 0;
696 | GCC_PREPROCESSOR_DEFINITIONS = (
697 | "DEBUG=1",
698 | "$(inherited)",
699 | );
700 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
701 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
702 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
703 | GCC_WARN_UNDECLARED_SELECTOR = YES;
704 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
705 | GCC_WARN_UNUSED_FUNCTION = YES;
706 | GCC_WARN_UNUSED_VARIABLE = YES;
707 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
708 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
709 | LIBRARY_SEARCH_PATHS = (
710 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
711 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"",
712 | "\"$(inherited)\"",
713 | );
714 | MTL_ENABLE_DEBUG_INFO = YES;
715 | ONLY_ACTIVE_ARCH = YES;
716 | SDKROOT = iphoneos;
717 | };
718 | name = Debug;
719 | };
720 | 83CBBA211A601CBA00E9B192 /* Release */ = {
721 | isa = XCBuildConfiguration;
722 | buildSettings = {
723 | ALWAYS_SEARCH_USER_PATHS = NO;
724 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
725 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
726 | CLANG_CXX_LIBRARY = "libc++";
727 | CLANG_ENABLE_MODULES = YES;
728 | CLANG_ENABLE_OBJC_ARC = YES;
729 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
730 | CLANG_WARN_BOOL_CONVERSION = YES;
731 | CLANG_WARN_COMMA = YES;
732 | CLANG_WARN_CONSTANT_CONVERSION = YES;
733 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
734 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
735 | CLANG_WARN_EMPTY_BODY = YES;
736 | CLANG_WARN_ENUM_CONVERSION = YES;
737 | CLANG_WARN_INFINITE_RECURSION = YES;
738 | CLANG_WARN_INT_CONVERSION = YES;
739 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
740 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
741 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
742 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
743 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
744 | CLANG_WARN_STRICT_PROTOTYPES = YES;
745 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
746 | CLANG_WARN_UNREACHABLE_CODE = YES;
747 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
748 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
749 | COPY_PHASE_STRIP = YES;
750 | ENABLE_NS_ASSERTIONS = NO;
751 | ENABLE_STRICT_OBJC_MSGSEND = YES;
752 | GCC_C_LANGUAGE_STANDARD = gnu99;
753 | GCC_NO_COMMON_BLOCKS = YES;
754 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
755 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
756 | GCC_WARN_UNDECLARED_SELECTOR = YES;
757 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
758 | GCC_WARN_UNUSED_FUNCTION = YES;
759 | GCC_WARN_UNUSED_VARIABLE = YES;
760 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
761 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
762 | LIBRARY_SEARCH_PATHS = (
763 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
764 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"",
765 | "\"$(inherited)\"",
766 | );
767 | MTL_ENABLE_DEBUG_INFO = NO;
768 | SDKROOT = iphoneos;
769 | VALIDATE_PRODUCT = YES;
770 | };
771 | name = Release;
772 | };
773 | /* End XCBuildConfiguration section */
774 |
775 | /* Begin XCConfigurationList section */
776 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "appgobarberTests" */ = {
777 | isa = XCConfigurationList;
778 | buildConfigurations = (
779 | 00E356F61AD99517003FC87E /* Debug */,
780 | 00E356F71AD99517003FC87E /* Release */,
781 | );
782 | defaultConfigurationIsVisible = 0;
783 | defaultConfigurationName = Release;
784 | };
785 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "appgobarber" */ = {
786 | isa = XCConfigurationList;
787 | buildConfigurations = (
788 | 13B07F941A680F5B00A75B9A /* Debug */,
789 | 13B07F951A680F5B00A75B9A /* Release */,
790 | );
791 | defaultConfigurationIsVisible = 0;
792 | defaultConfigurationName = Release;
793 | };
794 | 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "appgobarber-tvOS" */ = {
795 | isa = XCConfigurationList;
796 | buildConfigurations = (
797 | 2D02E4971E0B4A5E006451C7 /* Debug */,
798 | 2D02E4981E0B4A5E006451C7 /* Release */,
799 | );
800 | defaultConfigurationIsVisible = 0;
801 | defaultConfigurationName = Release;
802 | };
803 | 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "appgobarber-tvOSTests" */ = {
804 | isa = XCConfigurationList;
805 | buildConfigurations = (
806 | 2D02E4991E0B4A5E006451C7 /* Debug */,
807 | 2D02E49A1E0B4A5E006451C7 /* Release */,
808 | );
809 | defaultConfigurationIsVisible = 0;
810 | defaultConfigurationName = Release;
811 | };
812 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "appgobarber" */ = {
813 | isa = XCConfigurationList;
814 | buildConfigurations = (
815 | 83CBBA201A601CBA00E9B192 /* Debug */,
816 | 83CBBA211A601CBA00E9B192 /* Release */,
817 | );
818 | defaultConfigurationIsVisible = 0;
819 | defaultConfigurationName = Release;
820 | };
821 | /* End XCConfigurationList section */
822 | };
823 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
824 | }
825 |
--------------------------------------------------------------------------------