delete extra files

This commit is contained in:
Ninjas Code - 4 2023-03-31 09:21:09 +05:00
parent 244f669f95
commit 4512a7a878
42 changed files with 5 additions and 43711 deletions

2
.gitignore vendored
View File

@ -1,2 +0,0 @@
CustomerApp/node_modules
RiderApp/node_modules

View File

@ -1 +0,0 @@
/node_modules

View File

@ -1 +0,0 @@
legacy-peer-deps=true

View File

@ -1,151 +0,0 @@
import { ApolloProvider } from '@apollo/react-hooks'
import * as Font from 'expo-font'
import * as Location from 'expo-location'
import * as Notifications from 'expo-notifications'
import * as SplashScreen from 'expo-splash-screen'
import React, { useEffect, useState } from 'react'
import {
ActivityIndicator,
BackHandler,
Platform,
StatusBar,
StyleSheet,
useColorScheme,
View
} from 'react-native'
import FlashMessage from 'react-native-flash-message'
import i18n from './i18n'
import setupApolloClient from './src/apollo/index'
import { ConfigurationProvider } from './src/context/Configuration'
import { UserProvider } from './src/context/User'
import AppContainer from './src/routes'
import { AnimatedSplash } from './src/screens'
import { COLORS, THEME } from './src/Theme'
import { exitAlert } from './src/utils/androidBackButton'
import { requestTrackingPermissions } from './src/utils/useAppTrackingTransparency'
SplashScreen.preventAutoHideAsync().catch(() => {})
export default function App() {
const colorScheme = useColorScheme()
const isDark = colorScheme === 'dark'
const [fontLoaded, setFontLoaded] = useState(false)
const [client, setupClient] = useState(null)
useEffect(() => {
requestTrackingPermissions()
}, [])
useEffect(() => {
loadAppData()
return () => {
BackHandler.removeEventListener('hardwareBackPress', exitAlert)
}
}, [])
async function loadAppData() {
const client = await setupApolloClient()
setupClient(client)
await i18n.initAsync()
// load fonts
await Font.loadAsync({
Poppin300: require('./src/assets/font/Poppin/Poppins-Light.ttf'),
Poppin400: require('./src/assets/font/Poppin/Poppins-Regular.ttf'),
Poppin500: require('./src/assets/font/Poppin/Poppins-Medium.ttf'),
Poppin600: require('./src/assets/font/Poppin/Poppins-SemiBold.ttf'),
Poppin700: require('./src/assets/font/Poppin/Poppins-Bold.ttf'),
icomoon: require('./src/assets/font/icomoon.ttf')
})
await permissionForLocationAsync()
await permissionForPushNotificationsAsync()
BackHandler.addEventListener('hardwareBackPress', exitAlert)
setFontLoaded(true)
}
async function permissionForPushNotificationsAsync() {
const { status: existingStatus } = await Notifications.getPermissionsAsync()
let finalStatus = existingStatus
// only ask if permissions have not already been determined, because
// iOS won't necessarily prompt the user a second time.
if (existingStatus !== 'granted') {
// Android remote notification permissions are granted during the app
// install, so this will only ask on iOS
const { status } = await Notifications.requestPermissionsAsync()
finalStatus = status
}
// Stop here if the user did not grant permissions
if (finalStatus !== 'granted') {
return
}
if (Platform.OS === 'android') {
Notifications.setNotificationChannelAsync('default', {
name: 'default',
sound: true,
priority: 'max',
importance: Notifications.AndroidImportance.HIGH,
vibrate: [0, 250, 250, 250],
lightColor: COLORS.primary
})
}
}
async function permissionForLocationAsync() {
const { status: existingStatus } =
await Location.getForegroundPermissionsAsync()
// only ask if permissions have not already been determined, because
// iOS won't necessarily prompt the user a second time.
if (existingStatus !== 'granted') {
// Android location permissions are granted during the app
// install, so this will only ask on iOS
const { status } = await Location.requestForegroundPermissionsAsync()
// eslint-disable-next-line no-undef
finalStatus = status
}
}
if (fontLoaded && client) {
return (
<ApolloProvider client={client}>
<StatusBar
translucent
backgroundColor={'transparent'}
barStyle={isDark ? 'light-content' : 'dark-content'}
/>
<ConfigurationProvider>
<UserProvider>
<AnimatedSplash image={require('./assets/splash.png')}>
<AppContainer />
</AnimatedSplash>
</UserProvider>
</ConfigurationProvider>
<FlashMessage duration={2000} position="center" />
</ApolloProvider>
)
} else {
return (
<View style={[styles.flex, styles.mainContainer]}>
<ActivityIndicator
size="large"
color={
isDark
? THEME.Dark.colors.spinnerColor
: THEME.Light.colors.spinnerColor
}
/>
</View>
)
}
}
const styles = StyleSheet.create({
flex: {
flex: 1
},
mainContainer: {
justifyContent: 'center',
alignItems: 'center'
}
})

View File

@ -1,83 +0,0 @@
{
"expo": {
"name": "Enatega",
"version": "1.0.16",
"scheme": "enategasinglevendor",
"description": "Enatega is a starter kit food ordering app built in React Native using Expo for IOS and Android. It's made keeping good aesthetics in mind as well keeping the best coding practices in mind. Its fully customisable to easily help you in your next food delivery project. https://market.nativebase.io/view/react-native-food-delivery-backend-app",
"slug": "enategasinglevendor",
"privacy": "public",
"androidStatusBar": {
"backgroundColor": "#000"
},
"platforms": [
"ios",
"android"
],
"orientation": "portrait",
"icon": "./assets/icon.png",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "cover",
"backgroundColor": "#febb2c"
},
"updates": {
"fallbackToCacheTimeout": 0
},
"assetBundlePatterns": [
"**/*"
],
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.enatega.vendor",
"config": {
"googleMapsApiKey": ""
},
"usesAppleSignIn": true,
"infoPlist": {
"NSLocationWhenInUseUsageDescription": "This app uses the location to determine the delivery address for your orders.",
"NSUserTrackingUsageDescription": "Allow this app to collect app-related data that can be used for tracking you or your device."
}
},
"notification": {
"iosDisplayInForeground": true,
"color": "#d83765",
"icon": "./assets/not-icon.png",
"androidMode": "default",
"androidCollapsedTitle": "Enatega"
},
"android": {
"versionCode": 22,
"package": "com.enatega.vendor",
"googleServicesFile": "./google-services-prod.json",
"config": {
"googleMaps": {
"apiKey": ""
}
},
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#febb2c"
},
"permissions": [
"ACCESS_FINE_LOCATION",
"ACCESS_COARSE_LOCATION"
]
},
"plugins": [
[
"expo-tracking-transparency",
{
"userTrackingPermission": "Allow this app to collect app-related data that can be used for tracking you or your device."
}
]
],
"facebookScheme": "fb3017447961609878",
"facebookAppId": "3017447961609878",
"facebookDisplayName": "Food delivery",
"extra": {
"eas": {
"projectId": "0b51ea6b-d9fd-48e2-9480-54149ca73a7a"
}
}
}
}

View File

@ -1,10 +0,0 @@
module.exports = function (api) {
api.cache(true);
return {
presets: ["babel-preset-expo"],
plugins: [
"react-native-reanimated/plugin",
"@babel/plugin-syntax-dynamic-import",
],
};
};

View File

@ -1,36 +0,0 @@
{
"cli": {
"version": ">= 3.8.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"android": {
"buildType": "apk"
},
"ios": {
"resourceClass": "m-medium"
}
},
"preview": {
"distribution": "internal",
"ios": {
"resourceClass": "m-medium"
}
},
"production": {
"developmentClient": false,
"releaseChannel": "production",
"android": {
"buildType": "apk"
},
"ios": {
"resourceClass": "m-medium"
}
}
},
"submit": {
"production": {}
}
}

View File

@ -1,65 +0,0 @@
/*****************************
* environment.js
* path: '/environment.js' (root of your project)
******************************/
import Constants from "expo-constants";
const ENV = {
development: {
GRAPHQL_URL: "http://10.97.28.88.90:8000/graphql",
WS_GRAPHQL_URL: "ws://10.97.28.88.90:8000/graphql",
SERVER_URL: "http://10.97.28.88.90:8000/", // put / at the end of server url
IOS_CLIENT_ID_GOOGLE: "",
ANDROID_CLIENT_ID_GOOGLE: "",
FACEBOOK_APP_ID: "404956210315749",
AMPLITUDE_API_KEY: "",
STRIPE_PUBLIC_KEY: "",
STRIPE_IMAGE_URL: "http://10.97.28.88.90:8000/assets/images/logo.png",
STRIPE_STORE_NAME: "Enatega",
},
staging: {
GRAPHQL_URL: "https://staging-enatega-single-api.herokuapp.com/graphql",
WS_GRAPHQL_URL: "wss://staging-enatega-single-api.herokuapp.com/graphql",
SERVER_URL: "https://staging-enatega-single-api.herokuapp.com/", // put / at the end of server url
IOS_CLIENT_ID_GOOGLE: "",
ANDROID_CLIENT_ID_GOOGLE: "",
FACEBOOK_APP_ID: "404956210315749",
AMPLITUDE_API_KEY: "",
STRIPE_PUBLIC_KEY: "",
STRIPE_IMAGE_URL:
"https://staging-enatega-single-api.herokuapp.com/assets/images/logo.png",
STRIPE_STORE_NAME: "Enatega",
},
production: {
GRAPHQL_URL: "https://prod-enatega-single-api.herokuapp.com/graphql",
WS_GRAPHQL_URL: "wss://prod-enatega-single-api.herokuapp.com/graphql",
SERVER_URL: "https://prod-enatega-single-api.herokuapp.com/", // put / at the end of server url
IOS_CLIENT_ID_GOOGLE: "",
ANDROID_CLIENT_ID_GOOGLE: "",
FACEBOOK_APP_ID: "3017447961609878",
AMPLITUDE_API_KEY: "",
STRIPE_PUBLIC_KEY: "",
STRIPE_IMAGE_URL:
"https://prod-enatega-single-api.herokuapp.com/assets/images/logo.png",
STRIPE_STORE_NAME: "Enatega",
},
};
const getEnvVars = (env = Constants.manifest.releaseChannel) => {
// What is __DEV__ ?
// This variable is set to true when react-native is running in Dev mode.
// __DEV__ is true when run locally, but false when published.
// eslint-disable-next-line no-undef
if (__DEV__) {
return ENV.development;
} else if (env === "production") {
return ENV.production;
} else if (env === "staging") {
return ENV.staging;
} else {
return ENV.production;
}
};
export default getEnvVars;

View File

@ -1,8 +0,0 @@
import { registerRootComponent } from 'expo';
import App from './App';
// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
// It also ensures that whether you load the app in Expo Go or in a native build,
// the environment is set up appropriately
registerRootComponent(App);

View File

@ -1,4 +0,0 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require('expo/metro-config');
module.exports = getDefaultConfig(__dirname);

File diff suppressed because it is too large Load Diff

View File

@ -1,124 +0,0 @@
{
"name": "enatega-full-app",
"version": "5.0.0",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"eject": "expo eject",
"test": "jest",
"format": "prettier --write '**/*.js'",
"lint:fix": "eslint . --ext .js --fix",
"postinstall": "patch-package"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.js": [
"npm run format",
"npm run lint:fix"
]
},
"dependencies": {
"@amplitude/analytics-react-native": "^1.1.1",
"@apollo/react-hooks": "^3.1.3",
"@expo/vector-icons": "^13.0.0",
"@ptomasroos/react-native-multi-slider": "^2.2.2",
"@react-native-async-storage/async-storage": "~1.17.3",
"@react-native-community/masked-view": "0.1.11",
"@react-navigation/drawer": "^6.6.0",
"@react-navigation/native": "^6.1.4",
"@react-navigation/native-stack": "^6.9.10",
"@react-navigation/stack": "^6.3.14",
"apollo-boost": "^0.4.9",
"apollo-cache-inmemory": "^1.5.1",
"apollo-cache-persist": "^0.1.1",
"apollo-client": "^2.5.1",
"apollo-link-context": "^1.0.17",
"apollo-link-http": "^1.5.14",
"apollo-link-state": "^0.4.2",
"apollo-link-ws": "^1.0.20",
"apollo-upload-client": "^10.0.0",
"apollo-utilities": "^1.3.4",
"deprecated-react-native-prop-types": "^4.0.0",
"expo": "~47.0.12",
"expo-app-auth": "~11.1.0",
"expo-app-loading": "~2.1.1",
"expo-apple-authentication": "~5.0.1",
"expo-application": "~5.0.1",
"expo-asset": "~8.7.0",
"expo-auth-session": "~3.8.0",
"expo-camera": "~13.1.0",
"expo-constants": "~14.0.2",
"expo-contacts": "~11.0.1",
"expo-device": "~5.0.0",
"expo-font": "~11.0.1",
"expo-google-app-auth": "^8.3.0",
"expo-image-picker": "~14.0.2",
"expo-linking": "~3.3.1",
"expo-localization": "~14.0.0",
"expo-location": "~15.0.1",
"expo-notifications": "~0.17.0",
"expo-random": "~13.0.0",
"expo-sensors": "~12.0.1",
"expo-splash-screen": "~0.17.5",
"expo-status-bar": "~1.4.2",
"expo-tracking-transparency": "~3.0.1",
"expo-updates": "~0.15.6",
"graphql": "^16.6.0",
"graphql-tag": "^2.10.1",
"i18n-js": "^3.2.2",
"lodash": "^4.17.21",
"patch-package": "^6.5.1",
"react": "18.1.0",
"react-apollo": "^3.1.5",
"react-native": "0.70.5",
"react-native-button": "^3.0.1",
"react-native-flash-message": "^0.4.0",
"react-native-flatlist-slider": "^1.0.5",
"react-native-gesture-handler": "~2.8.0",
"react-native-gifted-chat": "^1.1.1",
"react-native-maps": "1.3.2",
"react-native-material-textfield": "^0.16.1",
"react-native-modal": "^13.0.1",
"react-native-modalize": "^2.0.8",
"react-native-reanimated": "~2.12.0",
"react-native-safe-area-context": "4.4.1",
"react-native-screens": "~3.18.0",
"react-native-star-rating": "^1.1.0",
"react-native-svg": "13.4.0",
"react-native-timeline-flatlist": "^0.8.0",
"react-native-webview": "11.23.1",
"subscriptions-transport-ws": "^0.11.0",
"uuid": "^3.3.2",
"validate.js": "^0.13.1"
},
"devDependencies": {
"@babel/core": "^7.12.9",
"babel-jest": "^29.4.3",
"babel-preset-expo": "~9.2.1",
"babel-preset-react-native": "^4.0.1",
"eslint": "^8.34.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-react": "^7.20.0",
"eslint-plugin-standard": "^5.0.0",
"husky": "^8.0.3",
"jest": "^29.4.3",
"jest-react-native": "^18.0.0",
"lint-staged": "^13.1.2",
"metro-react-native-babel-preset": "^0.75.0",
"prettier": "^2.3.1",
"prettier-config-standard": "^5.0.0",
"react-test-renderer": "^18.2.0"
},
"jest": {
"preset": "react-native"
},
"private": true
}

