├── app.json ├── src ├── images │ ├── final1.png │ ├── final2.png │ ├── final3.png │ ├── ArticlesList.png │ ├── Result-Lesson-3.png │ ├── Result-Lesson-4.png │ ├── Result-Lesson-5.png │ ├── Result-Lesson-6-1.png │ └── Result-Lesson-6-2.png ├── config │ ├── locale.js │ ├── data.js │ ├── dimensions.js │ ├── api.js │ ├── colors.js │ └── html.js ├── sagas │ ├── index.js │ └── articlesSagas.js ├── reducers │ ├── routesReducer.js │ ├── categoryReducer.js │ └── articlesReducer.js ├── components │ ├── ArabicText.js │ ├── HtmlView.js │ ├── ListEmpty.js │ ├── Header.js │ ├── ArticleCard.js │ └── LeftMenu.js ├── store │ └── index.js ├── assets │ └── data │ │ ├── filters.json │ │ └── categories.json ├── Pages │ ├── MainPage.js │ ├── ArticleDetailsPage.js │ ├── SearchPage.js │ └── ArticlesPage.js └── App.js ├── android ├── app │ ├── src │ │ └── main │ │ │ ├── res │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ └── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── assets │ │ │ └── fonts │ │ │ │ ├── Entypo.ttf │ │ │ │ ├── Zocial.ttf │ │ │ │ ├── Ionicons.ttf │ │ │ │ ├── Octicons.ttf │ │ │ │ ├── EvilIcons.ttf │ │ │ │ ├── FontAwesome.ttf │ │ │ │ ├── Foundation.ttf │ │ │ │ ├── MaterialIcons.ttf │ │ │ │ ├── SimpleLineIcons.ttf │ │ │ │ └── MaterialCommunityIcons.ttf │ │ │ ├── java │ │ │ └── com │ │ │ │ └── hesspress │ │ │ │ ├── MainActivity.java │ │ │ │ └── MainApplication.java │ │ │ └── AndroidManifest.xml │ ├── BUCK │ ├── proguard-rules.pro │ ├── build.gradle │ └── app.iml ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── keystores │ ├── debug.keystore.properties │ └── BUCK ├── settings.gradle ├── local.properties ├── build.gradle ├── hesspress.iml ├── gradle.properties ├── gradlew.bat └── gradlew ├── ios ├── Al-Jazeera-Arabic-Bold.woff ├── Al-Jazeera-Arabic-Regular.woff ├── hesspress.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ └── adilbenmoussa.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── xcuserdata │ │ └── adilbenmoussa.xcuserdatad │ │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ ├── hesspress.xcscheme │ │ │ └── hesspress-tvOS.xcscheme │ └── project.pbxproj ├── hesspress │ ├── AppDelegate.h │ ├── main.m │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── AppDelegate.m │ ├── Info.plist │ └── Base.lproj │ │ └── LaunchScreen.xib ├── hesspressTests │ ├── Info.plist │ └── hesspressTests.m ├── hesspress-tvOSTests │ └── Info.plist └── hesspress-tvOS │ └── Info.plist ├── index.android.js ├── index.ios.js ├── jsconfig.json ├── __tests__ ├── index.ios.js └── index.android.js ├── .eslintrc ├── LICENSE ├── package.json └── README.md /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hesspress", 3 | "displayName": "hesspress" 4 | } -------------------------------------------------------------------------------- /src/images/final1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/final1.png -------------------------------------------------------------------------------- /src/images/final2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/final2.png -------------------------------------------------------------------------------- /src/images/final3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/final3.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | hesspress 3 | 4 | -------------------------------------------------------------------------------- /src/images/ArticlesList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/ArticlesList.png -------------------------------------------------------------------------------- /ios/Al-Jazeera-Arabic-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/ios/Al-Jazeera-Arabic-Bold.woff -------------------------------------------------------------------------------- /src/images/Result-Lesson-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/Result-Lesson-3.png -------------------------------------------------------------------------------- /src/images/Result-Lesson-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/Result-Lesson-4.png -------------------------------------------------------------------------------- /src/images/Result-Lesson-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/Result-Lesson-5.png -------------------------------------------------------------------------------- /ios/Al-Jazeera-Arabic-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/ios/Al-Jazeera-Arabic-Regular.woff -------------------------------------------------------------------------------- /src/images/Result-Lesson-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/Result-Lesson-6-1.png -------------------------------------------------------------------------------- /src/images/Result-Lesson-6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/src/images/Result-Lesson-6-2.png -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Entypo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/Entypo.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Zocial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/Zocial.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/Ionicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Octicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/Octicons.ttf -------------------------------------------------------------------------------- /android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /index.android.js: -------------------------------------------------------------------------------- 1 | import { 2 | AppRegistry 3 | } from 'react-native'; 4 | import App from './src/App'; 5 | 6 | AppRegistry.registerComponent('hesspress', () => App); -------------------------------------------------------------------------------- /index.ios.js: -------------------------------------------------------------------------------- 1 | import { 2 | AppRegistry 3 | } from 'react-native'; 4 | import App from './src/App'; 5 | 6 | AppRegistry.registerComponent('hesspress', () => App); -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/EvilIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/EvilIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/FontAwesome.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Foundation.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/Foundation.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/MaterialIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SimpleLineIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/SimpleLineIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "allowSyntheticDefaultImports": true 5 | }, 6 | "exclude": [ 7 | "node_modules" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/config/locale.js: -------------------------------------------------------------------------------- 1 | export default () => { 2 | const moment = require('moment'); 3 | const arabicLocale = require('moment/locale/ar'); 4 | moment.locale('ar', arabicLocale); 5 | }; 6 | -------------------------------------------------------------------------------- /android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = "debug", 3 | properties = "debug.keystore.properties", 4 | store = "debug.keystore", 5 | visibility = [ 6 | "PUBLIC", 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /src/config/data.js: -------------------------------------------------------------------------------- 1 | 2 | export const categoriesWithMedia = [11]; 3 | export const filters = require('../assets/data/filters.json'); 4 | export const categories = require('../assets/data/categories.json'); 5 | -------------------------------------------------------------------------------- /ios/hesspress.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'hesspress' 2 | include ':react-native-vector-icons' 3 | project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') 4 | 5 | include ':app' 6 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 6 | -------------------------------------------------------------------------------- /ios/hesspress.xcodeproj/project.xcworkspace/xcuserdata/adilbenmoussa.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adilbenmoussa/hespress.com-react-native/HEAD/ios/hesspress.xcodeproj/project.xcworkspace/xcuserdata/adilbenmoussa.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /src/config/dimensions.js: -------------------------------------------------------------------------------- 1 | import { Platform } from 'react-native'; 2 | 3 | export const isAndroid = Platform.OS === 'android'; 4 | export const isIOS = Platform.OS === 'ios'; 5 | 6 | export default { 7 | header: { 8 | height: isIOS ? 60 : 48, 9 | paddingTop: isIOS ? 18 : 10, 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /src/sagas/index.js: -------------------------------------------------------------------------------- 1 | import {all, takeLatest } from 'redux-saga/effects'; 2 | import { actionTypes } from '../reducers/articlesReducer'; 3 | import { searchArticles } from './articlesSagas'; 4 | 5 | 6 | export default function* rootSaga() { 7 | yield all([ 8 | takeLatest(actionTypes.SEARCH_ARTICLES, searchArticles) 9 | ]); 10 | } -------------------------------------------------------------------------------- /__tests__/index.ios.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.ios.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /__tests__/index.android.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.android.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /src/reducers/routesReducer.js: -------------------------------------------------------------------------------- 1 | import { ActionConst } from 'react-native-router-flux'; 2 | 3 | const initialState = { 4 | scene: {}, 5 | }; 6 | 7 | export default function reducer(state = initialState, action = {}) { 8 | switch (action.type) { 9 | case ActionConst.FOCUS: 10 | return { 11 | ...state, 12 | scene: action.scene, 13 | }; 14 | 15 | default: 16 | return state; 17 | } 18 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/hesspress/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.hesspress; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. 9 | * This is used to schedule rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "hesspress"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/reducers/categoryReducer.js: -------------------------------------------------------------------------------- 1 | const actionTypes = { 2 | SELECT_CATEGORY: 'CATEGORY/SELECT_CATEGORY' 3 | }; 4 | 5 | export default function reducer(state = {}, action) { 6 | switch(action.type) { 7 | case actionTypes.SELECT_CATEGORY: 8 | return action.payload; 9 | default: 10 | return state; 11 | } 12 | } 13 | 14 | export const actionCreators = { 15 | select: (category) => ({ 16 | type: actionTypes.SELECT_CATEGORY, 17 | payload: category 18 | }) 19 | } -------------------------------------------------------------------------------- /android/local.properties: -------------------------------------------------------------------------------- 1 | ## This file is automatically generated by Android Studio. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must *NOT* be checked into Version Control Systems, 5 | # as it contains information specific to your local configuration. 6 | # 7 | # Location of the SDK. This is only used by Gradle. 8 | # For customization when using a Version Control System, please read the 9 | # header note. 10 | #Wed Jul 05 15:51:44 CEST 2017 11 | sdk.dir=/Users/adilbenmoussa/Library/Android/sdk 12 | -------------------------------------------------------------------------------- /ios/hesspress/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (nonatomic, strong) UIWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "ecmaVersion": 7, 4 | "sourceType": "module", 5 | "ecmaFeatures": { 6 | "jsx": true 7 | } 8 | }, 9 | "plugins": [ 10 | "react", 11 | "react-native" 12 | ], 13 | "extends": ["eslint:recommended", "plugin:react/recommended"], 14 | "rules": { 15 | "comma-dangle" : 0, 16 | "react-native/no-unused-styles": 2, 17 | "react-native/split-platform-components": 2 18 | }, 19 | "settings": { 20 | "react": { 21 | "pragma": "React", 22 | "version": "0.14.8" 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /ios/hesspress/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | #import "AppDelegate.h" 13 | 14 | int main(int argc, char * argv[]) { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/ArabicText.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { 3 | Text, 4 | } from 'react-native'; 5 | 6 | 7 | class ArabicText extends Component { 8 | 9 | render(){ 10 | const { textStyle, onPress, children } = this.props; 11 | return ( 12 | 15 | {children} 16 | 17 | ); 18 | } 19 | } 20 | 21 | ArabicText.propTypes = { 22 | textStyle: Text.propTypes.style, 23 | onPress: PropTypes.func 24 | } 25 | 26 | 27 | export default ArabicText; 28 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.3' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | mavenLocal() 18 | jcenter() 19 | maven { 20 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 21 | url "$rootDir/../node_modules/react-native/android" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /ios/hesspress/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import { createStore, applyMiddleware, combineReducers } from 'redux'; 2 | import logger from 'redux-logger'; 3 | import promiseMiddleware from 'redux-promise-middleware'; 4 | import createSagaMiddleware from 'redux-saga'; 5 | import categoryReducer from '../reducers/categoryReducer'; 6 | import articlesReducer from '../reducers/articlesReducer'; 7 | import routesReducer from '../reducers/routesReducer'; 8 | import sagas from '../sagas'; 9 | 10 | const reducers = combineReducers({ 11 | selectedCategory: categoryReducer, 12 | articles: articlesReducer, 13 | routes: routesReducer 14 | }); 15 | 16 | const sagaMiddleware = createSagaMiddleware(); 17 | const middleWare = applyMiddleware(logger, promiseMiddleware(), sagaMiddleware); 18 | 19 | const store = createStore(reducers, {}, middleWare); 20 | 21 | sagaMiddleware.run(sagas) 22 | 23 | export default store; -------------------------------------------------------------------------------- /ios/hesspressTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/hesspress-tvOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /android/hesspress.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | android.useDeprecatedNdk=true 21 | -------------------------------------------------------------------------------- /src/config/api.js: -------------------------------------------------------------------------------- 1 | // "http://www.hespress.com/json/clean_box_article_list?search_limit=20&search_before_after=1&search_sort_by=most_commented&search_search_date=1&search_order=descending&pg=1" 2 | 3 | import { isNil } from 'lodash'; 4 | const API_ENTRY_POINT = 'http://www.hespress.com/json/clean_box_article_list'; 5 | 6 | export const queryByCategory = (category) => { 7 | let queryPart; 8 | 9 | if(isNil(category.query_params)) { 10 | queryPart = `search_cid=${category.id}` 11 | } else { 12 | queryPart = category.query_params 13 | } 14 | 15 | const query = `${API_ENTRY_POINT}?${queryPart}&search_sort_by=created&pg=1&search_limit=20` 16 | console.log('query', query); 17 | return query; 18 | } 19 | 20 | export const queryBySearchedText = (searchedText) => { 21 | const query = `${API_ENTRY_POINT}?search_limit=20&search_sort_by=created&search_query=${searchedText}&pg=1`; 22 | console.log('queryBySearchedText::query', query); 23 | return query; 24 | } -------------------------------------------------------------------------------- /src/sagas/articlesSagas.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { call, put } from 'redux-saga/effects'; 3 | import { queryBySearchedText } from '../config/api'; 4 | import { actionTypes } from '../reducers/articlesReducer'; 5 | 6 | const query = async (searchedText) => { 7 | const response = await axios(queryBySearchedText(searchedText)); 8 | return response.data.articles; 9 | } 10 | 11 | // Worker Saga 12 | export function* searchArticles(action) { 13 | const searchedText = action.payload; 14 | try { 15 | yield put({ 16 | type: actionTypes.SEARCH_ARTICLES_PENDING 17 | }); 18 | const response = yield call(query, searchedText); 19 | yield put({ 20 | type: actionTypes.SEARCH_ARTICLES_FULFILLED, 21 | payload: response || [] 22 | }) 23 | } catch (error) { 24 | yield put({ 25 | type: actionTypes.SEARCH_ARTICLES_REJECTED, 26 | payload: error 27 | }); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Adil Ben Moussa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ios/hesspress.xcodeproj/xcuserdata/adilbenmoussa.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | hesspress-tvOS.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 1 11 | 12 | hesspress.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 0 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 00E356ED1AD99517003FC87E 21 | 22 | primary 23 | 24 | 25 | 13B07F861A680F5B00A75B9A 26 | 27 | primary 28 | 29 | 30 | 2D02E47A1E0B4A5D006451C7 31 | 32 | primary 33 | 34 | 35 | 2D02E48F1E0B4A5D006451C7 36 | 37 | primary 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/data/filters.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": -1, 4 | "name": "جميع الاخبار", 5 | "color": "#E91E63", 6 | "icon": "viadeo", 7 | "query_params": "search_exclude_cid=22,23" 8 | }, 9 | { 10 | "id": -2, 11 | "name": "الاخبار الرئيسية", 12 | "color": "#9C27B0", 13 | "icon": "map-o", 14 | "query_params": "search_tag_id=2" 15 | }, 16 | { 17 | "id": -3, 18 | "name": "الاكثر تعليقا", 19 | "color": "#673AB7", 20 | "icon": "ravelry" , 21 | "query_params": "search_sort_by=most_commented&search_search_date=1&search_order=descending" 22 | }, 23 | { 24 | "id": -4, 25 | "name": "الاكثر تقييما", 26 | "color": "#F44336", 27 | "icon": "eercast" , 28 | "query_params": "search_before_after=1&search_search_date=1&search_sort_by=vote_num" 29 | }, 30 | { 31 | "id": -5, 32 | "name": "الاكثر مشاهدة", 33 | "color": "#F44336", 34 | "icon": "first-order" , 35 | "query_params": "search_before_after=1&search_search_date=1&search_sort_by=most_popular" 36 | } 37 | ] -------------------------------------------------------------------------------- /src/config/colors.js: -------------------------------------------------------------------------------- 1 | import {categories} from '../config/data'; 2 | 3 | export const colors = { 4 | primary: '#23438b', 5 | secondary: '#364654', 6 | selectedCategory: '#192636', 7 | titleColor: '#2196F3', 8 | autorColor: '#E91E63', 9 | 10 | white: '#ffffff', 11 | black: '#000000' 12 | }; 13 | 14 | export const hexWithOpacity = (hex, opacity) => { 15 | const r = parseInt(hex.slice(1, 3), 16), 16 | g = parseInt(hex.slice(3, 5), 16), 17 | b = parseInt(hex.slice(5, 7), 16); 18 | 19 | if (opacity) { 20 | return "rgba(" + r + ", " + g + ", " + b + ", " + opacity + ")"; 21 | } else { 22 | return "rgb(" + r + ", " + g + ", " + b + ")"; 23 | } 24 | } 25 | 26 | export const getColorById = (categoryId, currentCategory) => { 27 | let color; 28 | if (currentCategory && currentCategory.id < 0) { 29 | const category = categories.find((cat) => cat.id === categoryId); 30 | if (!category) { 31 | console.log('categoryId not found', categoryId); 32 | } 33 | color = category.color; 34 | } 35 | else { 36 | color = currentCategory.color; 37 | } 38 | 39 | return color; 40 | } 41 | 42 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/hesspress/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.hesspress; 2 | 3 | import android.app.Application; 4 | 5 | import com.facebook.react.ReactApplication; 6 | import com.oblador.vectoricons.VectorIconsPackage; 7 | import com.facebook.react.ReactNativeHost; 8 | import com.facebook.react.ReactPackage; 9 | import com.facebook.react.shell.MainReactPackage; 10 | import com.facebook.soloader.SoLoader; 11 | 12 | import java.util.Arrays; 13 | import java.util.List; 14 | 15 | public class MainApplication extends Application implements ReactApplication { 16 | 17 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 18 | @Override 19 | public boolean getUseDeveloperSupport() { 20 | return BuildConfig.DEBUG; 21 | } 22 | 23 | @Override 24 | protected List getPackages() { 25 | return Arrays.asList( 26 | new MainReactPackage(), 27 | new VectorIconsPackage() 28 | ); 29 | } 30 | }; 31 | 32 | @Override 33 | public ReactNativeHost getReactNativeHost() { 34 | return mReactNativeHost; 35 | } 36 | 37 | @Override 38 | public void onCreate() { 39 | super.onCreate(); 40 | SoLoader.init(this, /* native exopackage */ false); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hesspress", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node node_modules/react-native/local-cli/cli.js start", 7 | "test": "jest" 8 | }, 9 | "dependencies": { 10 | "axios": "^0.16.2", 11 | "react": "16.0.0-alpha.12", 12 | "react-native": "0.45.1", 13 | "react-native-elements": "^0.13.0", 14 | "react-native-router-flux": "^3.40.1", 15 | "react-native-side-menu": "^0.20.1", 16 | "react-native-vector-icons": "^4.2.0", 17 | "react-redux": "^5.0.5", 18 | "redux": "^3.7.1", 19 | "redux-logger": "^3.0.6", 20 | "redux-promise-middleware": "^4.2.1", 21 | "react-dom": "^15.4.2", 22 | "entities": "^1.1.1", 23 | "htmlparser2-without-node-native": "^3.9.0", 24 | "react-native-image-header": "^1.0.1", 25 | "react-native-image-header-scroll-view": "^0.6.1", 26 | "redux-saga": "^0.15.4" 27 | }, 28 | "devDependencies": { 29 | "babel-jest": "20.0.3", 30 | "babel-preset-react-native": "2.0.0", 31 | "eslint": "2.7.0", 32 | "eslint-plugin-react": "4.3.0", 33 | "eslint-plugin-react-native": "1.0.0", 34 | "jest": "20.0.4", 35 | "react-test-renderer": "16.0.0-alpha.12" 36 | }, 37 | "jest": { 38 | "preset": "react-native" 39 | } 40 | } -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 19 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/components/HtmlView.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { 3 | View 4 | } from 'react-native'; 5 | import { htmlToElements } from '../config/html'; 6 | 7 | class HtmlView extends Component { 8 | 9 | constructor(props) { 10 | super(props); 11 | 12 | this.state = { 13 | elements: null 14 | } 15 | } 16 | 17 | componentDidMount() { 18 | this.mounted = true; 19 | this.startHtmlParse(this.props.html); 20 | } 21 | 22 | componentWillUnmount(){ 23 | this.mounted = false; 24 | } 25 | 26 | startHtmlParse(html) { 27 | if (!html) { 28 | this.setState({ 29 | elements: null 30 | }) 31 | } 32 | 33 | htmlToElements(html, (error, elements) => { 34 | if (error) console.log(error) 35 | 36 | if (this.mounted) { 37 | this.setState({ 38 | elements 39 | }); 40 | } 41 | }); 42 | } 43 | 44 | render() { 45 | if (this.state.elements) { 46 | return 47 | } 48 | return 49 | } 50 | } 51 | 52 | HtmlView.propTypes = { 53 | html: PropTypes.string.isRequired 54 | } 55 | 56 | export default HtmlView; 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/config/html.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import entities from 'entities'; 3 | import htmlparser from 'htmlparser2-without-node-native'; 4 | import ArabicText from '../components/ArabicText'; 5 | 6 | 7 | export const decodeHtml = (text) => entities.decode(text); 8 | export const imageUriByName = (image) => `http://s1.hespress.com/files/${image}`; 9 | 10 | export const htmlToElements = (html, callBack) => { 11 | 12 | function domToElements(dom) { 13 | console.log('dom', dom); 14 | if (!dom) return null; 15 | 16 | return dom.map(function (node) { 17 | if (node.type === 'text') { 18 | return ( 19 | 21 | {decodeHtml(node.data)} 22 | 23 | ); 24 | } 25 | 26 | if(node.type === 'tag'){ 27 | return domToElements(node.children); 28 | } 29 | 30 | // if(node.name === 'iframe'){ 31 | // return 32 | // } 33 | 34 | return ({`${node.type}_${node.name}`}) 35 | }) 36 | } 37 | 38 | const handler = new htmlparser.DomHandler(function (error, dom) { 39 | if (error) callBack(error) 40 | callBack(null, domToElements(dom)) 41 | }) 42 | 43 | const parser = new htmlparser.Parser(handler); 44 | parser.write(html); 45 | parser.done(); 46 | } -------------------------------------------------------------------------------- /ios/hesspress/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import "AppDelegate.h" 11 | 12 | #import 13 | #import 14 | 15 | @implementation AppDelegate 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 18 | { 19 | NSURL *jsCodeLocation; 20 | 21 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 22 | 23 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 24 | moduleName:@"hesspress" 25 | initialProperties:nil 26 | launchOptions:launchOptions]; 27 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 28 | 29 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 30 | UIViewController *rootViewController = [UIViewController new]; 31 | rootViewController.view = rootView; 32 | self.window.rootViewController = rootViewController; 33 | [self.window makeKeyAndVisible]; 34 | return YES; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /src/Pages/MainPage.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | StatusBar 4 | } from 'react-native'; 5 | import { connect } from 'react-redux'; 6 | 7 | import SideMenu from 'react-native-side-menu'; 8 | import ArticlesPage from '../Pages/ArticlesPage'; 9 | import { colors } from '../config/colors'; 10 | import LeftMenu from '../components/LeftMenu'; 11 | 12 | class MainPage extends Component { 13 | 14 | constructor(props) { 15 | super(props); 16 | 17 | this.state = { 18 | isOpen: false 19 | } 20 | } 21 | 22 | toggle() { 23 | this.setState({ 24 | isOpen: !this.state.isOpen 25 | }); 26 | } 27 | 28 | updateMenuState(isOpen) { 29 | this.setState({ isOpen }) 30 | } 31 | 32 | onLeftMenuItemSelected() { 33 | this.setState({ 34 | isOpen: false, 35 | }); 36 | } 37 | 38 | render() { 39 | const menu = ; 41 | return ( 42 | this.updateMenuState(isOpen)}> 46 | 50 | this.toggle()} 52 | /> 53 | 54 | ); 55 | } 56 | } 57 | 58 | export default connect(({routes}) => ({routes}))(MainPage); 59 | -------------------------------------------------------------------------------- /src/components/ListEmpty.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | 3 | import { 4 | View, 5 | ActivityIndicator, 6 | Dimensions, 7 | StyleSheet, 8 | Text 9 | 10 | } from 'react-native'; 11 | import ArabicText from './ArabicText'; 12 | import { colors } from '../config/colors'; 13 | 14 | const {width, height} = Dimensions.get('window'); 15 | 16 | const ListEmpty = (props) => { 17 | const { isPending, error } = props; 18 | if (isPending) { 19 | return ( 20 | 26 | ) 27 | } 28 | 29 | if (error) { 30 | return ( 31 | {error} 32 | ) 33 | } 34 | 35 | return 36 | 37 | لم يتم العثور على أية مقال 38 | 39 | 40 | }; 41 | 42 | ListEmpty.propTypes = { 43 | isPending: PropTypes.bool.isRequired, 44 | error: PropTypes.string 45 | } 46 | 47 | const styles = StyleSheet.create({ 48 | activityIndicator: { 49 | justifyContent: 'center', 50 | alignItems: 'center', 51 | width: width, 52 | height: height, 53 | }, 54 | artclesNoFoundContainer: { 55 | paddingTop: 100, 56 | alignItems: 'center', 57 | width: width, 58 | height: height, 59 | }, 60 | artclesNoFound: { 61 | fontSize: 24, 62 | color: colors.secondary, 63 | } 64 | }); 65 | 66 | export default ListEmpty; 67 | -------------------------------------------------------------------------------- /ios/hesspress-tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | NSLocationWhenInUseUsageDescription 40 | 41 | NSAppTransportSecurity 42 | 43 | 44 | NSExceptionDomains 45 | 46 | localhost 47 | 48 | NSExceptionAllowsInsecureHTTPLoads 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /android/app/BUCK: -------------------------------------------------------------------------------- 1 | # To learn about Buck see [Docs](https://buckbuild.com/). 2 | # To run your application with Buck: 3 | # - install Buck 4 | # - `npm start` - to start the packager 5 | # - `cd android` 6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 8 | # - `buck install -r android/app` - compile, install and run application 9 | # 10 | 11 | lib_deps = [] 12 | 13 | for jarfile in glob(['libs/*.jar']): 14 | name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')] 15 | lib_deps.append(':' + name) 16 | prebuilt_jar( 17 | name = name, 18 | binary_jar = jarfile, 19 | ) 20 | 21 | for aarfile in glob(['libs/*.aar']): 22 | name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')] 23 | lib_deps.append(':' + name) 24 | android_prebuilt_aar( 25 | name = name, 26 | aar = aarfile, 27 | ) 28 | 29 | android_library( 30 | name = "all-libs", 31 | exported_deps = lib_deps, 32 | ) 33 | 34 | android_library( 35 | name = "app-code", 36 | srcs = glob([ 37 | "src/main/java/**/*.java", 38 | ]), 39 | deps = [ 40 | ":all-libs", 41 | ":build_config", 42 | ":res", 43 | ], 44 | ) 45 | 46 | android_build_config( 47 | name = "build_config", 48 | package = "com.hesspress", 49 | ) 50 | 51 | android_resource( 52 | name = "res", 53 | package = "com.hesspress", 54 | res = "src/main/res", 55 | ) 56 | 57 | android_binary( 58 | name = "app", 59 | keystore = "//android/keystores:debug", 60 | manifest = "src/main/AndroidManifest.xml", 61 | package_type = "debug", 62 | deps = [ 63 | ":app-code", 64 | ], 65 | ) 66 | -------------------------------------------------------------------------------- /src/components/Header.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { 3 | Text, 4 | View, 5 | TouchableWithoutFeedback, 6 | StyleSheet, 7 | } from 'react-native'; 8 | import { Actions } from 'react-native-router-flux'; 9 | 10 | import Icon from 'react-native-vector-icons/FontAwesome'; 11 | import ArabicText from './ArabicText'; 12 | import { colors } from '../config/colors'; 13 | import dimensions from '../config/dimensions'; 14 | 15 | class Header extends Component { 16 | 17 | render() { 18 | const { toggleLeftMenu, title } = this.props; 19 | return ( 20 | 21 | toggleLeftMenu()} 23 | > 24 | 28 | 29 | 30 | {title} 31 | 32 | 33 | Actions.SearchPage()} 35 | > 36 | 40 | 41 | 42 | ); 43 | } 44 | } 45 | 46 | Header.propTypes = { 47 | toggleLeftMenu: PropTypes.func.isRequired, 48 | title: PropTypes.string.isRequired 49 | } 50 | 51 | const styles = StyleSheet.create({ 52 | container: { 53 | flexDirection: 'row', 54 | height: dimensions.header.height, 55 | alignItems: 'center', 56 | justifyContent: 'space-between', 57 | backgroundColor: colors.primary, 58 | paddingHorizontal: 15, 59 | paddingTop: dimensions.header.paddingTop 60 | }, 61 | title: { 62 | color: colors.white, 63 | fontSize: 18, 64 | fontWeight: 'bold' 65 | } 66 | }); 67 | 68 | export default Header; 69 | -------------------------------------------------------------------------------- /ios/hesspressTests/hesspressTests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | #import 12 | 13 | #import 14 | #import 15 | 16 | #define TIMEOUT_SECONDS 600 17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 18 | 19 | @interface hesspressTests : XCTestCase 20 | 21 | @end 22 | 23 | @implementation hesspressTests 24 | 25 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 26 | { 27 | if (test(view)) { 28 | return YES; 29 | } 30 | for (UIView *subview in [view subviews]) { 31 | if ([self findSubviewInView:subview matching:test]) { 32 | return YES; 33 | } 34 | } 35 | return NO; 36 | } 37 | 38 | - (void)testRendersWelcomeScreen 39 | { 40 | UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; 41 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 42 | BOOL foundElement = NO; 43 | 44 | __block NSString *redboxError = nil; 45 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 46 | if (level >= RCTLogLevelError) { 47 | redboxError = message; 48 | } 49 | }); 50 | 51 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 52 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 53 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 54 | 55 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 56 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 57 | return YES; 58 | } 59 | return NO; 60 | }]; 61 | } 62 | 63 | RCTSetLogFunction(RCTDefaultLogFunction); 64 | 65 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 66 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 67 | } 68 | 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /src/reducers/articlesReducer.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { queryByCategory } from '../config/api'; 3 | 4 | export const actionTypes = { 5 | GET_ARTICLES: 'ARTICLES/GET_ARTICLES', 6 | GET_ARTICLES_PENDING: 'ARTICLES/GET_ARTICLES_PENDING', 7 | GET_ARTICLES_FULFILLED: 'ARTICLES/GET_ARTICLES_FULFILLED', 8 | GET_ARTICLES_REJECTED: 'ARTICLES/GET_ARTICLES_REJECTED', 9 | SEARCH_ARTICLES_PENDING: 'ARTICLES/SEARCH_ARTICLES_PENDING', 10 | SEARCH_ARTICLES: 'ARTICLES/SEARCH_ARTICLES', 11 | SEARCH_ARTICLES_FULFILLED: 'ARTICLES/SEARCH_ARTICLES_FULFILLED', 12 | SEARCH_ARTICLES_REJECTED: 'ARTICLES/SEARCH_ARTICLES_REJECTED', 13 | }; 14 | 15 | const initialState = { 16 | isPending: false, 17 | articles: [], 18 | searchedArticles: [], 19 | error: null 20 | }; 21 | 22 | 23 | export default function reducer(state = initialState, action) { 24 | switch (action.type) { 25 | case actionTypes.GET_ARTICLES_PENDING: 26 | return { 27 | ...state, 28 | articles: [], 29 | isPending: true 30 | } 31 | case actionTypes.GET_ARTICLES_FULFILLED: 32 | return { 33 | ...state, 34 | isPending: false, 35 | articles: action.payload 36 | } 37 | case actionTypes.GET_ARTICLES_REJECTED: 38 | return { 39 | ...state, 40 | isPending: false, 41 | error: action.payload 42 | } 43 | case actionTypes.SEARCH_ARTICLES_PENDING: 44 | return { 45 | ...state, 46 | searchedArticles: [], 47 | isPending: true 48 | } 49 | case actionTypes.SEARCH_ARTICLES_FULFILLED: 50 | return { 51 | ...state, 52 | isPending: false, 53 | searchedArticles: action.payload 54 | } 55 | case actionTypes.GET_ARTICLES_REJECTED: 56 | return { 57 | ...state, 58 | isPending: false, 59 | error: action.payload 60 | } 61 | default: 62 | return state; 63 | } 64 | } 65 | 66 | export const actionCreators = { 67 | getArticles: (category) => ({ 68 | type: actionTypes.GET_ARTICLES, 69 | payload: axios 70 | .get(queryByCategory(category)) 71 | .then((result) => result.data.articles) 72 | }), 73 | searchArticles: (searchedText) => ({ 74 | type: actionTypes.SEARCH_ARTICLES, 75 | payload: searchedText 76 | }) 77 | }; 78 | 79 | -------------------------------------------------------------------------------- /ios/hesspress/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | hesspress 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | NSExceptionDomains 32 | 33 | hespress.com 34 | 35 | NSExceptionAllowsInsecureHTTPLoads 36 | 37 | 38 | localhost 39 | 40 | NSExceptionAllowsInsecureHTTPLoads 41 | 42 | 43 | s1.hespress.com 44 | 45 | NSExceptionAllowsInsecureHTTPLoads 46 | 47 | 48 | 49 | 50 | NSLocationWhenInUseUsageDescription 51 | 52 | UIAppFonts 53 | 54 | Entypo.ttf 55 | EvilIcons.ttf 56 | FontAwesome.ttf 57 | Foundation.ttf 58 | Ionicons.ttf 59 | MaterialCommunityIcons.ttf 60 | MaterialIcons.ttf 61 | Octicons.ttf 62 | SimpleLineIcons.ttf 63 | Zocial.ttf 64 | Al-Jazeera-Arabic-Bold.woff 65 | Al-Jazeera-Arabic-Regular.woff 66 | 67 | UILaunchStoryboardName 68 | LaunchScreen 69 | UIRequiredDeviceCapabilities 70 | 71 | armv7 72 | 73 | UISupportedInterfaceOrientations 74 | 75 | UIInterfaceOrientationPortrait 76 | UIInterfaceOrientationLandscapeLeft 77 | UIInterfaceOrientationLandscapeRight 78 | 79 | UIViewControllerBasedStatusBarAppearance 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Disabling obfuscation is useful if you collect stack traces from production crashes 20 | # (unless you are using a system that supports de-obfuscate the stack traces). 21 | -dontobfuscate 22 | 23 | # React Native 24 | 25 | # Keep our interfaces so they can be used by other ProGuard rules. 26 | # See http://sourceforge.net/p/proguard/bugs/466/ 27 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip 28 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters 29 | -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip 30 | 31 | # Do not strip any method/class that is annotated with @DoNotStrip 32 | -keep @com.facebook.proguard.annotations.DoNotStrip class * 33 | -keep @com.facebook.common.internal.DoNotStrip class * 34 | -keepclassmembers class * { 35 | @com.facebook.proguard.annotations.DoNotStrip *; 36 | @com.facebook.common.internal.DoNotStrip *; 37 | } 38 | 39 | -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { 40 | void set*(***); 41 | *** get*(); 42 | } 43 | 44 | -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } 45 | -keep class * extends com.facebook.react.bridge.NativeModule { *; } 46 | -keepclassmembers,includedescriptorclasses class * { native ; } 47 | -keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } 48 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } 49 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } 50 | 51 | -dontwarn com.facebook.react.** 52 | 53 | # TextLayoutBuilder uses a non-public Android constructor within StaticLayout. 54 | # See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details. 55 | -dontwarn android.text.StaticLayout 56 | 57 | # okhttp 58 | 59 | -keepattributes Signature 60 | -keepattributes *Annotation* 61 | -keep class okhttp3.** { *; } 62 | -keep interface okhttp3.** { *; } 63 | -dontwarn okhttp3.** 64 | 65 | # okio 66 | 67 | -keep class sun.misc.Unsafe { *; } 68 | -dontwarn java.nio.file.* 69 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 70 | -dontwarn okio.** 71 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | } from 'react-native'; 4 | import { Provider } from 'react-redux'; 5 | import { head } from 'lodash'; 6 | 7 | import { 8 | Router, 9 | Scene, 10 | Actions, 11 | } from 'react-native-router-flux'; 12 | import { connect } from 'react-redux'; 13 | 14 | import configureLocale from './config/locale'; 15 | import store from './store'; 16 | import { filters } from './config/data'; 17 | import { colors } from './config/colors'; 18 | import MainPage from './Pages/MainPage'; 19 | import ArticleDetailsPage from './Pages/ArticleDetailsPage'; 20 | import SearchPage from './Pages/SearchPage'; 21 | 22 | 23 | import { actionCreators as categoryActionCreators } from './reducers/categoryReducer'; 24 | import { actionCreators as articlesActionCreators } from './reducers/articlesReducer'; 25 | 26 | // init the moment localization. 27 | configureLocale(); 28 | 29 | const scenes = Actions.create( 30 | 31 | 32 | ""} 48 | /> 49 | ""} 65 | /> 66 | 67 | ); 68 | 69 | // --- Create connected Router if you want dispatch() method. 70 | // --- Or you can just use vanilla Router 71 | const ConnectedRouter = connect()(Router); 72 | 73 | 74 | class App extends Component { 75 | 76 | constructor(props) { 77 | super(props); 78 | 79 | this.state = { 80 | isOpen: false 81 | } 82 | 83 | const firstFilter = head(filters); 84 | store.dispatch(categoryActionCreators.select(firstFilter)); 85 | store.dispatch(articlesActionCreators.getArticles(firstFilter)); 86 | } 87 | 88 | render() { 89 | return ( 90 | 91 | 92 | 93 | ); 94 | } 95 | } 96 | 97 | export default App; 98 | -------------------------------------------------------------------------------- /src/Pages/ArticleDetailsPage.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { 3 | View, 4 | Text, 5 | StyleSheet, 6 | Image 7 | } from 'react-native'; 8 | import { connect } from 'react-redux'; 9 | import { Actions } from 'react-native-router-flux'; 10 | import HeaderImageScrollView, { TriggeringView } from 'react-native-image-header-scroll-view'; 11 | import { colors } from '../config/colors'; 12 | import { imageUriByName, decodeHtml } from '../config/html'; 13 | import ArabicText from '../components/ArabicText'; 14 | import HtmlView from '../components/HtmlView'; 15 | 16 | 17 | class ArticlesDetailsPage extends Component { 18 | 19 | componentDidMount() { 20 | Actions.refresh({ 21 | backTitle: this.props.selectedCategory.name 22 | }); 23 | } 24 | 25 | render() { 26 | const { image, author, title, body } = this.props; 27 | return ( 28 | 29 | ( 33 | 37 | )} 38 | > 39 | 41 | {decodeHtml(title)} 42 | {decodeHtml(author)} 43 | 44 | 45 | 46 | 47 | ); 48 | } 49 | } 50 | 51 | ArticlesDetailsPage.propTypes = { 52 | selectedCategory: PropTypes.object.isRequired, 53 | title: PropTypes.string.isRequired, 54 | author: PropTypes.string.isRequired, 55 | body: PropTypes.string.isRequired 56 | } 57 | 58 | const mapStateToProps = (state) => { 59 | return { 60 | selectedArticle: state.articles.selectedArticle, 61 | isPending: state.articles.isPending, 62 | error: state.articles.error, 63 | selectedCategory: state.selectedCategory 64 | }; 65 | } 66 | 67 | const styles = StyleSheet.create({ 68 | mainContainer: { 69 | flex: 1, 70 | paddingTop: 62 71 | }, 72 | scrollViewContainer: { 73 | flex: 1, 74 | flexDirection: 'column', 75 | justifyContent: 'center', 76 | alignItems: 'flex-end', 77 | padding: 10 78 | }, 79 | title: { 80 | fontSize: 16, 81 | color: colors.titleColor, 82 | paddingBottom: 10, 83 | textAlign: 'right' 84 | }, 85 | author: { 86 | fontSize: 14, 87 | color: colors.autorColor, 88 | paddingBottom: 10, 89 | textAlign: 'right' 90 | }, 91 | image: { 92 | height: 180, 93 | resizeMode: 'cover' 94 | } 95 | }); 96 | 97 | const ConnectArticlesDetailsPage = connect(mapStateToProps)(ArticlesDetailsPage); 98 | export default ConnectArticlesDetailsPage; -------------------------------------------------------------------------------- /src/assets/data/categories.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 11, 4 | "name": "صوت وصورة", 5 | "color": "#E91E63", 6 | "icon": "adn" 7 | }, 8 | { 9 | "id": 80, 10 | "name": "كاريكاتير اليوم", 11 | "color": "#9888B0", 12 | "icon": "yelp" 13 | }, 14 | { 15 | "id": 109, 16 | "name": "رمضانيات", 17 | "color": "#9C27B0", 18 | "icon": "anchor" 19 | }, 20 | { 21 | "id": 1, 22 | "name": "سياسة", 23 | "color": "#673AB7", 24 | "icon": "apple" 25 | }, 26 | { 27 | "id": 4, 28 | "name": "مجتمع", 29 | "color": "#F44336", 30 | "icon": "flash" 31 | }, 32 | { 33 | "id": 2, 34 | "name": "جهات", 35 | "color": "#3F51B5", 36 | "icon": "bar-chart" 37 | }, 38 | { 39 | "id": 5, 40 | "name": "مال وأعمال", 41 | "color": "#2196F3", 42 | "icon": "money" 43 | }, 44 | { 45 | "id": 21, 46 | "name": "مغاربة العالم", 47 | "color": "#CDDC39", 48 | "icon": "yelp" 49 | }, 50 | { 51 | "id": 16, 52 | "name": "السلطة الرابعة", 53 | "color": "#FF9800", 54 | "icon": "gears" 55 | }, 56 | { 57 | "id": 9, 58 | "name": "حوادث", 59 | "color": "#FF5722", 60 | "icon": "btc" 61 | }, 62 | { 63 | "id": 6, 64 | "name": "فن وثقافة", 65 | "color": "#CDDC39", 66 | "icon": "motorcycle" 67 | }, 68 | { 69 | "id": 18, 70 | "name": "تمازيغت", 71 | "color": "#e67e22", 72 | "icon": "wrench" 73 | }, 74 | { 75 | "id": 20, 76 | "name": "بيئة وعلوم", 77 | "color": "#9DDDD0", 78 | "icon": "money" 79 | }, 80 | { 81 | "id": 8, 82 | "name": "مدارات", 83 | "color": "#e67e22", 84 | "icon": "bed" 85 | }, 86 | { 87 | "id": 7, 88 | "name": "رياضة", 89 | "color": "#3498db", 90 | "icon": "yc" 91 | }, 92 | { 93 | "id": 22, 94 | "name": "كُتّاب وآراء", 95 | "color": "#1abc9c", 96 | "icon": "gg" 97 | }, 98 | { 99 | "id": 23, 100 | "name": "كُتّاب منبر هسبريس", 101 | "color": "#2ecc71", 102 | "icon": "hand-grab-o" 103 | }, 104 | { 105 | "id": 17, 106 | "name": "خارج الحدود", 107 | "color": "#8e44ad", 108 | "icon": "handshake-o" 109 | }, 110 | { 111 | "id": 110, 112 | "name": "فيديو", 113 | "color": "#9C27B0", 114 | "icon": "anchor" 115 | }, 116 | { 117 | "id": 108, 118 | "name": "عالم التقنية", 119 | "color": "#9C0710", 120 | "icon": "gg" 121 | }, 122 | { 123 | "id": 29, 124 | "name": "عين على الفايسبوك", 125 | "color": "#3498db", 126 | "icon": "yc" 127 | }, 128 | { 129 | "id": 107, 130 | "name": "منوعات", 131 | "color": "#9C3330", 132 | "icon": "anchor" 133 | }, 134 | { 135 | "id": 83, 136 | "name": "من الأمس", 137 | "color": "#9C9980", 138 | "icon": "yc" 139 | } 140 | ] -------------------------------------------------------------------------------- /ios/hesspress/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/components/ArticleCard.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { 3 | TouchableWithoutFeedback, 4 | View, 5 | Image, 6 | Dimensions, 7 | StyleSheet 8 | } from 'react-native'; 9 | 10 | import { Badge } from 'react-native-elements'; 11 | import ArabicText from '../components/ArabicText'; 12 | import { Actions } from 'react-native-router-flux'; 13 | import { colors, hexWithOpacity } from '../config/colors'; 14 | import { imageUriByName, decodeHtml } from '../config/html'; 15 | import { categoriesWithMedia } from '../config/data'; 16 | import moment from 'moment'; 17 | import Icon from 'react-native-vector-icons/FontAwesome'; 18 | // const {width, height} = Dimensions.get('window'); 19 | 20 | const ArticleCard = (props) => { 21 | const {article, categoryColor} = props; 22 | 23 | const mediaColor = hexWithOpacity(colors.white, 0.5); 24 | const hasMedia = categoriesWithMedia.indexOf(article.category_id) >= 0; 25 | 26 | return Actions.ArticleDetailsPage(article)} 29 | > 30 | 31 | 35 | 36 | {hasMedia && 41 | } 42 | 43 | 44 | 45 | 47 | {article.category_name} 48 | 49 | 50 | {moment(article.created).fromNow()} 51 | {decodeHtml(article.title)} 52 | 53 | 54 | 55 | 56 | }; 57 | 58 | ArticleCard.propTypes = { 59 | article: PropTypes.object.isRequired, 60 | categoryColor: PropTypes.string 61 | } 62 | 63 | const styles = StyleSheet.create({ 64 | container: { 65 | position: 'relative', 66 | backgroundColor: 'rgba(0,0,0,0)', 67 | paddingTop: 2, 68 | paddingHorizontal: 2 69 | }, 70 | textContainer: { 71 | position: 'absolute', 72 | top: 10, 73 | bottom: 30, 74 | right: 10, 75 | flex: 1, 76 | flexDirection: 'column', 77 | justifyContent: 'space-between', 78 | alignItems: 'flex-end', 79 | }, 80 | title: { 81 | color: colors.white, 82 | fontSize: 16, 83 | fontWeight: 'bold', 84 | textAlign: 'right', 85 | lineHeight: 20, 86 | }, 87 | dateCreated: { 88 | color: colors.white, 89 | fontSize: 14, 90 | textAlign: 'right' 91 | }, 92 | badge: { 93 | backgroundColor: 'rgba(205, 220, 57,0.5)', 94 | borderRadius: 4, 95 | height: 30, 96 | padding: 6 97 | }, 98 | badgeText: { 99 | color: colors.white, 100 | fontSize: 16, 101 | fontWeight: 'bold' 102 | }, 103 | image: { 104 | height: 250, 105 | }, 106 | imageOverlay: { 107 | backgroundColor: 'rgba(0,0,0,0.3)', 108 | height: 250, 109 | justifyContent: 'center', 110 | alignItems: 'center' 111 | } 112 | }); 113 | 114 | export default ArticleCard; -------------------------------------------------------------------------------- /src/components/LeftMenu.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { 3 | StyleSheet, 4 | ScrollView, 5 | View, 6 | Dimensions 7 | } from 'react-native'; 8 | import { bindActionCreators } from 'redux'; 9 | import { connect } from 'react-redux'; 10 | 11 | import ArabicText from './ArabicText'; 12 | import { colors } from '../config/colors'; 13 | import Icon from 'react-native-vector-icons/FontAwesome'; 14 | const window = Dimensions.get('window'); 15 | import { categories, filters } from '../config/data'; 16 | import { actionCreators as categoryActionCreators } from '../reducers/categoryReducer'; 17 | import { actionCreators as articlesActionCreators } from '../reducers/articlesReducer'; 18 | 19 | 20 | class LeftMenu extends Component { 21 | renderItems(items) { 22 | const { select, getArticles, selectedCategory } = this.props; 23 | const onLeftMenuItemSelected = (category) => { 24 | select(category); 25 | getArticles(category); 26 | this.props.onLeftMenuItemSelected(category) 27 | } 28 | 29 | return items.map((item) => 30 | 31 | 32 | onLeftMenuItemSelected(item)} 34 | textStyle={styles.text}>{item.name} 35 | 36 | 42 | 43 | 44 | ); 45 | } 46 | 47 | render() { 48 | return ( 49 | 50 | {this.renderItems(filters)} 51 | 52 | الاقسام 53 | 54 | {this.renderItems(categories)} 55 | 56 | ); 57 | } 58 | } 59 | 60 | LeftMenu.propTypes = { 61 | onLeftMenuItemSelected: PropTypes.func.isRequired, 62 | selectedCategory: PropTypes.object.isRequired 63 | }; 64 | 65 | const styles = StyleSheet.create({ 66 | scrollContainer: { 67 | flex: 1, 68 | width: window.width, 69 | height: window.height, 70 | backgroundColor: colors.secondary, 71 | padding: 20, 72 | paddingLeft: 0 73 | }, 74 | text: { 75 | color: colors.white, 76 | fontSize: 18, 77 | // fontWeight: 'bold', 78 | paddingTop: 4 79 | }, 80 | textWithIcon: { 81 | flexDirection: 'row', 82 | justifyContent: 'flex-end', 83 | alignItems: 'center', 84 | paddingVertical: 4, 85 | paddingRight: 120 86 | }, 87 | iconWithText: { 88 | paddingLeft: 14 89 | }, 90 | withIcon: { 91 | flexDirection: 'row', 92 | alignItems: 'center' 93 | }, 94 | sectionContainer: { 95 | paddingTop: 30, 96 | flexDirection: 'row', 97 | justifyContent: 'flex-end', 98 | alignItems: 'center', 99 | paddingVertical: 4, 100 | paddingRight: 120 101 | 102 | }, 103 | sectionText: { 104 | color: colors.white, 105 | fontSize: 16, 106 | alignItems: 'flex-start', 107 | } 108 | }); 109 | 110 | const mapStateToProps = (state) => { 111 | return { 112 | selectedCategory: state.selectedCategory 113 | } 114 | } 115 | 116 | const mapDispatchToPros = (dispatch) => ({ 117 | ...bindActionCreators({ 118 | ...categoryActionCreators, 119 | ...articlesActionCreators 120 | }, dispatch) 121 | }); 122 | 123 | const ConnectedLeftMenu = connect(mapStateToProps, mapDispatchToPros)(LeftMenu) 124 | 125 | export default ConnectedLeftMenu; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hespress.com-react-native 2 | 3 | ### Final Results - [Youtube playlist](https://www.youtube.com/channel/UCoEuFnwZ1aMYns1X8-KiACQ) 4 | 5 | النتيجة النهائية للدروس 6 | اكتب برنامج واحد يعطيك النتيجة في للايفون والاندرويد 7 | ملاحظة: ستايلات الاندرويد لم يتم اكمالها 8 | 9 | The result of my lessons on React-Native 10 | Write one code base, have two platforms supported, iOS and android. 11 | Note: the styles on android haven't finished it. 12 | 13 | ### 14 | 15 | 16 | 17 | 18 | 19 | 20 | ## Lesson 13 - [Youtube video](https://youtu.be/8MSRurO4Sfc): 21 | * Android 22 | 23 | ## Lesson 12 - [Youtube video](https://youtu.be/YJV6f6sddSg): 24 | * Articles Search Page - صفحة البحث عن المقالات 25 | 26 | ## Lesson 11 - [Youtube video](https://youtu.be/bH9xxY21IsE): 27 | * [Redux-Saga](https://github.com/redux-saga/redux-saga) 28 | 29 | ## Lesson 10 - [Youtube video](https://youtu.be/-MHgx1JhGNY): 30 | * HTML Parser Article View 31 | * [image-header-scroll-view](https://github.com/bamlab/react-native-image-header-scroll-view) 32 | * [react-native-router-flux](https://github.com/aksonov/react-native-router-flux) 33 | * [htmlparser2](https://github.com/fb55/htmlparser2) 34 | 35 | ## Lesson 9 - [Youtube video](https://youtu.be/bY97cNUhDmY): 36 | * Navigation - Article Details View - التنقل - تفاصيل المقال 37 | * [react-native-router-flux](https://github.com/aksonov/react-native-router-flux) 38 | 39 | 40 | ## Lesson 8 - [Youtube video](https://youtu.be/YjJ0psaT-f0): 41 | * Pull To Refresh Content - القائمة اختر القسم 42 | * Video Icon 43 | 44 | ## Lesson 7 - [Youtube video](https://www.youtube.com/watch?v=Mn0zlcr2UlM): 45 | * [Fetch live articles - مقالات حية] 46 | * [Redux](http://redux.js.org/) 47 | * [Redux-Promise-middleware](https://github.com/acdlite/redux-promise) 48 | * [Allow Arbitrary loads](https://stackoverflow.com/questions/38077273/react-native-fetch-network-request-failed-not-using-localhost) 49 | * ` 50 | "axios": "^0.16.2", 51 | "react-redux": "^5.0.5", 52 | "redux": "^3.7.1", 53 | "redux-logger": "^3.0.6", 54 | "redux-promise-middleware": "^4.2.1" 55 | ` 56 | 57 | ## Lesson 6 - [Youtube video](https://youtu.be/Lr5ZW_lF-1E): 58 | * Side Menu, Select Category - القائمة اختر القسم 59 | * Category colors 60 | 61 | ## Lesson 5 - [Youtube video](https://youtu.be/oET0-5xjImY): 62 | * [Side Menu - القائمة الجانبية](https://github.com/react-native-community/react-native-side-menu) 63 | * [Fontawesome](https://paulferrett.com/fontawesome-favicon/) 64 | * [Colors](http://materialuicolors.co/?ref=flatuicolors.com) 65 | 66 | 67 | ## Lesson 4 - [Youtube video](https://www.youtube.com/watch?v=xm_aeBvuN00&index): 68 | * [HTML Encoding - تصحيح النص](https://www.npmjs.com/package/html-entities) 69 | * [StatusBar - شريط الحالة](https://facebook.github.io/react-native/docs/statusbar.html) 70 | * Arabic Fonts - الخطوط العربية 71 | * [Moment - لحظة](https://momentjs.com/docs/#/i18n/) 72 | 73 | 74 | ## Lesson 3 - [Youtube video](https://youtu.be/OkQ8JszXjpM): 75 | * [FlatList - قائمة](https://facebook.github.io/react-native/docs/flatlist.html) 76 | * [Card - بطاقة] 77 | * [Elements](https://github.com/react-native-training/react-native-elements) 78 | * [react-developer-tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi) 79 | 80 | ### Lesson 2 - [Youtube video](https://youtu.be/5WpRdnWb2Uo): 81 | * ESLINT - تركيب مدقق البرمجة 82 | * Application Header - بدء بناء رأس التطبيق 83 | 84 | 85 | ### Lesson 1 - [Youtube video](https://youtu.be/S3KGpVb7TIY): 86 | * Install React-Native - التثبت 87 | 88 | ### Result Lesson 6: 89 | 90 | 91 | 92 | ### Result Lesson 5: 93 | 94 | 95 | ### Result Lesson 4: 96 | 97 | 98 | ### Result Lesson 3: 99 | 100 | -------------------------------------------------------------------------------- /src/Pages/SearchPage.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | View, 4 | TextInput, 5 | StyleSheet, 6 | FlatList, 7 | TouchableWithoutFeedback 8 | } from 'react-native'; 9 | import { connect } from 'react-redux'; 10 | import { bindActionCreators } from 'redux'; 11 | import { actionCreators as articlesActionCreators } from '../reducers/articlesReducer'; 12 | import Icon from 'react-native-vector-icons/FontAwesome'; 13 | import { colors, hexWithOpacity, getColorById } from '../config/colors'; 14 | import { categories, categoriesWithMedia } from '../config/data'; 15 | import ArabicText from '../components/ArabicText'; 16 | import ListEmpty from '../components/ListEmpty'; 17 | import ArticleCard from '../components/ArticleCard'; 18 | import { debounce } from 'lodash'; 19 | import { Actions } from 'react-native-router-flux'; 20 | import dimensions from '../config/dimensions'; 21 | 22 | class SearchPage extends Component { 23 | 24 | _keyExtractor = (item, index) => item.id; 25 | 26 | _search(searchText) { 27 | const {searchArticles} = this.props; 28 | searchArticles(searchText); 29 | } 30 | 31 | _renderListEmptyComponent() { 32 | const { isPending, error } = this.props; 33 | return 37 | } 38 | 39 | _renderItem({item}) { 40 | color = colors.primary 41 | const mediaColor = hexWithOpacity(colors.white, 0.5); 42 | const hasMedia = categoriesWithMedia.indexOf(item.category_id) >= 0; 43 | return ( 44 | 48 | ); 49 | } 50 | 51 | 52 | render() { 53 | 54 | const { searchedArticles } = this.props; 55 | return ( 56 | 57 | 58 | 64 | 72 | Actions.pop()} 74 | > 75 | 76 | إلغاء 77 | 78 | 79 | 80 | 81 | 87 | 88 | ); 89 | } 90 | } 91 | 92 | const mapStateToProps = (state) => { 93 | return { 94 | searchedArticles: state.articles.searchedArticles, 95 | }; 96 | } 97 | 98 | const mapDispatchToPros = (dispatch) => ({ 99 | ...bindActionCreators({ 100 | ...articlesActionCreators 101 | }, dispatch) 102 | }); 103 | 104 | 105 | const styles = StyleSheet.create({ 106 | container: { 107 | flex: 1, 108 | backgroundColor: colors.white 109 | }, 110 | header: { 111 | flexDirection: 'row', 112 | height: dimensions.header.height, 113 | alignItems: 'center', 114 | justifyContent: 'space-between', 115 | backgroundColor: colors.primary, 116 | paddingHorizontal: 15, 117 | paddingTop: dimensions.header.paddingTop, 118 | }, 119 | searchIcon: { 120 | backgroundColor: 'transparent' 121 | }, 122 | input: { 123 | width: 260, 124 | height: 30, 125 | backgroundColor: colors.white, 126 | marginHorizontal: 10, 127 | paddingLeft: 10, 128 | borderRadius: 3, 129 | color: colors.black 130 | }, 131 | cancelButtonText: { 132 | color: colors.white 133 | }, 134 | activityIndicator: { 135 | justifyContent: 'center', 136 | alignItems: 'center', 137 | width: window.width, 138 | height: window.height, 139 | }, 140 | artclesNoFoundContainer: { 141 | paddingTop: 100, 142 | alignItems: 'center', 143 | width: window.width, 144 | height: window.height, 145 | }, 146 | artclesNoFound: { 147 | fontSize: 24, 148 | color: colors.secondary, 149 | } 150 | }); 151 | 152 | const connectedSearchPage = connect(mapStateToProps, mapDispatchToPros)(SearchPage); 153 | 154 | export default connectedSearchPage; 155 | 156 | 157 | -------------------------------------------------------------------------------- /ios/hesspress.xcodeproj/xcshareddata/xcschemes/hesspress.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /ios/hesspress.xcodeproj/xcshareddata/xcschemes/hesspress-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /src/Pages/ArticlesPage.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { 3 | View, 4 | FlatList, 5 | Image, 6 | Text, 7 | ActivityIndicator, 8 | Dimensions, 9 | TouchableWithoutFeedback 10 | } from 'react-native'; 11 | import moment from 'moment'; 12 | import { connect } from 'react-redux'; 13 | import { bindActionCreators } from 'redux'; 14 | import { Actions } from 'react-native-router-flux'; 15 | 16 | import { Badge } from 'react-native-elements'; 17 | import Icon from 'react-native-vector-icons/FontAwesome'; 18 | import Header from '../components/Header'; 19 | import ArabicText from '../components/ArabicText'; 20 | import { colors, hexWithOpacity, getColorById } from '../config/colors'; 21 | import { categories, categoriesWithMedia } from '../config/data'; 22 | import { actionCreators as articlesActionCreators } from '../reducers/articlesReducer'; 23 | import { imageUriByName, decodeHtml } from '../config/html'; 24 | import ListEmpty from '../components/ListEmpty'; 25 | import ArticleCard from '../components/ArticleCard'; 26 | 27 | const window = Dimensions.get('window'); 28 | 29 | class ArticlesPages extends Component { 30 | 31 | _keyExtractor = (item, index) => item.id; 32 | 33 | _renderItem({item}) { 34 | const {selectedCategory} = this.props; 35 | color = hexWithOpacity(getColorById(item.category_id, selectedCategory), 0.5); 36 | const mediaColor = hexWithOpacity(colors.white, 0.5); 37 | const hasMedia = categoriesWithMedia.indexOf(item.category_id) >= 0; 38 | return ( 39 | 43 | ); 44 | } 45 | 46 | _renderListEmptyComponent() { 47 | const { isPending, error } = this.props; 48 | return 52 | } 53 | 54 | _handleRefresh() { 55 | const { getArticles, selectedCategory } = this.props; 56 | getArticles(selectedCategory); 57 | } 58 | 59 | render() { 60 | const { articles, selectedCategory, toggleLeftMenu } = this.props; 61 | return ( 62 | 63 |
66 | 74 | 75 | ); 76 | } 77 | } 78 | 79 | ArticlesPages.propTypes = { 80 | toggleLeftMenu: PropTypes.func.isRequired, 81 | selectedCategory: PropTypes.object.isRequired, 82 | articles: PropTypes.array.isRequired, 83 | } 84 | 85 | 86 | const styles = { 87 | mainContainer: { 88 | backgroundColor: colors.white, 89 | width: window.width, 90 | height: window.height, 91 | flex: 1, 92 | }, 93 | container: { 94 | position: 'relative', 95 | backgroundColor: 'rgba(0,0,0,0)', 96 | paddingTop: 2, 97 | paddingHorizontal: 2 98 | }, 99 | textContainer: { 100 | position: 'absolute', 101 | top: 10, 102 | bottom: 30, 103 | right: 10, 104 | flex: 1, 105 | flexDirection: 'column', 106 | justifyContent: 'space-between', 107 | alignItems: 'flex-end', 108 | }, 109 | title: { 110 | color: colors.white, 111 | fontSize: 16, 112 | fontWeight: 'bold', 113 | textAlign: 'right', 114 | lineHeight: 20, 115 | }, 116 | dateCreated: { 117 | color: colors.white, 118 | fontSize: 14, 119 | textAlign: 'right' 120 | }, 121 | badge: { 122 | backgroundColor: 'rgba(205, 220, 57,0.5)', 123 | borderRadius: 4, 124 | height: 30, 125 | padding: 6 126 | }, 127 | badgeText: { 128 | color: colors.white, 129 | fontSize: 16, 130 | fontWeight: 'bold' 131 | }, 132 | image: { 133 | height: 250, 134 | }, 135 | imageOverlay: { 136 | backgroundColor: 'rgba(0,0,0,0.3)', 137 | height: 250, 138 | justifyContent: 'center', 139 | alignItems: 'center' 140 | }, 141 | bottomTextGroup: { 142 | top: 10 143 | }, 144 | activityIndicatorContainer: { 145 | width: window.width, 146 | height: window.height, 147 | flex: 1, 148 | justifyContent: 'center', 149 | alignItems: 'center', 150 | marginTop: 70, 151 | backgroundColor: colors.white 152 | }, 153 | activityIndicator: { 154 | justifyContent: 'center', 155 | alignItems: 'center', 156 | width: window.width, 157 | height: window.height, 158 | }, 159 | artclesNoFoundContainer: { 160 | paddingTop: 100, 161 | alignItems: 'center', 162 | width: window.width, 163 | height: window.height, 164 | }, 165 | artclesNoFound: { 166 | fontSize: 24, 167 | color: colors.secondary, 168 | } 169 | }; 170 | 171 | const mapStateToProps = (state) => { 172 | return { 173 | articles: state.articles.articles, 174 | isPending: state.articles.isPending, 175 | error: state.articles.error, 176 | selectedCategory: state.selectedCategory 177 | }; 178 | } 179 | 180 | const mapDispatchToPros = (dispatch) => ({ 181 | ...bindActionCreators({ 182 | ...articlesActionCreators 183 | }, dispatch) 184 | }); 185 | 186 | const ConntectedArticlesPages = connect(mapStateToProps, mapDispatchToPros)(ArticlesPages); 187 | 188 | export default ConntectedArticlesPages; 189 | -------------------------------------------------------------------------------- /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 19 | * entryFile: "index.android.js", 20 | * 21 | * // whether to bundle JS and assets in debug mode 22 | * bundleInDebug: false, 23 | * 24 | * // whether to bundle JS and assets in release mode 25 | * bundleInRelease: true, 26 | * 27 | * // whether to bundle JS and assets in another build variant (if configured). 28 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 29 | * // The configuration property can be in the following formats 30 | * // 'bundleIn${productFlavor}${buildType}' 31 | * // 'bundleIn${buildType}' 32 | * // bundleInFreeDebug: true, 33 | * // bundleInPaidRelease: true, 34 | * // bundleInBeta: true, 35 | * 36 | * // whether to disable dev mode in custom build variants (by default only disabled in release) 37 | * // for example: to disable dev mode in the staging build type (if configured) 38 | * devDisabledInStaging: true, 39 | * // The configuration property can be in the following formats 40 | * // 'devDisabledIn${productFlavor}${buildType}' 41 | * // 'devDisabledIn${buildType}' 42 | * 43 | * // the root of your project, i.e. where "package.json" lives 44 | * root: "../../", 45 | * 46 | * // where to put the JS bundle asset in debug mode 47 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 48 | * 49 | * // where to put the JS bundle asset in release mode 50 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 51 | * 52 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 53 | * // require('./image.png')), in debug mode 54 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 55 | * 56 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 57 | * // require('./image.png')), in release mode 58 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 59 | * 60 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 61 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 62 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 63 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 64 | * // for example, you might want to remove it from here. 65 | * inputExcludes: ["android/**", "ios/**"], 66 | * 67 | * // override which node gets called and with what additional arguments 68 | * nodeExecutableAndArgs: ["node"], 69 | * 70 | * // supply additional arguments to the packager 71 | * extraPackagerArgs: [] 72 | * ] 73 | */ 74 | 75 | apply from: "../../node_modules/react-native/react.gradle" 76 | 77 | /** 78 | * Set this to true to create two separate APKs instead of one: 79 | * - An APK that only works on ARM devices 80 | * - An APK that only works on x86 devices 81 | * The advantage is the size of the APK is reduced by about 4MB. 82 | * Upload all the APKs to the Play Store and people will download 83 | * the correct one based on the CPU architecture of their device. 84 | */ 85 | def enableSeparateBuildPerCPUArchitecture = false 86 | 87 | /** 88 | * Run Proguard to shrink the Java bytecode in release builds. 89 | */ 90 | def enableProguardInReleaseBuilds = false 91 | 92 | android { 93 | compileSdkVersion 23 94 | buildToolsVersion "23.0.1" 95 | 96 | defaultConfig { 97 | applicationId "com.hesspress" 98 | minSdkVersion 16 99 | targetSdkVersion 22 100 | versionCode 1 101 | versionName "1.0" 102 | ndk { 103 | abiFilters "armeabi-v7a", "x86" 104 | } 105 | } 106 | splits { 107 | abi { 108 | reset() 109 | enable enableSeparateBuildPerCPUArchitecture 110 | universalApk false // If true, also generate a universal APK 111 | include "armeabi-v7a", "x86" 112 | } 113 | } 114 | buildTypes { 115 | release { 116 | minifyEnabled enableProguardInReleaseBuilds 117 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 118 | } 119 | } 120 | // applicationVariants are e.g. debug, release 121 | applicationVariants.all { variant -> 122 | variant.outputs.each { output -> 123 | // For each separate APK per architecture, set a unique version code as described here: 124 | // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits 125 | def versionCodes = ["armeabi-v7a":1, "x86":2] 126 | def abi = output.getFilter(OutputFile.ABI) 127 | if (abi != null) { // null for the universal-debug, universal-release variants 128 | output.versionCodeOverride = 129 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 130 | } 131 | } 132 | } 133 | } 134 | 135 | dependencies { 136 | compile project(':react-native-vector-icons') 137 | compile fileTree(dir: "libs", include: ["*.jar"]) 138 | compile "com.android.support:appcompat-v7:23.0.1" 139 | compile "com.facebook.react:react-native:+" // From node_modules 140 | } 141 | 142 | // Run this once to be able to run the application with BUCK 143 | // puts all compile dependencies into folder libs for BUCK to use 144 | task copyDownloadableDepsToLibs(type: Copy) { 145 | from configurations.compile 146 | into 'libs' 147 | } 148 | -------------------------------------------------------------------------------- /android/app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /ios/hesspress.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 11 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 12 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 13 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 14 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 15 | 00E356F31AD99517003FC87E /* hesspressTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* hesspressTests.m */; }; 16 | 02CE59E5FDA347F29B63E80F /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 21DB30753FE04116B6F8ECC6 /* FontAwesome.ttf */; }; 17 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 18 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 19 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 20 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 21 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 22 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 23 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 24 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 25 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 26 | 1B7B8FDED417452AB298F740 /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1B9135DB2FFD41148140E39B /* Ionicons.ttf */; }; 27 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 28 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 29 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 30 | 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 31 | 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; 32 | 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; 33 | 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; 34 | 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; 35 | 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; 36 | 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; 37 | 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; 38 | 2DCD954D1E0B4F2C00145EB5 /* hesspressTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* hesspressTests.m */; }; 39 | 338889F91EFEE55F0070FADD /* Al-Jazeera-Arabic-Bold.woff in Resources */ = {isa = PBXBuildFile; fileRef = 338889F71EFEE55F0070FADD /* Al-Jazeera-Arabic-Bold.woff */; }; 40 | 338889FA1EFEE55F0070FADD /* Al-Jazeera-Arabic-Bold.woff in Resources */ = {isa = PBXBuildFile; fileRef = 338889F71EFEE55F0070FADD /* Al-Jazeera-Arabic-Bold.woff */; }; 41 | 338889FB1EFEE55F0070FADD /* Al-Jazeera-Arabic-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 338889F81EFEE55F0070FADD /* Al-Jazeera-Arabic-Regular.woff */; }; 42 | 338889FC1EFEE55F0070FADD /* Al-Jazeera-Arabic-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 338889F81EFEE55F0070FADD /* Al-Jazeera-Arabic-Regular.woff */; }; 43 | 4BA92FE8DB58403FB0263274 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8EE86CB9044942118D7B97B2 /* MaterialIcons.ttf */; }; 44 | 5E6414BB147E416A87C1DC9F /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 746B5B4632EB46A48720991A /* Entypo.ttf */; }; 45 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 46 | 6D2ECFE194384CF7BAFF25E7 /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C2678551DBFA4FFEACF961BD /* EvilIcons.ttf */; }; 47 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 48 | 9862B08F834143DFAF5FA834 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 626B8D1AE35342C4B1096D8C /* libRNVectorIcons.a */; }; 49 | CC04BC8A32A141D794AB695A /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8BB5DAA5414F4047B8643C6D /* SimpleLineIcons.ttf */; }; 50 | F3978EFB59F44CE2ACA7562E /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1F79F8661C6C4CCF8236D179 /* MaterialCommunityIcons.ttf */; }; 51 | F59D66DF19E04F5CA0361627 /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7C63F860DE834ECCBB8307E5 /* Foundation.ttf */; }; 52 | F61549D66C2D462891080A20 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8057D52B0CF24A04AF387FB6 /* Zocial.ttf */; }; 53 | FE4D9FAABC0A4375A061E1D1 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 841A3421D7DB4E668DCF3F40 /* Octicons.ttf */; }; 54 | /* End PBXBuildFile section */ 55 | 56 | /* Begin PBXContainerItemProxy section */ 57 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 58 | isa = PBXContainerItemProxy; 59 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 60 | proxyType = 2; 61 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 62 | remoteInfo = RCTActionSheet; 63 | }; 64 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 65 | isa = PBXContainerItemProxy; 66 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 67 | proxyType = 2; 68 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 69 | remoteInfo = RCTGeolocation; 70 | }; 71 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 72 | isa = PBXContainerItemProxy; 73 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 74 | proxyType = 2; 75 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 76 | remoteInfo = RCTImage; 77 | }; 78 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 79 | isa = PBXContainerItemProxy; 80 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 81 | proxyType = 2; 82 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 83 | remoteInfo = RCTNetwork; 84 | }; 85 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 86 | isa = PBXContainerItemProxy; 87 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 88 | proxyType = 2; 89 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 90 | remoteInfo = RCTVibration; 91 | }; 92 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 93 | isa = PBXContainerItemProxy; 94 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 95 | proxyType = 1; 96 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 97 | remoteInfo = hesspress; 98 | }; 99 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 100 | isa = PBXContainerItemProxy; 101 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 102 | proxyType = 2; 103 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 104 | remoteInfo = RCTSettings; 105 | }; 106 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 107 | isa = PBXContainerItemProxy; 108 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 109 | proxyType = 2; 110 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 111 | remoteInfo = RCTWebSocket; 112 | }; 113 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 114 | isa = PBXContainerItemProxy; 115 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 116 | proxyType = 2; 117 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 118 | remoteInfo = React; 119 | }; 120 | 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { 121 | isa = PBXContainerItemProxy; 122 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 123 | proxyType = 1; 124 | remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; 125 | remoteInfo = "hesspress-tvOS"; 126 | }; 127 | 333A29741EFDB0C500BA55D4 /* PBXContainerItemProxy */ = { 128 | isa = PBXContainerItemProxy; 129 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 130 | proxyType = 2; 131 | remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; 132 | remoteInfo = "third-party"; 133 | }; 134 | 333A29761EFDB0C500BA55D4 /* PBXContainerItemProxy */ = { 135 | isa = PBXContainerItemProxy; 136 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 137 | proxyType = 2; 138 | remoteGlobalIDString = 139D7E881E25C6D100323FB7; 139 | remoteInfo = "double-conversion"; 140 | }; 141 | 333A29791EFDB0C500BA55D4 /* PBXContainerItemProxy */ = { 142 | isa = PBXContainerItemProxy; 143 | containerPortal = E13AAFC482364FFDBE07660E /* RNVectorIcons.xcodeproj */; 144 | proxyType = 2; 145 | remoteGlobalIDString = 5DBEB1501B18CEA900B34395; 146 | remoteInfo = RNVectorIcons; 147 | }; 148 | 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { 149 | isa = PBXContainerItemProxy; 150 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 151 | proxyType = 2; 152 | remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; 153 | remoteInfo = "RCTImage-tvOS"; 154 | }; 155 | 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { 156 | isa = PBXContainerItemProxy; 157 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 158 | proxyType = 2; 159 | remoteGlobalIDString = 2D2A28471D9B043800D4039D; 160 | remoteInfo = "RCTLinking-tvOS"; 161 | }; 162 | 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 163 | isa = PBXContainerItemProxy; 164 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 165 | proxyType = 2; 166 | remoteGlobalIDString = 2D2A28541D9B044C00D4039D; 167 | remoteInfo = "RCTNetwork-tvOS"; 168 | }; 169 | 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 170 | isa = PBXContainerItemProxy; 171 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 172 | proxyType = 2; 173 | remoteGlobalIDString = 2D2A28611D9B046600D4039D; 174 | remoteInfo = "RCTSettings-tvOS"; 175 | }; 176 | 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { 177 | isa = PBXContainerItemProxy; 178 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 179 | proxyType = 2; 180 | remoteGlobalIDString = 2D2A287B1D9B048500D4039D; 181 | remoteInfo = "RCTText-tvOS"; 182 | }; 183 | 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { 184 | isa = PBXContainerItemProxy; 185 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 186 | proxyType = 2; 187 | remoteGlobalIDString = 2D2A28881D9B049200D4039D; 188 | remoteInfo = "RCTWebSocket-tvOS"; 189 | }; 190 | 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { 191 | isa = PBXContainerItemProxy; 192 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 193 | proxyType = 2; 194 | remoteGlobalIDString = 2D2A28131D9B038B00D4039D; 195 | remoteInfo = "React-tvOS"; 196 | }; 197 | 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { 198 | isa = PBXContainerItemProxy; 199 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 200 | proxyType = 2; 201 | remoteGlobalIDString = 3D3C059A1DE3340900C268FA; 202 | remoteInfo = yoga; 203 | }; 204 | 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { 205 | isa = PBXContainerItemProxy; 206 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 207 | proxyType = 2; 208 | remoteGlobalIDString = 3D3C06751DE3340C00C268FA; 209 | remoteInfo = "yoga-tvOS"; 210 | }; 211 | 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { 212 | isa = PBXContainerItemProxy; 213 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 214 | proxyType = 2; 215 | remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; 216 | remoteInfo = cxxreact; 217 | }; 218 | 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 219 | isa = PBXContainerItemProxy; 220 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 221 | proxyType = 2; 222 | remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; 223 | remoteInfo = "cxxreact-tvOS"; 224 | }; 225 | 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 226 | isa = PBXContainerItemProxy; 227 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 228 | proxyType = 2; 229 | remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; 230 | remoteInfo = jschelpers; 231 | }; 232 | 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 233 | isa = PBXContainerItemProxy; 234 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 235 | proxyType = 2; 236 | remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; 237 | remoteInfo = "jschelpers-tvOS"; 238 | }; 239 | 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 240 | isa = PBXContainerItemProxy; 241 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 242 | proxyType = 2; 243 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 244 | remoteInfo = RCTAnimation; 245 | }; 246 | 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 247 | isa = PBXContainerItemProxy; 248 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 249 | proxyType = 2; 250 | remoteGlobalIDString = 2D2A28201D9B03D100D4039D; 251 | remoteInfo = "RCTAnimation-tvOS"; 252 | }; 253 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 254 | isa = PBXContainerItemProxy; 255 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 256 | proxyType = 2; 257 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 258 | remoteInfo = RCTLinking; 259 | }; 260 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 261 | isa = PBXContainerItemProxy; 262 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 263 | proxyType = 2; 264 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 265 | remoteInfo = RCTText; 266 | }; 267 | /* End PBXContainerItemProxy section */ 268 | 269 | /* Begin PBXFileReference section */ 270 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 271 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 272 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 273 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 274 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 275 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 276 | 00E356EE1AD99517003FC87E /* hesspressTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = hesspressTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 277 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 278 | 00E356F21AD99517003FC87E /* hesspressTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = hesspressTests.m; sourceTree = ""; }; 279 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 280 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 281 | 13B07F961A680F5B00A75B9A /* hesspress.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = hesspress.app; sourceTree = BUILT_PRODUCTS_DIR; }; 282 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = hesspress/AppDelegate.h; sourceTree = ""; }; 283 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = hesspress/AppDelegate.m; sourceTree = ""; }; 284 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 285 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = hesspress/Images.xcassets; sourceTree = ""; }; 286 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = hesspress/Info.plist; sourceTree = ""; }; 287 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = hesspress/main.m; sourceTree = ""; }; 288 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 289 | 1B9135DB2FFD41148140E39B /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; 290 | 1F79F8661C6C4CCF8236D179 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; 291 | 21DB30753FE04116B6F8ECC6 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; 292 | 2D02E47B1E0B4A5D006451C7 /* hesspress-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "hesspress-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 293 | 2D02E4901E0B4A5D006451C7 /* hesspress-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "hesspress-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 294 | 338889F71EFEE55F0070FADD /* Al-Jazeera-Arabic-Bold.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Al-Jazeera-Arabic-Bold.woff"; sourceTree = ""; }; 295 | 338889F81EFEE55F0070FADD /* Al-Jazeera-Arabic-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Al-Jazeera-Arabic-Regular.woff"; sourceTree = ""; }; 296 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 297 | 626B8D1AE35342C4B1096D8C /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; 298 | 746B5B4632EB46A48720991A /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; 299 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 300 | 7C63F860DE834ECCBB8307E5 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; 301 | 8057D52B0CF24A04AF387FB6 /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; 302 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 303 | 841A3421D7DB4E668DCF3F40 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; 304 | 8BB5DAA5414F4047B8643C6D /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; 305 | 8EE86CB9044942118D7B97B2 /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; 306 | C2678551DBFA4FFEACF961BD /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; 307 | E13AAFC482364FFDBE07660E /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; 308 | /* End PBXFileReference section */ 309 | 310 | /* Begin PBXFrameworksBuildPhase section */ 311 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 312 | isa = PBXFrameworksBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, 316 | ); 317 | runOnlyForDeploymentPostprocessing = 0; 318 | }; 319 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 320 | isa = PBXFrameworksBuildPhase; 321 | buildActionMask = 2147483647; 322 | files = ( 323 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 324 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 325 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 326 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 327 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 328 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 329 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 330 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 331 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 332 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 333 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 334 | 9862B08F834143DFAF5FA834 /* libRNVectorIcons.a in Frameworks */, 335 | ); 336 | runOnlyForDeploymentPostprocessing = 0; 337 | }; 338 | 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { 339 | isa = PBXFrameworksBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */, 343 | 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, 344 | 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, 345 | 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, 346 | 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, 347 | 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, 348 | 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, 349 | 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, 350 | ); 351 | runOnlyForDeploymentPostprocessing = 0; 352 | }; 353 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { 354 | isa = PBXFrameworksBuildPhase; 355 | buildActionMask = 2147483647; 356 | files = ( 357 | ); 358 | runOnlyForDeploymentPostprocessing = 0; 359 | }; 360 | /* End PBXFrameworksBuildPhase section */ 361 | 362 | /* Begin PBXGroup section */ 363 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 364 | isa = PBXGroup; 365 | children = ( 366 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 367 | ); 368 | name = Products; 369 | sourceTree = ""; 370 | }; 371 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 372 | isa = PBXGroup; 373 | children = ( 374 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 375 | ); 376 | name = Products; 377 | sourceTree = ""; 378 | }; 379 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 380 | isa = PBXGroup; 381 | children = ( 382 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 383 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, 384 | ); 385 | name = Products; 386 | sourceTree = ""; 387 | }; 388 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 389 | isa = PBXGroup; 390 | children = ( 391 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 392 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, 393 | ); 394 | name = Products; 395 | sourceTree = ""; 396 | }; 397 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 398 | isa = PBXGroup; 399 | children = ( 400 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 401 | ); 402 | name = Products; 403 | sourceTree = ""; 404 | }; 405 | 00E356EF1AD99517003FC87E /* hesspressTests */ = { 406 | isa = PBXGroup; 407 | children = ( 408 | 00E356F21AD99517003FC87E /* hesspressTests.m */, 409 | 00E356F01AD99517003FC87E /* Supporting Files */, 410 | ); 411 | path = hesspressTests; 412 | sourceTree = ""; 413 | }; 414 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 415 | isa = PBXGroup; 416 | children = ( 417 | 00E356F11AD99517003FC87E /* Info.plist */, 418 | ); 419 | name = "Supporting Files"; 420 | sourceTree = ""; 421 | }; 422 | 139105B71AF99BAD00B5F7CC /* Products */ = { 423 | isa = PBXGroup; 424 | children = ( 425 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 426 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, 427 | ); 428 | name = Products; 429 | sourceTree = ""; 430 | }; 431 | 139FDEE71B06529A00C62182 /* Products */ = { 432 | isa = PBXGroup; 433 | children = ( 434 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 435 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, 436 | ); 437 | name = Products; 438 | sourceTree = ""; 439 | }; 440 | 13B07FAE1A68108700A75B9A /* hesspress */ = { 441 | isa = PBXGroup; 442 | children = ( 443 | 338889DA1EFEE54B0070FADD /* Assets */, 444 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 445 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 446 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 447 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 448 | 13B07FB61A68108700A75B9A /* Info.plist */, 449 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 450 | 13B07FB71A68108700A75B9A /* main.m */, 451 | ); 452 | name = hesspress; 453 | sourceTree = ""; 454 | }; 455 | 146834001AC3E56700842450 /* Products */ = { 456 | isa = PBXGroup; 457 | children = ( 458 | 146834041AC3E56700842450 /* libReact.a */, 459 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */, 460 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, 461 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, 462 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, 463 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, 464 | 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, 465 | 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, 466 | 333A29751EFDB0C500BA55D4 /* libthird-party.a */, 467 | 333A29771EFDB0C500BA55D4 /* libdouble-conversion.a */, 468 | ); 469 | name = Products; 470 | sourceTree = ""; 471 | }; 472 | 333A29571EFDB0C400BA55D4 /* Products */ = { 473 | isa = PBXGroup; 474 | children = ( 475 | 333A297A1EFDB0C500BA55D4 /* libRNVectorIcons.a */, 476 | ); 477 | name = Products; 478 | sourceTree = ""; 479 | }; 480 | 338889DA1EFEE54B0070FADD /* Assets */ = { 481 | isa = PBXGroup; 482 | children = ( 483 | 338889F71EFEE55F0070FADD /* Al-Jazeera-Arabic-Bold.woff */, 484 | 338889F81EFEE55F0070FADD /* Al-Jazeera-Arabic-Regular.woff */, 485 | ); 486 | name = Assets; 487 | sourceTree = ""; 488 | }; 489 | 5E91572E1DD0AC6500FF2AA8 /* Products */ = { 490 | isa = PBXGroup; 491 | children = ( 492 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, 493 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, 494 | ); 495 | name = Products; 496 | sourceTree = ""; 497 | }; 498 | 6BE10DC15A9E4EF682C35EFB /* Resources */ = { 499 | isa = PBXGroup; 500 | children = ( 501 | 746B5B4632EB46A48720991A /* Entypo.ttf */, 502 | C2678551DBFA4FFEACF961BD /* EvilIcons.ttf */, 503 | 21DB30753FE04116B6F8ECC6 /* FontAwesome.ttf */, 504 | 7C63F860DE834ECCBB8307E5 /* Foundation.ttf */, 505 | 1B9135DB2FFD41148140E39B /* Ionicons.ttf */, 506 | 1F79F8661C6C4CCF8236D179 /* MaterialCommunityIcons.ttf */, 507 | 8EE86CB9044942118D7B97B2 /* MaterialIcons.ttf */, 508 | 841A3421D7DB4E668DCF3F40 /* Octicons.ttf */, 509 | 8BB5DAA5414F4047B8643C6D /* SimpleLineIcons.ttf */, 510 | 8057D52B0CF24A04AF387FB6 /* Zocial.ttf */, 511 | ); 512 | name = Resources; 513 | sourceTree = ""; 514 | }; 515 | 78C398B11ACF4ADC00677621 /* Products */ = { 516 | isa = PBXGroup; 517 | children = ( 518 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 519 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, 520 | ); 521 | name = Products; 522 | sourceTree = ""; 523 | }; 524 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 525 | isa = PBXGroup; 526 | children = ( 527 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 528 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 529 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 530 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 531 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 532 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 533 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 534 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 535 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 536 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 537 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 538 | E13AAFC482364FFDBE07660E /* RNVectorIcons.xcodeproj */, 539 | ); 540 | name = Libraries; 541 | sourceTree = ""; 542 | }; 543 | 832341B11AAA6A8300B99B32 /* Products */ = { 544 | isa = PBXGroup; 545 | children = ( 546 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 547 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, 548 | ); 549 | name = Products; 550 | sourceTree = ""; 551 | }; 552 | 83CBB9F61A601CBA00E9B192 = { 553 | isa = PBXGroup; 554 | children = ( 555 | 13B07FAE1A68108700A75B9A /* hesspress */, 556 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 557 | 00E356EF1AD99517003FC87E /* hesspressTests */, 558 | 83CBBA001A601CBA00E9B192 /* Products */, 559 | 6BE10DC15A9E4EF682C35EFB /* Resources */, 560 | ); 561 | indentWidth = 2; 562 | sourceTree = ""; 563 | tabWidth = 2; 564 | }; 565 | 83CBBA001A601CBA00E9B192 /* Products */ = { 566 | isa = PBXGroup; 567 | children = ( 568 | 13B07F961A680F5B00A75B9A /* hesspress.app */, 569 | 00E356EE1AD99517003FC87E /* hesspressTests.xctest */, 570 | 2D02E47B1E0B4A5D006451C7 /* hesspress-tvOS.app */, 571 | 2D02E4901E0B4A5D006451C7 /* hesspress-tvOSTests.xctest */, 572 | ); 573 | name = Products; 574 | sourceTree = ""; 575 | }; 576 | /* End PBXGroup section */ 577 | 578 | /* Begin PBXNativeTarget section */ 579 | 00E356ED1AD99517003FC87E /* hesspressTests */ = { 580 | isa = PBXNativeTarget; 581 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "hesspressTests" */; 582 | buildPhases = ( 583 | 00E356EA1AD99517003FC87E /* Sources */, 584 | 00E356EB1AD99517003FC87E /* Frameworks */, 585 | 00E356EC1AD99517003FC87E /* Resources */, 586 | ); 587 | buildRules = ( 588 | ); 589 | dependencies = ( 590 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 591 | ); 592 | name = hesspressTests; 593 | productName = hesspressTests; 594 | productReference = 00E356EE1AD99517003FC87E /* hesspressTests.xctest */; 595 | productType = "com.apple.product-type.bundle.unit-test"; 596 | }; 597 | 13B07F861A680F5B00A75B9A /* hesspress */ = { 598 | isa = PBXNativeTarget; 599 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "hesspress" */; 600 | buildPhases = ( 601 | 13B07F871A680F5B00A75B9A /* Sources */, 602 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 603 | 13B07F8E1A680F5B00A75B9A /* Resources */, 604 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 605 | ); 606 | buildRules = ( 607 | ); 608 | dependencies = ( 609 | ); 610 | name = hesspress; 611 | productName = "Hello World"; 612 | productReference = 13B07F961A680F5B00A75B9A /* hesspress.app */; 613 | productType = "com.apple.product-type.application"; 614 | }; 615 | 2D02E47A1E0B4A5D006451C7 /* hesspress-tvOS */ = { 616 | isa = PBXNativeTarget; 617 | buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "hesspress-tvOS" */; 618 | buildPhases = ( 619 | 2D02E4771E0B4A5D006451C7 /* Sources */, 620 | 2D02E4781E0B4A5D006451C7 /* Frameworks */, 621 | 2D02E4791E0B4A5D006451C7 /* Resources */, 622 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, 623 | ); 624 | buildRules = ( 625 | ); 626 | dependencies = ( 627 | ); 628 | name = "hesspress-tvOS"; 629 | productName = "hesspress-tvOS"; 630 | productReference = 2D02E47B1E0B4A5D006451C7 /* hesspress-tvOS.app */; 631 | productType = "com.apple.product-type.application"; 632 | }; 633 | 2D02E48F1E0B4A5D006451C7 /* hesspress-tvOSTests */ = { 634 | isa = PBXNativeTarget; 635 | buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "hesspress-tvOSTests" */; 636 | buildPhases = ( 637 | 2D02E48C1E0B4A5D006451C7 /* Sources */, 638 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */, 639 | 2D02E48E1E0B4A5D006451C7 /* Resources */, 640 | ); 641 | buildRules = ( 642 | ); 643 | dependencies = ( 644 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, 645 | ); 646 | name = "hesspress-tvOSTests"; 647 | productName = "hesspress-tvOSTests"; 648 | productReference = 2D02E4901E0B4A5D006451C7 /* hesspress-tvOSTests.xctest */; 649 | productType = "com.apple.product-type.bundle.unit-test"; 650 | }; 651 | /* End PBXNativeTarget section */ 652 | 653 | /* Begin PBXProject section */ 654 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 655 | isa = PBXProject; 656 | attributes = { 657 | LastUpgradeCheck = 610; 658 | ORGANIZATIONNAME = Facebook; 659 | TargetAttributes = { 660 | 00E356ED1AD99517003FC87E = { 661 | CreatedOnToolsVersion = 6.2; 662 | TestTargetID = 13B07F861A680F5B00A75B9A; 663 | }; 664 | 2D02E47A1E0B4A5D006451C7 = { 665 | CreatedOnToolsVersion = 8.2.1; 666 | ProvisioningStyle = Automatic; 667 | }; 668 | 2D02E48F1E0B4A5D006451C7 = { 669 | CreatedOnToolsVersion = 8.2.1; 670 | ProvisioningStyle = Automatic; 671 | TestTargetID = 2D02E47A1E0B4A5D006451C7; 672 | }; 673 | }; 674 | }; 675 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "hesspress" */; 676 | compatibilityVersion = "Xcode 3.2"; 677 | developmentRegion = English; 678 | hasScannedForEncodings = 0; 679 | knownRegions = ( 680 | en, 681 | Base, 682 | ); 683 | mainGroup = 83CBB9F61A601CBA00E9B192; 684 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 685 | projectDirPath = ""; 686 | projectReferences = ( 687 | { 688 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 689 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 690 | }, 691 | { 692 | ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; 693 | ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 694 | }, 695 | { 696 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 697 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 698 | }, 699 | { 700 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 701 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 702 | }, 703 | { 704 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 705 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 706 | }, 707 | { 708 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 709 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 710 | }, 711 | { 712 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 713 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 714 | }, 715 | { 716 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 717 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 718 | }, 719 | { 720 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 721 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 722 | }, 723 | { 724 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 725 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 726 | }, 727 | { 728 | ProductGroup = 146834001AC3E56700842450 /* Products */; 729 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 730 | }, 731 | { 732 | ProductGroup = 333A29571EFDB0C400BA55D4 /* Products */; 733 | ProjectRef = E13AAFC482364FFDBE07660E /* RNVectorIcons.xcodeproj */; 734 | }, 735 | ); 736 | projectRoot = ""; 737 | targets = ( 738 | 13B07F861A680F5B00A75B9A /* hesspress */, 739 | 00E356ED1AD99517003FC87E /* hesspressTests */, 740 | 2D02E47A1E0B4A5D006451C7 /* hesspress-tvOS */, 741 | 2D02E48F1E0B4A5D006451C7 /* hesspress-tvOSTests */, 742 | ); 743 | }; 744 | /* End PBXProject section */ 745 | 746 | /* Begin PBXReferenceProxy section */ 747 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 748 | isa = PBXReferenceProxy; 749 | fileType = archive.ar; 750 | path = libRCTActionSheet.a; 751 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 752 | sourceTree = BUILT_PRODUCTS_DIR; 753 | }; 754 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 755 | isa = PBXReferenceProxy; 756 | fileType = archive.ar; 757 | path = libRCTGeolocation.a; 758 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 759 | sourceTree = BUILT_PRODUCTS_DIR; 760 | }; 761 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 762 | isa = PBXReferenceProxy; 763 | fileType = archive.ar; 764 | path = libRCTImage.a; 765 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 766 | sourceTree = BUILT_PRODUCTS_DIR; 767 | }; 768 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 769 | isa = PBXReferenceProxy; 770 | fileType = archive.ar; 771 | path = libRCTNetwork.a; 772 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 773 | sourceTree = BUILT_PRODUCTS_DIR; 774 | }; 775 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 776 | isa = PBXReferenceProxy; 777 | fileType = archive.ar; 778 | path = libRCTVibration.a; 779 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 780 | sourceTree = BUILT_PRODUCTS_DIR; 781 | }; 782 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 783 | isa = PBXReferenceProxy; 784 | fileType = archive.ar; 785 | path = libRCTSettings.a; 786 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 787 | sourceTree = BUILT_PRODUCTS_DIR; 788 | }; 789 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 790 | isa = PBXReferenceProxy; 791 | fileType = archive.ar; 792 | path = libRCTWebSocket.a; 793 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 794 | sourceTree = BUILT_PRODUCTS_DIR; 795 | }; 796 | 146834041AC3E56700842450 /* libReact.a */ = { 797 | isa = PBXReferenceProxy; 798 | fileType = archive.ar; 799 | path = libReact.a; 800 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 801 | sourceTree = BUILT_PRODUCTS_DIR; 802 | }; 803 | 333A29751EFDB0C500BA55D4 /* libthird-party.a */ = { 804 | isa = PBXReferenceProxy; 805 | fileType = archive.ar; 806 | path = "libthird-party.a"; 807 | remoteRef = 333A29741EFDB0C500BA55D4 /* PBXContainerItemProxy */; 808 | sourceTree = BUILT_PRODUCTS_DIR; 809 | }; 810 | 333A29771EFDB0C500BA55D4 /* libdouble-conversion.a */ = { 811 | isa = PBXReferenceProxy; 812 | fileType = archive.ar; 813 | path = "libdouble-conversion.a"; 814 | remoteRef = 333A29761EFDB0C500BA55D4 /* PBXContainerItemProxy */; 815 | sourceTree = BUILT_PRODUCTS_DIR; 816 | }; 817 | 333A297A1EFDB0C500BA55D4 /* libRNVectorIcons.a */ = { 818 | isa = PBXReferenceProxy; 819 | fileType = archive.ar; 820 | path = libRNVectorIcons.a; 821 | remoteRef = 333A29791EFDB0C500BA55D4 /* PBXContainerItemProxy */; 822 | sourceTree = BUILT_PRODUCTS_DIR; 823 | }; 824 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { 825 | isa = PBXReferenceProxy; 826 | fileType = archive.ar; 827 | path = "libRCTImage-tvOS.a"; 828 | remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; 829 | sourceTree = BUILT_PRODUCTS_DIR; 830 | }; 831 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { 832 | isa = PBXReferenceProxy; 833 | fileType = archive.ar; 834 | path = "libRCTLinking-tvOS.a"; 835 | remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; 836 | sourceTree = BUILT_PRODUCTS_DIR; 837 | }; 838 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { 839 | isa = PBXReferenceProxy; 840 | fileType = archive.ar; 841 | path = "libRCTNetwork-tvOS.a"; 842 | remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; 843 | sourceTree = BUILT_PRODUCTS_DIR; 844 | }; 845 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { 846 | isa = PBXReferenceProxy; 847 | fileType = archive.ar; 848 | path = "libRCTSettings-tvOS.a"; 849 | remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; 850 | sourceTree = BUILT_PRODUCTS_DIR; 851 | }; 852 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { 853 | isa = PBXReferenceProxy; 854 | fileType = archive.ar; 855 | path = "libRCTText-tvOS.a"; 856 | remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; 857 | sourceTree = BUILT_PRODUCTS_DIR; 858 | }; 859 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { 860 | isa = PBXReferenceProxy; 861 | fileType = archive.ar; 862 | path = "libRCTWebSocket-tvOS.a"; 863 | remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; 864 | sourceTree = BUILT_PRODUCTS_DIR; 865 | }; 866 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { 867 | isa = PBXReferenceProxy; 868 | fileType = archive.ar; 869 | path = libReact.a; 870 | remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; 871 | sourceTree = BUILT_PRODUCTS_DIR; 872 | }; 873 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { 874 | isa = PBXReferenceProxy; 875 | fileType = archive.ar; 876 | path = libyoga.a; 877 | remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; 878 | sourceTree = BUILT_PRODUCTS_DIR; 879 | }; 880 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { 881 | isa = PBXReferenceProxy; 882 | fileType = archive.ar; 883 | path = libyoga.a; 884 | remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; 885 | sourceTree = BUILT_PRODUCTS_DIR; 886 | }; 887 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { 888 | isa = PBXReferenceProxy; 889 | fileType = archive.ar; 890 | path = libcxxreact.a; 891 | remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; 892 | sourceTree = BUILT_PRODUCTS_DIR; 893 | }; 894 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { 895 | isa = PBXReferenceProxy; 896 | fileType = archive.ar; 897 | path = libcxxreact.a; 898 | remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; 899 | sourceTree = BUILT_PRODUCTS_DIR; 900 | }; 901 | 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { 902 | isa = PBXReferenceProxy; 903 | fileType = archive.ar; 904 | path = libjschelpers.a; 905 | remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; 906 | sourceTree = BUILT_PRODUCTS_DIR; 907 | }; 908 | 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { 909 | isa = PBXReferenceProxy; 910 | fileType = archive.ar; 911 | path = libjschelpers.a; 912 | remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; 913 | sourceTree = BUILT_PRODUCTS_DIR; 914 | }; 915 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 916 | isa = PBXReferenceProxy; 917 | fileType = archive.ar; 918 | path = libRCTAnimation.a; 919 | remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 920 | sourceTree = BUILT_PRODUCTS_DIR; 921 | }; 922 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 923 | isa = PBXReferenceProxy; 924 | fileType = archive.ar; 925 | path = libRCTAnimation.a; 926 | remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 927 | sourceTree = BUILT_PRODUCTS_DIR; 928 | }; 929 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 930 | isa = PBXReferenceProxy; 931 | fileType = archive.ar; 932 | path = libRCTLinking.a; 933 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 934 | sourceTree = BUILT_PRODUCTS_DIR; 935 | }; 936 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 937 | isa = PBXReferenceProxy; 938 | fileType = archive.ar; 939 | path = libRCTText.a; 940 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 941 | sourceTree = BUILT_PRODUCTS_DIR; 942 | }; 943 | /* End PBXReferenceProxy section */ 944 | 945 | /* Begin PBXResourcesBuildPhase section */ 946 | 00E356EC1AD99517003FC87E /* Resources */ = { 947 | isa = PBXResourcesBuildPhase; 948 | buildActionMask = 2147483647; 949 | files = ( 950 | 338889FC1EFEE55F0070FADD /* Al-Jazeera-Arabic-Regular.woff in Resources */, 951 | 338889FA1EFEE55F0070FADD /* Al-Jazeera-Arabic-Bold.woff in Resources */, 952 | ); 953 | runOnlyForDeploymentPostprocessing = 0; 954 | }; 955 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 956 | isa = PBXResourcesBuildPhase; 957 | buildActionMask = 2147483647; 958 | files = ( 959 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 960 | 338889F91EFEE55F0070FADD /* Al-Jazeera-Arabic-Bold.woff in Resources */, 961 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 962 | 5E6414BB147E416A87C1DC9F /* Entypo.ttf in Resources */, 963 | 338889FB1EFEE55F0070FADD /* Al-Jazeera-Arabic-Regular.woff in Resources */, 964 | 6D2ECFE194384CF7BAFF25E7 /* EvilIcons.ttf in Resources */, 965 | 02CE59E5FDA347F29B63E80F /* FontAwesome.ttf in Resources */, 966 | F59D66DF19E04F5CA0361627 /* Foundation.ttf in Resources */, 967 | 1B7B8FDED417452AB298F740 /* Ionicons.ttf in Resources */, 968 | F3978EFB59F44CE2ACA7562E /* MaterialCommunityIcons.ttf in Resources */, 969 | 4BA92FE8DB58403FB0263274 /* MaterialIcons.ttf in Resources */, 970 | FE4D9FAABC0A4375A061E1D1 /* Octicons.ttf in Resources */, 971 | CC04BC8A32A141D794AB695A /* SimpleLineIcons.ttf in Resources */, 972 | F61549D66C2D462891080A20 /* Zocial.ttf in Resources */, 973 | ); 974 | runOnlyForDeploymentPostprocessing = 0; 975 | }; 976 | 2D02E4791E0B4A5D006451C7 /* Resources */ = { 977 | isa = PBXResourcesBuildPhase; 978 | buildActionMask = 2147483647; 979 | files = ( 980 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, 981 | ); 982 | runOnlyForDeploymentPostprocessing = 0; 983 | }; 984 | 2D02E48E1E0B4A5D006451C7 /* Resources */ = { 985 | isa = PBXResourcesBuildPhase; 986 | buildActionMask = 2147483647; 987 | files = ( 988 | ); 989 | runOnlyForDeploymentPostprocessing = 0; 990 | }; 991 | /* End PBXResourcesBuildPhase section */ 992 | 993 | /* Begin PBXShellScriptBuildPhase section */ 994 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 995 | isa = PBXShellScriptBuildPhase; 996 | buildActionMask = 2147483647; 997 | files = ( 998 | ); 999 | inputPaths = ( 1000 | ); 1001 | name = "Bundle React Native code and images"; 1002 | outputPaths = ( 1003 | ); 1004 | runOnlyForDeploymentPostprocessing = 0; 1005 | shellPath = /bin/sh; 1006 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 1007 | }; 1008 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { 1009 | isa = PBXShellScriptBuildPhase; 1010 | buildActionMask = 2147483647; 1011 | files = ( 1012 | ); 1013 | inputPaths = ( 1014 | ); 1015 | name = "Bundle React Native Code And Images"; 1016 | outputPaths = ( 1017 | ); 1018 | runOnlyForDeploymentPostprocessing = 0; 1019 | shellPath = /bin/sh; 1020 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 1021 | }; 1022 | /* End PBXShellScriptBuildPhase section */ 1023 | 1024 | /* Begin PBXSourcesBuildPhase section */ 1025 | 00E356EA1AD99517003FC87E /* Sources */ = { 1026 | isa = PBXSourcesBuildPhase; 1027 | buildActionMask = 2147483647; 1028 | files = ( 1029 | 00E356F31AD99517003FC87E /* hesspressTests.m in Sources */, 1030 | ); 1031 | runOnlyForDeploymentPostprocessing = 0; 1032 | }; 1033 | 13B07F871A680F5B00A75B9A /* Sources */ = { 1034 | isa = PBXSourcesBuildPhase; 1035 | buildActionMask = 2147483647; 1036 | files = ( 1037 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 1038 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 1039 | ); 1040 | runOnlyForDeploymentPostprocessing = 0; 1041 | }; 1042 | 2D02E4771E0B4A5D006451C7 /* Sources */ = { 1043 | isa = PBXSourcesBuildPhase; 1044 | buildActionMask = 2147483647; 1045 | files = ( 1046 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, 1047 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, 1048 | ); 1049 | runOnlyForDeploymentPostprocessing = 0; 1050 | }; 1051 | 2D02E48C1E0B4A5D006451C7 /* Sources */ = { 1052 | isa = PBXSourcesBuildPhase; 1053 | buildActionMask = 2147483647; 1054 | files = ( 1055 | 2DCD954D1E0B4F2C00145EB5 /* hesspressTests.m in Sources */, 1056 | ); 1057 | runOnlyForDeploymentPostprocessing = 0; 1058 | }; 1059 | /* End PBXSourcesBuildPhase section */ 1060 | 1061 | /* Begin PBXTargetDependency section */ 1062 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 1063 | isa = PBXTargetDependency; 1064 | target = 13B07F861A680F5B00A75B9A /* hesspress */; 1065 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 1066 | }; 1067 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { 1068 | isa = PBXTargetDependency; 1069 | target = 2D02E47A1E0B4A5D006451C7 /* hesspress-tvOS */; 1070 | targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; 1071 | }; 1072 | /* End PBXTargetDependency section */ 1073 | 1074 | /* Begin PBXVariantGroup section */ 1075 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { 1076 | isa = PBXVariantGroup; 1077 | children = ( 1078 | 13B07FB21A68108700A75B9A /* Base */, 1079 | ); 1080 | name = LaunchScreen.xib; 1081 | path = hesspress; 1082 | sourceTree = ""; 1083 | }; 1084 | /* End PBXVariantGroup section */ 1085 | 1086 | /* Begin XCBuildConfiguration section */ 1087 | 00E356F61AD99517003FC87E /* Debug */ = { 1088 | isa = XCBuildConfiguration; 1089 | buildSettings = { 1090 | BUNDLE_LOADER = "$(TEST_HOST)"; 1091 | GCC_PREPROCESSOR_DEFINITIONS = ( 1092 | "DEBUG=1", 1093 | "$(inherited)", 1094 | ); 1095 | HEADER_SEARCH_PATHS = ( 1096 | "$(inherited)", 1097 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1098 | ); 1099 | INFOPLIST_FILE = hesspressTests/Info.plist; 1100 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1101 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1102 | LIBRARY_SEARCH_PATHS = ( 1103 | "$(inherited)", 1104 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1105 | ); 1106 | OTHER_LDFLAGS = ( 1107 | "-ObjC", 1108 | "-lc++", 1109 | ); 1110 | PRODUCT_NAME = "$(TARGET_NAME)"; 1111 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hesspress.app/hesspress"; 1112 | }; 1113 | name = Debug; 1114 | }; 1115 | 00E356F71AD99517003FC87E /* Release */ = { 1116 | isa = XCBuildConfiguration; 1117 | buildSettings = { 1118 | BUNDLE_LOADER = "$(TEST_HOST)"; 1119 | COPY_PHASE_STRIP = NO; 1120 | HEADER_SEARCH_PATHS = ( 1121 | "$(inherited)", 1122 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1123 | ); 1124 | INFOPLIST_FILE = hesspressTests/Info.plist; 1125 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1126 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1127 | LIBRARY_SEARCH_PATHS = ( 1128 | "$(inherited)", 1129 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1130 | ); 1131 | OTHER_LDFLAGS = ( 1132 | "-ObjC", 1133 | "-lc++", 1134 | ); 1135 | PRODUCT_NAME = "$(TARGET_NAME)"; 1136 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hesspress.app/hesspress"; 1137 | }; 1138 | name = Release; 1139 | }; 1140 | 13B07F941A680F5B00A75B9A /* Debug */ = { 1141 | isa = XCBuildConfiguration; 1142 | buildSettings = { 1143 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1144 | CURRENT_PROJECT_VERSION = 1; 1145 | DEAD_CODE_STRIPPING = NO; 1146 | HEADER_SEARCH_PATHS = ( 1147 | "$(inherited)", 1148 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1149 | ); 1150 | INFOPLIST_FILE = hesspress/Info.plist; 1151 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1152 | OTHER_LDFLAGS = ( 1153 | "$(inherited)", 1154 | "-ObjC", 1155 | "-lc++", 1156 | ); 1157 | PRODUCT_NAME = hesspress; 1158 | VERSIONING_SYSTEM = "apple-generic"; 1159 | }; 1160 | name = Debug; 1161 | }; 1162 | 13B07F951A680F5B00A75B9A /* Release */ = { 1163 | isa = XCBuildConfiguration; 1164 | buildSettings = { 1165 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1166 | CURRENT_PROJECT_VERSION = 1; 1167 | HEADER_SEARCH_PATHS = ( 1168 | "$(inherited)", 1169 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1170 | ); 1171 | INFOPLIST_FILE = hesspress/Info.plist; 1172 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1173 | OTHER_LDFLAGS = ( 1174 | "$(inherited)", 1175 | "-ObjC", 1176 | "-lc++", 1177 | ); 1178 | PRODUCT_NAME = hesspress; 1179 | VERSIONING_SYSTEM = "apple-generic"; 1180 | }; 1181 | name = Release; 1182 | }; 1183 | 2D02E4971E0B4A5E006451C7 /* Debug */ = { 1184 | isa = XCBuildConfiguration; 1185 | buildSettings = { 1186 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 1187 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 1188 | CLANG_ANALYZER_NONNULL = YES; 1189 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1190 | CLANG_WARN_INFINITE_RECURSION = YES; 1191 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1192 | DEBUG_INFORMATION_FORMAT = dwarf; 1193 | ENABLE_TESTABILITY = YES; 1194 | GCC_NO_COMMON_BLOCKS = YES; 1195 | HEADER_SEARCH_PATHS = ( 1196 | "$(inherited)", 1197 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1198 | ); 1199 | INFOPLIST_FILE = "hesspress-tvOS/Info.plist"; 1200 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1201 | LIBRARY_SEARCH_PATHS = ( 1202 | "$(inherited)", 1203 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1204 | ); 1205 | OTHER_LDFLAGS = ( 1206 | "-ObjC", 1207 | "-lc++", 1208 | ); 1209 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.hesspress-tvOS"; 1210 | PRODUCT_NAME = "$(TARGET_NAME)"; 1211 | SDKROOT = appletvos; 1212 | TARGETED_DEVICE_FAMILY = 3; 1213 | TVOS_DEPLOYMENT_TARGET = 9.2; 1214 | }; 1215 | name = Debug; 1216 | }; 1217 | 2D02E4981E0B4A5E006451C7 /* Release */ = { 1218 | isa = XCBuildConfiguration; 1219 | buildSettings = { 1220 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 1221 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 1222 | CLANG_ANALYZER_NONNULL = YES; 1223 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1224 | CLANG_WARN_INFINITE_RECURSION = YES; 1225 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1226 | COPY_PHASE_STRIP = NO; 1227 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1228 | GCC_NO_COMMON_BLOCKS = YES; 1229 | HEADER_SEARCH_PATHS = ( 1230 | "$(inherited)", 1231 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1232 | ); 1233 | INFOPLIST_FILE = "hesspress-tvOS/Info.plist"; 1234 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1235 | LIBRARY_SEARCH_PATHS = ( 1236 | "$(inherited)", 1237 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1238 | ); 1239 | OTHER_LDFLAGS = ( 1240 | "-ObjC", 1241 | "-lc++", 1242 | ); 1243 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.hesspress-tvOS"; 1244 | PRODUCT_NAME = "$(TARGET_NAME)"; 1245 | SDKROOT = appletvos; 1246 | TARGETED_DEVICE_FAMILY = 3; 1247 | TVOS_DEPLOYMENT_TARGET = 9.2; 1248 | }; 1249 | name = Release; 1250 | }; 1251 | 2D02E4991E0B4A5E006451C7 /* Debug */ = { 1252 | isa = XCBuildConfiguration; 1253 | buildSettings = { 1254 | BUNDLE_LOADER = "$(TEST_HOST)"; 1255 | CLANG_ANALYZER_NONNULL = YES; 1256 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1257 | CLANG_WARN_INFINITE_RECURSION = YES; 1258 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1259 | DEBUG_INFORMATION_FORMAT = dwarf; 1260 | ENABLE_TESTABILITY = YES; 1261 | GCC_NO_COMMON_BLOCKS = YES; 1262 | INFOPLIST_FILE = "hesspress-tvOSTests/Info.plist"; 1263 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1264 | LIBRARY_SEARCH_PATHS = ( 1265 | "$(inherited)", 1266 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1267 | ); 1268 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.hesspress-tvOSTests"; 1269 | PRODUCT_NAME = "$(TARGET_NAME)"; 1270 | SDKROOT = appletvos; 1271 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hesspress-tvOS.app/hesspress-tvOS"; 1272 | TVOS_DEPLOYMENT_TARGET = 10.1; 1273 | }; 1274 | name = Debug; 1275 | }; 1276 | 2D02E49A1E0B4A5E006451C7 /* Release */ = { 1277 | isa = XCBuildConfiguration; 1278 | buildSettings = { 1279 | BUNDLE_LOADER = "$(TEST_HOST)"; 1280 | CLANG_ANALYZER_NONNULL = YES; 1281 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1282 | CLANG_WARN_INFINITE_RECURSION = YES; 1283 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1284 | COPY_PHASE_STRIP = NO; 1285 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1286 | GCC_NO_COMMON_BLOCKS = YES; 1287 | INFOPLIST_FILE = "hesspress-tvOSTests/Info.plist"; 1288 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1289 | LIBRARY_SEARCH_PATHS = ( 1290 | "$(inherited)", 1291 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1292 | ); 1293 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.hesspress-tvOSTests"; 1294 | PRODUCT_NAME = "$(TARGET_NAME)"; 1295 | SDKROOT = appletvos; 1296 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hesspress-tvOS.app/hesspress-tvOS"; 1297 | TVOS_DEPLOYMENT_TARGET = 10.1; 1298 | }; 1299 | name = Release; 1300 | }; 1301 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 1302 | isa = XCBuildConfiguration; 1303 | buildSettings = { 1304 | ALWAYS_SEARCH_USER_PATHS = NO; 1305 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1306 | CLANG_CXX_LIBRARY = "libc++"; 1307 | CLANG_ENABLE_MODULES = YES; 1308 | CLANG_ENABLE_OBJC_ARC = YES; 1309 | CLANG_WARN_BOOL_CONVERSION = YES; 1310 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1311 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1312 | CLANG_WARN_EMPTY_BODY = YES; 1313 | CLANG_WARN_ENUM_CONVERSION = YES; 1314 | CLANG_WARN_INT_CONVERSION = YES; 1315 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1316 | CLANG_WARN_UNREACHABLE_CODE = YES; 1317 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1318 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1319 | COPY_PHASE_STRIP = NO; 1320 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1321 | GCC_C_LANGUAGE_STANDARD = gnu99; 1322 | GCC_DYNAMIC_NO_PIC = NO; 1323 | GCC_OPTIMIZATION_LEVEL = 0; 1324 | GCC_PREPROCESSOR_DEFINITIONS = ( 1325 | "DEBUG=1", 1326 | "$(inherited)", 1327 | ); 1328 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 1329 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1330 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1331 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1332 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1333 | GCC_WARN_UNUSED_FUNCTION = YES; 1334 | GCC_WARN_UNUSED_VARIABLE = YES; 1335 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1336 | MTL_ENABLE_DEBUG_INFO = YES; 1337 | ONLY_ACTIVE_ARCH = YES; 1338 | SDKROOT = iphoneos; 1339 | }; 1340 | name = Debug; 1341 | }; 1342 | 83CBBA211A601CBA00E9B192 /* Release */ = { 1343 | isa = XCBuildConfiguration; 1344 | buildSettings = { 1345 | ALWAYS_SEARCH_USER_PATHS = NO; 1346 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1347 | CLANG_CXX_LIBRARY = "libc++"; 1348 | CLANG_ENABLE_MODULES = YES; 1349 | CLANG_ENABLE_OBJC_ARC = YES; 1350 | CLANG_WARN_BOOL_CONVERSION = YES; 1351 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1352 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1353 | CLANG_WARN_EMPTY_BODY = YES; 1354 | CLANG_WARN_ENUM_CONVERSION = YES; 1355 | CLANG_WARN_INT_CONVERSION = YES; 1356 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1357 | CLANG_WARN_UNREACHABLE_CODE = YES; 1358 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1359 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1360 | COPY_PHASE_STRIP = YES; 1361 | ENABLE_NS_ASSERTIONS = NO; 1362 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1363 | GCC_C_LANGUAGE_STANDARD = gnu99; 1364 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1365 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1366 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1367 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1368 | GCC_WARN_UNUSED_FUNCTION = YES; 1369 | GCC_WARN_UNUSED_VARIABLE = YES; 1370 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1371 | MTL_ENABLE_DEBUG_INFO = NO; 1372 | SDKROOT = iphoneos; 1373 | VALIDATE_PRODUCT = YES; 1374 | }; 1375 | name = Release; 1376 | }; 1377 | /* End XCBuildConfiguration section */ 1378 | 1379 | /* Begin XCConfigurationList section */ 1380 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "hesspressTests" */ = { 1381 | isa = XCConfigurationList; 1382 | buildConfigurations = ( 1383 | 00E356F61AD99517003FC87E /* Debug */, 1384 | 00E356F71AD99517003FC87E /* Release */, 1385 | ); 1386 | defaultConfigurationIsVisible = 0; 1387 | defaultConfigurationName = Release; 1388 | }; 1389 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "hesspress" */ = { 1390 | isa = XCConfigurationList; 1391 | buildConfigurations = ( 1392 | 13B07F941A680F5B00A75B9A /* Debug */, 1393 | 13B07F951A680F5B00A75B9A /* Release */, 1394 | ); 1395 | defaultConfigurationIsVisible = 0; 1396 | defaultConfigurationName = Release; 1397 | }; 1398 | 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "hesspress-tvOS" */ = { 1399 | isa = XCConfigurationList; 1400 | buildConfigurations = ( 1401 | 2D02E4971E0B4A5E006451C7 /* Debug */, 1402 | 2D02E4981E0B4A5E006451C7 /* Release */, 1403 | ); 1404 | defaultConfigurationIsVisible = 0; 1405 | defaultConfigurationName = Release; 1406 | }; 1407 | 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "hesspress-tvOSTests" */ = { 1408 | isa = XCConfigurationList; 1409 | buildConfigurations = ( 1410 | 2D02E4991E0B4A5E006451C7 /* Debug */, 1411 | 2D02E49A1E0B4A5E006451C7 /* Release */, 1412 | ); 1413 | defaultConfigurationIsVisible = 0; 1414 | defaultConfigurationName = Release; 1415 | }; 1416 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "hesspress" */ = { 1417 | isa = XCConfigurationList; 1418 | buildConfigurations = ( 1419 | 83CBBA201A601CBA00E9B192 /* Debug */, 1420 | 83CBBA211A601CBA00E9B192 /* Release */, 1421 | ); 1422 | defaultConfigurationIsVisible = 0; 1423 | defaultConfigurationName = Release; 1424 | }; 1425 | /* End XCConfigurationList section */ 1426 | }; 1427 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 1428 | } 1429 | --------------------------------------------------------------------------------