added customer application
|
@ -0,0 +1,150 @@
|
||||||
|
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()
|
||||||
|
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'
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,77 @@
|
||||||
|
{
|
||||||
|
"expo": {
|
||||||
|
"name": "Enatega",
|
||||||
|
"version": "1.0.16",
|
||||||
|
"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": "AIzaSyD0vSz1qjsn_RSPBB9HRD1Eqztm7DyuKw8"
|
||||||
|
},
|
||||||
|
"usesAppleSignIn": true,
|
||||||
|
"infoPlist": {
|
||||||
|
"NSLocationWhenInUseUsageDescription": "This app uses the location to determine the delivery address for your orders."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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",
|
||||||
|
"useNextNotificationsApi": true,
|
||||||
|
"config": {
|
||||||
|
"googleMaps": {
|
||||||
|
"apiKey": "AIzaSyBt9S6e7ig5EkNiSXw3sCyX7kgo1gzPxl4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 345 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 63 KiB |
After Width: | Height: | Size: 85 KiB |
|
@ -0,0 +1,7 @@
|
||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true)
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
plugins: ['react-native-reanimated/plugin']
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDRTCCAi2gAwIBAgIERu0DYTANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJV
|
||||||
|
UzEJMAcGA1UECBMAMQkwBwYDVQQHEwAxCTAHBgNVBAoTADEJMAcGA1UECxMAMRgw
|
||||||
|
FgYDVQQDEw9jb20uZW5hdGVnYS5hcHAwHhcNMTkwNzI2MDg0NzEyWhcNNDYxMjEx
|
||||||
|
MDg0NzEyWjBTMQswCQYDVQQGEwJVUzEJMAcGA1UECBMAMQkwBwYDVQQHEwAxCTAH
|
||||||
|
BgNVBAoTADEJMAcGA1UECxMAMRgwFgYDVQQDEw9jb20uZW5hdGVnYS5hcHAwggEi
|
||||||
|
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQChW6yOHftMY4PZYS/1VK72o0mj
|
||||||
|
TMxVrolnwN46QrCkwX3MTC5Rf014MCOfWjRpbeCnL/ZFW5hMu1gfZhI3cU6n8kKi
|
||||||
|
3xkhIgtxoaGecC594WzOJfFNhNuHbdJTp4KlPli8k1CiWSxzddnxDaJX1zLh4vbp
|
||||||
|
Z1czC0k7HY6Muhpd7WCC1uwcp0UzCm1ej7LZqYPuUzwieW0V/ASMdS9yWri4LyIO
|
||||||
|
DA6nFbDdvCJrupL0C8RQjACCRMLwGx2l3zMlWe3nDa4ZyMRW6cdSsQA6QvlwxVeK
|
||||||
|
6I40S8fYsUf68/QZrnBwTV9yyJ78bIpF+9zF3b7kcv7tXAKkcuoQcd/70e79AgMB
|
||||||
|
AAGjITAfMB0GA1UdDgQWBBQ71L/oHvSkF0v65nI4B1iVLSFcfDANBgkqhkiG9w0B
|
||||||
|
AQsFAAOCAQEAlzMU9jy1oCtrxeucJcx5LU2+4Np/pdhfofivK3W6cLJ6yqAvKxNC
|
||||||
|
cmO+4mwG8O9s5bYtscB7+n9u1JYNOGMtyzAbjW2tzysaPU9EPatD+oAQznU1ur28
|
||||||
|
v5YCTmS1tv4wRsYkjYGI+S+XQ+qi/wuNith2te1qoUfdl4/JCIA8kw7XPU9eLkDE
|
||||||
|
r3RrsZXV7NTIo2f2nnTeJWz9QFtERevQlgpwOnCqmqvPKV3n52sH5R/8g3xjiL1W
|
||||||
|
wP1JHGErSFGVbctYH6HTsHQkAfmzPeK7UOfB+kR70dXkPKdw3u+pdv8jzaRO9gpq
|
||||||
|
H97r6aLCoyB53CJ+6w51DSl1eAKMGK7Tcg==
|
||||||
|
-----END CERTIFICATE-----
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*****************************
|
||||||
|
* environment.js
|
||||||
|
* path: '/environment.js' (root of your project)
|
||||||
|
******************************/
|
||||||
|
|
||||||
|
import Constants from 'expo-constants'
|
||||||
|
|
||||||
|
const ENV = {
|
||||||
|
development: {
|
||||||
|
GRAPHQL_URL: 'http://192.168.100.90:8000/graphql',
|
||||||
|
WS_GRAPHQL_URL: 'ws://192.168.100.90:8000/graphql',
|
||||||
|
SERVER_URL: 'http://192.168.100.90:8000/', // put / at the end of server url
|
||||||
|
IOS_CLIENT_ID_GOOGLE:
|
||||||
|
'967541328677-uq7f7odvmeea2pb2sq0l7q320ds86536.apps.googleusercontent.com',
|
||||||
|
ANDROID_CLIENT_ID_GOOGLE:
|
||||||
|
'967541328677-u9lbhmiesp67j3md9b8nk6mkhooeljur.apps.googleusercontent.com',
|
||||||
|
FACEBOOK_APP_ID: '404956210315749',
|
||||||
|
AMPLITUDE_API_KEY: '358ef0deb443586e2cc4ddd4380151f0',
|
||||||
|
STRIPE_PUBLIC_KEY: 'pk_test_lEaBbVGnTkzja2FyFiNlbqtw',
|
||||||
|
STRIPE_IMAGE_URL: 'http://192.168.100.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:
|
||||||
|
'967541328677-nf8h4ou7rhmq9fahs87p057rggo95eah.apps.googleusercontent.com',
|
||||||
|
ANDROID_CLIENT_ID_GOOGLE:
|
||||||
|
'967541328677-7264tf7tkdtoufk844rck9mimrve135c.apps.googleusercontent.com',
|
||||||
|
FACEBOOK_APP_ID: '404956210315749',
|
||||||
|
AMPLITUDE_API_KEY: '358ef0deb443586e2cc4ddd4380151f0',
|
||||||
|
STRIPE_PUBLIC_KEY: 'pk_test_lEaBbVGnTkzja2FyFiNlbqtw',
|
||||||
|
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:
|
||||||
|
'94983896797-irt6u2cmq2sjcp7j1rj9m9pqptjd12ue.apps.googleusercontent.com',
|
||||||
|
ANDROID_CLIENT_ID_GOOGLE:
|
||||||
|
'94983896797-omp6mi32rl3126siafgnskrqql0rdk5c.apps.googleusercontent.com',
|
||||||
|
FACEBOOK_APP_ID: '3017447961609878',
|
||||||
|
AMPLITUDE_API_KEY: '358ef0deb443586e2cc4ddd4380151f0',
|
||||||
|
STRIPE_PUBLIC_KEY: 'pk_test_lEaBbVGnTkzja2FyFiNlbqtw',
|
||||||
|
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
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*****************************
|
||||||
|
* environment.js
|
||||||
|
* path: '/environment.js' (root of your project)
|
||||||
|
******************************/
|
||||||
|
|
||||||
|
import Constants from 'expo-constants';
|
||||||
|
|
||||||
|
const ENV = {
|
||||||
|
development: {
|
||||||
|
GRAPHQL_URL:'' ,
|
||||||
|
SERVER_URL: '', // put / at the end of server url
|
||||||
|
IOS_CLIENT_ID_GOOGLE: "",
|
||||||
|
ANDROID_CLIENT_ID_GOOGLE: "",
|
||||||
|
FACEBOOK_APP_ID: "",
|
||||||
|
AMPLITUDE_API_KEY: "",
|
||||||
|
STRIPE_PUBLIC_KEY: "",
|
||||||
|
STRIPE_IMAGE_URL: "",
|
||||||
|
STRIPE_STORE_NAME: ""
|
||||||
|
},
|
||||||
|
production: {
|
||||||
|
GRAPHQL_URL:'' ,
|
||||||
|
SERVER_URL: '', // put / at the end of server url
|
||||||
|
IOS_CLIENT_ID_GOOGLE: "",
|
||||||
|
ANDROID_CLIENT_ID_GOOGLE: "",
|
||||||
|
FACEBOOK_APP_ID: "",
|
||||||
|
AMPLITUDE_API_KEY: "",
|
||||||
|
STRIPE_PUBLIC_KEY: "",
|
||||||
|
STRIPE_IMAGE_URL: "",
|
||||||
|
STRIPE_STORE_NAME: ""
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
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.
|
||||||
|
if (__DEV__) {
|
||||||
|
return ENV.development;
|
||||||
|
} else if (env === 'production') {
|
||||||
|
return ENV.production;
|
||||||
|
} else {
|
||||||
|
return ENV.development;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default getEnvVars;
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "94983896797",
|
||||||
|
"firebase_url": "https://enatega-production.firebaseio.com",
|
||||||
|
"project_id": "enatega-production",
|
||||||
|
"storage_bucket": "enatega-production.appspot.com"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:94983896797:android:537c4eadfd11cf33",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.enatega.app"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "94983896797-9e36v3edasjt9t9r5q9uvkth700nn0nn.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyBt9S6e7ig5EkNiSXw3sCyX7kgo1gzPxl4"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "94983896797-9e36v3edasjt9t9r5q9uvkth700nn0nn.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client_id": "94983896797-irt6u2cmq2sjcp7j1rj9m9pqptjd12ue.apps.googleusercontent.com",
|
||||||
|
"client_type": 2,
|
||||||
|
"ios_info": {
|
||||||
|
"bundle_id": "com.enatega.app"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "94983896797",
|
||||||
|
"firebase_url": "https://enatega-production.firebaseio.com",
|
||||||
|
"project_id": "enatega-production",
|
||||||
|
"storage_bucket": "enatega-production.appspot.com"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:94983896797:android:5b28fe2925a51512112534",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.enatega.vendor"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "94983896797-9e36v3edasjt9t9r5q9uvkth700nn0nn.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyBt9S6e7ig5EkNiSXw3sCyX7kgo1gzPxl4"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "94983896797-9e36v3edasjt9t9r5q9uvkth700nn0nn.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client_id": "94983896797-osn1lglcn3f03a4dqpf1vl2rcogca8vp.apps.googleusercontent.com",
|
||||||
|
"client_type": 2,
|
||||||
|
"ios_info": {
|
||||||
|
"bundle_id": "com.enatega.app"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "346954645996",
|
||||||
|
"firebase_url": "https://enatega-4d403.firebaseio.com",
|
||||||
|
"project_id": "enatega-4d403",
|
||||||
|
"storage_bucket": "enatega-4d403.appspot.com"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:346954645996:android:f968efbb41d1fa7a",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "host.exp.exponent"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "346954645996-a2t28in6j98u33hnd4evb45m5d34lvjp.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyCFfJ4RHfakMqvp_QsIHkfWcpeYrxtk8j0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "346954645996-a2t28in6j98u33hnd4evb45m5d34lvjp.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
import AsyncStorage from '@react-native-async-storage/async-storage'
|
||||||
|
import * as Localization from 'expo-localization'
|
||||||
|
import i18n from 'i18n-js'
|
||||||
|
import { Platform } from 'react-native'
|
||||||
|
import { de } from './translations/de'
|
||||||
|
import { en } from './translations/en'
|
||||||
|
import { fr } from './translations/fr'
|
||||||
|
import { km } from './translations/km'
|
||||||
|
import { zh } from './translations/zh'
|
||||||
|
|
||||||
|
i18n.initAsync = async() => {
|
||||||
|
i18n.fallbacks = true
|
||||||
|
i18n.translations = { fr, en, km, zh, de }
|
||||||
|
// i18n.locale = 'km'
|
||||||
|
if (Platform.OS === 'android') {
|
||||||
|
const lang = await AsyncStorage.getItem('enatega-language')
|
||||||
|
i18n.locale = lang || 'en'
|
||||||
|
} else {
|
||||||
|
i18n.locale = Localization.locale
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default i18n
|
|
@ -0,0 +1,118 @@
|
||||||
|
{
|
||||||
|
"name": "enatega-full-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",
|
||||||
|
"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": {
|
||||||
|
"@apollo/react-hooks": "^3.1.3",
|
||||||
|
"@expo/vector-icons": "^12.0.0",
|
||||||
|
"@ptomasroos/react-native-multi-slider": "^2.2.2",
|
||||||
|
"@react-native-async-storage/async-storage": "~1.15.0",
|
||||||
|
"@react-native-community/masked-view": "0.1.10",
|
||||||
|
"@react-navigation/drawer": "^5.12.5",
|
||||||
|
"@react-navigation/native": "^5.9.4",
|
||||||
|
"@react-navigation/stack": "^5.14.5",
|
||||||
|
"apollo-boost": "^0.3.1",
|
||||||
|
"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",
|
||||||
|
"expo": "^44.0.0",
|
||||||
|
"expo-analytics-amplitude": "~11.1.0",
|
||||||
|
"expo-app-auth": "~11.1.0",
|
||||||
|
"expo-app-loading": "~1.3.0",
|
||||||
|
"expo-apple-authentication": "~4.1.0",
|
||||||
|
"expo-application": "~4.0.1",
|
||||||
|
"expo-asset": "~8.4.6",
|
||||||
|
"expo-constants": "~13.0.1",
|
||||||
|
"expo-device": "~4.1.0",
|
||||||
|
"expo-facebook": "~12.1.0",
|
||||||
|
"expo-font": "~10.0.4",
|
||||||
|
"expo-google-app-auth": "~8.3.0",
|
||||||
|
"expo-image-picker": "~12.0.1",
|
||||||
|
"expo-linking": "~3.0.0",
|
||||||
|
"expo-localization": "~12.0.0",
|
||||||
|
"expo-location": "~14.0.1",
|
||||||
|
"expo-notifications": "~0.14.0",
|
||||||
|
"expo-splash-screen": "~0.14.1",
|
||||||
|
"expo-tracking-transparency": "~2.1.0",
|
||||||
|
"expo-updates": "~0.11.6",
|
||||||
|
"graphql": "^14.5.8",
|
||||||
|
"graphql-tag": "^2.10.1",
|
||||||
|
"i18n-js": "^3.2.2",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"patch-package": "^6.2.2",
|
||||||
|
"react": "17.0.1",
|
||||||
|
"react-apollo": "^2.5.8",
|
||||||
|
"react-native": "0.64.3",
|
||||||
|
"react-native-flash-message": "^0.1.23",
|
||||||
|
"react-native-flatlist-slider": "^1.0.5",
|
||||||
|
"react-native-gesture-handler": "~2.1.0",
|
||||||
|
"react-native-gifted-chat": "^0.16.3",
|
||||||
|
"react-native-maps": "0.29.4",
|
||||||
|
"react-native-material-textfield": "^0.16.1",
|
||||||
|
"react-native-modal": "^11.10.0",
|
||||||
|
"react-native-modalize": "^2.0.8",
|
||||||
|
"react-native-reanimated": "~2.3.1",
|
||||||
|
"react-native-safe-area-context": "3.3.2",
|
||||||
|
"react-native-screens": "~3.10.1",
|
||||||
|
"react-native-star-rating": "^1.1.0",
|
||||||
|
"react-native-svg": "12.1.1",
|
||||||
|
"react-native-timeline-flatlist": "^0.7.2",
|
||||||
|
"react-native-webview": "11.15.0",
|
||||||
|
"subscriptions-transport-ws": "^0.9.16",
|
||||||
|
"uuid": "^3.3.2",
|
||||||
|
"validate.js": "^0.12.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-jest": "^24.8.0",
|
||||||
|
"babel-preset-expo": "9.0.2",
|
||||||
|
"babel-preset-react-native": "^4.0.1",
|
||||||
|
"eslint": "^7.28.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.3.8",
|
||||||
|
"jest": "^26.6.3",
|
||||||
|
"jest-react-native": "^18.0.0",
|
||||||
|
"lint-staged": "^10.5.4",
|
||||||
|
"metro-react-native-babel-preset": "^0.54.1",
|
||||||
|
"prettier": "^2.3.1",
|
||||||
|
"prettier-config-standard": "^1.0.1",
|
||||||
|
"react-test-renderer": "^16.8.6"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"preset": "react-native",
|
||||||
|
"transformIgnorePatterns": [
|
||||||
|
"node_modules/(?!(react-native|expo|@expo|apollo-boost|apollo-cache-inmemory|apollo-client|apollo-link-context|apollo-link-http|apollo-link-state|apollo-upload-client|graphql|graphql-tag|react-apollo|react-native-animatable|react-native-material-buttons|react-native-material-ripple|react-native-material-textfield|react-native-ratings|react-native-swiper-flatlist|react-native-timeline-listview|react-navigation|validate.js)/)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"private": true
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
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..c12b3a6 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
|
||||||
|
@@ -11,7 +11,7 @@ export default class Affix extends PureComponent {
|
||||||
|
|
||||||
|
static propTypes = {
|
||||||
|
numberOfLines: PropTypes.number,
|
||||||
|
- style: Animated.Text.propTypes.style,
|
||||||
|
+ style: PropTypes.object,
|
||||||
|
|
||||||
|
color: PropTypes.string.isRequired,
|
||||||
|
fontSize: PropTypes.number.isRequired,
|
||||||
|
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..9bbf2e2 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
|
||||||
|
@@ -221,6 +221,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..fe9d9c4 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
|
||||||
|
@@ -11,7 +11,7 @@ export default class Helper extends PureComponent {
|
||||||
|
|
||||||
|
disabled: PropTypes.bool,
|
||||||
|
|
||||||
|
- style: Animated.Text.propTypes.style,
|
||||||
|
+ style: PropTypes.object,
|
||||||
|
|
||||||
|
baseColor: PropTypes.string,
|
||||||
|
errorColor: PropTypes.string,
|
||||||
|
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..809fcdd 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
|
||||||
|
@@ -43,7 +43,7 @@ export default class Label extends PureComponent {
|
||||||
|
y1: PropTypes.number,
|
||||||
|
}),
|
||||||
|
|
||||||
|
- style: Animated.Text.propTypes.style,
|
||||||
|
+ style: PropTypes.object,
|
||||||
|
label: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
const COLORS = {
|
||||||
|
white: '#FFFFFF',
|
||||||
|
black: '#000000',
|
||||||
|
black02: 'rgba(0, 0, 0, 0.2)',
|
||||||
|
primary: '#febb2c',
|
||||||
|
darkGrey: '#333333',
|
||||||
|
offWhite: '#FAFAFA',
|
||||||
|
lineGrey: '#e7e5e4',
|
||||||
|
lightGrey: '#a5a5a5',
|
||||||
|
lightWhite: '#FCFCFC',
|
||||||
|
whitishGrey: '#7F7F7F',
|
||||||
|
lightBlack: '#292929',
|
||||||
|
redishPink: '#ff4866',
|
||||||
|
primaryBlue: '#00b9c6',
|
||||||
|
primaryBlack: '#0b0b0b',
|
||||||
|
blueShadeGrey: '#f7f7fb',
|
||||||
|
primaryLightBlue: '#0cc8d5',
|
||||||
|
lightBlueShadeGrey: '#f8f9fa',
|
||||||
|
mediumBlueShadeGrey: '#f2f4f5',
|
||||||
|
black06: 'rgba(0,0,0,0.6)',
|
||||||
|
white06: 'rgba(255,255,255,0.6)',
|
||||||
|
redishOrange: '#FA7751',
|
||||||
|
blueColor: '#00b9c6',
|
||||||
|
yellowishOrange: '#fff1d4'
|
||||||
|
}
|
||||||
|
export { COLORS }
|
|
@ -0,0 +1,82 @@
|
||||||
|
import { DarkTheme, DefaultTheme } from '@react-navigation/native'
|
||||||
|
import { COLORS } from './Colors'
|
||||||
|
const Theme = {
|
||||||
|
Light: {
|
||||||
|
...DefaultTheme,
|
||||||
|
colors: {
|
||||||
|
...DefaultTheme.colors,
|
||||||
|
black: COLORS.black,
|
||||||
|
white: COLORS.white,
|
||||||
|
curve: COLORS.primary,
|
||||||
|
selected: COLORS.primary,
|
||||||
|
fontWhite: COLORS.white,
|
||||||
|
tagColor: COLORS.primary,
|
||||||
|
iconColor: COLORS.darkGrey,
|
||||||
|
iconColorPrimary: COLORS.primary,
|
||||||
|
cardContainer: COLORS.white,
|
||||||
|
rippleColor: COLORS.black02,
|
||||||
|
background: COLORS.white,
|
||||||
|
lightBackground: COLORS.lightBlueShadeGrey,
|
||||||
|
headerbackground: COLORS.primary,
|
||||||
|
headerbackground2: COLORS.offWhite,
|
||||||
|
headerTextColor: COLORS.primaryBlack,
|
||||||
|
fontMainColor: COLORS.primaryBlack,
|
||||||
|
fontSecondColor: COLORS.lightGrey,
|
||||||
|
placeHolderColor: COLORS.lightGrey,
|
||||||
|
buttonBackground: COLORS.primary,
|
||||||
|
buttonBackgroundLight: COLORS.mediumBlueShadeGrey,
|
||||||
|
buttonBackgroundBlue: COLORS.primaryLightBlue,
|
||||||
|
active: COLORS.primaryLightBlue,
|
||||||
|
buttonText: COLORS.white,
|
||||||
|
horizontalLine: COLORS.lineGrey,
|
||||||
|
shadowColor: COLORS.black06,
|
||||||
|
drawerBackground: COLORS.primary,
|
||||||
|
spinnerColor: COLORS.primary,
|
||||||
|
errorColor: COLORS.redishOrange,
|
||||||
|
radioColor: COLORS.white,
|
||||||
|
radioOuterColor: COLORS.primary,
|
||||||
|
blueColor: COLORS.blueColor,
|
||||||
|
chatBubblePrimary: COLORS.yellowishOrange
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Dark: {
|
||||||
|
...DarkTheme,
|
||||||
|
colors: {
|
||||||
|
...DarkTheme.colors,
|
||||||
|
white: COLORS.white,
|
||||||
|
black: COLORS.black,
|
||||||
|
curve: COLORS.primary,
|
||||||
|
selected: COLORS.primary,
|
||||||
|
fontWhite: COLORS.white,
|
||||||
|
tagColor: COLORS.primary,
|
||||||
|
rippleColor: COLORS.black02,
|
||||||
|
background: COLORS.lightBlack,
|
||||||
|
lightBackground: COLORS.lightBlueShadeGrey,
|
||||||
|
cardContainer: COLORS.darkGrey,
|
||||||
|
iconColor: COLORS.lightWhite,
|
||||||
|
iconColorPrimary: COLORS.primary,
|
||||||
|
headerbackground: COLORS.black,
|
||||||
|
headerbackground2: COLORS.black,
|
||||||
|
headerTextColor: COLORS.primaryBlack,
|
||||||
|
fontMainColor: COLORS.lightWhite,
|
||||||
|
fontSecondColor: COLORS.whitishGrey,
|
||||||
|
placeHolderColor: COLORS.lightGrey,
|
||||||
|
buttonBackground: COLORS.primary,
|
||||||
|
buttonBackgroundLight: COLORS.mediumBlueShadeGrey,
|
||||||
|
buttonBackgroundBlue: COLORS.primaryLightBlue,
|
||||||
|
active: COLORS.primaryLightBlue,
|
||||||
|
buttonText: COLORS.white,
|
||||||
|
horizontalLine: COLORS.lineGrey,
|
||||||
|
shadowColor: COLORS.white06,
|
||||||
|
drawerBackground: COLORS.primary,
|
||||||
|
spinnerColor: COLORS.primary,
|
||||||
|
errorColor: COLORS.redishOrange,
|
||||||
|
radioColor: COLORS.white,
|
||||||
|
radioOuterColor: COLORS.primary,
|
||||||
|
blueColor: COLORS.blueColor,
|
||||||
|
chatBubblePrimary: COLORS.yellowishOrange
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Theme
|
|
@ -0,0 +1,4 @@
|
||||||
|
import { COLORS } from './Colors'
|
||||||
|
import THEME from './Theme'
|
||||||
|
|
||||||
|
export { COLORS, THEME }
|
|
@ -0,0 +1,92 @@
|
||||||
|
import AsyncStorage from '@react-native-async-storage/async-storage'
|
||||||
|
import { defaultDataIdFromObject, InMemoryCache } from 'apollo-cache-inmemory'
|
||||||
|
import { persistCache } from 'apollo-cache-persist'
|
||||||
|
import { ApolloClient } from 'apollo-client'
|
||||||
|
import { ApolloLink, concat, Observable, split } from 'apollo-link'
|
||||||
|
import { createHttpLink } from 'apollo-link-http'
|
||||||
|
import { WebSocketLink } from 'apollo-link-ws'
|
||||||
|
import { getMainDefinition } from 'apollo-utilities'
|
||||||
|
import getEnvVars from '../../environment'
|
||||||
|
|
||||||
|
const { GRAPHQL_URL, WS_GRAPHQL_URL } = getEnvVars()
|
||||||
|
|
||||||
|
const cache = new InMemoryCache({
|
||||||
|
dataIdFromObject: object => {
|
||||||
|
switch (object.__typename) {
|
||||||
|
case 'CartItem':
|
||||||
|
return object.key // use `key` as the primary key
|
||||||
|
default:
|
||||||
|
return defaultDataIdFromObject(object) // fall back to default handling
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const httpLink = createHttpLink({
|
||||||
|
uri: GRAPHQL_URL
|
||||||
|
})
|
||||||
|
|
||||||
|
const wsLink = new WebSocketLink({
|
||||||
|
uri: WS_GRAPHQL_URL,
|
||||||
|
options: {
|
||||||
|
reconnect: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const request = async operation => {
|
||||||
|
const token = await AsyncStorage.getItem('token')
|
||||||
|
|
||||||
|
operation.setContext({
|
||||||
|
// get the authentication token from local storage if it exists
|
||||||
|
// return the headers to the context so httpLink can read them
|
||||||
|
headers: {
|
||||||
|
authorization: token ? `Bearer ${token}` : ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const requestLink = new ApolloLink(
|
||||||
|
(operation, forward) =>
|
||||||
|
new Observable(observer => {
|
||||||
|
// console.log(observer)
|
||||||
|
let handle
|
||||||
|
Promise.resolve(operation)
|
||||||
|
.then(oper => request(oper))
|
||||||
|
.then(() => {
|
||||||
|
handle = forward(operation).subscribe({
|
||||||
|
next: observer.next.bind(observer),
|
||||||
|
error: observer.error.bind(observer),
|
||||||
|
complete: observer.complete.bind(observer)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch(observer.error.bind(observer))
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
if (handle) handle.unsubscribe()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
const terminatingLink = split(({ query }) => {
|
||||||
|
const { kind, operation } = getMainDefinition(query)
|
||||||
|
return kind === 'OperationDefinition' && operation === 'subscription'
|
||||||
|
}, wsLink)
|
||||||
|
|
||||||
|
const setupApollo = async() => {
|
||||||
|
await persistCache({
|
||||||
|
cache,
|
||||||
|
storage: AsyncStorage
|
||||||
|
})
|
||||||
|
const client = new ApolloClient({
|
||||||
|
link: concat(ApolloLink.from([terminatingLink, requestLink]), httpLink),
|
||||||
|
cache,
|
||||||
|
resolvers: {}
|
||||||
|
})
|
||||||
|
|
||||||
|
// set ref for global use
|
||||||
|
// eslint-disable-next-line no-undef
|
||||||
|
clientRef = client
|
||||||
|
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
|
export default setupApollo
|
|
@ -0,0 +1,590 @@
|
||||||
|
export const login = `
|
||||||
|
mutation Login($facebookId:String,$email:String,$password:String,$type:String!,$appleId:String,$name:String,$notificationToken:String){
|
||||||
|
login(facebookId:$facebookId,email:$email,password:$password,type:$type,appleId:$appleId,name:$name,notificationToken:$notificationToken){
|
||||||
|
userId
|
||||||
|
token
|
||||||
|
tokenExpiration
|
||||||
|
name
|
||||||
|
email
|
||||||
|
phone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
export const categories = `
|
||||||
|
{
|
||||||
|
categories{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
img_menu
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const foods = `
|
||||||
|
query FoodByCategory($category:String!,$onSale:Boolean,$inStock:Boolean,$min:Float,$max:Float,$search:String){
|
||||||
|
foodByCategory(category:$category,onSale:$onSale,inStock:$inStock,min:$min,max:$max,search:$search){
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
variations{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
price
|
||||||
|
discounted
|
||||||
|
addons{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
quantity_minimum
|
||||||
|
quantity_maximum
|
||||||
|
options{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
price
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
category{_id}
|
||||||
|
img_url
|
||||||
|
stock
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const createUser = `
|
||||||
|
mutation CreateUser($facebookId:String,$phone:String,$email:String,$password:String,$name:String,$notificationToken:String,$appleId:String){
|
||||||
|
createUser(userInput:{
|
||||||
|
facebookId:$facebookId,
|
||||||
|
phone:$phone,
|
||||||
|
email:$email,
|
||||||
|
password:$password,
|
||||||
|
name:$name,
|
||||||
|
notificationToken:$notificationToken,
|
||||||
|
appleId:$appleId
|
||||||
|
}){
|
||||||
|
userId
|
||||||
|
token
|
||||||
|
tokenExpiration
|
||||||
|
name
|
||||||
|
email
|
||||||
|
phone
|
||||||
|
notificationToken
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const updateUser = `
|
||||||
|
mutation UpdateUser($name:String!,$phone:String!){
|
||||||
|
updateUser(updateUserInput:{name:$name,phone:$phone}){
|
||||||
|
_id
|
||||||
|
name
|
||||||
|
phone
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const updateNotificationStatus = `
|
||||||
|
mutation UpdateNotificationStatus($offerNotification:Boolean!,$orderNotification:Boolean!){
|
||||||
|
updateNotificationStatus(offerNotification:$offerNotification,orderNotification:$orderNotification){
|
||||||
|
_id
|
||||||
|
notificationToken
|
||||||
|
is_order_notification
|
||||||
|
is_offer_notification
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
export const profile = `
|
||||||
|
query{
|
||||||
|
profile{
|
||||||
|
_id
|
||||||
|
name
|
||||||
|
phone
|
||||||
|
email
|
||||||
|
notificationToken
|
||||||
|
is_order_notification
|
||||||
|
is_offer_notification
|
||||||
|
addresses{
|
||||||
|
_id
|
||||||
|
label
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
longitude
|
||||||
|
latitude
|
||||||
|
selected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const order = `query Order($id:String!){
|
||||||
|
order(id:$id){
|
||||||
|
_id
|
||||||
|
delivery_address{
|
||||||
|
latitude
|
||||||
|
longitude
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
label
|
||||||
|
}
|
||||||
|
delivery_charges
|
||||||
|
order_id
|
||||||
|
user{
|
||||||
|
_id
|
||||||
|
phone
|
||||||
|
}
|
||||||
|
items{
|
||||||
|
_id
|
||||||
|
food{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
category{
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
description
|
||||||
|
img_url
|
||||||
|
|
||||||
|
}
|
||||||
|
variation{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
price
|
||||||
|
}
|
||||||
|
addons{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
quantity_minimum
|
||||||
|
quantity_maximum
|
||||||
|
options{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
price
|
||||||
|
}
|
||||||
|
}
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
payment_status
|
||||||
|
payment_method
|
||||||
|
order_amount
|
||||||
|
paid_amount
|
||||||
|
order_status
|
||||||
|
status_queue{
|
||||||
|
pending
|
||||||
|
preparing
|
||||||
|
picked
|
||||||
|
delivered
|
||||||
|
cancelled
|
||||||
|
}
|
||||||
|
createdAt
|
||||||
|
review{
|
||||||
|
_id
|
||||||
|
rating
|
||||||
|
description
|
||||||
|
}
|
||||||
|
rider{
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
export const myOrders = `query Orders($offset:Int){
|
||||||
|
orders(offset:$offset){
|
||||||
|
_id
|
||||||
|
delivery_address{
|
||||||
|
latitude
|
||||||
|
longitude
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
label
|
||||||
|
}
|
||||||
|
delivery_charges
|
||||||
|
order_id
|
||||||
|
user{
|
||||||
|
_id
|
||||||
|
phone
|
||||||
|
}
|
||||||
|
|
||||||
|
items{
|
||||||
|
_id
|
||||||
|
food{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
category{
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
description
|
||||||
|
img_url
|
||||||
|
}
|
||||||
|
variation{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
price
|
||||||
|
}
|
||||||
|
addons{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
quantity_minimum
|
||||||
|
quantity_maximum
|
||||||
|
options{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
price
|
||||||
|
}
|
||||||
|
}
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
payment_status
|
||||||
|
payment_method
|
||||||
|
order_amount
|
||||||
|
paid_amount
|
||||||
|
order_status
|
||||||
|
status_queue{
|
||||||
|
pending
|
||||||
|
preparing
|
||||||
|
picked
|
||||||
|
delivered
|
||||||
|
cancelled
|
||||||
|
}
|
||||||
|
createdAt
|
||||||
|
review{
|
||||||
|
_id
|
||||||
|
rating
|
||||||
|
description
|
||||||
|
}
|
||||||
|
rider{
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
//
|
||||||
|
// can we get userId from request instead??
|
||||||
|
// needs research
|
||||||
|
//
|
||||||
|
|
||||||
|
export const orderStatusChanged = `subscription OrderStatusChanged($userId:String!){
|
||||||
|
orderStatusChanged(userId:$userId)
|
||||||
|
{
|
||||||
|
userId
|
||||||
|
origin
|
||||||
|
order{
|
||||||
|
_id
|
||||||
|
delivery_address{
|
||||||
|
latitude
|
||||||
|
longitude
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
label
|
||||||
|
}
|
||||||
|
delivery_charges
|
||||||
|
order_id
|
||||||
|
user{
|
||||||
|
_id
|
||||||
|
phone
|
||||||
|
}
|
||||||
|
|
||||||
|
items{
|
||||||
|
_id
|
||||||
|
food{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
category{
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
description
|
||||||
|
img_url
|
||||||
|
}
|
||||||
|
variation{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
price
|
||||||
|
}
|
||||||
|
addons{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
quantity_minimum
|
||||||
|
quantity_maximum
|
||||||
|
options{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
price
|
||||||
|
}
|
||||||
|
}
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
payment_status
|
||||||
|
payment_method
|
||||||
|
order_amount
|
||||||
|
paid_amount
|
||||||
|
order_status
|
||||||
|
status_queue{
|
||||||
|
pending
|
||||||
|
preparing
|
||||||
|
picked
|
||||||
|
delivered
|
||||||
|
cancelled
|
||||||
|
}
|
||||||
|
createdAt
|
||||||
|
review{
|
||||||
|
_id
|
||||||
|
rating
|
||||||
|
description
|
||||||
|
}
|
||||||
|
rider{
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
//
|
||||||
|
// status queue??
|
||||||
|
// can we use address id instead of address object, then get the address on backend??
|
||||||
|
//
|
||||||
|
export const placeOrder = `
|
||||||
|
mutation PlaceOrder($orderInput:[OrderInput!]!,$paymentMethod:String!,$couponCode:String,$address:AddressInput!){
|
||||||
|
placeOrder(orderInput: $orderInput,paymentMethod:$paymentMethod,couponCode:$couponCode,address:$address) {
|
||||||
|
_id
|
||||||
|
order_id
|
||||||
|
delivery_address{
|
||||||
|
latitude
|
||||||
|
longitude
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
label
|
||||||
|
}
|
||||||
|
delivery_charges
|
||||||
|
items{
|
||||||
|
_id
|
||||||
|
food{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
category{
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
description
|
||||||
|
img_url
|
||||||
|
}
|
||||||
|
variation{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
price
|
||||||
|
}
|
||||||
|
addons{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
quantity_minimum
|
||||||
|
quantity_maximum
|
||||||
|
options{
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
price
|
||||||
|
}
|
||||||
|
}
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
user {
|
||||||
|
_id
|
||||||
|
phone
|
||||||
|
email
|
||||||
|
}
|
||||||
|
rider{
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
payment_status
|
||||||
|
payment_method
|
||||||
|
paid_amount
|
||||||
|
order_amount
|
||||||
|
order_status
|
||||||
|
status_queue{
|
||||||
|
pending
|
||||||
|
preparing
|
||||||
|
picked
|
||||||
|
delivered
|
||||||
|
cancelled
|
||||||
|
}
|
||||||
|
createdAt
|
||||||
|
review{
|
||||||
|
_id
|
||||||
|
rating
|
||||||
|
description
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const reviewOrder = `mutation ReviewOrder(
|
||||||
|
$orderId:String!,
|
||||||
|
$rating:Int!,
|
||||||
|
$description:String
|
||||||
|
){
|
||||||
|
reviewOrder(reviewInput:{
|
||||||
|
orderId:$orderId,
|
||||||
|
rating:$rating,
|
||||||
|
description:$description
|
||||||
|
}){
|
||||||
|
_id
|
||||||
|
order_id
|
||||||
|
review{
|
||||||
|
_id
|
||||||
|
rating
|
||||||
|
description
|
||||||
|
}
|
||||||
|
createdAt
|
||||||
|
updatedAt
|
||||||
|
is_active
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
//
|
||||||
|
// use this to push token instead of login, signup mutation?
|
||||||
|
// needs research
|
||||||
|
//
|
||||||
|
export const pushToken = `mutation PushToken($token:String!){
|
||||||
|
pushToken(token:$token){
|
||||||
|
_id
|
||||||
|
notificationToken
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const getConfiguration = `query Configuration{
|
||||||
|
configuration{
|
||||||
|
_id
|
||||||
|
currency
|
||||||
|
currency_symbol
|
||||||
|
delivery_charges
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const foodByIds = `query FoodByIds($ids:[String!]!){
|
||||||
|
foodByIds(ids: $ids) {
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
img_url
|
||||||
|
stock
|
||||||
|
category {
|
||||||
|
_id
|
||||||
|
}
|
||||||
|
variations {
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
price
|
||||||
|
discounted
|
||||||
|
addons {
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
quantity_minimum
|
||||||
|
quantity_maximum
|
||||||
|
options {
|
||||||
|
_id
|
||||||
|
title
|
||||||
|
description
|
||||||
|
price
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const getCoupon = `mutation Coupon($coupon:String!){
|
||||||
|
coupon(coupon:$coupon){
|
||||||
|
_id
|
||||||
|
code
|
||||||
|
discount
|
||||||
|
enabled
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const deleteAddress = `mutation DeleteAddress($id:ID!){
|
||||||
|
deleteAddress(id:$id){
|
||||||
|
_id
|
||||||
|
addresses{
|
||||||
|
_id
|
||||||
|
label
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
longitude
|
||||||
|
latitude
|
||||||
|
selected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const createAddress = `mutation CreateAddress($addressInput:AddressInput!){
|
||||||
|
createAddress(addressInput:$addressInput){
|
||||||
|
_id
|
||||||
|
addresses{
|
||||||
|
_id
|
||||||
|
label
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
longitude
|
||||||
|
latitude
|
||||||
|
selected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const editAddress = `mutation EditAddress($addressInput:AddressInput!){
|
||||||
|
editAddress(addressInput:$addressInput){
|
||||||
|
_id
|
||||||
|
label
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
longitude
|
||||||
|
latitude
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const changePassword = `mutation ChangePassword($oldPassword:String!,$newPassword:String!){
|
||||||
|
changePassword(oldPassword:$oldPassword,newPassword:$newPassword)
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const forgotPassword = `mutation ForgotPassword($email:String!){
|
||||||
|
forgotPassword(email:$email){
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const selectAddress = `mutation SelectAddress($id:String!){
|
||||||
|
selectAddress(id:$id){
|
||||||
|
_id
|
||||||
|
addresses{
|
||||||
|
_id
|
||||||
|
label
|
||||||
|
delivery_address
|
||||||
|
details
|
||||||
|
longitude
|
||||||
|
latitude
|
||||||
|
selected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const subscriptionRiderLocation = `subscription SubscriptionRiderLocation($riderId:String!){
|
||||||
|
subscriptionRiderLocation(riderId:$riderId) {
|
||||||
|
_id
|
||||||
|
location {
|
||||||
|
latitude
|
||||||
|
longitude
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
export const rider = `query Rider($id:String){
|
||||||
|
rider(id:$id){
|
||||||
|
_id
|
||||||
|
location {
|
||||||
|
latitude
|
||||||
|
longitude
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`
|
|
@ -0,0 +1,20 @@
|
||||||
|
import * as React from 'react'
|
||||||
|
import Svg, { Path } from 'react-native-svg'
|
||||||
|
|
||||||
|
function LogoAlphabet(props) {
|
||||||
|
return (
|
||||||
|
<Svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width={71.456}
|
||||||
|
height={69.504}
|
||||||
|
viewBox="0 0 71.456 69.504"
|
||||||
|
{...props}>
|
||||||
|
<Path
|
||||||
|
fill="#0b0b0b"
|
||||||
|
d="M36.914 69.503a83.004 83.004 0 01-3.529-.106C15.33 68.497.674 54.169.027 36.773a35.8 35.8 0 018.081-24.387A35.35 35.35 0 0130.626.199a28.342 28.342 0 013.9-.192h.237Q42.995-.001 51.227 0h15.658a4.54 4.54 0 013.9 2.193 4.525 4.525 0 01.161 4.459l-1.9 3.675-3.007 5.793c-3.808 7.333-7.746 14.914-11.558 22.4a6.11 6.11 0 01-5.984 3.75h-.124c-4.9-.053-10.119-.077-16.925-.077q-4.46 0-8.922.009l-6.04.007a26.533 26.533 0 002.291 4.166 18.962 18.962 0 0015.822 8.18c1.459.03 3 .043 4.862.043q1.175 0 2.363-.005h.012a2.7 2.7 0 012.307 1.291 2.707 2.707 0 01.1 2.652l-4.9 9.505a2.705 2.705 0 01-2.4 1.466zM24.305 27.258c6.041 0 12.52-.009 19.069-.078a2.429 2.429 0 00.263-.382c1.73-3.181 3.417-6.466 5.05-9.641l1.141-2.219-2.237-.013c-2.088-.013-4.143-.026-6.18-.026-3.162 0-5.75.031-8.142.1a18.038 18.038 0 00-11.515 4.771 18.807 18.807 0 00-5.338 7.484z"
|
||||||
|
/>
|
||||||
|
</Svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(LogoAlphabet)
|
|
@ -0,0 +1,27 @@
|
||||||
|
import * as React from 'react'
|
||||||
|
import Svg, { Text, TSpan } from 'react-native-svg'
|
||||||
|
|
||||||
|
function LogoName(props) {
|
||||||
|
return (
|
||||||
|
<Svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width={125}
|
||||||
|
height={32}
|
||||||
|
viewBox="0 0 125 32"
|
||||||
|
{...props}>
|
||||||
|
<Text
|
||||||
|
fill="#0b0b0b"
|
||||||
|
fontFamily="AmsiPro-BoldItalic"
|
||||||
|
fontSize={32}
|
||||||
|
fontStyle="italic"
|
||||||
|
fontWeight={700}
|
||||||
|
transform="translate(0 27)">
|
||||||
|
<TSpan x={0} y={0}>
|
||||||
|
{'enatega'}
|
||||||
|
</TSpan>
|
||||||
|
</Text>
|
||||||
|
</Svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(LogoName)
|
|
@ -0,0 +1,18 @@
|
||||||
|
import * as React from 'react'
|
||||||
|
import Svg, { Path } from 'react-native-svg'
|
||||||
|
|
||||||
|
function CartIcon(props) {
|
||||||
|
return (
|
||||||
|
<Svg viewBox="0 0 489 489" width={512} height={512} {...props}>
|
||||||
|
<Path
|
||||||
|
d="M440.1 422.7l-28-315.3c-.6-7-6.5-12.3-13.4-12.3h-57.6C340.3 42.5 297.3 0 244.5 0s-95.8 42.5-96.6 95.1H90.3c-7 0-12.8 5.3-13.4 12.3l-28 315.3c0 .4-.1.8-.1 1.2 0 35.9 32.9 65.1 73.4 65.1h244.6c40.5 0 73.4-29.2 73.4-65.1 0-.4 0-.8-.1-1.2zM244.5 27c37.9 0 68.8 30.4 69.6 68.1H174.9c.8-37.7 31.7-68.1 69.6-68.1zm122.3 435H122.2c-25.4 0-46-16.8-46.4-37.5l26.8-302.3h45.2v41c0 7.5 6 13.5 13.5 13.5s13.5-6 13.5-13.5v-41h139.3v41c0 7.5 6 13.5 13.5 13.5s13.5-6 13.5-13.5v-41h45.2l26.9 302.3c-.4 20.7-21.1 37.5-46.4 37.5z"
|
||||||
|
data-original="#000000"
|
||||||
|
className="prefix__active-path"
|
||||||
|
data-old_color="#000000"
|
||||||
|
fill="#FFF"
|
||||||
|
/>
|
||||||
|
</Svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CartIcon
|
|
@ -0,0 +1,72 @@
|
||||||
|
import * as React from 'react'
|
||||||
|
import Svg, { Defs, G, Path, Circle } from 'react-native-svg'
|
||||||
|
/* SVGR has dropped some elements not supported by react-native-svg: style */
|
||||||
|
|
||||||
|
function EmptyAddress(props) {
|
||||||
|
return (
|
||||||
|
<Svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width={103.104}
|
||||||
|
height={206.775}
|
||||||
|
viewBox="0 0 103.104 206.775"
|
||||||
|
{...props}>
|
||||||
|
<Defs></Defs>
|
||||||
|
<G id="prefix__Group_451" transform="translate(-103.265 -315.494)">
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27770"
|
||||||
|
fill="#3f3d56"
|
||||||
|
d="M188.794 49.138h-1.136V18.014A18.014 18.014 0 00169.645 0H103.7a18.014 18.014 0 00-18.009 18.014v170.748a18.014 18.014 0 0018.009 18.013h65.94a18.014 18.014 0 0018.014-18.014V71.292h1.136z"
|
||||||
|
transform="translate(17.574 315.494)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27771"
|
||||||
|
d="M195.973 29.6v170.5a13.441 13.441 0 01-13.429 13.453h-66.28a13.443 13.443 0 01-13.453-13.434V29.6a13.443 13.443 0 0113.434-13.453h8.055a6.39 6.39 0 005.918 8.8H168a6.39 6.39 0 005.918-8.8h8.607a13.441 13.441 0 0113.453 13.429z"
|
||||||
|
fill="#fff"
|
||||||
|
transform="translate(5.425 304.038)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27772"
|
||||||
|
fill="#e5e5e5"
|
||||||
|
d="M195.973 54.82v-5.807h-8.79v-32.04a13.411 13.411 0 00-4.663-.83h-1.144v32.87h-30.488V24.947h-5.808v24.066h-25.552v-32.87h-3.264a13.325 13.325 0 00-2.544.241v32.629h-10.909v5.807h10.909v13.433l-10.909 6.3v6.708l10.909-6.3v39.966h-10.909v5.807h10.909v57.784h-10.909v5.807h10.909V213.3a13.328 13.328 0 002.544.241h3.264v-29.22h25.552v29.22h5.807v-29.22h30.489v29.22h1.144a13.412 13.412 0 004.663-.83v-28.386h8.79v-5.807h-8.79v-25.262h8.711v-5.807h-8.711v-26.715h8.79v-5.807h-8.79V79.5h8.79v-5.806h-8.79V54.82zm-58.986 0L119.528 64.9V54.82zm-17.46 16.786l25.553-14.753v58.074h-25.552zm0 106.911v-57.783h25.553v57.784zm61.849 0h-30.488v-25.262h30.489zm0-31.07h-30.488v-26.713h30.489zm0-32.522h-30.488V79.5h30.489zm0-41.233h-30.488V54.82h30.489z"
|
||||||
|
transform="translate(5.425 304.038)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27773"
|
||||||
|
d="M277.166 133.105c0 18.442-33.393 59.526-33.393 59.526s-33.393-41.084-33.393-59.526a33.393 33.393 0 1166.785 0z"
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(-70.909 244.735)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27774"
|
||||||
|
d="M296.873 161.458a19.745 19.745 0 11-19.745-19.745 19.736 19.736 0 0119.745 19.727z"
|
||||||
|
fill="#fff"
|
||||||
|
transform="translate(-104.262 214.931)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_321"
|
||||||
|
cx={7.356}
|
||||||
|
cy={7.356}
|
||||||
|
r={7.356}
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(165.44 369.471)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27775"
|
||||||
|
d="M310.059 249.527a19.766 19.766 0 01-21.217 0 11.034 11.034 0 0121.217 0z"
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(-126.588 144.1)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_322"
|
||||||
|
cx={9.001}
|
||||||
|
cy={9.001}
|
||||||
|
r={9.001}
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(163.863 443.464)"
|
||||||
|
/>
|
||||||
|
</G>
|
||||||
|
</Svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(EmptyAddress)
|
|
@ -0,0 +1,116 @@
|
||||||
|
import * as React from 'react'
|
||||||
|
import Svg, { Defs, G, Path, Circle } from 'react-native-svg'
|
||||||
|
/* SVGR has dropped some elements not supported by react-native-svg: style */
|
||||||
|
|
||||||
|
function EmptyCart(props) {
|
||||||
|
return (
|
||||||
|
<Svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width={188.228}
|
||||||
|
height={140.238}
|
||||||
|
viewBox="0 0 188.228 140.238"
|
||||||
|
{...props}>
|
||||||
|
<Defs></Defs>
|
||||||
|
<G id="prefix__Group_450" transform="translate(-75.631 -357.239)">
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27783"
|
||||||
|
d="M188.519 755.456c4.238 7.86 13.233 11.233 13.233 11.233s2.123-9.369-2.115-17.228-13.237-11.233-13.237-11.233-2.119 9.372 2.119 17.228z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="translate(-98.692 -269.439)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27784"
|
||||||
|
fill="#febb2c"
|
||||||
|
d="M169.11 774.942c7.651 4.6 10.6 13.747 10.6 13.747s-9.458 1.68-17.11-2.923-10.6-13.748-10.6-13.748 9.458-1.68 17.11 2.924z"
|
||||||
|
transform="translate(-76.369 -291.51)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Rectangle_2492"
|
||||||
|
d="M0 0h.682v6.308H0z"
|
||||||
|
fill="#f2f2f2"
|
||||||
|
transform="translate(245.871 428.106)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27785"
|
||||||
|
d="M206.016 631.778h-80.742v-.578h80.161v-28.176h-73.373L128.5 595.6l.524-.251 3.406 7.1h73.589z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="translate(-6.926 -149.359)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_327"
|
||||||
|
cx={6.099}
|
||||||
|
cy={6.099}
|
||||||
|
r={6.099}
|
||||||
|
fill="#3f3d56"
|
||||||
|
transform="translate(122.995 484.451)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_328"
|
||||||
|
cx={6.099}
|
||||||
|
cy={6.099}
|
||||||
|
r={6.099}
|
||||||
|
fill="#3f3d56"
|
||||||
|
transform="translate(183.116 484.451)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_329"
|
||||||
|
cx={3.776}
|
||||||
|
cy={3.776}
|
||||||
|
r={3.776}
|
||||||
|
fill="#3f3d56"
|
||||||
|
transform="translate(256.307 357.239)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27786"
|
||||||
|
d="M326.04 541.718h-90.754l-19.637-64.187h130.614l-.119.378zm-90.325-.581h89.9l19.857-63.025H216.434z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="translate(-118.314 -97.638)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27787"
|
||||||
|
d="M179.221 469.941H99.508L82.26 413.015h114.724l-.1.335z"
|
||||||
|
fill="#f2f2f2"
|
||||||
|
transform="translate(21.421 -29.201)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27788"
|
||||||
|
d="M450.38 356.491l-.562-.149 3.833-14.448h22.3v.581H454.1z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="translate(-220.803 17.668)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Rectangle_2497"
|
||||||
|
d="M0 0h117.742v.581H0z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="translate(103.68 399.353)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Rectangle_2498"
|
||||||
|
d="M0 0h104.452v.581H0z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="translate(110.228 420.753)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Rectangle_2499"
|
||||||
|
d="M0 0h.581v63.606H0z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="translate(162.35 380.184)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Rectangle_2500"
|
||||||
|
d="M0 0h63.741v.581H0z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="rotate(-86.27 329.18 123.26)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Rectangle_2501"
|
||||||
|
d="M0 0h.581v63.741H0z"
|
||||||
|
fill="#2f2e41"
|
||||||
|
transform="rotate(-3.729 5907.583 -1895.335)"
|
||||||
|
/>
|
||||||
|
</G>
|
||||||
|
</Svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(EmptyCart)
|
|
@ -0,0 +1,535 @@
|
||||||
|
import * as React from 'react'
|
||||||
|
import Svg, {
|
||||||
|
Defs,
|
||||||
|
LinearGradient,
|
||||||
|
Stop,
|
||||||
|
G,
|
||||||
|
Path,
|
||||||
|
Circle,
|
||||||
|
Ellipse
|
||||||
|
} from 'react-native-svg'
|
||||||
|
/* SVGR has dropped some elements not supported by react-native-svg: style */
|
||||||
|
|
||||||
|
function EmptyFood(props) {
|
||||||
|
return (
|
||||||
|
<Svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width={75.38}
|
||||||
|
height={240.015}
|
||||||
|
viewBox="0 0 75.38 240.015"
|
||||||
|
{...props}>
|
||||||
|
<Defs>
|
||||||
|
<LinearGradient
|
||||||
|
id="prefix__linear-gradient"
|
||||||
|
x1={0.5}
|
||||||
|
x2={0.5}
|
||||||
|
y1={1}
|
||||||
|
gradientUnits="objectBoundingBox">
|
||||||
|
<Stop offset={0} stopColor="gray" stopOpacity={0.251} />
|
||||||
|
<Stop offset={0.535} stopColor="gray" stopOpacity={0.122} />
|
||||||
|
<Stop offset={1} stopColor="gray" stopOpacity={0.102} />
|
||||||
|
</LinearGradient>
|
||||||
|
</Defs>
|
||||||
|
<G id="prefix__Group_452" transform="translate(-14823.746 -14042.397)">
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27691"
|
||||||
|
fill="url(#prefix__linear-gradient)"
|
||||||
|
d="M483.2 234.077c-.533-1.031-3.349-7.44-3.349-7.44l-4.719-12.229s-3.349-5.157-3.349-6.114-6.09-4.788-6.09-4.788-4.948-1.473-5.328-1.621-6.242-2.086-6.242-2.086-2.308-3.035-2.637-2.242l-.036-.058a7.836 7.836 0 01-.88-2.838c-.013-.088-.023-.181-.035-.273a11.3 11.3 0 004.958-9.3 11.14 11.14 0 00-.1-1.446 1.012 1.012 0 01.131-.069c.095-.041.071-.075 0-.109.024-.012.048-.026.072-.036.126-.055.042-.1-.08-.145h.007c.172-.075-.045-.124-.22-.2l-.028-.153a1.029 1.029 0 00.07-.3l.046.023a1.289 1.289 0 000-.576 1.013 1.013 0 01-.04.113.962.962 0 00-.443-.872l-.027-.024.323-3.3c4.76-.225 5.6-8.323 4.509-8.773s0-1.425 0-3.374-3.591-4.124-3.591-4.124-1.5.75-3.841-3-10.94-4.349-11.524-3.374-4.426 2.25-9.436 3.674-4.092 7.348-3.257 8.623a7.276 7.276 0 011.169 3.524 20.635 20.635 0 001.587 3.9c-.5 1.091.773 7.07 1.15 8.769-.006.052-.012.1-.017.157l-.01.015a.8.8 0 00-.049.085.977.977 0 00-.077.564 1.177 1.177 0 00.085.616 11.238 11.238 0 003.985 8.384l.017.31c.07 1.388.11 3.029.037 4.6 0 .08-.01.159-.014.239a1.8 1.8 0 00-1.274 1c-.472.908-3.212 2.307-3.212 2.307s-4.8.221-5.252 1.105-7.384 3.831-7.384 3.831-3.654 2.136-3.121 4.567c.278 1.27-.5 3.244-1.313 4.839a22.985 22.985 0 00-5.255-1.31l3.884 3.703-.129.2-2.207 7.809s-.761 2.726-1.522 3.389.685 6.7.685 6.7-.837 4.273-1.522 5.378 1.066 3.831 1.066 3.831l3.5 7.956 9.287 2.357 1.619.345q-.047.285-.1.568c-.448 2.534-1.035 4.865-1.751 5.5-1.751 1.547-1.675 8.472-1.675 8.472l.076 9.8s.609 12.081.3 12.523c-.192.279.193.734 1.211 1.143q-.044.273-.085.554c-.286 2-.414 4.29.244 5.3a4.028 4.028 0 01.457 1.768c0 .958 1.446 2.947 1.446 2.947s-1.142 8.177.761 10.976 3.5 7.882 2.588 9.061c0 0-1.6 3.462-.837 5.009a1.806 1.806 0 01-.99 2.8c-.99.368-.9 3.389-.9 3.389l1.818 14.365s.99 2.947.152 3.978-.837 6.188.457 7.956-1.827 5.009-1.827 5.009-1.9 2.726 1.142 3.61c0 0 .609.147-.533 1.326s-1.37 2.652-.609 3.168a3.482 3.482 0 00.494.245c-.028.175-.059.355-.095.547-.292 1.538-.843 3.542-1.845 4.511a32.16 32.16 0 00-4.984 6.642c-1.044 1.98-1.5 3.834-.344 4.7 2.74 2.063 6.242 2.726 8.3 1.915a23.362 23.362 0 004.948-3.315l.685-2.873s-.457-1.768 1.827-2.431a11.732 11.732 0 004.415-3.02v-3.819a16.184 16.184 0 001.6-1.043s1.066-3.757 0-5.009-1.446-1.694-.076-2.5 1.556-2.578.551-4.125-2.606-3.831-1.236-7.072 1.873-13.186 1.873-13.186-.639-6.777 0-8.324-.731-4.641-.731-4.641a24.8 24.8 0 011.294-5.6c.837-1.768 1.522-11.124 1.522-11.124a24 24 0 001.522-6.556c0-2.578-2.36-8.766 1.142-10.387 0 0 1.522 1.326.913 6.63 0 0 1.751 6.188 1.751 8.1s1.294 8.84 1.294 8.84a9.01 9.01 0 00.685 3.02c.533.81 0 3.02 0 3.02s1.979 1.842 1.446 3.02.091 3.837.091 3.837l-.472 16.5s-1.37 7.072 1.827 11.345c0 0-1.142 6.262-1.827 6.7s2.512 4.273 2.512 4.273-.886 2.482.913 2.6v4.1a8.762 8.762 0 002.512 2.8c1.675 1.179.99 5.23.99 5.23a6.958 6.958 0 007.764 4.052c5.633-1.1 6.394-1.621 6.09-3.462a41.468 41.468 0 00-.7-3.233c-.606-2.366-1.535-5.222-2.646-6.63-1.751-2.219-3.2-6.86-3.2-6.86s-.685-1.547 0-2.063a1.41 1.41 0 00.381-1.473 4.836 4.836 0 00.067-3.094c-.6-1.179 1.151-3.61 1.151-3.61l-.533-11.345.533-16.5s-2.36-2.726-1.37-4.346-1.142-3.9-1.142-3.9-.228-.074.381-1.915a4.59 4.59 0 00-.152-3.315s-1.294-4.567.99-8.03c0 0 .99-4.567 1.294-6.925.21-1.638 1.525-7.759 2.308-11.339l.127-.581c1.127.062 1.98.133 1.98.133s-1.751-12.155 0-14.66-1.37-21.658-1.37-21.658-.746-3.347-1.206-6.763c-.026-.195-.05-.389-.074-.583a36.9 36.9 0 014.249-.094c3.654.221 7.231-1.179 7.307-2.578s2.055-6.925 2.36-8.177.528-5.53-.008-6.562z"
|
||||||
|
transform="translate(14415.603 13887.477)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27692"
|
||||||
|
d="M456.179 738.67v6.821a11.324 11.324 0 01-4.254 3.007c-2.2.66-1.76 2.42-1.76 2.42l-.66 2.861a22.5 22.5 0 01-4.768 3.3c-1.98.807-5.354.147-7.995-1.907-1.115-.865-.675-2.711.332-4.682a31.934 31.934 0 014.8-6.613c.965-.965 1.5-2.96 1.778-4.492.208-1.147.276-2.036.276-2.036z"
|
||||||
|
className="#4c495a"
|
||||||
|
transform="translate(14398.211 13524.996)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27693"
|
||||||
|
d="M456.179 754.325v1.731a11.325 11.325 0 01-4.254 3.007c-2.2.66-1.76 2.42-1.76 2.42l-.66 2.86a22.5 22.5 0 01-4.768 3.3c-1.98.807-5.354.147-7.995-1.907-1.115-.866-.675-2.711.332-4.682-.047 2.071.566 4.4 3.556 4.316a15.146 15.146 0 008.875-3.227s-.073-4.841 3.3-5.941a10.277 10.277 0 003.374-1.877z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14398.211 13514.433)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27694"
|
||||||
|
d="M542.486 748.39c-5.428 1.1-7.481-4.034-7.481-4.034s.66-4.034-.954-5.208a8.655 8.655 0 01-2.42-2.787v-6.748l6.6-4.694 3.573 3.163.241.211s1.394 4.621 3.08 6.83c1.071 1.4 1.966 4.245 2.549 6.6.338 1.355.572 2.549.678 3.218.295 1.836-.438 2.349-5.866 3.449z"
|
||||||
|
className="#4c495a"
|
||||||
|
transform="translate(14338.748 13532.731)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27695"
|
||||||
|
d="M542.486 762.939c-5.428 1.1-7.481-4.034-7.481-4.034s.66-4.034-.954-5.208a8.656 8.656 0 01-2.42-2.787v-2.61a27.553 27.553 0 013.447 4.154c.587 1.247.66 5.794 3.374 6.6s7.995 1.54 8.435-.513a11.445 11.445 0 01.789-2.265c.338 1.355.572 2.549.678 3.218.293 1.831-.44 2.345-5.868 3.445z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14338.748 13518.184)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27696"
|
||||||
|
d="M456.4 737.35l12.249 1.32v3.606c-1.382.819-3.362 1.687-4.474.8-1.643-1.314-6.528-2.984-8.05-3.685.209-1.152.275-2.041.275-2.041z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14385.739 13524.996)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27697"
|
||||||
|
d="M542.046 728.88c-1.687-.587-4.694 1.98-8.655 3.594a4.122 4.122 0 01-1.76.393v-3.254l6.6-4.694 3.573 3.163a4.474 4.474 0 00.242.798z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14338.748 13532.731)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27698"
|
||||||
|
fill="#5f5d7e"
|
||||||
|
d="M493.035 519.636s-.232 1.08-.563 2.646c-.754 3.565-2.021 9.658-2.224 11.289-.293 2.347-1.247 6.895-1.247 6.895-2.2 3.447-.953 7.995-.953 7.995a4.708 4.708 0 01.147 3.3c-.587 1.834-.367 1.907-.367 1.907s2.054 2.274 1.1 3.887 1.32 4.327 1.32 4.327l-.513 16.43.513 11.3s-1.687 2.42-1.109 3.594a4.966 4.966 0 01-.065 3.081 1.438 1.438 0 01-.367 1.467c-.66.513 0 2.054 0 2.054-1.687-.587-4.694 1.98-8.655 3.594s-2.641-2.2-2.641-2.2-3.081-3.814-2.42-4.254 1.76-6.674 1.76-6.674c-3.081-4.254-1.76-11.3-1.76-11.3l.455-16.424s-.6-2.646-.088-3.82-1.394-3.007-1.394-3.007.513-2.2 0-3.007a9.226 9.226 0 01-.66-3.007s-1.247-6.895-1.247-8.8-1.687-8.068-1.687-8.068c.587-5.281-.88-6.6-.88-6.6-3.374 1.614-1.1 7.775-1.1 10.342a24.544 24.544 0 01-1.467 6.528s-.66 9.315-1.467 11.075a25.4 25.4 0 00-1.247 5.574s1.32 3.081.7 4.621 0 8.288 0 8.288-.484 9.9-1.8 13.129.22 5.5 1.191 7.041.789 3.3-.531 4.107-.953 1.247.073 2.494 0 4.988 0 4.988-4.181 3.3-6.014 1.834-7.7-3.374-8.435-3.887-.513-1.98.587-3.154.513-1.32.513-1.32c-2.934-.88-1.1-3.594-1.1-3.594s3.007-3.227 1.76-4.988-1.247-6.894-.44-7.921-.147-3.961-.147-3.961l-1.751-14.3s-.082-3.007.871-3.374a1.816 1.816 0 00.954-2.787c-.733-1.54.807-4.987.807-4.987.88-1.174-.66-6.234-2.494-9.022s-.733-10.928-.733-10.928-1.394-1.98-1.394-2.934a4.11 4.11 0 00-.44-1.76c-.634-1.006-.511-3.283-.235-5.278.267-1.93.675-3.6.675-3.6z"
|
||||||
|
transform="translate(14392.087 13661.223)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27699"
|
||||||
|
d="M499.5 264.207l-14.449 3.374s-7.115-6.014-5.354-9.242a12.818 12.818 0 00.962-5c.07-1.564.032-3.2-.035-4.58-.1-2-.267-3.474-.267-3.474s14.816-8.361 14.3 0a21.36 21.36 0 00.1 4.178 7.988 7.988 0 00.848 2.825c.792 1.411 1.769 1.432 1.769 1.432z"
|
||||||
|
fill="#fdc2cc"
|
||||||
|
transform="translate(14371.242 13833.552)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27700"
|
||||||
|
d="M496.31 249.461a11.364 11.364 0 01-14.132-.7c-.1-2-.267-3.474-.267-3.474s14.816-8.361 14.3 0a21.353 21.353 0 00.099 4.174z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14369.692 13833.552)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_301"
|
||||||
|
cx={11.369}
|
||||||
|
cy={11.369}
|
||||||
|
r={11.369}
|
||||||
|
fill="#fdc2cc"
|
||||||
|
transform="translate(14848.009 14062.112)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27701"
|
||||||
|
d="M499.5 281.872l-14.449 3.374s-7.115-6.014-5.354-9.242a12.818 12.818 0 00.962-5 7.372 7.372 0 002.632 4.415c3.3 2.2 2.787 4.914 2.787 4.914l5.941-.22c-.367-2.42 1.834-3.741 2.567-4.034s.367-1.614.367-1.614l.651-4.512c.792 1.411 1.769 1.432 1.769 1.432z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14371.242 13815.886)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27702"
|
||||||
|
d="M493.406 519.636s-.232 1.08-.563 2.646a23.092 23.092 0 00-4.644.067 80.838 80.838 0 01-8.068.513l-15.989.566v-.493a47.174 47.174 0 00-5.5.367 39.084 39.084 0 01-9.682-.587 10.419 10.419 0 01-2.435-.657c.267-1.93.675-3.6.675-3.6z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14391.716 13661.223)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27703"
|
||||||
|
d="M478.041 318.274a23.345 23.345 0 00.232 5.882c.443 3.4 1.162 6.733 1.162 6.733s3.007 19.07 1.32 21.564 0 14.6 0 14.6-5.061-.44-6.674-.073a80.814 80.814 0 01-8.068.513l-15.989.566v-.493a47.134 47.134 0 00-5.5.367 39.09 39.09 0 01-9.682-.587c-2.714-.44-3.814-1.32-3.521-1.76s-.293-12.469-.293-12.469l-.073-9.755s-.073-6.894 1.614-8.435c.689-.628 1.256-2.949 1.687-5.472.619-3.653.954-7.731.954-7.731l-11.149-29.852-.22-.587s3.227-4.988 2.714-7.408 3.007-4.547 3.007-4.547 6.674-2.934 7.115-3.814 5.061-1.1 5.061-1.1 2.64-1.394 3.1-2.3a1.735 1.735 0 011.229-1 7.387 7.387 0 002.643 4.471c3.3 2.2 2.787 4.914 2.787 4.914l5.941-.22c-.367-2.42 1.834-3.741 2.567-4.034s.367-1.614.367-1.614l.687-4.75c.317-.789 2.541 2.233 2.541 2.233s5.648 1.931 6.014 2.077 5.134 1.614 5.134 1.614 5.868 3.814 5.868 4.767 3.227 6.088 3.227 6.088l-.109.581c-.752 4.042-5.156 27.877-5.693 31.031z"
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(14405.834 13816.011)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27704"
|
||||||
|
d="M475.639 359.737s-12.689-3.374-13.936-4.181-8.581 3.887.367 10.268c0 0 10.942 2.274 13.869 0s-.3-6.087-.3-6.087z"
|
||||||
|
fill="#fdc2cc"
|
||||||
|
transform="translate(14384.765 13762.666)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27705"
|
||||||
|
d="M530.065 313.559l1.54.073 4.547 12.175s2.714 6.381 3.227 7.408.293 5.281 0 6.528-2.2 6.748-2.274 8.141-3.521 2.787-7.041 2.567-11.735.88-11.735.88-8.773-.917-14.156 1.834c0 0-3.447-7.115-3.081-20.39 0 0 6.088-.367 7.628.22s9.022 2.274 9.975 1.393 5.282 1.612 5.282 1.612a3.718 3.718 0 000-3.081c-.733-1.76-1.98-7.261-.367-9.022s6.455-10.338 6.455-10.338z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14357.771 13788.747)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27706"
|
||||||
|
d="M526.82 352.87c-3.641.246-7.713.792-7.713.792s-8.772-.918-14.156 1.834c0 0-3.447-7.115-3.081-20.39 0 0 6.088-.367 7.628.22s9.021 2.274 9.975 1.394 5.281 1.614 5.281 1.614a3.717 3.717 0 000-3.08c-.734-1.76-1.98-7.261-.367-9.022s6.455-10.342 6.455-10.342l1.432.067c-.745 4.043-5.149 27.877-5.686 31.031a23.342 23.342 0 00.232 5.882z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14357.287 13787.296)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27707"
|
||||||
|
d="M530.842 314.336l1.54.073 4.547 12.175s2.714 6.381 3.227 7.408.293 5.281 0 6.528-2.2 6.748-2.274 8.141-3.521 2.787-7.041 2.567-11.735.88-11.735.88-8.773-.917-14.156 1.834c0 0-3.447-7.115-3.081-20.39 0 0 6.088-.367 7.628.22s9.022 2.274 9.975 1.394 5.281 1.614 5.281 1.614a3.717 3.717 0 000-3.08c-.733-1.76-1.98-7.261-.367-9.022s6.456-10.342 6.456-10.342z"
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(14357.287 13788.264)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Rectangle_2473"
|
||||||
|
d="M0 0h2.153v19.373H0z"
|
||||||
|
fill="#dfe6f5"
|
||||||
|
transform="rotate(-148.235 9447.513 4949.24)"
|
||||||
|
/>
|
||||||
|
<Ellipse
|
||||||
|
id="prefix__Ellipse_302"
|
||||||
|
cx={6.199}
|
||||||
|
cy={4.348}
|
||||||
|
fill="#dfe6f5"
|
||||||
|
rx={6.199}
|
||||||
|
ry={4.348}
|
||||||
|
transform="rotate(-58.235 20108.237 -6300.42)"
|
||||||
|
/>
|
||||||
|
<Ellipse
|
||||||
|
id="prefix__Ellipse_303"
|
||||||
|
cx={4.45}
|
||||||
|
cy={3.121}
|
||||||
|
opacity={0.1}
|
||||||
|
rx={4.45}
|
||||||
|
ry={3.121}
|
||||||
|
transform="rotate(-58.235 20108.463 -6302.603)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Rectangle_2474"
|
||||||
|
d="M0 0h2.153v12.054H0z"
|
||||||
|
fill="#53526b"
|
||||||
|
transform="rotate(-148.235 9446.105 4954.192)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27708"
|
||||||
|
d="M489.872 390.68l4.474-1.247s22.077.587 14.669-8.508c0 0-3.887-3.741-12.029-.733s-10.415 3.374-10.415 3.374z"
|
||||||
|
fill="#fdc2cc"
|
||||||
|
transform="translate(14366.792 13748.006)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_304"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14852.482 14098.564)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_305"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14867.592 14098.051)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_306"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(14852.482 14098.271)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_307"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14853.729 14110.74)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_308"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14868.033 14109.859)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_309"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(14853.729 14110.446)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_310"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14867.666 14152.333)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_311"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14856.082 14152.333)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_312"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(14867.666 14152.039)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_313"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14856.962 14167.07)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_314"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14868.033 14166.19)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_315"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(14856.962 14166.776)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_316"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(14856.082 14152.039)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_317"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(14868.033 14165.896)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_318"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(14867.592 14097.758)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_319"
|
||||||
|
cx={0.88}
|
||||||
|
cy={0.88}
|
||||||
|
r={0.88}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(14868.033 14109.566)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27709"
|
||||||
|
d="M531.243 416.884s.147 20.1.587 23.691c0 0 .159-22.743-.587-23.691z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14338.99 13724.441)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27710"
|
||||||
|
d="M541.131 441.551c-.3 0 6.014 23.544 6.308 25.231s-4.548-25.231-6.308-25.231z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14332.843 13709.09)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27711"
|
||||||
|
d="M554.355 431.451c0 .22 3.521 12.762 5.281 13.422s-5.281-13.422-5.281-13.422z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14324.606 13715.376)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27712"
|
||||||
|
d="M578.364 366.775s-7.481.333-7.7 1.414 7.7-1.414 7.7-1.414z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14314.46 13755.626)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27713"
|
||||||
|
d="M548.472 620.04s-5.354 2.274-4.547 2.42 4.547-2.42 4.547-2.42z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14331.149 13598.005)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27714"
|
||||||
|
d="M526.762 611.005c-.209-.469 3.594 1.907 3.594 2.2s-3.301-1.54-3.594-2.2z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14341.784 13603.666)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27715"
|
||||||
|
d="M539.983 631.484s4.181-.211 4.474 1.4-4.474-1.4-4.474-1.4z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14333.551 13590.888)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27716"
|
||||||
|
d="M460.352 630.824s4.547-.889 4.914 0-4.914 0-4.914 0z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14383.11 13591.54)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27717"
|
||||||
|
d="M462.928 704.721s.3 3.741-.8 4.621.8-4.621.8-4.621z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14382.221 13545.303)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27718"
|
||||||
|
d="M463.348 724.888c1.436.147 8.99-1.174 8.917 0s-8.917 0-8.917 0z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14381.244 13533.058)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27719"
|
||||||
|
d="M551.758 713.591s-2.577-.4-1.948 1.342z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14327.497 13539.807)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27720"
|
||||||
|
d="M418.5 323.57h-1.39l-2.127 7.775s-.733 2.714-1.467 3.374.66 6.674.66 6.674-.807 4.254-1.467 5.354 1.027 3.814 1.027 3.814l3.374 7.921 8.948 2.347s15.769 3.447 16.5 3.961 1.394-.22 1.907-4.987 1.907-14.009 3.007-14.449c0 0-8.8.953-9.535.807a37.29 37.29 0 00-4.254.073s-4.621-.293-5.354.147.953-2.13.953-2.13a7.073 7.073 0 000-3.591c-.51-1.98-.803-24.424-10.782-17.09z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14412.856 13783.429)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27721"
|
||||||
|
d="M454.566 347.685c-1.1.44-2.494 9.682-3.007 14.449s-1.174 5.5-1.907 4.988c-.6-.417-11.107-2.77-15.036-3.638.619-3.653.953-7.731.953-7.731L424.421 325.9h1.174c9.975-7.335 10.268 15.109 10.782 17.09a7.075 7.075 0 010 3.591s-1.687 2.57-.953 2.13 5.354-.147 5.354-.147a37.275 37.275 0 014.254-.073c.733.147 9.534-.806 9.534-.806z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14405.472 13781.979)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27722"
|
||||||
|
d="M417.727 324.347h-1.394l-2.127 7.775s-.733 2.714-1.467 3.374.66 6.674.66 6.674-.807 4.254-1.467 5.354 1.027 3.814 1.027 3.814l3.374 7.921 8.948 2.347s15.769 3.447 16.5 3.961 1.394-.22 1.907-4.987 1.907-14.009 3.007-14.449c0 0-8.8.954-9.535.807a37.277 37.277 0 00-4.254.073s-4.621-.293-5.354.147.953-2.13.953-2.13a7.073 7.073 0 000-3.591c-.505-1.98-.805-24.424-10.778-17.09z"
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(14413.34 13782.945)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27723"
|
||||||
|
d="M432.185 397.074s-4.034 7.628-4.767 6.748 4.767-6.748 4.767-6.748z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14403.649 13736.771)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27724"
|
||||||
|
d="M425.042 385.572s-3.741 3.1-1.98 3.9 1.98-3.9 1.98-3.9z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14406.61 13743.93)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27725"
|
||||||
|
d="M438.4 375.515c.293.073 5.428 1.093 5.5 1.537s-5.5-1.537-5.5-1.537z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14396.769 13750.188)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27726"
|
||||||
|
d="M495.034 214.749a.756.756 0 00-.5.786c-.3.264-.719-.047-.962-.384s-.525-.748-.9-.7a3.216 3.216 0 00-.513.214c-.587.188-1.083-.5-1.411-1.106l-1.716-3.174c-1.147.666-2.5-.032-3.641-.722s-2.494-1.391-3.644-.725c-1.687.974-1.749 4.222-3.5 5.023-.563.258-1.218.2-1.74.557a3.316 3.316 0 00-1.027 1.678 1.778 1.778 0 01-.575.948 1.263 1.263 0 01-.593.144 2.543 2.543 0 01-1.526-.214 1.289 1.289 0 01-.528-1.526.793.793 0 01.047-.085 5.347 5.347 0 00.5-.725c.176-.466-.076-1.009-.021-1.514.091-.863 1-1.317 1.159-2.165.065-.332 0-.687.059-1.021a.923.923 0 01.035-.129l-.537.37a12.864 12.864 0 001.344-2.526 7.779 7.779 0 014.747-3.864 11.331 11.331 0 015.865.067 19.313 19.313 0 015.219 2.15 5.179 5.179 0 011.52 1.235 9.514 9.514 0 01.9 1.663c.569 1.179 2.124 2.271.886 2.435-1.03.138-.091.86.449 1.347a1.4 1.4 0 01.311.34 1.218 1.218 0 01-.065 1.176c-.199.265.646.318.358.447z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14375.744 13857.224)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27727"
|
||||||
|
fill="#865a61"
|
||||||
|
d="M495.034 213.972a.756.756 0 00-.5.786c-.3.264-.719-.047-.962-.384s-.525-.748-.9-.7a3.216 3.216 0 00-.513.214c-.587.188-1.083-.5-1.411-1.106l-1.716-3.174c-1.147.666-2.5-.032-3.641-.722s-2.494-1.391-3.644-.725c-1.687.974-1.749 4.222-3.5 5.023-.563.258-1.218.2-1.74.557a3.316 3.316 0 00-1.027 1.678 1.778 1.778 0 01-.575.948 1.263 1.263 0 01-.593.144 2.542 2.542 0 01-1.526-.214 1.289 1.289 0 01-.528-1.526.8.8 0 01.047-.085 5.343 5.343 0 00.5-.725c.176-.466-.076-1.009-.02-1.514.091-.863 1-1.317 1.159-2.165.065-.332 0-.687.059-1.021a.922.922 0 01.035-.129l-.537.37a12.864 12.864 0 001.344-2.526 7.779 7.779 0 014.747-3.864 11.331 11.331 0 015.865.067 19.313 19.313 0 015.219 2.15 5.179 5.179 0 011.52 1.235 9.51 9.51 0 01.9 1.663c.569 1.179 2.124 2.271.886 2.435-1.03.138-.091.86.449 1.347a1.4 1.4 0 01.311.34 1.218 1.218 0 01-.065 1.177c-.2.264.645.317.357.446z"
|
||||||
|
transform="translate(14375.744 13857.707)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27728"
|
||||||
|
d="M494.64 212.01l-.117 1.235s-12.31-15.6-21.886 2.016l-.126-.575a5.339 5.339 0 00.5-.725c.176-.466-.076-1.009-.021-1.514.091-.863 1-1.317 1.159-2.165.065-.332 0-.687.059-1.021a.926.926 0 01.035-.129l-.537.37a12.864 12.864 0 001.344-2.526 7.779 7.779 0 014.747-3.864 11.331 11.331 0 015.865.067 19.313 19.313 0 015.219 2.15 5.179 5.179 0 011.52 1.235 9.517 9.517 0 01.9 1.663c.569 1.179 2.124 2.271.886 2.435-1.025.138-.087.861.453 1.348z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14375.543 13857.707)"
|
||||||
|
/>
|
||||||
|
<G
|
||||||
|
id="prefix__Group_447"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14848.001 14065.161)">
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27729"
|
||||||
|
d="M494.858 221.557a.6.6 0 00-.14.508c-.3.264-.719-.047-.962-.384s-.525-.748-.9-.7a3.22 3.22 0 00-.513.214c-.587.188-1.083-.5-1.411-1.106l-1.716-3.174c-1.147.666-2.5-.032-3.641-.722s-2.494-1.391-3.644-.725c-1.687.974-1.749 4.222-3.5 5.023-.563.258-1.218.2-1.74.557a3.316 3.316 0 00-1.027 1.678 1.777 1.777 0 01-.575.948 1.263 1.263 0 01-.593.144 2.542 2.542 0 01-1.526-.214 1.372 1.372 0 01-.572-.807 1.319 1.319 0 00.572 1.393 2.543 2.543 0 001.526.214 1.263 1.263 0 00.593-.144 1.778 1.778 0 00.575-.948 3.315 3.315 0 011.027-1.678c.522-.355 1.176-.3 1.74-.557 1.749-.8 1.81-4.049 3.5-5.023 1.15-.666 2.505.035 3.644.725s2.494 1.388 3.641.722q.858 1.584 1.716 3.174c.329.6.824 1.294 1.411 1.106a3.22 3.22 0 01.513-.214c.373-.047.651.367.9.7s.663.648.962.384a.756.756 0 01.5-.786c.231-.102-.255-.157-.36-.308z"
|
||||||
|
transform="translate(-472.373 -215.199)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27730"
|
||||||
|
d="M529.071 223.028a1.061 1.061 0 01.277-.07c.546-.072.548-.325.332-.686a.859.859 0 01-.332.1c-.589.079-.533.349-.277.656z"
|
||||||
|
transform="translate(-507.545 -219.601)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27731"
|
||||||
|
d="M532.046 229.837a1.325 1.325 0 000-.574.847.847 0 01-.149.323c-.097.114.018.192.149.251z"
|
||||||
|
transform="translate(-509.396 -223.952)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27732"
|
||||||
|
d="M473.989 228.544c-.006.034-.013.067-.017.1a3.367 3.367 0 00.057.789 2.775 2.775 0 00-.04-.89z"
|
||||||
|
transform="translate(-473.366 -223.504)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27733"
|
||||||
|
d="M476.366 219.066a4.254 4.254 0 01-.492.735l.474-.326a3.269 3.269 0 01.018-.409z"
|
||||||
|
transform="translate(-474.552 -217.605)"
|
||||||
|
/>
|
||||||
|
</G>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27734"
|
||||||
|
d="M465.432 186.921s-1.77-7.914-1.207-9.183a20.935 20.935 0 01-1.529-3.882 7.413 7.413 0 00-1.127-3.509c-.8-1.269-1.69-7.167 3.138-8.586s8.529-2.688 9.093-3.658 8.851-.373 11.1 3.36 3.7 2.986 3.7 2.986 3.46 2.165 3.46 4.106-1.046 2.912 0 3.36.241 8.511-4.345 8.735l-.4 4.255s-12.308-15.605-21.883 2.016z"
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(14382.747 13885.753)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27735"
|
||||||
|
d="M473.76 172.554s-1.064 6.234.88 8.325z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14374.945 13876.503)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27736"
|
||||||
|
d="M483.891 168.767s-2.714 6.674-2.054 7.958z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14369.803 13878.858)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27737"
|
||||||
|
d="M491.7 163.134s-1.834 8.692-.953 9.388z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14364.345 13882.365)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27738"
|
||||||
|
d="M499.417 169.349s-2.274 5.574-1.357 6.344z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14359.776 13878.497)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27739"
|
||||||
|
d="M509.746 171.1s-2.677 4.547-2.127 5.354z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14353.738 13877.409)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27740"
|
||||||
|
d="M524.063 182.848s-2.86.77-2.274 1.687z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14344.923 13870.097)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27741"
|
||||||
|
d="M531.585 195.375s-2.567 1.247-2.09 1.907z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14340.114 13862.3)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27742"
|
||||||
|
d="M469.646 207.061s16.4-6.66 23.5 2.912c-.003-.001-8.621-7.328-23.5-2.912z"
|
||||||
|
opacity={0.1}
|
||||||
|
transform="translate(14377.325 13856.431)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27743"
|
||||||
|
d="M298.991 248.243l2.285-2.311 6.46 6.385-2.285 2.312-5.941-5.872z"
|
||||||
|
fill="#53526b"
|
||||||
|
transform="translate(14542.056 13869.972)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27744"
|
||||||
|
d="M414.267 316.454s10 .851 19.307 11.326l-3.879 3.924z"
|
||||||
|
fill="#dfe6f5"
|
||||||
|
transform="translate(14411.791 13786.944)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27745"
|
||||||
|
d="M471.286 358.743s-9.611-3.5-10.556-4.341-6.5 4.037.278 10.663c0 0 8.288 2.361 10.505 0s-.227-6.322-.227-6.322z"
|
||||||
|
fill="#fdc2cc"
|
||||||
|
transform="translate(14384.765 13763.385)"
|
||||||
|
/>
|
||||||
|
</G>
|
||||||
|
</Svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(EmptyFood)
|
|
@ -0,0 +1,88 @@
|
||||||
|
import * as React from 'react'
|
||||||
|
import Svg, { Defs, G, Path, Circle } from 'react-native-svg'
|
||||||
|
/* SVGR has dropped some elements not supported by react-native-svg: style */
|
||||||
|
|
||||||
|
function EmptyOrder(props) {
|
||||||
|
return (
|
||||||
|
<Svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width={165.999}
|
||||||
|
height={162.035}
|
||||||
|
viewBox="0 0 165.999 162.035"
|
||||||
|
{...props}>
|
||||||
|
<Defs></Defs>
|
||||||
|
<G id="prefix__undraw_No_data_re_kwbl" transform="translate(-.001 -.004)">
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27777"
|
||||||
|
fill="#f2f2f2"
|
||||||
|
d="M410.677 191.327h-44.73a3.849 3.849 0 00-3.845 3.845v99.412l-.513.156-10.973 3.36a2.052 2.052 0 01-2.561-1.361l-32.638-106.614a2.051 2.051 0 011.361-2.561l16.909-5.178 49.02-15 16.909-5.178a2.048 2.048 0 012.561 1.358l8.343 27.252z"
|
||||||
|
transform="translate(-305.292 -154.883)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27778"
|
||||||
|
d="M391.327 169.845L381.271 137a4.356 4.356 0 00-5.442-2.891l-23.773 7.277-49.018 15.007-23.773 7.279a4.361 4.361 0 00-2.891 5.442l34.367 112.248a4.364 4.364 0 004.168 3.084 4.305 4.305 0 001.274-.192l16.3-4.988.513-.159v-.536l-.513.156-16.448 5.037a3.849 3.849 0 01-4.8-2.55l-34.369-112.251a3.839 3.839 0 012.55-4.8l23.773-7.279 49.018-15 23.773-7.279a3.841 3.841 0 014.8 2.55l10.009 32.7.159.513h.533z"
|
||||||
|
fill="#3f3d56"
|
||||||
|
transform="translate(-276.182 -133.913)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27779"
|
||||||
|
d="M382.585 177a2.311 2.311 0 01-2.207-1.632l-3.3-10.784a2.306 2.306 0 011.531-2.881L423.7 147.9a2.309 2.309 0 012.881 1.53l3.3 10.784a2.309 2.309 0 01-1.53 2.881l-45.1 13.806a2.3 2.3 0 01-.666.099z"
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(-351.139 -144.235)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_323"
|
||||||
|
cx={5.126}
|
||||||
|
cy={5.126}
|
||||||
|
r={5.126}
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(43.614 1.273)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_324"
|
||||||
|
cx={3.246}
|
||||||
|
cy={3.246}
|
||||||
|
r={3.246}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(45.494 3.153)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27780"
|
||||||
|
fill="#e6e6e6"
|
||||||
|
d="M621.132 402.252H534.5a2.181 2.181 0 01-2.179-2.179V296.266a2.181 2.181 0 012.179-2.179h86.635a2.181 2.181 0 012.179 2.179v103.808a2.181 2.181 0 01-2.182 2.178z"
|
||||||
|
transform="translate(-466.665 -253.029)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27781"
|
||||||
|
d="M554.13 274.087h-53.954a4.364 4.364 0 00-4.357 4.357V382.97l.513-.156v-104.37a3.849 3.849 0 013.845-3.845h54.113zm47.034 0H500.176a4.364 4.364 0 00-4.357 4.357v117.393a4.364 4.364 0 004.357 4.357h100.988a4.363 4.363 0 004.357-4.357V278.444a4.363 4.363 0 00-4.357-4.357zm3.845 121.75a3.849 3.849 0 01-3.845 3.845H500.176a3.849 3.849 0 01-3.845-3.845V278.444a3.849 3.849 0 013.845-3.845h100.988a3.849 3.849 0 013.845 3.845z"
|
||||||
|
fill="#3f3d56"
|
||||||
|
transform="translate(-439.521 -238.155)"
|
||||||
|
/>
|
||||||
|
<Path
|
||||||
|
id="prefix__Path_27782"
|
||||||
|
d="M658.287 271.979h-47.162a2.309 2.309 0 01-2.307-2.307v-11.278a2.31 2.31 0 012.307-2.307h47.162a2.31 2.31 0 012.307 2.307v11.278a2.309 2.309 0 01-2.307 2.307z"
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(-523.557 -224.769)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_325"
|
||||||
|
cx={5.126}
|
||||||
|
cy={5.126}
|
||||||
|
r={5.126}
|
||||||
|
fill="#febb2c"
|
||||||
|
transform="translate(106.023 21.834)"
|
||||||
|
/>
|
||||||
|
<Circle
|
||||||
|
id="prefix__Ellipse_326"
|
||||||
|
cx={3.122}
|
||||||
|
cy={3.122}
|
||||||
|
r={3.122}
|
||||||
|
fill="#FFF"
|
||||||
|
transform="translate(108.026 23.838)"
|
||||||
|
/>
|
||||||
|
</G>
|
||||||
|
</Svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(EmptyOrder)
|
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 277 B |
After Width: | Height: | Size: 1.5 MiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 522 B |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 696 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 1.3 KiB |
|
@ -0,0 +1,88 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React, { useContext } from 'react'
|
||||||
|
import { TouchableOpacity, View } from 'react-native'
|
||||||
|
import ConfigurationContext from '../../context/Configuration'
|
||||||
|
import { alignment } from '../../utils/alignment'
|
||||||
|
import { ICONS_NAME } from '../../utils/constant'
|
||||||
|
import { scale } from '../../utils/scaling'
|
||||||
|
import { CustomIcon } from '../CustomIcon'
|
||||||
|
import EnategaImage from '../EnategaImage/EnategaImage'
|
||||||
|
import TextDefault from '../Text/TextDefault/TextDefault'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
const cartItem = props => {
|
||||||
|
const styles = useStyle()
|
||||||
|
const { colors } = useTheme()
|
||||||
|
const configuration = useContext(ConfigurationContext)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.itemContainer}>
|
||||||
|
<View style={{ width: '25%' }}>
|
||||||
|
<EnategaImage
|
||||||
|
imgStyle={styles.imgResponsive}
|
||||||
|
imgSource={{ uri: props.image }}
|
||||||
|
spinnerProps={{ style: styles.loadingView }}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
<View style={styles.textContainer}>
|
||||||
|
<TextDefault numberOfLines={2} style={alignment.MBxSmall} medium H5>
|
||||||
|
{props.dealName}
|
||||||
|
</TextDefault>
|
||||||
|
<View
|
||||||
|
style={{
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'space-between'
|
||||||
|
}}>
|
||||||
|
<View style={{ flexGrow: 1 }}>
|
||||||
|
<TextDefault
|
||||||
|
textColor={colors.tagColor}
|
||||||
|
H4
|
||||||
|
bolder
|
||||||
|
style={alignment.MRxSmall}>
|
||||||
|
{configuration.currency_symbol}
|
||||||
|
{parseFloat(props.dealPrice).toFixed(2)}
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
<View style={styles.actionContainer}>
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
style={styles.actionContainerBtns}
|
||||||
|
onPress={props.removeQuantity}>
|
||||||
|
<CustomIcon
|
||||||
|
name={ICONS_NAME.Minus}
|
||||||
|
size={scale(14)}
|
||||||
|
color={colors.placeHolderColor}
|
||||||
|
/>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<View style={styles.actionContainerView}>
|
||||||
|
<TextDefault style={[alignment.PLsmall, alignment.PRsmall]}>
|
||||||
|
{props.quantity}
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
style={[styles.actionContainerBtns, styles.tagbtn]}
|
||||||
|
onPress={props.addQuantity}>
|
||||||
|
<CustomIcon
|
||||||
|
name={ICONS_NAME.Plus}
|
||||||
|
size={scale(14)}
|
||||||
|
color={colors.white}
|
||||||
|
/>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
cartItem.propTypes = {
|
||||||
|
removeQuantity: PropTypes.func,
|
||||||
|
quantity: PropTypes.number,
|
||||||
|
addQuantity: PropTypes.func,
|
||||||
|
dealName: PropTypes.string,
|
||||||
|
dealPrice: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||||
|
image: PropTypes.string
|
||||||
|
}
|
||||||
|
export default cartItem
|
|
@ -0,0 +1,78 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import { Dimensions, StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../utils/alignment'
|
||||||
|
import { moderateScale, scale, verticalScale } from '../../utils/scaling'
|
||||||
|
const { width } = Dimensions.get('window')
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
|
||||||
|
return StyleSheet.create({
|
||||||
|
itemContainer: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
width: '100%',
|
||||||
|
...alignment.MBmedium,
|
||||||
|
backgroundColor: colors.cardContainer,
|
||||||
|
elevation: 5,
|
||||||
|
padding: 10,
|
||||||
|
shadowColor: colors.placeHolderColor,
|
||||||
|
shadowOffset: {
|
||||||
|
width: verticalScale(2),
|
||||||
|
height: verticalScale(1)
|
||||||
|
},
|
||||||
|
borderRadius: 20,
|
||||||
|
height: width * 0.28,
|
||||||
|
shadowOpacity: 0.3,
|
||||||
|
shadowRadius: verticalScale(10),
|
||||||
|
...alignment.PLsmall,
|
||||||
|
...alignment.PRsmall
|
||||||
|
},
|
||||||
|
imgResponsive: {
|
||||||
|
width: moderateScale(75),
|
||||||
|
height: moderateScale(75),
|
||||||
|
borderRadius: moderateScale(20)
|
||||||
|
},
|
||||||
|
loadingView: {
|
||||||
|
backgroundColor: colors.background,
|
||||||
|
width: '100%',
|
||||||
|
height: '100%'
|
||||||
|
},
|
||||||
|
textContainer: {
|
||||||
|
flex: 1,
|
||||||
|
height: '100%',
|
||||||
|
justifyContent: 'space-evenly',
|
||||||
|
...alignment.MLsmall
|
||||||
|
},
|
||||||
|
actionContainer: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'flex-end',
|
||||||
|
alignItems: 'center'
|
||||||
|
},
|
||||||
|
actionContainerBtns: {
|
||||||
|
width: scale(24),
|
||||||
|
aspectRatio: 1,
|
||||||
|
backgroundColor: colors.lightBackground,
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
borderRadius: scale(8),
|
||||||
|
elevation: 3,
|
||||||
|
shadowColor: colors.shadowColor,
|
||||||
|
shadowOffset: {
|
||||||
|
width: 0,
|
||||||
|
height: verticalScale(1)
|
||||||
|
},
|
||||||
|
shadowOpacity: 0.5,
|
||||||
|
shadowRadius: verticalScale(1)
|
||||||
|
},
|
||||||
|
tagbtn: {
|
||||||
|
backgroundColor: colors.iconColorPrimary
|
||||||
|
},
|
||||||
|
actionContainerView: {
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,8 @@
|
||||||
|
import { createIconSetFromIcoMoon } from '@expo/vector-icons'
|
||||||
|
import icoMoonConfig from './selection.json'
|
||||||
|
|
||||||
|
export const CustomIcon = createIconSetFromIcoMoon(
|
||||||
|
icoMoonConfig,
|
||||||
|
'icomoon',
|
||||||
|
'icomoon.ttf'
|
||||||
|
)
|
|
@ -0,0 +1,81 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React, { useState } from 'react'
|
||||||
|
import { TouchableOpacity, View } from 'react-native'
|
||||||
|
import { ICONS_NAME } from '../../../utils/constant'
|
||||||
|
import { scale } from '../../../utils/scaling'
|
||||||
|
import { CustomIcon } from '../../CustomIcon'
|
||||||
|
import { FlashMessage } from '../../FlashMessage/FlashMessage'
|
||||||
|
import TextDefault from '../../Text/TextDefault/TextDefault'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
function CartComponent(props) {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
const styles = useStyle()
|
||||||
|
const [quantity, setQuantity] = useState(1)
|
||||||
|
|
||||||
|
function onAdd() {
|
||||||
|
if (props.stock > quantity) setQuantity(quantity + 1)
|
||||||
|
else {
|
||||||
|
FlashMessage({
|
||||||
|
message: 'No more items in stock'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function onRemove() {
|
||||||
|
if (quantity === 1) return
|
||||||
|
setQuantity(quantity - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.mainContainer}>
|
||||||
|
<View style={styles.subContainer}>
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
onPress={onRemove}
|
||||||
|
style={styles.icon}>
|
||||||
|
<CustomIcon
|
||||||
|
name={ICONS_NAME.Minus}
|
||||||
|
size={scale(18)}
|
||||||
|
color={colors.placeHolderColor}
|
||||||
|
/>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TextDefault H5 bold center>
|
||||||
|
{quantity}
|
||||||
|
</TextDefault>
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
onPress={onAdd}
|
||||||
|
style={styles.icon}>
|
||||||
|
<CustomIcon
|
||||||
|
name={ICONS_NAME.Plus}
|
||||||
|
size={scale(18)}
|
||||||
|
color={colors.placeHolderColor}
|
||||||
|
/>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
onPress={props.onPress.bind(this, quantity)}
|
||||||
|
style={
|
||||||
|
!props.disabled
|
||||||
|
? styles.btnContainer
|
||||||
|
: {
|
||||||
|
...styles.btnContainer,
|
||||||
|
backgroundColor: colors.buttonBackgroundBlue
|
||||||
|
}
|
||||||
|
}>
|
||||||
|
<TextDefault textColor={colors.buttonText} H5 bold center>
|
||||||
|
Add To Cart
|
||||||
|
</TextDefault>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
CartComponent.propTypes = {
|
||||||
|
stock: PropTypes.number.isRequired,
|
||||||
|
onPress: PropTypes.func,
|
||||||
|
disabled: PropTypes.bool
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CartComponent
|
|
@ -0,0 +1,55 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import { Dimensions, StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { moderateScale, scale, verticalScale } from '../../../utils/scaling'
|
||||||
|
const { height } = Dimensions.get('window')
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
|
||||||
|
return StyleSheet.create({
|
||||||
|
flex: {
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
mainContainer: {
|
||||||
|
width: '100%',
|
||||||
|
height: height * 0.08,
|
||||||
|
backgroundColor: 'transparent',
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
...alignment.MBlarge
|
||||||
|
},
|
||||||
|
subContainer: {
|
||||||
|
width: '90%',
|
||||||
|
height: '70%',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'space-around',
|
||||||
|
flexDirection: 'row'
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
width: '10%',
|
||||||
|
height: '90%',
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: colors.white,
|
||||||
|
borderRadius: scale(12),
|
||||||
|
elevation: 3,
|
||||||
|
shadowColor: colors.shadowColor,
|
||||||
|
shadowOffset: {
|
||||||
|
width: 0,
|
||||||
|
height: verticalScale(1)
|
||||||
|
},
|
||||||
|
shadowOpacity: 0.5,
|
||||||
|
shadowRadius: verticalScale(1)
|
||||||
|
},
|
||||||
|
btnContainer: {
|
||||||
|
width: '50%',
|
||||||
|
height: '100%',
|
||||||
|
borderRadius: moderateScale(12),
|
||||||
|
backgroundColor: colors.horizontalLine,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,67 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React, { useContext, useState } from 'react'
|
||||||
|
import { TouchableOpacity, View } from 'react-native'
|
||||||
|
import ConfigurationContext from '../../../context/Configuration'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import CheckboxBtn from '../../FdCheckbox/CheckboxBtn'
|
||||||
|
import TextDefault from '../../Text/TextDefault/TextDefault'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
function CheckComponent(props) {
|
||||||
|
const styles = useStyle()
|
||||||
|
const { colors } = useTheme()
|
||||||
|
const [options, setOptions] = useState(
|
||||||
|
props.options.map(option => ({ ...option, checked: false }))
|
||||||
|
)
|
||||||
|
const configuration = useContext(ConfigurationContext)
|
||||||
|
|
||||||
|
function onPress(option) {
|
||||||
|
const tempOptions = options
|
||||||
|
const index = tempOptions.findIndex(opt => opt._id === option._id)
|
||||||
|
tempOptions[index].checked = !tempOptions[index].checked
|
||||||
|
setOptions(tempOptions)
|
||||||
|
props.onPress(option)
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<View>
|
||||||
|
{options.map(option => (
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
onPress={onPress.bind(this, option)}
|
||||||
|
key={option._id}
|
||||||
|
style={styles.mainContainer}>
|
||||||
|
<View style={styles.leftContainer}>
|
||||||
|
<CheckboxBtn
|
||||||
|
onPress={onPress.bind(this, option)}
|
||||||
|
checked={option.checked}
|
||||||
|
/>
|
||||||
|
<TextDefault
|
||||||
|
numberOfLines={1}
|
||||||
|
textColor={
|
||||||
|
option.checked ? colors.fontMainColor : colors.fontSecondColor
|
||||||
|
}
|
||||||
|
style={[alignment.MLsmall, alignment.PRsmall, alignment.MRlarge]}
|
||||||
|
H5>
|
||||||
|
{option.title}
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
<View style={styles.rightContainer}>
|
||||||
|
<TextDefault
|
||||||
|
textColor={
|
||||||
|
option.checked ? colors.fontMainColor : colors.fontSecondColor
|
||||||
|
}
|
||||||
|
H5
|
||||||
|
medium>{`${configuration.currency_symbol} ${option.price}`}</TextDefault>
|
||||||
|
</View>
|
||||||
|
</TouchableOpacity>
|
||||||
|
))}
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
CheckComponent.propTypes = {
|
||||||
|
options: PropTypes.arrayOf(PropTypes.object),
|
||||||
|
onPress: PropTypes.func
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CheckComponent
|
|
@ -0,0 +1,29 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import { StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return StyleSheet.create({
|
||||||
|
flex: {
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
mainContainer: {
|
||||||
|
width: '100%',
|
||||||
|
flexDirection: 'row',
|
||||||
|
borderBottomWidth: StyleSheet.hairlineWidth,
|
||||||
|
borderBottomColor: colors.horizontalLine,
|
||||||
|
...alignment.PBsmall,
|
||||||
|
...alignment.MBsmall
|
||||||
|
},
|
||||||
|
leftContainer: {
|
||||||
|
flex: 1,
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center'
|
||||||
|
},
|
||||||
|
rightContainer: {
|
||||||
|
justifyContent: 'center'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,46 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React, { useContext } from 'react'
|
||||||
|
import { View } from 'react-native'
|
||||||
|
import ConfigurationContext from '../../../context/Configuration'
|
||||||
|
import TextDefault from '../../Text/TextDefault/TextDefault'
|
||||||
|
import styles from './styles'
|
||||||
|
|
||||||
|
function HeadingComponent(props) {
|
||||||
|
const configuration = useContext(ConfigurationContext)
|
||||||
|
const { colors } = useTheme()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<View style={styles.topContainer}>
|
||||||
|
<View style={styles.titleContainer}>
|
||||||
|
<TextDefault numberOfLines={1} H4 bold>
|
||||||
|
{props.title}
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
<View style={styles.priceContainer}>
|
||||||
|
<TextDefault
|
||||||
|
textColor={colors.tagColor}
|
||||||
|
H4
|
||||||
|
bolder>{`${configuration.currency_symbol} ${props.price}`}</TextDefault>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
<View style={styles.descContainer}>
|
||||||
|
<TextDefault
|
||||||
|
numberOfLines={3}
|
||||||
|
textColor={colors.fontSecondColor}
|
||||||
|
H5
|
||||||
|
medium>
|
||||||
|
{props.desc}
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
HeadingComponent.propTypes = {
|
||||||
|
title: PropTypes.string,
|
||||||
|
price: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||||
|
desc: PropTypes.string
|
||||||
|
}
|
||||||
|
export default HeadingComponent
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
topContainer: {
|
||||||
|
width: '100%',
|
||||||
|
flexDirection: 'row',
|
||||||
|
...alignment.PTsmall,
|
||||||
|
...alignment.PBxSmall
|
||||||
|
},
|
||||||
|
titleContainer: {
|
||||||
|
width: '70%',
|
||||||
|
...alignment.PRxSmall,
|
||||||
|
justifyContent: 'center'
|
||||||
|
},
|
||||||
|
priceContainer: {
|
||||||
|
width: '30%',
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'flex-end'
|
||||||
|
},
|
||||||
|
descContainer: {
|
||||||
|
width: '100%',
|
||||||
|
...alignment.MBsmall
|
||||||
|
}
|
||||||
|
})
|
||||||
|
export default styles
|
|
@ -0,0 +1,18 @@
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { Image } from 'react-native'
|
||||||
|
import { styles } from './styles'
|
||||||
|
|
||||||
|
function ImageHeader(props) {
|
||||||
|
return (
|
||||||
|
<Image
|
||||||
|
style={styles.backgroundImage}
|
||||||
|
resizeMode="cover"
|
||||||
|
source={{ uri: props.image }}
|
||||||
|
defaultSource={require('../../../assets/images/food_placeholder.png')}></Image>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
ImageHeader.propTypes = {
|
||||||
|
image: PropTypes.string
|
||||||
|
}
|
||||||
|
export default ImageHeader
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { Dimensions, StyleSheet } from 'react-native'
|
||||||
|
import { moderateScale } from '../../../utils/scaling'
|
||||||
|
const { height } = Dimensions.get('window')
|
||||||
|
|
||||||
|
export const styles = StyleSheet.create({
|
||||||
|
backgroundImage: {
|
||||||
|
width: '100%',
|
||||||
|
borderTopLeftRadius: moderateScale(30),
|
||||||
|
borderTopRightRadius: moderateScale(30),
|
||||||
|
// borderTopEndRadius:moderateScale(20),
|
||||||
|
// borderTopStartRadius:moderateScale(20),
|
||||||
|
height: height * 0.22
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,70 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React, { useContext, useState } from 'react'
|
||||||
|
import { TouchableOpacity, View } from 'react-native'
|
||||||
|
import ConfigurationContext from '../../../context/Configuration'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import RadioButton from '../../FdRadioBtn/RadioBtn'
|
||||||
|
import TextDefault from '../../Text/TextDefault/TextDefault'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
function RadioComponent(props) {
|
||||||
|
const styles = useStyle()
|
||||||
|
const { colors } = useTheme()
|
||||||
|
const [options] = useState(props.options)
|
||||||
|
const [selected, setSelected] = useState(props.selected || null)
|
||||||
|
const configuration = useContext(ConfigurationContext)
|
||||||
|
|
||||||
|
function onPress(option) {
|
||||||
|
setSelected(option)
|
||||||
|
props.onPress(option)
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{options.map(option => {
|
||||||
|
const isChecked = selected._id === option._id
|
||||||
|
return (
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
onPress={onPress.bind(this, option)}
|
||||||
|
key={option._id}
|
||||||
|
style={styles.mainContainer}>
|
||||||
|
<View style={styles.leftContainer}>
|
||||||
|
<RadioButton
|
||||||
|
size={13}
|
||||||
|
outerColor={colors.radioOuterColor}
|
||||||
|
innerColor={colors.radioColor}
|
||||||
|
animation={'bounceIn'}
|
||||||
|
isSelected={isChecked}
|
||||||
|
onPress={onPress.bind(this, option)}
|
||||||
|
/>
|
||||||
|
<TextDefault
|
||||||
|
textColor={
|
||||||
|
isChecked ? colors.fontMainColor : colors.fontSecondColor
|
||||||
|
}
|
||||||
|
style={alignment.MLsmall}
|
||||||
|
H5>
|
||||||
|
{option.title}
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
<View style={styles.rightContainer}>
|
||||||
|
<TextDefault
|
||||||
|
textColor={
|
||||||
|
isChecked ? colors.fontMainColor : colors.fontSecondColor
|
||||||
|
}
|
||||||
|
H5
|
||||||
|
medium>{`${configuration.currency_symbol} ${option.price}`}</TextDefault>
|
||||||
|
</View>
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
RadioComponent.propTypes = {
|
||||||
|
selected: PropTypes.any,
|
||||||
|
options: PropTypes.arrayOf(PropTypes.object),
|
||||||
|
onPress: PropTypes.func
|
||||||
|
}
|
||||||
|
export default RadioComponent
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import { StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
width: '100%',
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
borderBottomWidth: StyleSheet.hairlineWidth,
|
||||||
|
borderBottomColor: colors.horizontalLine,
|
||||||
|
...alignment.PBsmall,
|
||||||
|
...alignment.MBsmall
|
||||||
|
},
|
||||||
|
leftContainer: {
|
||||||
|
flex: 1,
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center'
|
||||||
|
},
|
||||||
|
rightContainer: {
|
||||||
|
justifyContent: 'center'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,46 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { View } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import TextDefault from '../../Text/TextDefault/TextDefault'
|
||||||
|
import styles from './styles'
|
||||||
|
|
||||||
|
function TitleComponent(props) {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.mainContainer}>
|
||||||
|
<View style={styles.leftContainer}>
|
||||||
|
<TextDefault numberOfLines={1} H5 bold>
|
||||||
|
{props.title}
|
||||||
|
</TextDefault>
|
||||||
|
<TextDefault
|
||||||
|
numberOfLines={1}
|
||||||
|
textColor={colors.fontSecondColor}
|
||||||
|
H5
|
||||||
|
bold>
|
||||||
|
{props.subTitle}
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
<TextDefault
|
||||||
|
style={[alignment.PLxSmall, alignment.PRxSmall]}
|
||||||
|
textColor={
|
||||||
|
props.error === true ? colors.errorColor : colors.placeHolderColor
|
||||||
|
}
|
||||||
|
H5
|
||||||
|
medium
|
||||||
|
center>
|
||||||
|
({props.status})
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
TitleComponent.propTypes = {
|
||||||
|
title: PropTypes.string.isRequired,
|
||||||
|
subTitle: PropTypes.string,
|
||||||
|
error: PropTypes.bool,
|
||||||
|
status: PropTypes.string
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TitleComponent
|
|
@ -0,0 +1,19 @@
|
||||||
|
import { StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
width: '100%',
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'flex-start',
|
||||||
|
...alignment.MBmedium,
|
||||||
|
...alignment.MTsmall
|
||||||
|
},
|
||||||
|
leftContainer: {
|
||||||
|
// width: '70%'
|
||||||
|
},
|
||||||
|
rightContainer: {
|
||||||
|
width: '30%'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
export default styles
|
|
@ -0,0 +1,15 @@
|
||||||
|
import CartComponent from './CartComponent/CartComponent'
|
||||||
|
import CheckComponent from './CheckComponent/CheckComponent'
|
||||||
|
import HeadingComponent from './HeadingComponent/HeadingComponent'
|
||||||
|
import ImageHeader from './ImageHeader/ImageHeader'
|
||||||
|
import RadioComponent from './RadioComponent/RadioComponent'
|
||||||
|
import TitleComponent from './TitleComponent/TitleComponent'
|
||||||
|
|
||||||
|
export {
|
||||||
|
CartComponent,
|
||||||
|
CheckComponent,
|
||||||
|
HeadingComponent,
|
||||||
|
ImageHeader,
|
||||||
|
RadioComponent,
|
||||||
|
TitleComponent
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
import { useNavigation } from '@react-navigation/native'
|
||||||
|
import React, { useContext } from 'react'
|
||||||
|
import { TouchableOpacity, View } from 'react-native'
|
||||||
|
import UserContext from '../../../context/User'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { NAVIGATION_SCREEN } from '../../../utils/constant'
|
||||||
|
import { TextDefault } from '../../Text'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
function DrawerProfile() {
|
||||||
|
const styles = useStyle()
|
||||||
|
const navigation = useNavigation()
|
||||||
|
const { isLoggedIn, loadingProfile, profile } = useContext(UserContext)
|
||||||
|
|
||||||
|
if (loadingProfile) return <TextDefault>Loading...</TextDefault>
|
||||||
|
return (
|
||||||
|
<View style={styles.mainContainer}>
|
||||||
|
{!isLoggedIn && (
|
||||||
|
<View style={styles.logInContainer}>
|
||||||
|
<TouchableOpacity
|
||||||
|
onPress={() => {
|
||||||
|
navigation.navigate(NAVIGATION_SCREEN.CreateAccount)
|
||||||
|
}}>
|
||||||
|
<TextDefault textColor={styles.whiteFont.color} bold H4>
|
||||||
|
Login/Create Account
|
||||||
|
</TextDefault>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
<View style={styles.loggedInContainer}>
|
||||||
|
{isLoggedIn && profile && (
|
||||||
|
<>
|
||||||
|
<View style={styles.imgContainer}>
|
||||||
|
<TextDefault bolder H1>
|
||||||
|
{profile.name.substr(0, 1).toUpperCase()}
|
||||||
|
</TextDefault>
|
||||||
|
</View>
|
||||||
|
<TextDefault
|
||||||
|
textColor={styles.whiteFont.color}
|
||||||
|
medium
|
||||||
|
H5
|
||||||
|
style={alignment.PLxSmall}>
|
||||||
|
Welcome
|
||||||
|
</TextDefault>
|
||||||
|
<TextDefault
|
||||||
|
textColor={styles.whiteFont.color}
|
||||||
|
bold
|
||||||
|
H4
|
||||||
|
style={alignment.PLxSmall}>
|
||||||
|
{profile.name}
|
||||||
|
</TextDefault>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default DrawerProfile
|
|
@ -0,0 +1,55 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import { StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { scale } from '../../../utils/scaling'
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
|
||||||
|
return StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: colors.headerBackground
|
||||||
|
},
|
||||||
|
logInContainer: {
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
justifyContent: 'flex-end',
|
||||||
|
...alignment.PBlarge,
|
||||||
|
...alignment.PLmedium
|
||||||
|
},
|
||||||
|
whiteFont: {
|
||||||
|
color: colors.fontWhite
|
||||||
|
},
|
||||||
|
loggedInContainer: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'center',
|
||||||
|
...alignment.Plarge
|
||||||
|
},
|
||||||
|
imgContainer: {
|
||||||
|
width: scale(70),
|
||||||
|
height: scale(70),
|
||||||
|
borderRadius: scale(15),
|
||||||
|
borderStyle: 'dashed',
|
||||||
|
borderColor: colors.cardContainer,
|
||||||
|
borderWidth: 2,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
overflow: 'hidden',
|
||||||
|
backgroundColor: 'transparent',
|
||||||
|
padding: 2,
|
||||||
|
...alignment.MBsmall
|
||||||
|
},
|
||||||
|
imgResponsive: {
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
borderRadius: scale(15)
|
||||||
|
},
|
||||||
|
loadingView: {
|
||||||
|
backgroundColor: 'transparent',
|
||||||
|
width: '100%',
|
||||||
|
height: '100%'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,3 @@
|
||||||
|
import DrawerProfile from './Profile/DrawerProfile'
|
||||||
|
|
||||||
|
export { DrawerProfile }
|
|
@ -0,0 +1,59 @@
|
||||||
|
/* eslint-disable react/prop-types */
|
||||||
|
import React, { useState } from 'react'
|
||||||
|
import { Image, Platform, View } from 'react-native'
|
||||||
|
import { isObject } from 'validate.js'
|
||||||
|
import Spinner from '../Spinner/Spinner'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
const iosPlacholder = require('../../assets/images/food_placeholder.png')
|
||||||
|
const PLACEHOLDER = require('../../assets/images/imagePlaceholder.png')
|
||||||
|
|
||||||
|
function EnategaImage({
|
||||||
|
imgSource,
|
||||||
|
imgStyle = null,
|
||||||
|
resizeMode = 'cover',
|
||||||
|
spinnerProps
|
||||||
|
}) {
|
||||||
|
const styles = useStyle()
|
||||||
|
const [startImgLoading, setStartImgLoading] = useState(false)
|
||||||
|
|
||||||
|
const imageUrl = isObject(imgSource)
|
||||||
|
? { ...imgSource, cache: 'force-cache' }
|
||||||
|
: imgSource || PLACEHOLDER
|
||||||
|
const style = imgStyle || styles.imgContainer
|
||||||
|
|
||||||
|
const androidImage = (
|
||||||
|
<Image
|
||||||
|
source={imageUrl}
|
||||||
|
style={[styles.imgResponsive, style]}
|
||||||
|
onLoadStart={() => setStartImgLoading(true)}
|
||||||
|
onLoadEnd={() => setStartImgLoading(false)}
|
||||||
|
resizeMode={imgSource ? resizeMode : 'contain'}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
|
||||||
|
const iosImage = (
|
||||||
|
<Image
|
||||||
|
source={imageUrl}
|
||||||
|
defaultSource={iosPlacholder}
|
||||||
|
style={[styles.imgResponsive, style]}
|
||||||
|
resizeMode={imgSource ? resizeMode : 'contain'}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={style}>
|
||||||
|
{startImgLoading && (
|
||||||
|
<Spinner
|
||||||
|
animating={startImgLoading}
|
||||||
|
size="small"
|
||||||
|
style={style}
|
||||||
|
{...spinnerProps}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{Platform.OS === 'ios' ? iosImage : androidImage}
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(EnategaImage)
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { StyleSheet } from 'react-native'
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
return StyleSheet.create({
|
||||||
|
imgContainer: {
|
||||||
|
width: 50,
|
||||||
|
height: 50,
|
||||||
|
borderRadius: 8,
|
||||||
|
overflow: 'hidden'
|
||||||
|
},
|
||||||
|
imgResponsive: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: 'white',
|
||||||
|
height: undefined,
|
||||||
|
width: undefined
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,31 @@
|
||||||
|
import { AntDesign } from '@expo/vector-icons'
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { TouchableOpacity } from 'react-native'
|
||||||
|
import { scale } from '../../utils/scaling'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
function CheckboxBtn(props) {
|
||||||
|
const styles = useStyle()
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return (
|
||||||
|
<TouchableOpacity
|
||||||
|
onPress={props.onPress}
|
||||||
|
style={[
|
||||||
|
styles.mainContainer,
|
||||||
|
props.checked
|
||||||
|
? { backgroundColor: colors.selected }
|
||||||
|
: { backgroundColor: colors.white }
|
||||||
|
]}>
|
||||||
|
{props.checked ? (
|
||||||
|
<AntDesign name="check" size={scale(15)} color={colors.fontWhite} />
|
||||||
|
) : null}
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
CheckboxBtn.propTypes = {
|
||||||
|
onPress: PropTypes.func,
|
||||||
|
checked: PropTypes.bool
|
||||||
|
}
|
||||||
|
export default CheckboxBtn
|
|
@ -0,0 +1,19 @@
|
||||||
|
import { scale } from '../../utils/scaling'
|
||||||
|
import { StyleSheet } from 'react-native'
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
|
||||||
|
return StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
borderColor: colors.horizontalLine,
|
||||||
|
borderWidth: StyleSheet.hairlineWidth,
|
||||||
|
width: scale(20),
|
||||||
|
height: scale(20),
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,50 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { TouchableOpacity, View } from 'react-native'
|
||||||
|
import styles from './styles'
|
||||||
|
|
||||||
|
const DEFAULT_SIZE_MULTIPLIER = 0.7
|
||||||
|
|
||||||
|
function RadioButton(props) {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
|
||||||
|
const {
|
||||||
|
size = 16,
|
||||||
|
innerColor = colors.radioColor,
|
||||||
|
outerColor = colors.radioOuterColor,
|
||||||
|
isSelected = false,
|
||||||
|
onPress = () => null
|
||||||
|
} = props
|
||||||
|
|
||||||
|
const outerStyle = {
|
||||||
|
borderColor: isSelected ? outerColor : colors.fontSecondColor,
|
||||||
|
width: size + size * DEFAULT_SIZE_MULTIPLIER,
|
||||||
|
height: size + size * DEFAULT_SIZE_MULTIPLIER,
|
||||||
|
borderRadius: (size + size * DEFAULT_SIZE_MULTIPLIER) / 2,
|
||||||
|
borderWidth: isSelected ? size / 2 : 1
|
||||||
|
}
|
||||||
|
|
||||||
|
const innerStyle = {
|
||||||
|
width: size / 2,
|
||||||
|
height: size / 2,
|
||||||
|
borderRadius: size / 2,
|
||||||
|
backgroundColor: innerColor
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TouchableOpacity style={[styles.radio, outerStyle]} onPress={onPress}>
|
||||||
|
{isSelected ? <View style={innerStyle} {...props} /> : null}
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
RadioButton.propTypes = {
|
||||||
|
size: PropTypes.number,
|
||||||
|
innerColor: PropTypes.string,
|
||||||
|
outerColor: PropTypes.string,
|
||||||
|
isSelected: PropTypes.bool,
|
||||||
|
onPress: PropTypes.func
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RadioButton
|
|
@ -0,0 +1,7 @@
|
||||||
|
export default {
|
||||||
|
radio: {
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
alignSelf: 'center'
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { TouchableOpacity } from 'react-native'
|
||||||
|
import Spinner from '../../../components/Spinner/Spinner'
|
||||||
|
import TextDefault from '../../../components/Text/TextDefault/TextDefault'
|
||||||
|
import { COLORS } from '../../../Theme'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { ICONS_NAME } from '../../../utils/constant'
|
||||||
|
import { scale } from '../../../utils/scaling'
|
||||||
|
import { CustomIcon } from '../../CustomIcon'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
const FdEmailBtn = props => {
|
||||||
|
const styles = useStyle()
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return (
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
style={styles.mainContainer}
|
||||||
|
onPress={props.onPress}>
|
||||||
|
{props.loadingIcon ? (
|
||||||
|
<Spinner backColor="rgba(0,0,0,0.1)" spinnerColor={colors.tagColor} />
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<CustomIcon
|
||||||
|
style={styles.marginLeft5}
|
||||||
|
name={ICONS_NAME.Logo}
|
||||||
|
color={COLORS.primary}
|
||||||
|
size={scale(19)}
|
||||||
|
/>
|
||||||
|
<TextDefault style={alignment.MLxSmall} bold>
|
||||||
|
Signup using Email
|
||||||
|
</TextDefault>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
FdEmailBtn.propTypes = {
|
||||||
|
onPress: PropTypes.func,
|
||||||
|
loadingIcon: PropTypes.bool
|
||||||
|
}
|
||||||
|
export default FdEmailBtn
|
|
@ -0,0 +1,26 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import { Dimensions, StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { moderateScale } from '../../../utils/scaling'
|
||||||
|
const { height } = Dimensions.get('window')
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
width: '100%',
|
||||||
|
height: height * 0.07,
|
||||||
|
backgroundColor: colors.buttonBackgroundLight,
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
borderRadius: moderateScale(20)
|
||||||
|
},
|
||||||
|
marginLeft5: {
|
||||||
|
...alignment.Pmedium
|
||||||
|
},
|
||||||
|
marginLeft10: {
|
||||||
|
...alignment.MLmedium
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,44 @@
|
||||||
|
import { FontAwesome } from '@expo/vector-icons'
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { TouchableOpacity } from 'react-native'
|
||||||
|
import Spinner from '../../../components/Spinner/Spinner'
|
||||||
|
import TextDefault from '../../../components/Text/TextDefault/TextDefault'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { scale } from '../../../utils/scaling'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
const FdFacebookBtn = props => {
|
||||||
|
const styles = useStyle()
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return (
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
style={styles.mainContainer}
|
||||||
|
onPressIn={props.onPressIn}
|
||||||
|
onPress={props.onPress}>
|
||||||
|
{props.loadingIcon ? (
|
||||||
|
<Spinner backColor="rgba(0,0,0,0.1)" spinnerColor={colors.tagColor} />
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<FontAwesome
|
||||||
|
style={styles.marginLeft5}
|
||||||
|
name="facebook"
|
||||||
|
size={scale(19)}
|
||||||
|
color="#3b5998"
|
||||||
|
/>
|
||||||
|
<TextDefault style={alignment.MLsmall} bold>
|
||||||
|
Signup with Facebook
|
||||||
|
</TextDefault>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
FdFacebookBtn.propTypes = {
|
||||||
|
onPress: PropTypes.func,
|
||||||
|
loadingIcon: PropTypes.bool,
|
||||||
|
onPressIn: PropTypes.func
|
||||||
|
}
|
||||||
|
export default FdFacebookBtn
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import { Dimensions, StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { moderateScale } from '../../../utils/scaling'
|
||||||
|
const { height } = Dimensions.get('window')
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
width: '100%',
|
||||||
|
height: height * 0.07,
|
||||||
|
backgroundColor: colors.buttonBackgroundLight,
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
borderRadius: moderateScale(20)
|
||||||
|
},
|
||||||
|
marginLeft5: {
|
||||||
|
...alignment.Pmedium
|
||||||
|
},
|
||||||
|
marginLeft10: {
|
||||||
|
...alignment.MLmedium
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,50 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { Image, TouchableOpacity } from 'react-native'
|
||||||
|
import Spinner from '../../../components/Spinner/Spinner'
|
||||||
|
import TextDefault from '../../../components/Text/TextDefault/TextDefault'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { moderateScale } from '../../../utils/scaling'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
const FdGoogleBtn = props => {
|
||||||
|
const styles = useStyle()
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return (
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={0.7}
|
||||||
|
style={styles.mainContainer}
|
||||||
|
onPressIn={props.onPressIn}
|
||||||
|
onPress={props.onPress}>
|
||||||
|
{props.loadingIcon ? (
|
||||||
|
<Spinner backColor="rgba(0,0,0,0.1)" spinnerColor={colors.tagColor} />
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Image
|
||||||
|
source={{
|
||||||
|
uri: 'https://pngimg.com/uploads/google/google_PNG19635.png'
|
||||||
|
}}
|
||||||
|
style={[
|
||||||
|
{
|
||||||
|
width: 25,
|
||||||
|
height: 25,
|
||||||
|
marginLeft: moderateScale(10)
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<TextDefault style={alignment.MLlarge} bold>
|
||||||
|
Signup with Google
|
||||||
|
</TextDefault>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
FdGoogleBtn.propTypes = {
|
||||||
|
onPress: PropTypes.func,
|
||||||
|
loadingIcon: PropTypes.bool,
|
||||||
|
onPressIn: PropTypes.func
|
||||||
|
}
|
||||||
|
export default FdGoogleBtn
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import { Dimensions, StyleSheet } from 'react-native'
|
||||||
|
import { alignment } from '../../../utils/alignment'
|
||||||
|
import { moderateScale } from '../../../utils/scaling'
|
||||||
|
const { height } = Dimensions.get('window')
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
width: '100%',
|
||||||
|
height: height * 0.07,
|
||||||
|
backgroundColor: colors.buttonBackgroundLight,
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
borderRadius: moderateScale(20)
|
||||||
|
},
|
||||||
|
marginLeft5: {
|
||||||
|
...alignment.Pmedium
|
||||||
|
},
|
||||||
|
marginLeft10: {
|
||||||
|
...alignment.MLmedium
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useStyle
|
|
@ -0,0 +1,5 @@
|
||||||
|
import FdEmailBtn from './FdEmailBtn/FdEmailBtn'
|
||||||
|
import FdFacebookBtn from './FdFacebookBtn/FdFacebookBtn'
|
||||||
|
import FdGoogleBtn from './FdGoogleBtn/FdGoogleBtn'
|
||||||
|
|
||||||
|
export { FdEmailBtn, FdFacebookBtn, FdGoogleBtn }
|
|
@ -0,0 +1,38 @@
|
||||||
|
import { useTheme } from '@react-navigation/native'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { Switch, TouchableOpacity } from 'react-native'
|
||||||
|
import useStyle from './styles'
|
||||||
|
|
||||||
|
function SwitchBtn(props) {
|
||||||
|
const styles = useStyle()
|
||||||
|
const { colors } = useTheme()
|
||||||
|
return (
|
||||||
|
<TouchableOpacity
|
||||||
|
activeOpacity={1}
|
||||||
|
onPress={props.onPress}
|
||||||
|
style={[
|
||||||
|
styles.mainContainer,
|
||||||
|
props.checked
|
||||||
|
? { backgroundColor: colors.selected }
|
||||||
|
: { backgroundColor: colors.fontWhite }
|
||||||
|
]}>
|
||||||
|
<Switch
|
||||||
|
trackColor={{
|
||||||
|
false: colors.iconColor,
|
||||||
|
true: colors.selected
|
||||||
|
}}
|
||||||
|
thumbColor={colors.fontWhite}
|
||||||
|
ios_backgroundColor="#3e3e3e"
|
||||||
|
onValueChange={props.onPress}
|
||||||
|
value={props.isEnabled}
|
||||||
|
/>
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
SwitchBtn.propTypes = {
|
||||||
|
onPress: PropTypes.func,
|
||||||
|
checked: PropTypes.bool,
|
||||||
|
isEnabled: PropTypes.bool
|
||||||
|
}
|
||||||
|
export default SwitchBtn
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { StyleSheet } from 'react-native'
|
||||||
|
import { scale } from '../../utils/scaling'
|
||||||
|
|
||||||
|
const useStyle = () => {
|
||||||
|
return StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
width: scale(20),
|
||||||
|
height: scale(20),
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default useStyle
|