View File

@ -1,38 +0,0 @@
diff --git a/node_modules/react-native-button/Button.js b/node_modules/react-native-button/Button.js
index b248176..3c6aefa 100644
--- a/node_modules/react-native-button/Button.js
+++ b/node_modules/react-native-button/Button.js
@@ -1,4 +1,5 @@
import PropTypes from 'prop-types';
+import {TextPropTypes,ViewPropTypes} from 'deprecated-react-native-prop-types'
import React, { Component } from 'react';
import {
Platform,
@@ -7,7 +8,7 @@ import {
TouchableOpacity,
TouchableNativeFeedback,
View,
- ViewPropTypes
+ //ViewPropTypes
} from 'react-native';
import coalesceNonElementChildren from './coalesceNonElementChildren';
@@ -18,12 +19,15 @@ export default class Button extends Component {
static propTypes = {
...TouchableOpacity.propTypes,
accessibilityLabel: PropTypes.string,
- allowFontScaling: Text.propTypes.allowFontScaling,
+ // allowFontScaling: Text.propTypes.allowFontScaling,
+ allowFontScaling: TextPropTypes.allowFontScaling,
containerStyle: ViewPropTypes.style,
disabledContainerStyle: ViewPropTypes.style,
disabled: PropTypes.bool,
- style: Text.propTypes.style,
- styleDisabled: Text.propTypes.style,
+ style: TextPropTypes.style,
+ styleDisabled: TextPropTypes.style,
+ // style: Text.propTypes.style,
+ // styleDisabled: Text.propTypes.style,
childGroupStyle: ViewPropTypes.style,
androidBackground: PropTypes.object,
};

View File

@ -1,405 +0,0 @@
diff --git a/node_modules/react-native-material-textfield/src/components/affix/index.js b/node_modules/react-native-material-textfield/src/components/affix/index.js
index 0f85022..e467adb 100644
--- a/node_modules/react-native-material-textfield/src/components/affix/index.js
+++ b/node_modules/react-native-material-textfield/src/components/affix/index.js
@@ -9,26 +9,26 @@ export default class Affix extends PureComponent {
numberOfLines: 1,
};
- static propTypes = {
- numberOfLines: PropTypes.number,
- style: Animated.Text.propTypes.style,
+ // static propTypes = {
+ // numberOfLines: PropTypes.number,
+ // style: PropTypes.object,
- color: PropTypes.string.isRequired,
- fontSize: PropTypes.number.isRequired,
+ // color: PropTypes.string.isRequired,
+ // fontSize: PropTypes.number.isRequired,
- type: PropTypes
- .oneOf(['prefix', 'suffix'])
- .isRequired,
+ // type: PropTypes
+ // .oneOf(['prefix', 'suffix'])
+ // .isRequired,
- labelAnimation: PropTypes
- .instanceOf(Animated.Value)
- .isRequired,
+ // labelAnimation: PropTypes
+ // .instanceOf(Animated.Value)
+ // .isRequired,
- children: PropTypes.oneOfType([
- PropTypes.arrayOf(PropTypes.node),
- PropTypes.node,
- ]),
- };
+ // children: PropTypes.oneOfType([
+ // PropTypes.arrayOf(PropTypes.node),
+ // PropTypes.node,
+ // ]),
+ // };
render() {
let { labelAnimation, style, children, type, fontSize, color } = this.props;
diff --git a/node_modules/react-native-material-textfield/src/components/counter/index.js b/node_modules/react-native-material-textfield/src/components/counter/index.js
index 35d3264..089b871 100644
--- a/node_modules/react-native-material-textfield/src/components/counter/index.js
+++ b/node_modules/react-native-material-textfield/src/components/counter/index.js
@@ -5,15 +5,15 @@ import { Text } from 'react-native';
import styles from './styles';
export default class Counter extends PureComponent {
- static propTypes = {
- count: PropTypes.number.isRequired,
- limit: PropTypes.number,
+ // static propTypes = {
+ // count: PropTypes.number.isRequired,
+ // limit: PropTypes.number,
- baseColor: PropTypes.string.isRequired,
- errorColor: PropTypes.string.isRequired,
+ // baseColor: PropTypes.string.isRequired,
+ // errorColor: PropTypes.string.isRequired,
- style: Text.propTypes.style,
- };
+ // style: PropTypes.object,
+ // };
render() {
let { count, limit, baseColor, errorColor, style } = this.props;
diff --git a/node_modules/react-native-material-textfield/src/components/field/index.js b/node_modules/react-native-material-textfield/src/components/field/index.js
index 494bbaa..2a71c82 100644
--- a/node_modules/react-native-material-textfield/src/components/field/index.js
+++ b/node_modules/react-native-material-textfield/src/components/field/index.js
@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { PureComponent } from 'react';
+import {ViewPropTypes} from 'deprecated-react-native-prop-types';
import {
View,
Text,
@@ -7,7 +8,7 @@ import {
Animated,
StyleSheet,
Platform,
- ViewPropTypes,
+ //ViewPropTypes,
} from 'react-native';
import Line from '../line';
@@ -65,60 +66,60 @@ export default class TextField extends PureComponent {
disabled: false,
};
- static propTypes = {
- ...TextInput.propTypes,
+ // static propTypes = {
+ // ...TextInput.propTypes,
- animationDuration: PropTypes.number,
+ // animationDuration: PropTypes.number,
- fontSize: PropTypes.number,
- labelFontSize: PropTypes.number,
+ // fontSize: PropTypes.number,
+ // labelFontSize: PropTypes.number,
- contentInset: PropTypes.shape({
- top: PropTypes.number,
- label: PropTypes.number,
- input: PropTypes.number,
- left: PropTypes.number,
- right: PropTypes.number,
- }),
+ // contentInset: PropTypes.shape({
+ // top: PropTypes.number,
+ // label: PropTypes.number,
+ // input: PropTypes.number,
+ // left: PropTypes.number,
+ // right: PropTypes.number,
+ // }),
- labelOffset: Label.propTypes.offset,
+ // labelOffset: Label.propTypes.offset,
- labelTextStyle: Text.propTypes.style,
- titleTextStyle: Text.propTypes.style,
- affixTextStyle: Text.propTypes.style,
+ // labelTextStyle: PropTypes.object.style,
+ // // titleTextStyle: PropTypes.object.style,
+ // // affixTextStyle: PropTypes.object.style,
- tintColor: PropTypes.string,
- textColor: PropTypes.string,
- baseColor: PropTypes.string,
+ // tintColor: PropTypes.string,
+ // textColor: PropTypes.string,
+ // baseColor: PropTypes.string,
- label: PropTypes.string,
- title: PropTypes.string,
+ // label: PropTypes.string,
+ // title: PropTypes.string,
- characterRestriction: PropTypes.number,
+ // characterRestriction: PropTypes.number,
- error: PropTypes.string,
- errorColor: PropTypes.string,
+ // error: PropTypes.string,
+ // errorColor: PropTypes.string,
- lineWidth: PropTypes.number,
- activeLineWidth: PropTypes.number,
- disabledLineWidth: PropTypes.number,
+ // lineWidth: PropTypes.number,
+ // activeLineWidth: PropTypes.number,
+ // disabledLineWidth: PropTypes.number,
- lineType: Line.propTypes.lineType,
- disabledLineType: Line.propTypes.lineType,
+ // lineType: Line.propTypes.lineType,
+ // disabledLineType: Line.propTypes.lineType,
- disabled: PropTypes.bool,
+ // disabled: PropTypes.bool,
- formatText: PropTypes.func,
+ // formatText: PropTypes.func,
- renderLeftAccessory: PropTypes.func,
- renderRightAccessory: PropTypes.func,
+ // renderLeftAccessory: PropTypes.func,
+ // renderRightAccessory: PropTypes.func,
- prefix: PropTypes.string,
- suffix: PropTypes.string,
+ // prefix: PropTypes.string,
+ // suffix: PropTypes.string,
- containerStyle: (ViewPropTypes || View.propTypes).style,
- inputContainerStyle: (ViewPropTypes || View.propTypes).style,
- };
+ // containerStyle: (ViewPropTypes || View.propTypes).style,
+ // inputContainerStyle: (ViewPropTypes || View.propTypes).style,
+ // };
static inputContainerStyle = styles.inputContainer;
@@ -221,6 +222,7 @@ export default class TextField extends PureComponent {
let options = {
toValue: this.focusState(),
+ useNativeDriver: false,
duration,
};
diff --git a/node_modules/react-native-material-textfield/src/components/helper/index.js b/node_modules/react-native-material-textfield/src/components/helper/index.js
index 6060f9f..86ac2c0 100644
--- a/node_modules/react-native-material-textfield/src/components/helper/index.js
+++ b/node_modules/react-native-material-textfield/src/components/helper/index.js
@@ -1,23 +1,24 @@
import PropTypes from 'prop-types';
+
import React, { PureComponent } from 'react';
import { Animated } from 'react-native';
import styles from './styles';
export default class Helper extends PureComponent {
- static propTypes = {
- title: PropTypes.string,
- error: PropTypes.string,
+ // static propTypes = {
+ // title: PropTypes.string,
+ // error: PropTypes.string,
- disabled: PropTypes.bool,
+ // disabled: PropTypes.bool,
- style: Animated.Text.propTypes.style,
+ // style: PropTypes.object,
- baseColor: PropTypes.string,
- errorColor: PropTypes.string,
+ // baseColor: PropTypes.string,
+ // errorColor: PropTypes.string,
- focusAnimation: PropTypes.instanceOf(Animated.Value),
- };
+ // focusAnimation: PropTypes.instanceOf(Animated.Value),
+ // };
constructor(props) {
super(props);
diff --git a/node_modules/react-native-material-textfield/src/components/label/index.js b/node_modules/react-native-material-textfield/src/components/label/index.js
index 82eaf03..1ad9a93 100644
--- a/node_modules/react-native-material-textfield/src/components/label/index.js
+++ b/node_modules/react-native-material-textfield/src/components/label/index.js
@@ -11,41 +11,41 @@ export default class Label extends PureComponent {
restricted: false,
};
- static propTypes = {
- numberOfLines: PropTypes.number,
+ // static propTypes = {
+ // numberOfLines: PropTypes.number,
- disabled: PropTypes.bool,
- restricted: PropTypes.bool,
+ // disabled: PropTypes.bool,
+ // restricted: PropTypes.bool,
- fontSize: PropTypes.number.isRequired,
- activeFontSize: PropTypes.number.isRequired,
+ // fontSize: PropTypes.number.isRequired,
+ // activeFontSize: PropTypes.number.isRequired,
- baseColor: PropTypes.string.isRequired,
- tintColor: PropTypes.string.isRequired,
- errorColor: PropTypes.string.isRequired,
+ // baseColor: PropTypes.string.isRequired,
+ // tintColor: PropTypes.string.isRequired,
+ // errorColor: PropTypes.string.isRequired,
- focusAnimation: PropTypes
- .instanceOf(Animated.Value)
- .isRequired,
+ // focusAnimation: PropTypes
+ // .instanceOf(Animated.Value)
+ // .isRequired,
- labelAnimation: PropTypes
- .instanceOf(Animated.Value)
- .isRequired,
+ // labelAnimation: PropTypes
+ // .instanceOf(Animated.Value)
+ // .isRequired,
- contentInset: PropTypes.shape({
- label: PropTypes.number,
- }),
+ // contentInset: PropTypes.shape({
+ // label: PropTypes.number,
+ // }),
- offset: PropTypes.shape({
- x0: PropTypes.number,
- y0: PropTypes.number,
- x1: PropTypes.number,
- y1: PropTypes.number,
- }),
+ // offset: PropTypes.shape({
+ // x0: PropTypes.number,
+ // y0: PropTypes.number,
+ // x1: PropTypes.number,
+ // y1: PropTypes.number,
+ // }),
- style: Animated.Text.propTypes.style,
- label: PropTypes.string,
- };
+ // style: PropTypes.object,
+ // label: PropTypes.string,
+ // };
render() {
let {
diff --git a/node_modules/react-native-material-textfield/src/components/line/index.js b/node_modules/react-native-material-textfield/src/components/line/index.js
index 44995e9..b689387 100644
--- a/node_modules/react-native-material-textfield/src/components/line/index.js
+++ b/node_modules/react-native-material-textfield/src/components/line/index.js
@@ -16,23 +16,23 @@ export default class Line extends PureComponent {
restricted: false,
};
- static propTypes = {
- lineType: lineTypes,
- disabledLineType: lineTypes,
+ // static propTypes = {
+ // lineType: lineTypes,
+ // disabledLineType: lineTypes,
- disabled: PropTypes.bool,
- restricted: PropTypes.bool,
+ // disabled: PropTypes.bool,
+ // restricted: PropTypes.bool,
- tintColor: PropTypes.string,
- baseColor: PropTypes.string,
- errorColor: PropTypes.string,
+ // tintColor: PropTypes.string,
+ // baseColor: PropTypes.string,
+ // errorColor: PropTypes.string,
- lineWidth: PropTypes.number,
- activeLineWidth: PropTypes.number,
- disabledLineWidth: PropTypes.number,
+ // lineWidth: PropTypes.number,
+ // activeLineWidth: PropTypes.number,
+ // disabledLineWidth: PropTypes.number,
- focusAnimation: PropTypes.instanceOf(Animated.Value),
- };
+ // focusAnimation: PropTypes.instanceOf(Animated.Value),
+ // };
static getDerivedStateFromProps(props, state) {
let { lineWidth, activeLineWidth, disabledLineWidth } = props;
diff --git a/node_modules/react-native-material-textfield/src/components/outline/index.js b/node_modules/react-native-material-textfield/src/components/outline/index.js
index 9347a99..9c3e8a3 100644
--- a/node_modules/react-native-material-textfield/src/components/outline/index.js
+++ b/node_modules/react-native-material-textfield/src/components/outline/index.js
@@ -11,29 +11,29 @@ export default class Line extends PureComponent {
restricted: false,
};
- static propTypes = {
- lineType: PropTypes.oneOf(['solid', 'none']),
+ // static propTypes = {
+ // lineType: PropTypes.oneOf(['solid', 'none']),
- disabled: PropTypes.bool,
- restricted: PropTypes.bool,
+ // disabled: PropTypes.bool,
+ // restricted: PropTypes.bool,
- tintColor: PropTypes.string,
- baseColor: PropTypes.string,
- errorColor: PropTypes.string,
+ // tintColor: PropTypes.string,
+ // baseColor: PropTypes.string,
+ // errorColor: PropTypes.string,
- lineWidth: PropTypes.number,
- activeLineWidth: PropTypes.number,
- disabledLineWidth: PropTypes.number,
+ // lineWidth: PropTypes.number,
+ // activeLineWidth: PropTypes.number,
+ // disabledLineWidth: PropTypes.number,
- focusAnimation: PropTypes.instanceOf(Animated.Value),
- labelAnimation: PropTypes.instanceOf(Animated.Value),
- labelWidth: PropTypes.instanceOf(Animated.Value),
+ // focusAnimation: PropTypes.instanceOf(Animated.Value),
+ // labelAnimation: PropTypes.instanceOf(Animated.Value),
+ // labelWidth: PropTypes.instanceOf(Animated.Value),
- contentInset: PropTypes.shape({
- left: PropTypes.number,
- right: PropTypes.number,
- }),
- };
+ // contentInset: PropTypes.shape({
+ // left: PropTypes.number,
+ // right: PropTypes.number,
+ // }),
+ // };
borderProps() {
let {

View File

@ -1,34 +0,0 @@
diff --git a/node_modules/react-native-star-rating/node_modules/react-native-button/Button.js b/node_modules/react-native-star-rating/node_modules/react-native-button/Button.js
index fb7cf46..8e4c522 100644
--- a/node_modules/react-native-star-rating/node_modules/react-native-button/Button.js
+++ b/node_modules/react-native-star-rating/node_modules/react-native-button/Button.js
@@ -1,11 +1,12 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
+import {TextPropTypes,ViewPropTypes} from 'deprecated-react-native-prop-types'
import {
StyleSheet,
Text,
TouchableOpacity,
View,
- ViewPropTypes,
+ //ViewPropTypes,
} from 'react-native';
import coalesceNonElementChildren from './coalesceNonElementChildren';
@@ -16,12 +17,12 @@ export default class Button extends Component {
static propTypes = {
...TouchableOpacity.propTypes,
accessibilityLabel: PropTypes.string,
- allowFontScaling: Text.propTypes.allowFontScaling,
+ allowFontScaling: TextPropTypes.allowFontScaling,
containerStyle: ViewPropTypes.style,
disabledContainerStyle: ViewPropTypes.style,
disabled: PropTypes.bool,
- style: Text.propTypes.style,
- styleDisabled: Text.propTypes.style,
+ style: TextPropTypes.style,
+ styleDisabled: TextPropTypes.style,
childGroupStyle: ViewPropTypes.style,
};

View File

@ -1,26 +0,0 @@
diff --git a/node_modules/react-native-star-rating/StarButton.js b/node_modules/react-native-star-rating/StarButton.js
index b6db613..8a62f5a 100644
--- a/node_modules/react-native-star-rating/StarButton.js
+++ b/node_modules/react-native-star-rating/StarButton.js
@@ -1,6 +1,7 @@
// React and react native imports
import React, { Component } from 'react';
-import { Image, StyleSheet, ViewPropTypes } from 'react-native';
+import { Image, StyleSheet } from 'react-native';
+import {ViewPropTypes} from 'deprecated-react-native-prop-types';
import PropTypes from 'prop-types';
import { createIconSetFromIcoMoon } from 'react-native-vector-icons';
diff --git a/node_modules/react-native-star-rating/StarRating.js b/node_modules/react-native-star-rating/StarRating.js
index 7aecc95..de6397c 100644
--- a/node_modules/react-native-star-rating/StarRating.js
+++ b/node_modules/react-native-star-rating/StarRating.js
@@ -1,6 +1,7 @@
// React and react native imports
import React, { Component } from 'react';
-import { View, ViewPropTypes, StyleSheet } from 'react-native';
+import { View, StyleSheet } from 'react-native';
+import {ViewPropTypes} from 'deprecated-react-native-prop-types';
import PropTypes from 'prop-types';
import { View as AnimatableView } from 'react-native-animatable';

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1,5 +0,0 @@
import FdEmailBtn from "./FdEmailBtn/FdEmailBtn";
import FdGoogleBtn from "./FdGoogleBtn/FdGoogleBtn";
export { FdEmailBtn, FdGoogleBtn };

View File

@ -1,115 +0,0 @@
import { useNavigation, useTheme } from "@react-navigation/native";
import React, { useContext } from "react";
import { FlatList, TouchableOpacity, View } from "react-native";
import ConfigurationContext from "../../../context/Configuration";
import UserContext from "../../../context/User";
import { alignment } from "../../../utils/alignment";
import { NAVIGATION_SCREEN } from "../../../utils/constant";
import Spinner from "../../Spinner/Spinner";
import TextDefault from "../../Text/TextDefault/TextDefault";
import TextError from "../../Text/TextError/TextError";
import useStyle from "./styles";
export const orderStatuses = [
{
key: "PENDING",
status: 1,
statusText: "Your order is still pending.",
},
{
key: "ACCEPTED",
status: 2,
statusText: "Restaurant is preparing Food.",
},
{
key: "PICKED",
status: 3,
statusText: "Rider is on the way.",
},
{
key: "DELIVERED",
status: 4,
statusText: "Order is delivered.",
},
{
key: "COMPLETED",
status: 5,
statusText: "Order is completed.",
},
];
const orderStatusActive = ["PENDING", "PICKED", "ACCEPTED"];
const StatusCard = () => {
const { colors } = useTheme();
const styles = useStyle();
const navigation = useNavigation();
const {
loadingOrders,
errorOrders,
orders,
networkStatusOrders,
fetchOrders,
} = useContext(UserContext);
const configuration = useContext(ConfigurationContext);
const checkStatus = (status) => {
const obj = orderStatuses.filter((x) => {
return x.key === status;
});
return obj[0];
};
if (loadingOrders) return <Spinner />;
if (errorOrders) return <TextError>{errorOrders.message}</TextError>;
return (
<FlatList
contentContainerStyle={styles.mainContainer}
showsVerticalScrollIndicator={false}
showsHorizontalScrollIndicator={false}
horizontal={true}
refreshing={networkStatusOrders === 4}
onRefresh={() => networkStatusOrders === 7 && fetchOrders()}
data={orders.filter((o) => orderStatusActive.includes(o.order_status))}
//keyExtractor={(item) => item._id}
keyExtractor={(item, index) => String(index)}
renderItem={({ item, index }) => (
<TouchableOpacity
activeOpacity={0.8}
style={{ flex: 1, paddingHorizontal: 10 }}
onPress={() =>
navigation.navigate(NAVIGATION_SCREEN.OrderDetail, {
_id: item._id,
currency_symbol: configuration.currency_symbol,
})
}
>
<View key={index} style={styles.statusContainer}>
<View style={styles.textContainer}>
<TextDefault H5 medium textColor={styles.lightText.color}>
Your order ID
</TextDefault>
<TextDefault style={{ ...alignment.PBlarge }} H4 bolder>
{item.order_id}
</TextDefault>
<TextDefault H5 textColor={colors.placeHolderColor} medium>
Status
</TextDefault>
<TextDefault textColor={"#00b9c6"} H5 medium>
{item.order_status}{" "}
<TextDefault numberOfLines={2} medium>
{/* {checkStatus(item.order_status).status}.{' '} */}(
{checkStatus(item.order_status).statusText})
</TextDefault>
</TextDefault>
</View>
</View>
</TouchableOpacity>
)}
/>
);
};
export default StatusCard;

View File

@ -1,50 +0,0 @@
import { useTheme } from "@react-navigation/native";
import { useHeaderHeight } from "@react-navigation/elements";
import { StyleSheet } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { scale } from "../../utils/scaling";
const useStyle = () => {
const { colors } = useTheme();
const inset = useSafeAreaInsets();
const headerHeight = useHeaderHeight();
return StyleSheet.create({
flex: {
flex: 1,
},
wrapperView: {
backgroundColor: colors.background,
paddingTop: headerHeight,
paddingBottom: inset.bottom,
},
topCurve: {
position: "absolute",
opacity: 0.2,
left: -75,
borderTopRightRadius: scale(90),
borderBottomEndRadius: scale(200),
top: -20,
width: scale(250),
height: scale(260),
borderRadius: 100,
backgroundColor: colors.curve,
},
bottomCurve: {
position: "absolute",
height: scale(185),
width: scale(170),
borderTopRightRadius: scale(110),
borderTopLeftRadius: scale(90),
borderBottomRightRadius: scale(100),
borderBottomLeftRadius: scale(110),
right: -90,
backgroundColor: colors.curve,
opacity: 0.2,
bottom: -80,
zIndex: -1,
},
});
};
export default useStyle;

View File

@ -1,65 +0,0 @@
import CartItem from "./CartItem/CartItem";
import {
CartComponent,
CheckComponent,
HeadingComponent,
ImageHeader,
RadioComponent,
TitleComponent,
} from "./CustomizeComponents";
import { DrawerProfile } from "./Drawer";
import CheckboxBtn from "./FdCheckbox/CheckboxBtn";
import RadioBtn from "./FdRadioBtn/RadioBtn";
import { FdEmailBtn, FdGoogleBtn } from "./FdSocialBtn";
import { FlashMessage } from "./FlashMessage/FlashMessage";
import {
BackButton,
LeftButton,
RightButton,
RegistrationHeader,
} from "./Header";
import { MenuCard, StatusCard } from "./Menu";
import { FilterModal } from "./Modals";
import ActiveOrders from "./MyOrders/ActiveOrders";
import { TrackingRider } from "./OrderDetail";
import Sidebar from "./Sidebar/Sidebar";
import Spinner from "./Spinner/Spinner";
import { TextDefault, TextError, TextLine } from "./Text";
import Triangle from "./Triangle/Triangle";
import EnategaImage from "./EnategaImage/EnategaImage";
import WrapperView from "./WrapperView/WrapperView";
import { CustomIcon } from "./CustomIcon";
export {
WrapperView,
CustomIcon,
CartItem,
EnategaImage,
CartComponent,
CheckComponent,
HeadingComponent,
ImageHeader,
RadioComponent,
TitleComponent,
DrawerProfile,
RadioBtn,
CheckboxBtn,
FdEmailBtn,
FdGoogleBtn,
FlashMessage,
BackButton,
LeftButton,
RightButton,
MenuCard,
StatusCard,
FilterModal,
RegistrationHeader,
ActiveOrders,
Sidebar,
Triangle,
TextDefault,
TextError,
TextLine,
Spinner,
TrackingRider,
};

View File

@ -1,360 +0,0 @@
/* eslint-disable react/prop-types */
import { createDrawerNavigator } from "@react-navigation/drawer";
import { NavigationContainer, useTheme } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import * as Notifications from "expo-notifications";
import React, { useEffect } from "react";
import { Text, useColorScheme, View } from "react-native";
import Animated from "react-native-reanimated";
import {
initialWindowMetrics,
SafeAreaProvider,
} from "react-native-safe-area-context";
import { TextDefault, LeftButton, Sidebar } from "../components";
import Menu from "../screens/Menu/Menu";
import MenuItems from "../screens/MenuItems/MenuItems";
import Addresses from "../screens/Addresses/Addresses";
import NewAddress from "../screens/NewAddress/NewAddress";
import EditAddress from "../screens/EditAddress/EditAddress";
import Cart from "../screens/Cart/Cart";
import Profile from "../screens/Profile/Profile";
import FullMap from "../screens/FullMap/FullMap";
import CartAddress from "../screens/CartAddress/CartAddress";
import SelectVoucher from "../screens/Coupon/Coupon";
import Help from "../screens/Help/Help";
import HelpBrowser from "../screens/HelpBrowser/HelpBrowser";
import Chat from "../screens/Chat/Chat";
import Settings from "../screens/Settings/Settings";
import Paypal from "../screens/Paypal/Paypal";
import ItemDetail from "../screens/ItemDetail/ItemDetail";
import MyOrders from "../screens/MyOrders/MyOrders";
import OrderDetail from "../screens/OrderDetail/OrderDetail";
import StripeCheckout from "../screens/Stripe/StripeCheckout";
import RateAndReview from "../screens/RateAndReview/RateAndReview";
import CreateAccount from "../screens/CreateAccount/CreateAccount";
import Login from "../screens/Login/Login";
import Register from "../screens/Register/Register";
import ForgotPassword from "../screens/ForgotPassword/ForgotPassword";
// import {
// Addresses,
// Cart,
// CartAddress,
// Chat,
// CreateAccount,
// EditAddress,
// ForgotPassword,
// FullMap,
// Help,
// HelpBrowser,
// ItemDetail,
// Login,
// MenuItems,
// MyOrders,
// NewAddress,
// OrderDetail,
// Paypal,
// Profile,
// RateAndReview,
// Register,
// SelectVoucher,
// Settings,
// StripeCheckout,
// Menu,
// } from "../screens";
import { THEME } from "../Theme";
import { ICONS_NAME, NAVIGATION_SCREEN } from "../utils/constant";
import navigationService from "./navigationService";
import screenOptions from "./screenOptions";
import styles from "./styles";
const NavigationStack = createStackNavigator();
const MainStack = createStackNavigator();
const SideDrawer = createDrawerNavigator();
function Drawer() {
const { colors } = useTheme();
let animatedStyle = {};
let opacity;
let OuterWindowSlide, InnerWindowSlide;
return (
<SideDrawer.Navigator
drawerType="slide"
overlayColor="transparent"
screenOptions={{
drawerStyle: {
flex: 1,
backgroundColor: colors.drawerBackground,
width: "60%",
justifyContent: "space-between",
borderRightWidth: 0,
shadowOpacity: 0,
elevation: 0,
},
sceneContainerStyle: { backgroundColor: colors.drawerBackground },
}}
// drawerStyle={{
// flex: 1,
// backgroundColor: colors.drawerBackground,
// width: "60%",
// justifyContent: "space-between",
// borderRightWidth: 0,
// shadowOpacity: 0,
// elevation: 0,
// }}
// sceneContainerStyle={{ backgroundColor: colors.drawerBackground }}
drawerContent={(props) => {
const scale = Animated.interpolateNode(props.progress, {
inputRange: [0, 1],
outputRange: [1, 0.7],
});
const Animatedopacity = Animated.interpolateNode(props.progress, {
inputRange: [0, 0.6, 1],
outputRange: [0, 0, 1],
});
const AnimatedOuterSlide = Animated.interpolateNode(props.progress, {
inputRange: [0, 1],
outputRange: [0, -35],
});
const AnimatedInnerSlide = Animated.interpolateNode(props.progress, {
inputRange: [0, 1],
outputRange: [0, -15],
});
const borderRadius = Animated.interpolateNode(props.progress, {
inputRange: [0, 1],
outputRange: [0, 20],
});
animatedStyle = { borderRadius, transform: [{ scale }] };
opacity = Animatedopacity;
OuterWindowSlide = AnimatedOuterSlide;
InnerWindowSlide = AnimatedInnerSlide;
return <Sidebar {...props} />;
}}
>
<SideDrawer.Screen name="noDrawer" options={{ headerShown: false }}>
{(props) => (
<NoDrawer
{...props}
style={animatedStyle}
opacity={opacity}
OuterWindowSlide={OuterWindowSlide}
InnerWindowSlide={InnerWindowSlide}
/>
)}
</SideDrawer.Screen>
</SideDrawer.Navigator>
);
}
function NoDrawer({ style, opacity = 1, OuterWindowSlide, InnerWindowSlide }) {
const { colors } = useTheme();
return (
<React.Fragment>
<Animated.View
style={[styles.outerView, style, { marginLeft: OuterWindowSlide }]}
/>
<Animated.View
style={[styles.innerView, style, { marginLeft: InnerWindowSlide }]}
/>
<Animated.View style={[styles.animatedView, style]}>
<NavigationStack.Navigator
//mode="modal"
presentation="modal"
screenOptions={screenOptions({
textColor: colors.headerTextColor,
})}
>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Menu}
component={Menu}
options={{
headerLeft: () => <LeftButton icon={ICONS_NAME.Menu} />,
}}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.MenuItems}
component={MenuItems}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Cart}
component={Cart}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Profile}
component={Profile}
options={{
headerLeft: () => <LeftButton icon={ICONS_NAME.Menu} />,
}}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Addresses}
component={Addresses}
options={{
headerLeft: () => <LeftButton icon={ICONS_NAME.Menu} />,
}}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.NewAddress}
component={NewAddress}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.EditAddress}
component={EditAddress}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.FullMap}
component={FullMap}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.CartAddress}
component={CartAddress}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Coupon}
component={SelectVoucher}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Help}
component={Help}
options={{
headerLeft: () => <LeftButton icon={ICONS_NAME.Menu} />,
}}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Chat}
component={Chat}
options={{
headerLeft: () => <LeftButton icon={ICONS_NAME.Menu} />,
}}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.HelpBrowser}
component={HelpBrowser}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Settings}
component={Settings}
options={{
headerLeft: () => <LeftButton icon={ICONS_NAME.Menu} />,
}}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.Paypal}
component={Paypal}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.ItemDetail}
component={ItemDetail}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.MyOrders}
component={MyOrders}
options={{
headerLeft: () => <LeftButton icon={ICONS_NAME.Menu} />,
}}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.OrderDetail}
component={OrderDetail}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.RateAndReview}
component={RateAndReview}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.StripeCheckout}
component={StripeCheckout}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.CreateAccount}
options={{ headerShown: false }}
component={CreateAccount}
/>
<NavigationStack.Screen
options={{ headerShown: false }}
name={NAVIGATION_SCREEN.Login}
component={Login}
/>
<NavigationStack.Screen
options={{ headerShown: false }}
name={NAVIGATION_SCREEN.Register}
component={Register}
/>
<NavigationStack.Screen
name={NAVIGATION_SCREEN.ForgotPassword}
options={{ headerShown: false }}
component={ForgotPassword}
/>
</NavigationStack.Navigator>
</Animated.View>
<Animated.View style={[styles.closeView, { opacity: opacity }]}>
<TextDefault H4 medium>
{"Close X"}
</TextDefault>
</Animated.View>
</React.Fragment>
);
}
function AppContainer() {
console.log("AppContainer Working");
const colorScheme = useColorScheme();
function _handleNotification(notification) {
try {
if (notification.origin === "selected") {
if (notification.data.order) {
navigationService.navigate(NAVIGATION_SCREEN.OrderDetail, {
_id: notification.data._id,
});
}
}
} catch (e) {
console.log(e);
}
}
useEffect(() => {
Notifications.setNotificationHandler({
handleNotification: async () => ({
shouldShowAlert: true,
shouldPlaySound: false,
shouldSetBadge: false,
}),
});
const subscription =
Notifications.addNotificationResponseReceivedListener(
_handleNotification
);
return () => subscription.remove();
}, []);
return (
<SafeAreaProvider initialMetrics={initialWindowMetrics}>
<NavigationContainer
theme={colorScheme === "dark" ? THEME.Dark : THEME.Light}
ref={(ref) => {
navigationService.setGlobalRef(ref);
Notifications.addNotificationReceivedListener(_handleNotification);
}}
>
<MainStack.Navigator
screenOptions={{
headerShown: false,
}}
//headerMode="none"
initialRouteName={NAVIGATION_SCREEN.Drawer}
>
<MainStack.Screen
name={NAVIGATION_SCREEN.Drawer}
component={Drawer}
/>
</MainStack.Navigator>
</NavigationContainer>
</SafeAreaProvider>
);
}
export default AppContainer;

View File

@ -1,194 +0,0 @@
import { useMutation } from "@apollo/react-hooks";
import { useNavigation, useTheme } from "@react-navigation/native";
import gql from "graphql-tag";
import React, { useContext, useLayoutEffect } from "react";
import { FlatList, TouchableOpacity, View } from "react-native";
import i18n from "../../../i18n";
import { deleteAddress } from "../../apollo/server";
import EmptyAddress from "../../assets/images/SVG/imageComponents/EmptyAddress";
import {
CustomIcon,
RightButton,
TextDefault,
WrapperView,
} from "../../components";
import UserContext from "../../context/User";
import { COLORS } from "../../Theme";
import { alignment } from "../../utils/alignment";
import { ICONS_NAME, NAVIGATION_SCREEN } from "../../utils/constant";
import { scale } from "../../utils/scaling";
import useStyle from "./styles";
const DELETE_ADDRESS = gql`
${deleteAddress}
`;
function Addresses() {
const styles = useStyle();
const { colors } = useTheme();
const navigation = useNavigation();
const { profile } = useContext(UserContext);
const [mutate, { loading: loadingMutation }] = useMutation(DELETE_ADDRESS);
useLayoutEffect(() => {
navigation.setOptions({
title: i18n.t("myAddresses"),
headerRight: () => (
<RightButton
icon={ICONS_NAME.Plus}
iconSize={scale(18)}
onPress={() => navigation.navigate(NAVIGATION_SCREEN.NewAddress)}
/>
),
});
}, [navigation]);
const addressIcons = {
Home: ICONS_NAME.Home,
Work: ICONS_NAME.Cart,
Other: ICONS_NAME.Location,
};
const colorIcons = {
Other: COLORS.primary,
Home: COLORS.redishPink,
Work: COLORS.primaryLightBlue,
};
const emptyView = React.memo(() => {
return (
<View style={styles.subContainerImage}>
<View style={styles.image}>
<EmptyAddress width={scale(180)} height={scale(180)} />
</View>
<View style={styles.descriptionEmpty}>
<TextDefault
textColor={colors.fontMainColor}
bold
H5
style={alignment.Msmall}
>
No Addresses found.
</TextDefault>
<View>
<TextDefault textColor={colors.fontSecondColor}>
You haven&#39;t saved any address yet.
{"\n"}
Click Add New Address to get started
</TextDefault>
</View>
<TouchableOpacity
activeOpacity={0.8}
style={styles.adressBtn}
onPress={() => navigation.navigate(NAVIGATION_SCREEN.NewAddress)}
>
<TextDefault textColor={colors.white} H5 bold>
Add New Address
</TextDefault>
</TouchableOpacity>
</View>
</View>
);
});
return (
<WrapperView>
<View style={styles.containerInfo}>
<FlatList
showsVerticalScrollIndicator={false}
data={profile.addresses}
style={[styles.flex, styles.width100]}
contentContainerStyle={
profile.addresses.length > 0
? styles.contentContainer
: { flexGrow: 1 }
}
ListEmptyComponent={emptyView}
// keyExtractor={(item) => item._id}
keyExtractor={(item, index) => String(index)}
ItemSeparatorComponent={() => <View style={styles.line} />}
ListHeaderComponent={() => <View style={alignment.MTmedium} />}
renderItem={({ item: address }) => (
<TouchableOpacity
activeOpacity={0.7}
style={styles.width100}
onPress={() => {
navigation.navigate(NAVIGATION_SCREEN.EditAddress, {
...address,
});
}}
>
<View style={[styles.titleAddress, styles.width100]}>
<View
style={{
alignItems: "center",
flexDirection: "row",
flex: 1,
}}
>
<CustomIcon
name={addressIcons[address.label]}
size={scale(20)}
color={colorIcons[address.label]}
/>
<TextDefault
bold
H5
style={[alignment.MTxSmall, alignment.MLsmall]}
>
{address.label}
</TextDefault>
</View>
<View style={[styles.titleAddress]}>
<TouchableOpacity
activeOpacity={0.7}
disabled={loadingMutation}
style={[styles.iconButton, alignment.MRsmall]}
onPress={() => {
navigation.navigate(NAVIGATION_SCREEN.EditAddress, {
...address,
});
}}
>
<CustomIcon
name={ICONS_NAME.Pencil}
size={scale(20)}
color={colors.placeHolderColor}
/>
</TouchableOpacity>
<TouchableOpacity
activeOpacity={0.7}
disabled={loadingMutation}
style={styles.iconButton}
onPress={() => {
mutate({ variables: { id: address._id } });
}}
>
<CustomIcon
name={ICONS_NAME.Trash}
size={scale(20)}
color={colors.placeHolderColor}
/>
</TouchableOpacity>
</View>
</View>
<View style={styles.addressDetail}>
<TextDefault textColor={colors.fontSecondColor}>
{address.delivery_address}, {address.details}
</TextDefault>
</View>
</TouchableOpacity>
)}
/>
<TextDefault
textColor={colors.fontSecondColor}
style={alignment.MBsmall}
>
All rights are reserved by Enatega
</TextDefault>
</View>
</WrapperView>
);
}
export default React.memo(Addresses);

View File

@ -1,135 +0,0 @@
import { useMutation } from "@apollo/react-hooks";
import { useNavigation, useTheme } from "@react-navigation/native";
import gql from "graphql-tag";
import React, { useContext, useLayoutEffect } from "react";
import { FlatList, TouchableOpacity, View } from "react-native";
import i18n from "../../../i18n";
import { selectAddress } from "../../apollo/server";
import {
CustomIcon,
RightButton,
TextDefault,
WrapperView,
} from "../../components";
import RadioButton from "../../components/FdRadioBtn/RadioBtn";
import UserContext from "../../context/User";
import { alignment } from "../../utils/alignment";
import { ICONS_NAME, NAVIGATION_SCREEN } from "../../utils/constant";
import { scale } from "../../utils/scaling";
import useStyle from "./styles";
const SELECT_ADDRESS = gql`
${selectAddress}
`;
function CartAddresses() {
const { colors } = useTheme();
const styles = useStyle();
const navigation = useNavigation();
const { profile } = useContext(UserContext);
const [mutate] = useMutation(SELECT_ADDRESS, { onError });
useLayoutEffect(() => {
navigation.setOptions({
title: i18n.t("myAddresses"),
headerRight: () => (
<RightButton
icon={ICONS_NAME.Plus}
iconSize={scale(18)}
onPress={() => navigation.navigate(NAVIGATION_SCREEN.NewAddress)}
/>
),
});
}, [navigation]);
function onError(error) {
console.log(error);
}
const onSelectAddress = (address) => {
mutate({ variables: { id: address._id } });
navigation.goBack();
};
return (
<WrapperView>
<View style={styles.containerInfo}>
<FlatList
showsVerticalScrollIndicator={false}
style={styles.flex}
data={profile.addresses}
keyExtractor={(item, index) => String(index)}
contentContainerStyle={styles.contentContainer}
ItemSeparatorComponent={() => <View style={styles.line} />}
ListHeaderComponent={() => <View style={{ ...alignment.MTmedium }} />}
renderItem={({ item: address }) => (
<View style={styles.width100}>
<TouchableOpacity
activeOpacity={0.7}
style={styles.width100}
onPress={() => {
onSelectAddress(address);
}}
>
<View style={styles.width100}>
<View style={[styles.titleAddress, styles.width100]}>
<View style={[styles.homeIcon]}>
<RadioButton
size={10}
outerColor={colors.radioOuterColor}
innerColor={colors.radioColor}
animation={"bounceIn"}
isSelected={address.selected}
onPress={() => {
onSelectAddress(address);
}}
/>
</View>
<TextDefault style={{ width: "70%" }} H5 bold>
{address.label}
</TextDefault>
<TouchableOpacity
activeOpacity={0.7}
style={styles.editButton}
onPress={() =>
navigation.navigate(NAVIGATION_SCREEN.EditAddress, {
...address,
})
}
>
<CustomIcon
name={ICONS_NAME.Pencil}
size={scale(20)}
color={colors.tagColor}
/>
</TouchableOpacity>
</View>
<View style={{ ...alignment.MTxSmall }}></View>
<View style={styles.addressDetail}>
<TextDefault
line={4}
textColor={colors.fontSecondColor}
bold
>
{address.delivery_address}
</TextDefault>
<TextDefault
line={3}
textColor={colors.fontSecondColor}
bold
>
{address.details}
</TextDefault>
</View>
</View>
</TouchableOpacity>
</View>
)}
/>
</View>
</WrapperView>
);
}
export default CartAddresses;

View File

@ -1,211 +0,0 @@
import { Feather, FontAwesome } from "@expo/vector-icons";
import { useNavigation, useTheme } from "@react-navigation/native";
import React, { useCallback, useEffect, useState } from "react";
import { Keyboard, View } from "react-native";
import {
Bubble,
GiftedChat,
InputToolbar,
Send,
} from "react-native-gifted-chat";
import { TextDefault, WrapperView } from "../../components";
import { alignment } from "../../utils/alignment";
import { scale } from "../../utils/scaling";
import useStyle from "./styles";
const UserInfo = {
_id: 1,
name: "Jason",
active: true,
};
function Chat() {
const styles = useStyle();
const { colors } = useTheme();
const navigation = useNavigation();
const [messages, setMessages] = useState([]);
const [isTyping, setIsTyping] = useState(false);
useEffect(() => {
Keyboard.addListener("keyboardDidShow", _keyboardDidShow);
Keyboard.addListener("keyboardDidHide", _keyboardDidHide);
// cleanup function
return () => {
Keyboard.remove("keyboardDidShow", _keyboardDidShow);
Keyboard.remove("keyboardDidHide", _keyboardDidHide);
};
}, []);
const _keyboardDidShow = () => setIsTyping(true);
const _keyboardDidHide = () => setIsTyping(false);
useEffect(() => {
navigation.setOptions({
title: "Chat",
});
setMessages([
{
_id: 1,
text: "How can I help you?",
sent: true,
received: true,
createdAt: new Date(),
user: {
_id: 2,
name: "React Native",
avatar: "https://placeimg.com/140/140/any",
},
},
]);
}, [navigation]);
const onSend = useCallback((messages = []) => {
setMessages((previousMessages) =>
GiftedChat.append(previousMessages, messages)
);
}, []);
const renderBubble = (props) => {
return (
<Bubble
{...props}
textStyle={{
right: {
color: colors.fontMainColor,
},
left: {
color: colors.fontMainColor,
},
}}
bottomContainerStyle={{
right: {
...alignment.PTxSmall,
},
left: {
...alignment.PTxSmall,
},
}}
wrapperStyle={{
right: {
minWidth: 150,
backgroundColor: colors.chatBubblePrimary,
borderTopRightRadius: scale(15),
borderTopLeftRadius: scale(15),
borderBottomLeftRadius: scale(15),
borderBottomRightRadius: 0,
...alignment.MVxSmall,
...alignment.PVxSmall,
shadowColor: colors.shadowColor,
shadowOffset: {
width: 0,
height: 1,
},
shadowOpacity: 0.2,
shadowRadius: 2,
elevation: 3,
},
left: {
minWidth: 150,
backgroundColor: colors.lightBackground,
borderTopRightRadius: scale(15),
borderTopLeftRadius: scale(15),
borderBottomRightRadius: scale(15),
borderBottomLeftRadius: 0,
...alignment.MVxSmall,
...alignment.PVxSmall,
shadowColor: colors.shadowColor,
shadowOffset: {
width: 0,
height: 1,
},
shadowOpacity: 0.2,
shadowRadius: 2,
elevation: 3,
},
}}
/>
);
};
const renderSend = (props) => (
<Send {...props} containerStyle={styles.sendBtn}>
<View style={styles.rightBtn}>
<Feather
name={"send"}
color={colors.buttonText}
size={scale(17)}
style={{
transform: [
{ rotateZ: "45deg" },
{ translateY: 2 },
{ translateX: -1 },
],
}}
/>
</View>
</Send>
);
const customtInputToolbar = (props) => {
return (
<InputToolbar
{...props}
containerStyle={styles.inputContainer}
renderSend={renderSend}
render
/>
);
};
return (
<WrapperView>
<View style={[styles.flex, styles.mainContainer]}>
<View style={styles.header}>
<FontAwesome
name="circle"
color={UserInfo.active ? colors.active : colors.fontSecondColor}
/>
<TextDefault medium H5 style={alignment.PLsmall}>
{UserInfo.active ? UserInfo.name : "Offline"}
</TextDefault>
</View>
<GiftedChat
inverted
alwaysShowSend
user={UserInfo}
isTyping={isTyping}
messages={messages}
onSend={(messages) => onSend(messages)}
renderAvatar={() => null}
renderBubble={renderBubble}
renderInputToolbar={customtInputToolbar}
textInputStyle={styles.inputStyle}
minInputToolbarHeight={60}
// renderFooter={() =>
// isTyping ? (
// <TextDefault
// textColor={colors.selected}
// style={[alignment.PLlarge, alignment.MBsmall]}>
// User is typing...
// </TextDefault>
// ) : null
// }
timeTextStyle={{
left: {
width: "100%",
color: colors.fontMainColor,
fontSize: 11,
textAlign: "right",
},
right: {
color: colors.fontMainColor,
fontSize: 11,
},
}}
/>
</View>
</WrapperView>
);
}
export default Chat;

View File

@ -1,268 +0,0 @@
import { useMutation } from "@apollo/react-hooks";
import { FontAwesome } from "@expo/vector-icons";
import { useNavigation, useTheme } from "@react-navigation/native";
import * as AppleAuthentication from "expo-apple-authentication";
import Constants from "expo-constants";
//import * as Google from 'expo-google-app-auth'
import * as Google from "expo-auth-session/providers/google";
import * as Notifications from "expo-notifications";
import gql from "graphql-tag";
import React, { useContext, useEffect, useState } from "react";
import { Platform, TouchableOpacity, View } from "react-native";
import getEnvVars from "../../../environment";
import { login } from "../../apollo/server";
import {
EnategaImage,
FdEmailBtn,
FdGoogleBtn,
FlashMessage,
RegistrationHeader,
Spinner,
TextDefault,
WrapperView,
} from "../../components";
import UserContext from "../../context/User";
import { alignment } from "../../utils/alignment";
import Analytics from "../../utils/analytics";
import { NAVIGATION_SCREEN } from "../../utils/constant";
import { scale } from "../../utils/scaling";
import useStyle from "./styles";
import ApolloClient from "apollo-client";
const {
IOS_CLIENT_ID_GOOGLE,
ANDROID_CLIENT_ID_GOOGLE,
Expo_CLIENT_ID_GOOGLE,
} = getEnvVars();
const LOGIN = gql`
${login}
`;
const Logo = require("../../../assets/logo.png");
const CreateAccount = () => {
const styles = useStyle();
const { colors } = useTheme();
const navigation = useNavigation();
const [enableApple, setEnableApple] = useState(false);
const [loginButton, loginButtonSetter] = useState(null);
const [loading, setLoading] = useState(false);
const { setTokenAsync } = useContext(UserContext);
useEffect(() => {
checkIfSupportsAppleAuthentication();
}, []);
const [mutate] = useMutation(LOGIN, { onCompleted, onError });
async function checkIfSupportsAppleAuthentication() {
setEnableApple(await AppleAuthentication.isAvailableAsync());
}
async function onCompleted(data) {
try {
const trackingOpts = {
id: data.login.userId,
usernameOrEmail: data.login.email,
};
Analytics.identify(data.login.userId, trackingOpts);
Analytics.track(Analytics.events.USER_CREATED_ACCOUNT, trackingOpts);
setTokenAsync(data.login.token);
navigation.navigate(NAVIGATION_SCREEN.Menu);
} catch (e) {
console.log(e);
} finally {
setLoading(false);
}
}
function onError(error) {
try {
console.log(JSON.stringify(error));
FlashMessage({
message: error.graphQLErrors[0].message,
});
loginButtonSetter(null);
} catch (e) {
console.log(e);
} finally {
setLoading(false);
}
}
async function mutateLogin(user) {
setLoading(true);
let notificationToken = null;
if (Constants.isDevice) {
const { status: existingStatus } =
await Notifications.getPermissionsAsync();
if (existingStatus === "granted") {
notificationToken = (await Notifications.getExpoPushTokenAsync()).data;
}
}
mutate({ variables: { ...user, notificationToken } });
}
function renderAppleAction() {
if (loading && loginButton === "Apple") {
return (
<View style={styles.buttonBackground}>
<Spinner backColor="rgba(0,0,0,0.1)" spinnerColor={colors.tagColor} />
</View>
);
}
return (
<TouchableOpacity
style={styles.appleBtn}
onPress={async () => {
try {
const credential = await AppleAuthentication.signInAsync({
requestedScopes: [
AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
AppleAuthentication.AppleAuthenticationScope.EMAIL,
],
});
console.log(credential);
if (credential) {
const user = {
appleId: credential.user,
phone: "",
email: credential.email,
password: "",
name:
credential.fullName.givenName +
" " +
credential.fullName.familyName,
picture: "",
type: "apple",
};
mutateLogin(user);
}
loginButtonSetter("Apple");
// signed in
} catch (e) {
if (e.code === "ERR_CANCELLED") {
// handle that the user canceled the sign-in flow
loginButtonSetter(null);
} else {
// handle other errors
loginButtonSetter(null);
}
}
}}
>
<FontAwesome
style={styles.marginLeft5}
name="apple"
size={scale(19)}
color="#000"
/>
<TextDefault style={alignment.MLsmall} bold>
Signup with Apple
</TextDefault>
</TouchableOpacity>
);
}
const [googleRequest, googleResponse, googlePromptAsync] =
Google.useAuthRequest({
expoClientId: Expo_CLIENT_ID_GOOGLE,
iosClientId: IOS_CLIENT_ID_GOOGLE,
iosStandaloneAppClientId: IOS_CLIENT_ID_GOOGLE,
androidClientId: ANDROID_CLIENT_ID_GOOGLE,
androidStandaloneAppClientId: ANDROID_CLIENT_ID_GOOGLE,
//redirectUrl: `${AuthSession.OAuthRedirect}:/oauth2redirect/google`,
scopes: ["profile", "email"],
...{ useProxy: true },
});
const googleSignUp = () => {
if (googleResponse?.type === "success") {
const { authentication } = googleResponse;
console.log(authentication.accessToken);
(async () => {
const userInfoResponse = await fetch(
"https://www.googleapis.com/oauth2/v1/userinfo?alt=json",
{
headers: { Authorization: `Bearer ${authentication.accessToken}` },
}
);
const googleUser = await userInfoResponse.json();
const user = {
phone: "",
email: googleUser.email,
password: "",
name: googleUser.name,
picture: googleUser.picture,
type: "google",
};
mutateLogin(user);
})();
}
};
useEffect(() => {
googleSignUp();
}, [googleResponse]);
function renderGoogleAction() {
return (
<FdGoogleBtn
loadingIcon={loading && loginButton === "Google"}
onPressIn={() => {
loginButtonSetter("Google");
}}
disabled={!googleRequest}
onPress={() => googlePromptAsync()}
/>
);
}
function renderEmailAction() {
return (
<FdEmailBtn
loadingIcon={loading && loginButton === "Email"}
onPress={() => {
loginButtonSetter("Email");
navigation.navigate(NAVIGATION_SCREEN.Register);
}}
/>
);
}
return (
<WrapperView>
<View style={[styles.mainContainer, styles.flex]}>
<RegistrationHeader title={"Get Started"} />
<View style={styles.subContainer}>
<View style={[styles.flex, styles.upperContainer]}>
<EnategaImage
imgStyle={styles.imgResponsive}
imgSource={Logo}
spinnerProps={{ style: styles.loadingView }}
/>
</View>
<View style={styles.width100}>
<View style={alignment.MTmedium}>{renderGoogleAction()}</View>
{enableApple && (
<View style={alignment.MTmedium}>{renderAppleAction()}</View>
)}
<View style={alignment.MTmedium}>{renderEmailAction()}</View>
<TouchableOpacity
activeOpacity={0.7}
style={styles.alreadyBtn}
onPress={() => navigation.navigate(NAVIGATION_SCREEN.Login)}
>
<TextDefault style={[alignment.MLsmall]} bold>
Already a member? Log in
</TextDefault>
</TouchableOpacity>
</View>
</View>
</View>
</WrapperView>
);
};
export default CreateAccount;

View File

@ -1,107 +0,0 @@
import { useQuery } from "@apollo/react-hooks";
import { useNavigation } from "@react-navigation/native";
import gql from "graphql-tag";
import React, { useContext, useLayoutEffect } from "react";
import { FlatList, View } from "react-native";
import { categories } from "../../apollo/server";
import EmptyFood from "../../assets/images/SVG/imageComponents/EmptyFood";
import {
MenuCard,
Spinner,
StatusCard,
TextDefault,
TextError,
WrapperView,
} from "../../components";
import UserContext from "../../context/User";
import { alignment } from "../../utils/alignment";
import { NAVIGATION_SCREEN } from "../../utils/constant";
import { scale } from "../../utils/scaling";
import useStyle from "./styles";
// constants
const CATEGORIES = gql`
${categories}
`;
function Menu() {
const styles = useStyle();
const navigation = useNavigation();
const { isLoggedIn, profile } = useContext(UserContext);
const { data, refetch, networkStatus, loading, error } = useQuery(CATEGORIES);
useLayoutEffect(() => {
navigation.setOptions({
title: "Home",
});
}, []);
function emptyView() {
if (loading) {
return <Spinner />;
} else if (error) {
return (
<TextError
text={error ? error.message : "No Foods"}
backColor="transparent"
/>
);
} else {
return (
<View style={styles.emptyContainer}>
<EmptyFood width={scale(250)} height={scale(250)} />
<TextDefault H4 bold style={alignment.MTlarge}>
No item found
</TextDefault>
</View>
);
}
}
return (
<WrapperView>
<View style={[styles.flex, styles.mainContentContainer]}>
<FlatList
style={styles.flex}
contentContainerStyle={styles.contentContainer}
showsVerticalScrollIndicator={false}
keyExtractor={(item, index) => String(index)}
ListEmptyComponent={emptyView()}
data={loading ? [] : error ? [] : data.categories}
refreshing={networkStatus === 4}
onRefresh={() => refetch()}
ListHeaderComponent={() => {
if (!error && !loading) {
return (
<>
{isLoggedIn && profile && <StatusCard />}
<TextDefault style={alignment.Psmall} H4 medium>
Featured
</TextDefault>
</>
);
}
return null;
}}
renderItem={({ item }) => (
<View key={item._id} style={styles.cardViewContainer}>
<MenuCard
onPress={() =>
navigation.navigate(NAVIGATION_SCREEN.MenuItems, {
...item,
})
}
title={item.title}
description={item.description}
image={item.img_menu || ""}
/>
</View>
)}
/>
</View>
</WrapperView>
);
}
export default React.memo(Menu);

View File

@ -1,283 +0,0 @@
import { useQuery } from "@apollo/react-hooks";
import { useNavigation, useRoute } from "@react-navigation/native";
//import { useHeaderHeight } from '@react-navigation/stack'
import { useHeaderHeight } from "@react-navigation/elements";
import gql from "graphql-tag";
import { get } from "lodash";
import React, { useContext, useLayoutEffect, useRef, useState } from "react";
import {
FlatList,
ImageBackground,
Platform,
TouchableOpacity,
View,
} from "react-native";
import { Modalize } from "react-native-modalize";
import { foods } from "../../apollo/server";
import EmptyFood from "../../assets/images/SVG/imageComponents/EmptyFood";
import {
EnategaImage,
FilterModal,
FlashMessage,
RightButton,
Spinner,
TextDefault,
TextError,
WrapperView,
} from "../../components";
import ConfigurationContext from "../../context/Configuration";
import UserContext from "../../context/User";
import { alignment } from "../../utils/alignment";
import { ICONS_NAME, NAVIGATION_SCREEN, SORT_DATA } from "../../utils/constant";
import { moderateScale, scale } from "../../utils/scaling";
import useStyle from "./styles";
// constants
const FOODS = gql`
${foods}
`;
function MenuItems() {
const route = useRoute();
const styles = useStyle();
const headerHeight = useHeaderHeight();
const navigation = useNavigation();
const _id = route.params._id ?? null;
const imgMenu = route.params.img_menu ?? null;
const title = route.params.title ?? null;
const description = route.params.description ?? null;
const [filters, setFilters] = useState({});
const { loading, error, data, refetch, networkStatus } = useQuery(FOODS, {
variables: { category: _id, ...filters },
});
const { addCartItem } = useContext(UserContext);
const configuration = useContext(ConfigurationContext);
const modalizeRef = useRef(null);
const closeModal = () => {
modalizeRef.current.close();
};
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: title,
headerRight: () => (
<RightButton
icon={ICONS_NAME.Filter}
onPress={() => modalizeRef.current.open()}
/>
),
});
}, [navigation]);
async function onAddToCart(food) {
if (food.stock < 1) {
FlashMessage({
message: "Item out of stock",
});
return;
}
if (
food.variations.length === 1 &&
food.variations[0].addons.length === 0
) {
await addCartItem(food._id, food.variations[0]._id);
navigation.navigate(NAVIGATION_SCREEN.Cart);
} else {
navigation.navigate(NAVIGATION_SCREEN.ItemDetail, { food });
}
}
function renderGridCards(item) {
return (
<TouchableOpacity
onPress={() => {
onAddToCart(item);
}}
activeOpacity={0.7}
style={styles.cardContainer}
>
<View style={styles.cardImageContainer}>
<EnategaImage
imgStyle={styles.imgResponsive}
imgSource={
item.img_url
? { uri: item.img_url }
: require("../../assets/images/food_placeholder.png")
}
resizeMode={"cover"}
spinnerProps={{ style: styles.loadingView }}
/>
{item.stock < 1 && (
<View style={styles.emtpyStockLabel}>
<TextDefault textColor={styles.whiteFont.color} center>
No Stock
</TextDefault>
</View>
)}
</View>
<View style={[styles.textContainer]}>
<TextDefault numberOfLines={2} style={alignment.MBxSmall} bolder H5>
{item.title}
</TextDefault>
<TextDefault
numberOfLines={2}
textColor={styles.lightColor.color}
small
medium
>
{item.description}
</TextDefault>
<View style={{ flexDirection: "row", alignItems: "center" }}>
{item.variations[0].discounted > 0 && (
<TextDefault
textColor={styles.lightColor.color}
style={[alignment.MRxSmall]}
small
bold
H5
lineOver
>
{configuration.currency_symbol}{" "}
{(
item.variations[0].price + item.variations[0].discounted
).toFixed(2)}
</TextDefault>
)}
<TextDefault textColor={styles.tagColor.color} H4 bolder>
{configuration.currency_symbol}{" "}
{item.variations[0].price.toFixed(2)}
</TextDefault>
</View>
</View>
</TouchableOpacity>
);
}
function sortData(foods) {
const VALUE = get(SORT_DATA, get(filters, "sort"));
switch (VALUE) {
case SORT_DATA.NameAsc:
return foods.sort((a, b) =>
a.title.toLowerCase() > b.title.toLowerCase() ? 1 : -1
);
case SORT_DATA.NameDesc:
return foods.sort((a, b) =>
a.title.toLowerCase() < b.title.toLowerCase() ? 1 : -1
);
case SORT_DATA.PriceAsc:
return foods.sort((a, b) =>
a.variations[0].price > b.variations[0].price ? 1 : -1
);
case SORT_DATA.PriceDesc:
return foods.sort((a, b) =>
a.variations[0].price < b.variations[0].price ? 1 : -1
);
default:
return foods.sort((a, b) => (a.img_url < b.img_url ? 1 : -1));
}
}
const setFilterss = (filterObj) => {
setFilters(filterObj);
};
function emptyView() {
if (loading) {
return <Spinner />;
} else if (error) {
return (
<TextError
text={error ? error.message : "No Foods"}
backColor="transparent"
/>
);
} else {
return (
<View style={styles.emptyContainer}>
<EmptyFood width={scale(250)} height={scale(250)} />
<TextDefault H4 bold style={alignment.MTlarge}>
No food item found
</TextDefault>
</View>
);
}
}
function renderListHeader() {
return (
<View style={styles.backgroundImageContainer}>
<ImageBackground
style={styles.backgroundImage}
borderRadius={moderateScale(20)}
source={
imgMenu
? { uri: imgMenu }
: require("../../assets/images/food_placeholder.png")
}
>
<View style={styles.shadeContainer}></View>
<View style={styles.backgroundImageTextContainer}>
<TextDefault
numberOfLines={1}
textColor={styles.whiteFont.color}
H4
bolder
>
{title}
</TextDefault>
<TextDefault
numberOfLines={1}
textColor={styles.whiteFont.color}
bold
>
{description}
</TextDefault>
</View>
</ImageBackground>
</View>
);
}
return (
<WrapperView>
<View style={[styles.flex]}>
<FlatList
style={styles.flex}
contentContainerStyle={styles.contentContaienr}
showsVerticalScrollIndicator={false}
ListHeaderComponent={renderListHeader()}
keyExtractor={(item, index) => String(index)}
ListEmptyComponent={emptyView}
data={loading ? [] : error ? [] : sortData(data.foodByCategory)}
refreshing={networkStatus === 4}
onRefresh={() =>
refetch({
variables: { category: _id, ...filters },
})
}
renderItem={({ item }) => renderGridCards(item)}
/>
</View>
<Modalize
ref={modalizeRef}
adjustToContentHeight
handlePosition="inside"
modalTopOffset={headerHeight}
avoidKeyboardLikeIOS={Platform.select({
ios: true,
android: false,
})}
keyboardAvoidingOffset={2}
keyboardAvoidingBehavior="height"
>
<FilterModal
filterObj={filters}
setFilters={setFilterss}
closeFilterModal={closeModal}
/>
</Modalize>
</WrapperView>
);
}
export default MenuItems;

View File

@ -1,198 +0,0 @@
import { useApolloClient } from "@apollo/react-hooks";
import { useNavigation, useTheme } from "@react-navigation/native";
import React, { useContext, useLayoutEffect } from "react";
import { FlatList, TouchableOpacity, View } from "react-native";
import uuid from "uuid";
import i18n from "../../../i18n";
import EmptyOrder from "../../assets/images/SVG/imageComponents/EmptyOrder";
import {
ActiveOrders,
CustomIcon,
EnategaImage,
Spinner,
TextDefault,
TextError,
WrapperView,
} from "../../components";
import ConfigurationContext from "../../context/Configuration";
import UserContext from "../../context/User";
import { alignment } from "../../utils/alignment";
import { ICONS_NAME, NAVIGATION_SCREEN } from "../../utils/constant";
import { scale } from "../../utils/scaling";
import useStyle from "./style";
const orderStatusActive = ["PENDING", "PICKED", "ACCEPTED"];
const orderStatusInactive = ["DELIVERED", "COMPLETED"];
function MyOrders() {
const styles = useStyle();
const { colors } = useTheme();
const client = useApolloClient();
const navigation = useNavigation();
const configuration = useContext(ConfigurationContext);
const {
orders,
loadingOrders,
errorOrders,
fetchOrders,
fetchMoreOrdersFunc,
networkStatusOrders,
updateCart,
} = useContext(UserContext);
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: i18n.t("titleOrders"),
headerRight: null,
});
}, [navigation]);
// add items to cart and navigate to cart screen
async function onReOrder({ order }) {
const data = {
cartItems: order.items.map((item) => {
return {
...item.food,
key: uuid.v4(),
__typename: "CartItem",
variation: {
__typename: "ItemVariation",
_id: item.variation._id,
},
quantity: item.quantity,
addons: item.addons.map((addon) => ({
...addon,
__typename: "ItemAddon",
options: addon.options.map(({ _id }) => ({
_id,
__typename: "ItemOption",
})),
})),
};
}),
};
await updateCart(data.cartItems);
navigation.navigate(NAVIGATION_SCREEN.Cart);
}
function emptyView() {
if (loadingOrders) return <Spinner visible={loadingOrders} />;
if (errorOrders) return <TextError text={errorOrders.message} />;
else {
return (
<View style={styles.subContainerImage}>
<View style={styles.imageContainer}>
<EmptyOrder width={scale(250)} height={scale(250)} />
</View>
<View style={styles.descriptionEmpty}>
<TextDefault bolder center H4>
No Orders Found
</TextDefault>
</View>
<TouchableOpacity
activeOpacity={0.7}
style={styles.emptyButton}
onPress={() => navigation.navigate(NAVIGATION_SCREEN.Menu)}
>
<TextDefault textColor={colors.buttonText} bold H5 center>
Start Shopping
</TextDefault>
</TouchableOpacity>
</View>
);
}
}
return (
<WrapperView>
<FlatList
data={
loadingOrders || errorOrders
? []
: orders.filter((o) => orderStatusInactive.includes(o.order_status))
}
style={styles.container}
contentContainerStyle={styles.contentContainer}
ListEmptyComponent={emptyView()}
ListHeaderComponent={
<ActiveOrders
navigation={navigation}
activeOrders={orders.filter((o) =>
orderStatusActive.includes(o.order_status)
)}
pastOrders={orders.filter((o) =>
orderStatusInactive.includes(o.order_status)
)}
loading={loadingOrders}
error={errorOrders}
/>
}
//keyExtractor={(item) => item._id}
keyExtractor={(item, index) => String(index)}
refreshing={networkStatusOrders === 4}
onRefresh={() => networkStatusOrders === 7 && fetchOrders()}
renderItem={({ item }) => (
<TouchableOpacity
activeOpacity={0.7}
onPress={() =>
navigation.navigate(NAVIGATION_SCREEN.OrderDetail, {
_id: item._id,
currency_symbol: configuration.currency_symbol,
})
}
>
<View style={styles.subContainer}>
<View style={styles.imgContainer}>
<EnategaImage
imgStyle={styles.imgResponsive}
source={{ uri: item.items[0].food.img_url }}
spinnerProps={{ style: styles.loadingView }}
/>
</View>
<View style={styles.infoContainer}>
<TextDefault H5 bold style={alignment.MBxSmall}>
{"ID: "}
{item.order_id}
</TextDefault>
<TextDefault line={3} textColor={colors.tagColor} H5 medium>
{configuration.currency_symbol}
{item.order_amount}
{/* {item.order_status === 'PENDING'
? "We're asking the restaurant how long it will take to deliver your food."
: 'The restaurant rider will be at your place around.'} */}
</TextDefault>
</View>
<View style={styles.Vline} />
<TouchableOpacity
activeOpacity={0.8}
onPress={() => onReOrder({ order: item, client })}
style={styles.subContainerRight}
>
<View>
<View style={{ alignSelf: "center" }}>
<CustomIcon
name={ICONS_NAME.Refresh}
size={scale(28)}
color={colors.text}
/>
</View>
<TextDefault
textColor={colors.text}
style={alignment.MTxSmall}
bold
center
>
{"Re-Order"}
</TextDefault>
</View>
</TouchableOpacity>
</View>
</TouchableOpacity>
)}
onEndReached={fetchMoreOrdersFunc}
/>
</WrapperView>
);
}
export default MyOrders;

View File

@ -1,328 +0,0 @@
import { useMutation } from "@apollo/react-hooks";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { useNavigation, useTheme } from "@react-navigation/native";
import Constants from "expo-constants";
import * as Device from "expo-device";
import * as Localization from "expo-localization";
import * as Notifications from "expo-notifications";
import * as Updates from "expo-updates";
import gql from "graphql-tag";
import React, { useContext, useEffect, useRef, useState } from "react";
import {
AppState,
Linking,
Platform,
StyleSheet,
TouchableOpacity,
View,
} from "react-native";
import { Modalize } from "react-native-modalize";
import i18n from "../../../i18n";
import {
profile,
pushToken,
updateNotificationStatus,
} from "../../apollo/server";
import {
CustomIcon,
FlashMessage,
Spinner,
TextDefault,
WrapperView,
} from "../../components";
import SwitchBtn from "../../components/FdSwitch/SwitchBtn";
import UserContext from "../../context/User";
import { alignment } from "../../utils/alignment";
import { ICONS_NAME } from "../../utils/constant";
import { scale } from "../../utils/scaling";
import SettingModal from "./components/SettingModal";
import useStyle from "./styles";
const languageTypes = [
{ value: "English", code: "en", index: 0 },
{ value: "français", code: "fr", index: 1 },
{ value: "ភាសាខ្មែរ", code: "km", index: 2 },
{ value: "中文", code: "zh", index: 3 },
{ value: "Deutsche", code: "de", index: 4 },
];
const PUSH_TOKEN = gql`
${pushToken}
`;
const UPDATE_NOTIFICATION_TOKEN = gql`
${updateNotificationStatus}
`;
const PROFILE = gql`
${profile}
`;
function Settings() {
const styles = useStyle();
const { colors } = useTheme();
const navigation = useNavigation();
const { profile } = useContext(UserContext);
const [languageName, languageNameSetter] = useState("English");
const [offerNotification, offerNotificationSetter] = useState(
profile.is_offer_notification
);
const [orderNotification, orderNotificationSetter] = useState(
profile.is_order_notification
);
const [activeRadio, activeRadioSetter] = useState(languageTypes[0].index);
// eslint-disable-next-line no-unused-vars
const [appState, setAppState] = useState(AppState.currentState);
const [uploadToken] = useMutation(PUSH_TOKEN);
const [mutate, { loading }] = useMutation(UPDATE_NOTIFICATION_TOKEN, {
onCompleted,
onError,
refetchQueries: [{ query: PROFILE }],
});
const modalizeRef = useRef(null);
useEffect(() => {
navigation.setOptions({
headerTitle: i18n.t("titleSettings"),
headerRight: null,
});
selectLanguage();
checkPermission();
}, [navigation]);
const _handleAppStateChange = async (nextAppState) => {
if (nextAppState === "active") {
let token = null;
const permission = await getPermission();
if (permission === "granted") {
if (!profile.notificationToken) {
token = (await Notifications.getExpoPushTokenAsync()).data;
uploadToken({ variables: { token } });
}
offerNotificationSetter(profile.is_offer_notification);
orderNotificationSetter(profile.is_order_notification);
} else {
offerNotificationSetter(false);
orderNotificationSetter(false);
}
}
setAppState(nextAppState);
};
useEffect(() => {
AppState.addEventListener("change", _handleAppStateChange);
return () => {
AppState.remove("change", _handleAppStateChange);
};
}, []);
async function checkPermission() {
const permission = await getPermission();
if (permission !== "granted") {
offerNotificationSetter(false);
orderNotificationSetter(false);
} else {
offerNotificationSetter(profile.is_offer_notification);
orderNotificationSetter(profile.is_order_notification);
}
}
async function getPermission() {
const { status } = await Notifications.getPermissionsAsync();
return status;
}
async function selectLanguage() {
const lang = await AsyncStorage.getItem("enatega-language");
if (lang) {
const defLang = languageTypes.findIndex((el) => el.code === lang);
const langName = languageTypes[defLang].value;
activeRadioSetter(defLang);
languageNameSetter(langName);
}
}
const onSelectedLanguage = async (active) => {
const languageInd = active;
if (Platform.OS === "android") {
const localization = await Localization.getLocalizationAsync();
localization.locale = languageTypes[languageInd].code;
await AsyncStorage.setItem(
"enatega-language",
languageTypes[languageInd].code
);
Updates.reloadAsync();
}
};
const onClose = () => {
modalizeRef.current.close();
};
function onCompleted() {
FlashMessage({
message: "Notification Status Updated",
});
}
function onError(error) {
try {
FlashMessage({
message: error.networkError.result.errors[0].message,
});
} catch (err) {}
}
async function updateNotificationStatus(notificationCheck) {
let orderNotify, offerNotify;
if (!Device.isDevice) {
FlashMessage({
message: "Notification do not work on simulator",
});
return;
}
const permission = await getPermission();
if (!profile.notificationToken || permission !== "granted") {
Linking.openSettings();
}
if (notificationCheck === "offer") {
offerNotificationSetter(!offerNotification);
orderNotify = orderNotification;
offerNotify = !offerNotification;
}
if (notificationCheck === "order") {
orderNotificationSetter(!orderNotification);
orderNotify = !orderNotification;
offerNotify = offerNotification;
}
mutate({
variables: {
offerNotification: offerNotify,
orderNotification: orderNotify,
},
});
}
return (
<WrapperView>
{loading && (
<View style={{ ...StyleSheet.absoluteFill }}>
<Spinner />
</View>
)}
<View style={[styles.flex, styles.mainContainer]}>
<View style={alignment.Plarge}>
{Platform.OS === "android" && (
<View style={[styles.languageContainer, styles.shadow]}>
<View style={styles.changeLanguage}>
<View style={styles.headingLanguage}>
<TextDefault
numberOfLines={1}
textColor={colors.fontSecondColor}
medium
H5
>
Language
</TextDefault>
<TextDefault medium H5>
({languageName})
</TextDefault>
</View>
<TouchableOpacity
activeOpacity={0.5}
onPress={() => modalizeRef.current.open("top")}
style={styles.button}
>
<CustomIcon
name={ICONS_NAME.Pencil}
size={scale(22)}
color={colors.fontMainColor}
/>
</TouchableOpacity>
</View>
</View>
)}
<TouchableOpacity
activeOpacity={0.7}
onPress={() => {
updateNotificationStatus("offer");
}}
style={[styles.notificationContainer, styles.shadow]}
>
<View style={styles.notificationChekboxContainer}>
<TextDefault
numberOfLines={1}
textColor={colors.statusSecondColor}
>
{" "}
Receive Special Offers{" "}
</TextDefault>
<SwitchBtn
isEnabled={offerNotification}
onPress={() => {
updateNotificationStatus("offer");
}}
/>
</View>
</TouchableOpacity>
<TouchableOpacity
activeOpacity={0.7}
onPress={() => {
updateNotificationStatus("order");
}}
style={[styles.notificationContainer, styles.shadow]}
>
<View style={styles.notificationChekboxContainer}>
<TextDefault
numberOfLines={1}
textColor={colors.statusSecondColor}
>
{" "}
Get updates on your order status!{" "}
</TextDefault>
<SwitchBtn
isEnabled={orderNotification}
onPress={() => {
updateNotificationStatus("order");
}}
/>
</View>
</TouchableOpacity>
<View style={styles.versionContainer}>
<TextDefault textColor={colors.fontSecondColor}>
Version: {Constants.manifest.version}
</TextDefault>
</View>
</View>
</View>
<TextDefault
textColor={colors.fontSecondColor}
style={alignment.MBsmall}
center
>
All rights are reserved by Enatega
</TextDefault>
{/* Modal for language Changes */}
<Modalize
ref={modalizeRef}
adjustToContentHeight
handlePosition="inside"
avoidKeyboardLikeIOS={Platform.select({
ios: true,
android: false,
})}
keyboardAvoidingOffset={2}
keyboardAvoidingBehavior="height"
>
<SettingModal
onClose={onClose}
onSelectedLanguage={onSelectedLanguage}
activeRadio={activeRadio}
/>
</Modalize>
</WrapperView>
);
}
export default Settings;

View File

@ -1,66 +0,0 @@
import * as Amplitude from "@amplitude/analytics-react-native";
import { normalizeTrackingOptions } from "./analyticsUtils";
import getEnvVars from "../../environment";
import { getTrackingPermissions } from "./useAppTrackingTransparency";
const { AMPLITUDE_API_KEY } = getEnvVars();
let isInitialized = false;
export const events = {
USER_LOGGED_IN: "USER_LOGGED_IN",
USER_LOGGED_OUT: "USER_LOGGED_OUT",
USER_CREATED_ACCOUNT: "USER_CREATED_ACCOUNT",
// USER_RESET_PASSWORD: 'USER_RESET_PASSWORD',
// USER_LINKED_SOCIAL: 'USER_LINKED_SOCIAL',
// USER_UPDATED_EMAIL: 'USER_UPDATED_EMAIL',
// USER_UPDATED_PROFILE: 'USER_UPDATED_PROFILE',
// USER_UPDATED_LINKS: 'USER_UPDATED_SOCIAL_LINKS',
// USER_UPDATED_LIKE: 'USER_UPDATED_LIKE',
// USER_UPDATED_PRIVACY: 'USER_UPDATED_PRIVACY',
// USER_REMOVED_PROJECT: 'USER_REMOVED_PROJECT',
// USER_OPENED_CREATION: 'USER_OPENED_CREATION',
// USER_UPDATED_SETTINGS: 'USER_UPDATED_SETTINGS',
USER_PLACED_ORDER: "USER_PLACED_ORDER",
};
export async function initialize() {
const trackingStatus = await getTrackingPermissions();
if (isInitialized || !AMPLITUDE_API_KEY || trackingStatus !== "granted") {
return;
}
Amplitude.init(AMPLITUDE_API_KEY);
isInitialized = true;
}
export async function identify(id, options) {
initialize();
const properties = normalizeTrackingOptions(options);
if (properties) {
Amplitude.Identify(properties);
//await Amplitude.setUserPropertiesAsync(properties)
} else {
//await Amplitude.clearUserPropertiesAsync()
const identifyObj = new Amplitude.Identify();
identifyObj.remove(properties);
Amplitude.Identify(identifyObj);
}
}
export async function track(event, options) {
initialize();
const properties = normalizeTrackingOptions(options);
if (properties) {
Amplitude.track(event, properties);
} else {
Amplitude.track(event);
}
}
export default {
events,
initialize,
identify,
track,
};

View File

@ -1,35 +0,0 @@
// packages
import { BackHandler, Alert } from "react-native";
/**
* Attaches an event listener that handles the android-only hardware
* back button
* @param {Function} callback The function to call on click
*/
const handleAndroidBackButton = (callback) => {
BackHandler.addEventListener("hardwareBackPress", () => {
callback();
return true;
});
};
/**
* Removes the event listener in order not to add a new one
* every time the view component re-mounts
*/
const removeAndroidBackButtonHandler = () => {
// BackHandler.removeEventListener('hardwareBackPress')
BackHandler.remove("hardwareBackPress");
};
const exitAlert = () => {
Alert.alert("Confirm exit", "Do you want to quit the app?", [
{ text: "CANCEL", style: "cancel" },
{
text: "OK",
onPress: () => {
BackHandler.exitApp();
},
},
]);
return true;
};
export { handleAndroidBackButton, removeAndroidBackButtonHandler, exitAlert };

View File

@ -7,9 +7,11 @@ import Constants from "expo-constants";
const ENV = { const ENV = {
development: { development: {
GRAPHQL_URL: "http://10.97.28.88.90:8000/graphql", GRAPHQL_URL: "http://10.97.28.48:8000/graphql",
WS_GRAPHQL_URL: "ws://10.97.28.88.90:8000/graphql", WS_GRAPHQL_URL: "ws://10.97.28.48:8000/graphql",
SERVER_URL: "http://10.97.28.88.90:8000/", // put / at the end of server url SERVER_URL: "http://10.97.28.48:8000/", // put / at the end of server url
Expo_CLIENT_ID_GOOGLE:
"630195385603-82e52jpb722a8l0huhkspq3tqh2d6r6f.apps.googleusercontent.com",
IOS_CLIENT_ID_GOOGLE: IOS_CLIENT_ID_GOOGLE:
"967541328677-uq7f7odvmeea2pb2sq0l7q320ds86536.apps.googleusercontent.com", "967541328677-uq7f7odvmeea2pb2sq0l7q320ds86536.apps.googleusercontent.com",
ANDROID_CLIENT_ID_GOOGLE: ANDROID_CLIENT_ID_GOOGLE:

View File

@ -1,15 +0,0 @@
> Why do I have a folder named ".expo" in my project?
The ".expo" folder is created when an Expo project is started using "expo start" command.
> What do the files contain?
- "devices.json": contains information about devices that have recently opened this project. This is used to populate the "Development sessions" list in your development builds.
- "packager-info.json": contains port numbers and process PIDs that are used to serve the application to the mobile device/simulator.
- "settings.json": contains the server configuration that is used to serve the application manifest.
> Should I commit the ".expo" folder?
No, you should not share the ".expo" folder. It does not contain any information that is relevant for other developers working on the project, it is specific to your machine.
Upon project creation, the ".expo" folder is already added to your ".gitignore" file.

View File

@ -1,3 +0,0 @@
{
"devices": []
}

View File

@ -1,9 +0,0 @@
{
"expoServerPort": null,
"packagerPort": null,
"packagerPid": null,
"expoServerNgrokUrl": null,
"packagerNgrokUrl": null,
"ngrokPid": null,
"webpackServerPort": null
}

View File

@ -1,9 +0,0 @@
{
"hostType": "lan",
"lanType": "ip",
"dev": true,
"minify": false,
"urlRandomness": null,
"https": false,
"scheme": null
}

View File

@ -1 +0,0 @@
/node_modules

View File

@ -1,117 +0,0 @@
import { ApolloProvider } from "@apollo/react-hooks";
import AsyncStorage from "@react-native-async-storage/async-storage";
import * as Font from "expo-font";
import * as Notifications from "expo-notifications";
import * as SplashScreen from "expo-splash-screen";
import React, { useEffect, useState } from "react";
import { Platform, StatusBar } from "react-native";
import FlashMessage from "react-native-flash-message";
import i18n from "./i18n";
import setupApolloClient from "./src/apollo/index";
import { AuthContext } from "./src/context/auth";
import { ConfigurationProvider } from "./src/context/configuration";
import AppContainer from "./src/routes/index";
export default function App() {
const [fontLoaded, setFontLoaded] = useState(false);
const [client, setClient] = useState(null);
const [token, setToken] = useState(false);
const [appIsReady, setAppIsReady] = useState(false);
useEffect(() => {
(async () => {
const token = await AsyncStorage.getItem("rider-token");
if (token) setToken(token);
setAppIsReady(true);
})();
}, []);
useEffect(() => {
(async () => {
try {
await SplashScreen.preventAutoHideAsync();
} catch (e) {
console.log(e);
}
})();
loadData();
}, []);
const setTokenAsync = async (token) => {
await AsyncStorage.setItem("rider-token", token);
setToken(token);
};
const logout = async () => {
try {
await AsyncStorage.removeItem("rider-token");
setToken(null);
} catch (e) {
console.log("Logout Error: ", e);
}
};
async function loadData() {
await i18n.initAsync();
await Font.loadAsync({
MuseoSans300: require("./assets/font/MuseoSans/MuseoSans300.ttf"),
MuseoSans500: require("./assets/font/MuseoSans/MuseoSans500.ttf"),
MuseoSans700: require("./assets/font/MuseoSans/MuseoSans700.ttf"),
icomoon: require("./assets/font/icomoon.ttf"),
});
const client = await setupApolloClient();
await permissionForPushNotificationsAsync();
setClient(client);
setFontLoaded(true);
await SplashScreen.hideAsync();
}
async function permissionForPushNotificationsAsync() {
const {
status: existingStatus,
} = await Notifications.getPermissionsAsync();
let finalStatus = existingStatus;
// only ask if permissions have not already been determined, because
// iOS won't necessarily prompt the user a second time.
if (existingStatus !== "granted") {
// Android remote notification permissions are granted during the app
// install, so this will only ask on iOS
const { status } = await Notifications.requestPermissionsAsync();
finalStatus = status;
}
// Stop here if the user did not grant permissions
if (finalStatus !== "granted") {
return;
}
if (Platform.OS === "android") {
Notifications.setNotificationChannelAsync("default", {
name: "default",
sound: true,
priority: "max",
importance: Notifications.AndroidImportance.HIGH,
vibrate: [0, 250, 250, 250],
});
}
}
if (fontLoaded && client && appIsReady) {
return (
<ApolloProvider client={client}>
<StatusBar
translucent
backgroundColor={"transparent"}
barStyle="dark-content"
/>
<ConfigurationProvider>
<AuthContext.Provider value={{ token, setTokenAsync, logout }}>
<AppContainer />
</AuthContext.Provider>
</ConfigurationProvider>
<FlashMessage duration={2000} position="center" />
</ApolloProvider>
);
}
return null;
}

16906
Rider App/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,89 +0,0 @@
{
"name": "enatega-rider-app",
"version": "5.0.0",
"main": "node_modules/expo/AppEntry.js",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"eject": "expo eject",
"format": "prettier --write '**/*.js'",
"lint:fix": "eslint . --ext .js --fix",
"postinstall": "patch-package"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.js": [
"npm run format",
"npm run lint:fix"
]
},
"dependencies": {
"@apollo/react-hooks": "^3.1.3",
"@expo/vector-icons": "^13.0.0",
"@react-native-async-storage/async-storage": "~1.17.3",
"@react-native-community/masked-view": "0.1.10",
"@react-navigation/bottom-tabs": "^5.11.11",
"@react-navigation/drawer": "^5.12.5",
"@react-navigation/native": "^5.5.1",
"@react-navigation/stack": "^5.14.5",
"apollo-boost": "^0.4.3",
"apollo-cache-inmemory": "^1.6.2",
"apollo-client": "^2.6.3",
"apollo-link": "^1.2.12",
"apollo-link-context": "^1.0.18",
"apollo-link-state": "^0.4.2",
"apollo-link-ws": "^1.0.20",
"apollo-upload-client": "^10.0.1",
"deprecated-react-native-prop-types": "^4.0.0",
"expo": "^47.0.0",
"expo-constants": "~14.0.2",
"expo-font": "~11.0.1",
"expo-localization": "~14.0.0",
"expo-location": "~15.0.1",
"expo-notifications": "~0.17.0",
"expo-splash-screen": "~0.17.5",
"expo-task-manager": "~11.0.1",
"expo-updates": "~0.15.6",
"graphql": "^14.3.1",
"graphql-tag": "^2.10.1",
"i18n-js": "^3.3.0",
"patch-package": "^6.5.1",
"react": "18.1.0",
"react-apollo": "^2.5.8",
"react-native": "0.70.5",
"react-native-animatable": "^1.3.2",
"react-native-flash-message": "^0.1.13",
"react-native-gesture-handler": "~2.8.0",
"react-native-gifted-chat": "^0.16.3",
"react-native-maps": "1.3.2",
"react-native-maps-directions": "^1.8.0",
"react-native-material-textfield": "^0.16.1",
"react-native-modal": "^11.5.6",
"react-native-reanimated": "~2.12.0",
"react-native-safe-area-context": "4.4.1",
"react-native-screens": "~3.18.0",
"react-native-svg": "13.4.0",
"react-native-webview": "11.23.1",
"subscriptions-transport-ws": "^0.9.16"
},
"devDependencies": {
"babel-preset-expo": "~9.2.1",
"eslint": "^7.1.0",
"eslint-config-standard": "^14.1.1",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-react": "^7.20.0",
"eslint-plugin-standard": "^4.0.1",
"husky": "^4.2.5",
"lint-staged": "^10.2.7",
"prettier": "2.0.5",
"prettier-config-standard": "^1.0.1"
},
"private": true
}

View File

@ -1,251 +0,0 @@
diff --git a/node_modules/react-native-material-textfield/src/components/affix/index.js b/node_modules/react-native-material-textfield/src/components/affix/index.js
index 0f85022..e467adb 100644
--- a/node_modules/react-native-material-textfield/src/components/affix/index.js
+++ b/node_modules/react-native-material-textfield/src/components/affix/index.js
@@ -9,26 +9,26 @@ export default class Affix extends PureComponent {
numberOfLines: 1,
};
- static propTypes = {
- numberOfLines: PropTypes.number,
- style: Animated.Text.propTypes.style,
+ // static propTypes = {
+ // numberOfLines: PropTypes.number,
+ // style: PropTypes.object,
- color: PropTypes.string.isRequired,
- fontSize: PropTypes.number.isRequired,
+ // color: PropTypes.string.isRequired,
+ // fontSize: PropTypes.number.isRequired,
- type: PropTypes
- .oneOf(['prefix', 'suffix'])
- .isRequired,
+ // type: PropTypes
+ // .oneOf(['prefix', 'suffix'])
+ // .isRequired,
- labelAnimation: PropTypes
- .instanceOf(Animated.Value)
- .isRequired,
+ // labelAnimation: PropTypes
+ // .instanceOf(Animated.Value)
+ // .isRequired,
- children: PropTypes.oneOfType([
- PropTypes.arrayOf(PropTypes.node),
- PropTypes.node,
- ]),
- };
+ // children: PropTypes.oneOfType([
+ // PropTypes.arrayOf(PropTypes.node),
+ // PropTypes.node,
+ // ]),
+ // };
render() {
let { labelAnimation, style, children, type, fontSize, color } = this.props;
diff --git a/node_modules/react-native-material-textfield/src/components/counter/index.js b/node_modules/react-native-material-textfield/src/components/counter/index.js
index 35d3264..e4258cd 100644
--- a/node_modules/react-native-material-textfield/src/components/counter/index.js
+++ b/node_modules/react-native-material-textfield/src/components/counter/index.js
@@ -5,15 +5,15 @@ import { Text } from 'react-native';
import styles from './styles';
export default class Counter extends PureComponent {
- static propTypes = {
- count: PropTypes.number.isRequired,
- limit: PropTypes.number,
+ // static propTypes = {
+ // count: PropTypes.number.isRequired,
+ // limit: PropTypes.number,
- baseColor: PropTypes.string.isRequired,
- errorColor: PropTypes.string.isRequired,
+ // baseColor: PropTypes.string.isRequired,
+ // errorColor: PropTypes.string.isRequired,
- style: Text.propTypes.style,
- };
+ // style: Text.propTypes.style,
+ // };
render() {
let { count, limit, baseColor, errorColor, style } = this.props;
diff --git a/node_modules/react-native-material-textfield/src/components/field/index.js b/node_modules/react-native-material-textfield/src/components/field/index.js
index 494bbaa..d3960a6 100644
--- a/node_modules/react-native-material-textfield/src/components/field/index.js
+++ b/node_modules/react-native-material-textfield/src/components/field/index.js
@@ -1,4 +1,5 @@
import PropTypes from 'prop-types';
+import {ViewPropTypes} from 'deprecated-react-native-prop-types'
import React, { PureComponent } from 'react';
import {
View,
@@ -7,7 +8,7 @@ import {
Animated,
StyleSheet,
Platform,
- ViewPropTypes,
+ //ViewPropTypes,
} from 'react-native';
import Line from '../line';
@@ -83,9 +84,7 @@ export default class TextField extends PureComponent {
labelOffset: Label.propTypes.offset,
- labelTextStyle: Text.propTypes.style,
- titleTextStyle: Text.propTypes.style,
- affixTextStyle: Text.propTypes.style,
+
tintColor: PropTypes.string,
textColor: PropTypes.string,
@@ -221,6 +220,7 @@ export default class TextField extends PureComponent {
let options = {
toValue: this.focusState(),
+ useNativeDriver: false,
duration,
};
diff --git a/node_modules/react-native-material-textfield/src/components/helper/index.js b/node_modules/react-native-material-textfield/src/components/helper/index.js
index 6060f9f..7f790ca 100644
--- a/node_modules/react-native-material-textfield/src/components/helper/index.js
+++ b/node_modules/react-native-material-textfield/src/components/helper/index.js
@@ -5,19 +5,19 @@ import { Animated } from 'react-native';
import styles from './styles';
export default class Helper extends PureComponent {
- static propTypes = {
- title: PropTypes.string,
- error: PropTypes.string,
+ // static propTypes = {
+ // title: PropTypes.string,
+ // error: PropTypes.string,
- disabled: PropTypes.bool,
+ // disabled: PropTypes.bool,
- style: Animated.Text.propTypes.style,
+ // style: PropTypes.object,
- baseColor: PropTypes.string,
- errorColor: PropTypes.string,
+ // baseColor: PropTypes.string,
+ // errorColor: PropTypes.string,
- focusAnimation: PropTypes.instanceOf(Animated.Value),
- };
+ // focusAnimation: PropTypes.instanceOf(Animated.Value),
+ // };
constructor(props) {
super(props);
diff --git a/node_modules/react-native-material-textfield/src/components/label/index.js b/node_modules/react-native-material-textfield/src/components/label/index.js
index 82eaf03..eebad36 100644
--- a/node_modules/react-native-material-textfield/src/components/label/index.js
+++ b/node_modules/react-native-material-textfield/src/components/label/index.js
@@ -5,11 +5,11 @@ import { Animated } from 'react-native';
import styles from './styles';
export default class Label extends PureComponent {
- static defaultProps = {
- numberOfLines: 1,
- disabled: false,
- restricted: false,
- };
+ // static defaultProps = {
+ // numberOfLines: 1,
+ // disabled: false,
+ // restricted: false,
+ // };
static propTypes = {
numberOfLines: PropTypes.number,
@@ -43,7 +43,7 @@ export default class Label extends PureComponent {
y1: PropTypes.number,
}),
- style: Animated.Text.propTypes.style,
+ style: PropTypes.object,
label: PropTypes.string,
};
diff --git a/node_modules/react-native-material-textfield/src/components/line/index.js b/node_modules/react-native-material-textfield/src/components/line/index.js
index 44995e9..7ba8db0 100644
--- a/node_modules/react-native-material-textfield/src/components/line/index.js
+++ b/node_modules/react-native-material-textfield/src/components/line/index.js
@@ -8,13 +8,13 @@ const lineTypes = PropTypes
.oneOf(['solid', 'dotted', 'dashed', 'none']);
export default class Line extends PureComponent {
- static defaultProps = {
- lineType: 'solid',
- disabledLineType: 'dotted',
+ // static defaultProps = {
+ // lineType: 'solid',
+ // disabledLineType: 'dotted',
- disabled: false,
- restricted: false,
- };
+ // disabled: false,
+ // restricted: false,
+ // };
static propTypes = {
lineType: lineTypes,
diff --git a/node_modules/react-native-material-textfield/src/components/outline/index.js b/node_modules/react-native-material-textfield/src/components/outline/index.js
index 9347a99..9c3e8a3 100644
--- a/node_modules/react-native-material-textfield/src/components/outline/index.js
+++ b/node_modules/react-native-material-textfield/src/components/outline/index.js
@@ -11,29 +11,29 @@ export default class Line extends PureComponent {
restricted: false,
};
- static propTypes = {
- lineType: PropTypes.oneOf(['solid', 'none']),
+ // static propTypes = {
+ // lineType: PropTypes.oneOf(['solid', 'none']),
- disabled: PropTypes.bool,
- restricted: PropTypes.bool,
+ // disabled: PropTypes.bool,
+ // restricted: PropTypes.bool,
- tintColor: PropTypes.string,
- baseColor: PropTypes.string,
- errorColor: PropTypes.string,
+ // tintColor: PropTypes.string,
+ // baseColor: PropTypes.string,
+ // errorColor: PropTypes.string,
- lineWidth: PropTypes.number,
- activeLineWidth: PropTypes.number,
- disabledLineWidth: PropTypes.number,
+ // lineWidth: PropTypes.number,
+ // activeLineWidth: PropTypes.number,
+ // disabledLineWidth: PropTypes.number,
- focusAnimation: PropTypes.instanceOf(Animated.Value),
- labelAnimation: PropTypes.instanceOf(Animated.Value),
- labelWidth: PropTypes.instanceOf(Animated.Value),
+ // focusAnimation: PropTypes.instanceOf(Animated.Value),
+ // labelAnimation: PropTypes.instanceOf(Animated.Value),
+ // labelWidth: PropTypes.instanceOf(Animated.Value),
- contentInset: PropTypes.shape({
- left: PropTypes.number,
- right: PropTypes.number,
- }),
- };
+ // contentInset: PropTypes.shape({
+ // left: PropTypes.number,
+ // right: PropTypes.number,
+ // }),
+ // };
borderProps() {
let {