Compare commits

...

86 Commits

Author SHA1 Message Date
Sharan 5ed156a5ed
Update README.md 2024-03-15 16:36:14 +05:00
usama sattar 8c0ae6b58b
Merge pull request #45 from ninjas-code-official/aliyan-checking-issues
Fixed Language change triggers app reload issue
2024-02-14 13:23:37 +05:00
aliyanlatif efa0e57385 removed extra packages 2024-02-14 09:55:01 +05:00
aliyanlatif 91a1bb84de Fixed Language change triggers app reload issue 2024-02-12 16:54:29 +05:00
usama sattar 69a424fdf1
Merge pull request #44 from ninjas-code-official/aliyan-checking-issues
Fixed issue of app crash  when clicking an item with addons
2024-02-06 13:18:22 +05:00
aliyanlatif 2a75282c18 removed extra code 2024-02-06 09:59:39 +05:00
aliyanlatif 28b7fc6277 fixed order status text issue 2024-01-31 15:05:01 +05:00
aliyanlatif 8e04835487 Fixed issue of app crash when clicking an item with addons 2024-01-30 12:12:37 +05:00
Sharan d3dfbfe11d
Delete .github/ISSUE_TEMPLATE directory 2024-01-15 17:11:43 +05:00
usama sattar a002e6776f
Merge pull request #41 from ninjas-code-official/language-localisation
localisation issue solved
2024-01-12 21:58:56 +05:00
Kashif Shehzad Baloch e2653d8240 localisation issue solved 2024-01-12 17:23:03 +05:00
usama sattar e92ee6a201
Merge pull request #27 from ninjas-code-official/language-localisation
localisation completed in rider app
2024-01-12 16:29:07 +05:00
Sharan 437dff2a7d removed unused files 2024-01-12 15:58:40 +05:00
Sharan 5abcdd88ed remove unnecassy files 2024-01-12 15:50:18 +05:00
Kashif Shehzad Baloch 660a223739 remaining customer app localisation added and some issues solved 2024-01-12 12:44:58 +05:00
Kashif Shehzad Baloch d2d6d642a0 arabic language added in the localisation 2024-01-10 16:54:49 +05:00
Sharan da41d1789d Remove .DS_Store from tracking 2024-01-10 14:51:50 +05:00
Sharan 4a28fde375 added .gitignore file 2024-01-10 14:50:54 +05:00
ALIYAN LATIF a634d8ec71
Rename Amplitude.png to amplitude.png 2024-01-10 12:33:32 +05:00
aliyanlatif 64d9ec545e Updated Readme 2024-01-10 12:25:05 +05:00
aliyanlatif 6608713673 Updated Readme 2024-01-10 12:24:18 +05:00
aliyanlatif e2db744a61 Updated Readme 2024-01-10 12:21:44 +05:00
aliyanlatif 60a2fa8d0f Updated Readme in main branch 2024-01-10 10:12:01 +05:00
Sharan 079526d78d
Update issue templates 2024-01-09 12:51:43 +05:00
Kashif Shehzad Baloch 4fe9049c1e remaining headers added with localisation 2024-01-09 12:18:43 +05:00
Kashif Shehzad Baloch 8c829be3df some header localisation added 2024-01-04 16:45:52 +05:00
Romana-Aijaz b6fad0b435 Merge branch 'language-localisation' of https://github.com/Ninjas-Code-official/Enatega-White-Label-Food-Delivery-Solution into language-localisation 2024-01-04 15:02:52 +05:00
Romana-Aijaz 0ebadcc305 localisation complete 2024-01-04 15:02:31 +05:00
Kashif Shehzad Baloch 14404622a9 localisation completed in rider app 2024-01-03 17:03:39 +05:00
Sharan 3369c6a011
Update README.md 2023-11-28 15:16:01 +05:00
Kashif Shehzad Baloch 921cb3e14a
Update README.md
Abbas's content added.
2023-11-28 10:02:37 +05:00
Kashif Shehzad Baloch 21a5a89e75
Update README.md 2023-11-27 17:07:25 +05:00
Kashif Shehzad Baloch 68ecebe0b9 version updated 2023-11-08 10:29:18 +05:00
Kashif Shehzad Baloch 918b6f432f changes 2023-11-08 10:26:13 +05:00
Kashif Shehzad Baloch 16504a6c21 changes 2023-11-08 10:09:37 +05:00
Kashif Shehzad Baloch 915ed00080 Merge branch 'main' of https://github.com/Ninjas-Code-official/Enatega-Food-Delivery-Solution 2023-11-08 09:57:36 +05:00
Kashif Shehzad Baloch 4a19100d1e some changes 2023-11-08 09:57:16 +05:00
Sharan 726038a41f
Update README.md 2023-11-03 10:25:05 +05:00
Kashif Shehzad Baloch 552477f5e3 issue fixed 2023-11-01 11:42:10 +05:00
Kashif Shehzad Baloch 9c3489d164 issue fixed 2023-10-31 15:39:00 +05:00
Kashif Shehzad Baloch f7a7367d94
Merge pull request #24 from Ninjas-Code-official/fixing-issues
dark theme issues
2023-10-18 14:09:18 +05:00
Kashif Shehzad Baloch 408a5d0fc9 dark theme issues 2023-10-18 14:07:20 +05:00
Kashif Shehzad Baloch c1ac502512
Merge pull request #19 from Ninjas-Code-official/fixing-issues
Fixing issues
2023-10-16 15:32:26 +05:00
Kashif Shehzad Baloch f92bf954a2 other changes 2023-10-16 14:55:45 +05:00
Kashif Shehzad Baloch 6c286f5093 urls updated 2023-10-16 14:52:01 +05:00
Kashif Shehzad Baloch c6583f493e urls updated 2023-10-13 16:30:31 +05:00
Kashif Shehzad Baloch d779966dc6 issues fixed and build details 2023-10-13 16:27:58 +05:00
Kashif Shehzad Baloch 22b4a4b519 urls updated 2023-10-13 16:26:20 +05:00
aliamerce 3494942113
Merge pull request #14 from Ninjas-Code-official/readme-updated
Update README.md
2023-09-27 13:04:27 +05:00
aliamerce ef41326444
Update README.md 2023-09-27 12:42:28 +05:00
Sharan 726bd75055
Update README.md 2023-08-01 12:57:50 +05:00
Sharan 1354b518f3
Update README.md 2023-07-27 14:15:21 +05:00
Muhammad Adnan d1def5660d
Update README.md 2023-07-10 10:14:20 +05:00
Danyal Malik 2c7de6f2f2 changed documentation link 2023-07-09 00:27:50 +05:00
haiderasif 7eff2614d6
Update README.md 2023-07-06 14:42:22 +05:00
Ninjas Code - 4 dc512b5569 Server URl 2023-06-01 14:26:37 +05:00
haiderasif 128b5c1968
Update README.md 2023-05-29 10:21:32 +05:00
Ninjas Code - 4 5af6790fbb warnings 2023-05-26 15:58:14 +05:00
Ninjas Code - 4 305efbd0f9 after upgrade 2023-04-13 12:21:09 +05:00
Ninjas Code - 4 5b52e87e1a ios map working 2023-04-03 10:17:10 +05:00
Ninjas Code - 4 b68ad15d6b commit by adnan 2023-03-31 10:56:34 +05:00
Ninjas Code - 4 782d88b9f1 aa 2023-03-31 10:28:53 +05:00
Ninjas Code - 4 fceae9007d commit 2023-03-31 09:45:49 +05:00
Ninjas Code - 4 4512a7a878 delete extra files 2023-03-31 09:21:09 +05:00
Ninjas Code - 4 de0c5dd168 Delete Button working on both Android and ios 2023-03-31 08:50:24 +05:00
Sharan 244f669f95
Merge pull request #6 from Ninjas-Code-official/staging
Staging
2023-03-29 13:07:49 +05:00
Ninjas Code - 4 49c7b36a7b merging 2023-03-29 13:07:24 +05:00
Ninjas Code - 4 16f270b438 Merge branch 'main' into staging 2023-03-29 13:06:48 +05:00
Sharan 2f45f293a7
Merge pull request #5 from Ninjas-Code-official/adnan-admin-dashboard-singlevendor
@Adnan admin dashboard singlevendor
2023-03-29 12:58:25 +05:00
Sharan 3423109a42
Merge pull request #4 from Ninjas-Code-official/adnan-rider-app-singlevendor
@Adnan rider app singlevendor(upgrade to Expo SDK 47)
2023-03-29 12:56:32 +05:00
Ninjas Code - 4 c441ebfd13 Delete account button 2023-03-29 12:52:59 +05:00
Sharan 4370f69272
Merge pull request #3 from Ninjas-Code-official/feature1
Feature1 (Enatega single vendor Customer App Upgrade successfully)
2023-03-29 12:48:58 +05:00
sharan 85d5a84be0 updated readme 2023-03-27 14:37:29 +05:00
Ninjas Code - 4 7caec6e3a3 map issue resolve on android 2023-03-24 14:26:45 +05:00
Ninjas Code - 4 e68e05536d final commit 2023-03-22 11:58:12 +05:00
Ninjas Code - 4 481b9f1a94 after resovling fastlane error 2023-03-20 15:17:25 +05:00
Ninjas Code - 4 a92946771c after fixing fastlane error 2023-03-20 12:29:19 +05:00
sharan 8b2185187b added product video demo 2023-03-17 12:48:22 +05:00
Ninjas Code - 4 55a4dd3a46 final commit after build 2023-03-16 19:33:00 +05:00
Ninjas Code - 4 3ead205d37 Merge branch 'adnan-admin-dashboard-singlevendor' into feature1 2023-03-14 14:44:16 +05:00
Ninjas Code - 4 885c967cdb Error and Warning remove 2023-03-13 16:03:39 +05:00
Ninjas Code - 4 ee0bd79b8f Nested patching 2023-03-10 17:06:57 +05:00
Ninjas Code - 4 6515e2120a admin-dashboard-working 2023-03-10 10:33:55 +05:00
Ninjas Code - 4 65bf311498 upgrade to SDK 47 2023-03-09 14:15:59 +05:00
Ninjas Code - 4 194a514431 upgrade to SDK 47 2023-03-08 16:09:10 +05:00
Ninjas Code - 4 b651b11967 testing if changes in PR will reflect 2023-02-16 10:20:38 +05:00
414 changed files with 48055 additions and 86023 deletions

BIN
.DS_Store vendored

Binary file not shown.

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.expo
.DS_Store

View File

@ -0,0 +1,8 @@
NODE_PATH=./src
SKIP_PREFLIGHT_CHECK=true
REACT_APP_CLOUDINARY_UPLOAD_URL = https://api.cloudinary.com/v1_1/dimjm4ald/image/upload
REACT_APP_SERVER_URL = https://enatega-singlevendor.up.railway.app/
REACT_APP_WS_SERVER_URL = wss://enatega-singlevendor.up.railway.app/
REACT_APP_CLOUDINARY_CATEGORY = hmtkg7s5
REACT_APP_CLOUDINARY_FOOD = wdgvyas8
REACT_APP_ENV = “dev”

View File

@ -0,0 +1,10 @@
All variables should be appended by REACT_APP_
NODE_PATH=./src
SKIP_PREFLIGHT_CHECK=true
REACT_APP_CLOUDINARY_UPLOAD_URL = <Cloudinary URL>
REACT_APP_SERVER_URL = <Your SERVER URL>
REACT_APP_WS_SERVER_URL = <SERVER URL with appending "ws" for local or "wss" for remote>
REACT_APP_CLOUDINARY_CATEGORY = <Folder ID from Cloudinary>
REACT_APP_CLOUDINARY_FOOD = <Folder ID from Cloudinary>
REACT_APP_ENV = <Alias that is mentioned in package.json script>

View File

@ -0,0 +1,8 @@
NODE_PATH=./src
SKIP_PREFLIGHT_CHECK=true
REACT_APP_CLOUDINARY_UPLOAD_URL = https://api.cloudinary.com/v1_1/dimjm4ald/image/upload
REACT_APP_SERVER_URL = https://enatega-singlevendor.up.railway.app/
REACT_APP_WS_SERVER_URL = wss://enatega-singlevendor.up.railway.app/
REACT_APP_CLOUDINARY_CATEGORY = hmtkg7s5
REACT_APP_CLOUDINARY_FOOD = wdgvyas8
REACT_APP_ENV = "prod"

View File

@ -0,0 +1,8 @@
NODE_PATH=./src
SKIP_PREFLIGHT_CHECK=true
REACT_APP_CLOUDINARY_UPLOAD_URL = https://api.cloudinary.com/v1_1/dimjm4ald/image/upload
REACT_APP_SERVER_URL = https://enatega-singlevendor.up.railway.app/
REACT_APP_WS_SERVER_URL = wss://enatega-singlevendor.up.railway.app/
REACT_APP_CLOUDINARY_CATEGORY = hmtkg7s5
REACT_APP_CLOUDINARY_FOOD = wdgvyas8
REACT_APP_ENV = “staging”

View File

@ -0,0 +1,5 @@
src/assets/*
public/*
./node_modules
./patches
./history

View File

@ -0,0 +1,28 @@
{
"env": {
"browser": true,
"es6": true
},
"extends": [
"plugin:react/recommended",
"standard"
],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 11,
"sourceType": "module"
},
"plugins": [
"react"
],
"rules": {
"space-before-function-paren": ["error", "never"],
"react/prop-types": 0
}
}

4
Admin Dashboard/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/build
/node_modules
package-lock.json
yarn.lock

View File

@ -1,4 +0,0 @@
## [1.0.0] 2019-03-13
### Original Release
- Added Reactstrap as base framework
- Added design from Argon Dashboard by Creative Tim

View File

@ -1,42 +0,0 @@
!!! IF YOU DO NOT USE THIS ISSUES TEAMPLATE, YOUR ISSUE IS LIABLE TO BEING IGNORED BY US
# Prerequisites
Please answer the following questions for yourself before submitting an issue.
- [ ] I am running the latest version
- [ ] I checked the documentation and found no answer
- [ ] I checked to make sure that this issue has not already been filed
- [ ] I'm reporting the issue to the correct repository (for multi-repository projects)
# Expected Behavior
Please describe the behavior you are expecting
# Current Behavior
What is the current behavior?
# Failure Information (for bugs)
Please help provide information about the failure if this is a bug. If it is not a bug, please remove the rest of this template.
## Steps to Reproduce
Please provide detailed steps for reproducing the issue.
1. step 1
2. step 2
3. you get it...
## Context
Please provide any relevant information about your setup. This is important in case the issue is not reproducible except for under certain conditions.
* Device:
* Operating System:
* Browser and Version:
## Failure Logs
Please include any relevant log snippets or files here.

View File

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2019 Creative Tim
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,253 +0,0 @@
# [Argon Dashboard React](https://demos.creative-tim.com/argon-dashboard-react?ref=adr-github-readme) [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&logo=twitter)](https://twitter.com/home?status=Argon%20Dashboard%20is%20a%20Free%20Bootstrap%204,%20React%20and%20Reactstrap%20Dashboard%20made%20using%20create-react-app%20%E2%9D%A4%EF%B8%8F%0Ahttps%3A//demos.creative-tim.com/argon-dashboard-react%20%23react%20%23reactstrap%20%23createreactapp%20%23argon%20%23argondesign%20%23reactdashboard%20%23argonreact%20%23reactdesign%20%23bootstrap%20%23material%20%23design%20%23uikit%20%23freebie%20%20via%20%40CreativeTim)
![version](https://img.shields.io/badge/version-1.0.0-blue.svg) ![license](https://img.shields.io/badge/license-MIT-blue.svg) [![GitHub issues open](https://img.shields.io/github/issues/creativetimofficial/argon-dashboard-react.svg?maxAge=2592000)](https://github.com/creativetimofficial/argon-dashboard-react/issues?q=is%3Aopen+is%3Aissue) [![GitHub issues closed](https://img.shields.io/github/issues-closed-raw/creativetimofficial/argon-dashboard-react.svg?maxAge=2592000)](https://github.com/creativetimofficial/argon-dashboard-react/issues?q=is%3Aissue+is%3Aclosed) [![Join the chat at https://gitter.im/NIT-dgp/General](https://badges.gitter.im/NIT-dgp/General.svg)](https://gitter.im/creative-tim-general/Lobby) [![Chat](https://img.shields.io/badge/chat-on%20discord-7289da.svg)](https://discord.gg/E4aHAQy)
![Product Gif](https://raw.githubusercontent.com/creativetimofficial/public-assets/master/argon-dashboard-react/argon-dashboard-react.gif)
Start your development with a Dashboard for [Bootstrap 4](https://getbootstrap.com/?ref=creativetim), [React](https://reactjs.org/?ref=creativetim) and [Reactstrap](https://reactstrap.github.io/?ref=creativetim), made with [create-react-app](https://facebook.github.io/create-react-app/?ref=creativetim). It is open source, free and it features many components that can help you create amazing websites.
**Fully Coded Components**
Argon Dashboard React is built with over 100 individual components, giving you the freedom of choosing and combining. All components can take variations in color, that you can easily modify using SASS files.
You will save a lot of time going from prototyping to full-functional code, because all elements are implemented. This Dashboard is coming with pre-built examples, so the development process is seamless, switching from our pages to the real website is very easy to be done.
Every element has multiple states for colors, styles, hover, focus, that you can easily access and use.
**Complex Documentation**
Each element is well presented in a very complex documentation. You can read more about the idea behind this [dashboard here](https://demos.creative-tim.com/argon-dashboard-react/#/documentation/overview?ref=creativetim). You can check the [components here](https://demos.creative-tim.com/argon-dashboard-react/#/documentation/alerts?ref=creativetim) and the [foundation here](https://demos.creative-tim.com/argon-dashboard/#/documentation/colors?ref=creativetim).
**Example Pages**
If you want to get inspiration or just show something directly to your clients, you can jump start your development with our pre-built example pages. You will be able to quickly set up the basic structure for your web project.
## Table of Contents
* [Versions](#versions)
* [Demo](#demo)
* [Quick Start](#quick-start)
* [Documentation](#documentation)
* [File Structure](#file-structure)
* [Browser Support](#browser-support)
* [Resources](#resources)
* [Reporting Issues](#reporting-issues)
* [Licensing](#licensing)
* [Useful Links](#useful-links)
## Versions
[<img src="https://github.com/creativetimofficial/public-assets/blob/master/logos/html-logo.jpg?raw=true" width="60" height="60" />](https://www.creative-tim.com/product/argon-dashboard?ref=adr-github-readme)[<img src="https://github.com/creativetimofficial/public-assets/blob/master/logos/react-logo.jpg?raw=true" width="60" height="60" />](https://www.creative-tim.com/product/argon-dashboard-react?ref=adr-github-readme)[<img src="https://github.com/creativetimofficial/public-assets/blob/master/logos/angular-logo.jpg?raw=true" width="60" height="60" />](https://www.creative-tim.com/product/argon-dashboard-angular)[<img src="https://github.com/creativetimofficial/public-assets/blob/master/logos/nodejs-logo.jpg?raw=true" width="60" height="60" />](https://www.creative-tim.com/product/argon-dashboard-nodejs?ref=adr-github-readme)[<img src="https://raw.githubusercontent.com/creativetimofficial/public-assets/master/logos/laravel_logo.png" width="60" height="60" style="background:white"/>](https://www.creative-tim.com/product/argon-dashboard-laravel?ref=adr-github-readme)[<img src="https://raw.githubusercontent.com/creativetimofficial/public-assets/master/logos/sketch-logo.jpg" width="60" height="60" />](https://github.com/creativetimofficial/argon-dashboard/tree/sketch?ref=creativetim)
| HTML | React | Angular |
| --- | --- | --- |
| [![Argon Dashboard HTML](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard/argon-dashboard.jpg?raw=true)](https://www.creative-tim.com/product/argon-dashboard) | [![Argon Dashboard React](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-react/argon-dashboard-react.jpg?raw=true)](https://www.creative-tim.com/product/argon-dashboard-react) | [![Argon Dashboard Angular](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-angular/argon-dashboard-angular.jpg?raw=true)](https://www.creative-tim.com/product/argon-dashboard-angular)
| NodeJS | Laravel |
| --- | --- |
| [![Argon Dashboard NodeJS](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-nodejs/argon-dashboard-nodejs.jpg?raw=true)](https://www.creative-tim.com/product/argon-dashboard-nodejs) | [![Argon Dashboard Laravel](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-laravel/argon-dashboard-laravel.jpg?raw=true)](https://www.creative-tim.com/product/argon-dashboard-laravel) |
## Demo
| Dashboard Page | Icons Page | Tables Page | Maps Page |
| --- | --- | --- | --- |
| [![Dashboard Page](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-react/dashboard-page.png?raw=true)](https://demos.creative-tim.com/argon-dashboard-react/#/admin/index) | [![Icons Page](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-react/icons-page.png?raw=true)](https://demos.creative-tim.com/argon-dashboard-react/#/admin/icons) | [![Tables Page](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-react/tables-page.png?raw=true)](https://demos.creative-tim.com/argon-dashboard-react/#/admin/tables) | [![Maps Page](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-react/maps-page.png?raw=true)](https://demos.creative-tim.com/argon-dashboard-react/#/admin/maps)
| Register Page | Login Page Page | Profile Page |
| --- | --- | --- |
| [![Login Page](https://raw.githubusercontent.com/creativetimofficial/public-assets/master/argon-dashboard-react/register-page.png)](https://demos.creative-tim.com/argon-dashboard-react/#/auth/register) | [![Login Page Page](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-react/login-page.png?raw=true)](https://demos.creative-tim.com/argon-dashboard-react/#/auth/login) | [![Profile Page](https://github.com/creativetimofficial/public-assets/blob/master/argon-dashboard-react/user-page.png?raw=true)](https://demos.creative-tim.com/argon-dashboard-react/#/admin/user-profile)
[View More](https://demos.creative-tim.com/argon-dashboard-react?ref=adr-github-readme)
## Quick start
- `npm i argon-dashboard-react`
- [Download from Github](https://github.com/creativetimofficial/argon-dashboard-react/archive/master.zip).
- [Download from Creative Tim](https://www.creative-tim.com/product/argon-dashboard-react?ref=adr-github-readme).
- Install with [Bower](https://bower.io/?ref=creativetim): ```bower install argon-dashboard-react```.
- Clone the repo: `git clone https://github.com/creativetimofficial/argon-dashboard-react.git`.
## Documentation
The documentation for the Material Kit is hosted at our [website](https://demos.creative-tim.com/argon-dashboard-react/documentation/overview).
## File Structure
Within the download you'll find the following directories and files:
```
Argon Dashboard React
.
├── Documentation
│   └── documentation.html
├── CHANGELOG.md
├── ISSUE_TEMPLATE.md
├── LICENSE
├── README.md
├── package.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   └── manifest.json
└── src
├── assets
│   ├── css
│   │   ├── argon-dashboard-react.css
│   │   ├── argon-dashboard-react.css.map
│   │   └── argon-dashboard-react.min.css
│   ├── fonts
│   │   └── nucleo
│   ├── img
│   │   ├── brand
│   │   ├── icons
│   │   │   └── common
│   │   └── theme
│   ├── scss
│   │   ├── argon-dashboard-react.scss
│   │   ├── bootstrap
│   │   │   ├── mixins
│   │   │   └── utilities
│   │   ├── core
│   │   │   ├── alerts
│   │   │   ├── avatars
│   │   │   ├── badges
│   │   │   ├── buttons
│   │   │   ├── cards
│   │   │   ├── charts
│   │   │   ├── close
│   │   │   ├── custom-forms
│   │   │   ├── dropdowns
│   │   │   ├── footers
│   │   │   ├── forms
│   │   │   ├── headers
│   │   │   ├── icons
│   │   │   ├── list-groups
│   │   │   ├── maps
│   │   │   ├── masks
│   │   │   ├── mixins
│   │   │   ├── modals
│   │   │   ├── navbars
│   │   │   ├── navs
│   │   │   ├── paginations
│   │   │   ├── popovers
│   │   │   ├── progresses
│   │   │   ├── separators
│   │   │   ├── tables
│   │   │   ├── type
│   │   │   ├── utilities
│   │   │   └── vendors
│   │   ├── custom
│   │   └── react
│   └── vendor
│   ├── @fortawesome
│   │   └── fontawesome-free
│   │   ├── LICENSE.txt
│   │   ├── css
│   │   ├── js
│   │   ├── less
│   │   ├── scss
│   │   ├── sprites
│   │   ├── svgs
│   │   │   ├── brands
│   │   │   ├── regular
│   │   │   └── solid
│   │   └── webfonts
│   └── nucleo
│   ├── css
│   └── fonts
├── components
│   ├── Footers
│   │   ├── AdminFooter.jsx
│   │   └── AuthFooter.jsx
│   ├── Headers
│   │   ├── Header.jsx
│   │   └── UserHeader.jsx
│   ├── Navbars
│   │   ├── AdminNavbar.jsx
│   │   └── AuthNavbar.jsx
│   └── Sidebar
│   └── Sidebar.jsx
├── index.js
├── layouts
│   ├── Admin.jsx
│   └── Auth.jsx
├── routes.js
├── variables
│   └── charts.jsx
└── views
├── Index.jsx
└── examples
├── Icons.jsx
├── Login.jsx
├── Maps.jsx
├── Profile.jsx
├── Register.jsx
└── Tables.jsx
```
## Browser Support
At present, we officially aim to support the last two versions of the following browsers:
<img src="https://github.com/creativetimofficial/public-assets/blob/master/logos/chrome-logo.png?raw=true" width="64" height="64"> <img src="https://raw.githubusercontent.com/creativetimofficial/public-assets/master/logos/firefox-logo.png" width="64" height="64"> <img src="https://raw.githubusercontent.com/creativetimofficial/public-assets/master/logos/edge-logo.png" width="64" height="64"> <img src="https://raw.githubusercontent.com/creativetimofficial/public-assets/master/logos/safari-logo.png" width="64" height="64"> <img src="https://raw.githubusercontent.com/creativetimofficial/public-assets/master/logos/opera-logo.png" width="64" height="64">
## Resources
- Demo: <https://demos.creative-tim.com/argon-dashboard-react/#/admin/index?ref=adr-github-readme>
- Download Page: <https://www.creative-tim.com/product/argon-dashboard-react?ref=adr-github-readme>
- Documentation: <https://demos.creative-tim.com/argon-dashboard-react/#/documentation/overview?ref=adr-github-readme>
- License Agreement: <https://www.creative-tim.com/license?ref=adr-github-readme>
- Support: <https://www.creative-tim.com/contact-us?ref=adr-github-readme>
- Issues: [Github Issues Page](https://github.com/creativetimofficial/argon-dashboard-react/issues?ref=creativetim)
- **Kit:**
| HTML | Vue |
| --- | --- |
| [![Argon Design System HTML](https://github.com/creativetimofficial/public-assets/blob/master/argon-design-system/argon-design-system.jpg?raw=true)](https://www.creative-tim.com/product/argon-design-system) | [![Vue Argon Design System](https://github.com/creativetimofficial/public-assets/blob/master/vue-argon-design-system/vue-argon-design-system.jpg?raw=true)](https://www.creative-tim.com/product/vue-argon-design-system) |
## Reporting Issues
We use GitHub Issues as the official bug tracker for the Material Kit. Here are some advices for our users that want to report an issue:
1. Make sure that you are using the latest version of the Material Kit. Check the CHANGELOG from your dashboard on our [website](https://www.creative-tim.com/?ref=adr-github-readme).
2. Providing us reproducible steps for the issue will shorten the time it takes for it to be fixed.
3. Some issues may be browser specific, so specifying in what browser you encountered the issue might help.
## Licensing
- Copyright 2018 Creative Tim (https://www.creative-tim.com/?ref=adr-github-readme)
- Licensed under MIT (https://github.com/creativetimofficial/argon-dashboard-react/blob/master/LICENSE.md?ref=creativetim)
## Useful Links
- [Tutorials](https://www.youtube.com/channel/UCVyTG4sCw-rOvB9oHkzZD1w?ref=creativetim)
- [Affiliate Program](https://www.creative-tim.com/affiliates/new?ref=adr-github-readme) (earn money)
- [Blog Creative Tim](http://blog.creative-tim.com/?ref=adr-github-readme)
- [Free Products](https://www.creative-tim.com/bootstrap-themes/free?ref=adr-github-readme) from Creative Tim
- [Premium Products](https://www.creative-tim.com/bootstrap-themes/premium?ref=adr-github-readme) from Creative Tim
- [React Products](https://www.creative-tim.com/bootstrap-themes/react-themes?ref=adr-github-readme) from Creative Tim
- [Angular Products](https://www.creative-tim.com/bootstrap-themes/angular-themes?ref=adr-github-readme) from Creative Tim
- [VueJS Products](https://www.creative-tim.com/bootstrap-themes/vuejs-themes?ref=adr-github-readme) from Creative Tim
- [More products](https://www.creative-tim.com/bootstrap-themes?ref=adr-github-readme) from Creative Tim
- Check our Bundles [here](https://www.creative-tim.com/bundles?ref=adr-github-readme)
### Social Media
Twitter: <https://twitter.com/CreativeTim?ref=creativetim>
Facebook: <https://www.facebook.com/CreativeTim?ref=creativetim>
Dribbble: <https://dribbble.com/creativetim?ref=creativetim>
Instagram: <https://www.instagram.com/CreativeTimOfficial?ref=creativetim>

View File

@ -35,7 +35,7 @@ function Footer(props) {
<NavItem>
<NavLink
href="https://ninjascode.com/pages/ourteam.html"
href="https://ninjascode.com/our-team"
rel="noopener noreferrer"
target="_blank">
{t('About Us')}

View File

@ -27,7 +27,7 @@ function AuthFooter(props) {
</NavItem>
<NavItem>
<NavLink
href="https://ninjascode.com/pages/ourteam.html"
href="https://ninjascode.com/our-team"
target="_blank">
{t('About Us')}
</NavLink>

View File

@ -3,11 +3,11 @@ import { Route, Switch } from 'react-router-dom'
// reactstrap components
import { Container } from 'reactstrap'
// core components
import AdminNavbar from 'components/Navbars/AdminNavbar.jsx'
import AdminFooter from 'components/Footers/AdminFooter.jsx'
import Sidebar from 'components/Sidebar/Sidebar.jsx'
import AdminNavbar from '../components/Navbars/AdminNavbar.jsx'
import AdminFooter from '../components/Footers/AdminFooter.jsx'
import Sidebar from '../components/Sidebar/Sidebar.jsx'
import routes from 'routes.js'
import routes from './../routes.js'
const Admin = props => {
var divRef = useRef(null)
@ -49,7 +49,7 @@ const Admin = props => {
routes={routes}
logo={{
innerLink: '/admin/dashboard',
imgSrc: require('assets/img/brand/logo.png'),
imgSrc: require('../assets/img/brand/logo.png'),
imgAlt: '...'
}}
/>

View File

@ -4,10 +4,10 @@ import { Route, Switch } from 'react-router-dom'
import { Container, Row } from 'reactstrap'
// core components
import AuthNavbar from 'components/Navbars/AuthNavbar.jsx'
import AuthFooter from 'components/Footers/AuthFooter.jsx'
import AuthNavbar from '../components/Navbars/AuthNavbar.jsx'
import AuthFooter from '../components/Footers/AuthFooter.jsx'
import routes from 'routes.js'
import routes from '../routes.js'
function Auth(props) {
useEffect(() => {

View File

@ -1,7 +1,7 @@
/* eslint-disable react/display-name */
import React, { useState } from 'react'
import { Container, Badge, Row, Card, Modal } from 'reactstrap'
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import AddonComponent from '../components/Addon/Addon'
import { addons, deleteAddon } from '../apollo/server'
import CustomLoader from '../components/Loader/CustomLoader'

View File

@ -8,7 +8,7 @@ import CustomLoader from '../components/Loader/CustomLoader'
// reactstrap components
import { Badge, Card, Container, Row, Modal } from 'reactstrap'
// core components
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import { categories, deleteCategory, getFoods } from '../apollo/server'
import DataTable from 'react-data-table-component'
import orderBy from 'lodash/orderBy'

View File

@ -3,7 +3,7 @@ import { withTranslation } from 'react-i18next'
import { Container } from 'reactstrap'
import { Query } from 'react-apollo'
import gql from 'graphql-tag'
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import { getConfiguration } from '../apollo/server'
import OrderConfiguration from '../components/Configuration/Order/Order'
import EmailConfiguration from '../components/Configuration/Email/Email'

View File

@ -8,7 +8,7 @@ import CouponComponent from '../components/Coupon/Coupon'
import { Badge, Card, Container, Row, Modal } from 'reactstrap'
// core components
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import CustomLoader from '../components/Loader/CustomLoader'
import DataTable from 'react-data-table-component'
import orderBy from 'lodash/orderBy'

View File

@ -16,7 +16,7 @@ import {
Col
} from 'reactstrap'
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import { Query } from 'react-apollo'
import {
getDashboardTotal,

View File

@ -6,7 +6,7 @@ import { withTranslation } from 'react-i18next'
// reactstrap components
import { Badge, Card, Container, Row, Media, Modal } from 'reactstrap'
// core components
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import { getFoods, deleteFood } from '../apollo/server'
import FoodComponent from '../components/Food/Food'
import CustomLoader from '../components/Loader/CustomLoader'

View File

@ -2,7 +2,7 @@ import React, { useState } from 'react'
import gql from 'graphql-tag'
import { Mutation } from 'react-apollo'
import { withTranslation } from 'react-i18next'
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import { sendNotificationUser } from '../apollo/server'
import CustomLoader from '../components/Loader/CustomLoader'
import { validateFunc } from '../constraints/constraints'

View File

@ -1,7 +1,7 @@
/* eslint-disable react/display-name */
import React, { useState } from 'react'
import { Badge, Container, Row, Card, Modal } from 'reactstrap'
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import OptionComponent from '../components/Option/Option'
import CustomLoader from '../components/Loader/CustomLoader'
import DataTable from 'react-data-table-component'

View File

@ -3,7 +3,7 @@ import { withTranslation } from 'react-i18next'
import { Container, Row, Card, Modal } from 'reactstrap'
import OrderComponent from '../components/Order/Order'
import OrdersData from '../components/Order/OrderData'
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import { Query, compose, withApollo } from 'react-apollo'
import gql from 'graphql-tag'
import { getOrders } from '../apollo/server'

View File

@ -2,7 +2,7 @@
import React from 'react'
import { withTranslation } from 'react-i18next'
import { Container, Row, Card } from 'reactstrap'
import Header from 'components/Headers/Header.jsx'
import Header from '../components/Headers/Header.jsx'
import CustomLoader from '../components/Loader/CustomLoader'
import { Query, compose, withApollo } from 'react-apollo'
import gql from 'graphql-tag'

View File

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

View File

@ -1,71 +0,0 @@
/*****************************
* 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:
'',
ANDROID_CLIENT_ID_GOOGLE:
'',
FACEBOOK_APP_ID: '404956210315749',
AMPLITUDE_API_KEY: '',
STRIPE_PUBLIC_KEY: '',
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:
'',
ANDROID_CLIENT_ID_GOOGLE:
'',
FACEBOOK_APP_ID: '404956210315749',
AMPLITUDE_API_KEY: '',
STRIPE_PUBLIC_KEY: '',
STRIPE_IMAGE_URL:
'https://staging-enatega-single-api.herokuapp.com/assets/images/logo.png',
STRIPE_STORE_NAME: 'Enatega'
},
production: {
GRAPHQL_URL: 'https://prod-enatega-single-api.herokuapp.com/graphql',
WS_GRAPHQL_URL: 'wss://prod-enatega-single-api.herokuapp.com/graphql',
SERVER_URL: 'https://prod-enatega-single-api.herokuapp.com/', // put / at the end of server url
IOS_CLIENT_ID_GOOGLE:
'',
ANDROID_CLIENT_ID_GOOGLE:
'',
FACEBOOK_APP_ID: '3017447961609878',
AMPLITUDE_API_KEY: '',
STRIPE_PUBLIC_KEY: '',
STRIPE_IMAGE_URL:
'https://prod-enatega-single-api.herokuapp.com/assets/images/logo.png',
STRIPE_STORE_NAME: 'Enatega'
}
}
const getEnvVars = (env = Constants.manifest.releaseChannel) => {
// What is __DEV__ ?
// This variable is set to true when react-native is running in Dev mode.
// __DEV__ is true when run locally, but false when published.
// eslint-disable-next-line no-undef
if (__DEV__) {
return ENV.development
} else if (env === 'production') {
return ENV.production
} else if (env === 'staging') {
return ENV.staging
} else {
return ENV.production
}
}
export default getEnvVars

File diff suppressed because it is too large Load Diff

View File

@ -1,118 +0,0 @@
{
"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
}

View File

@ -1,51 +0,0 @@
diff --git a/node_modules/react-native-material-textfield/src/components/affix/index.js b/node_modules/react-native-material-textfield/src/components/affix/index.js
index 0f85022..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,
};

View File

@ -1,92 +0,0 @@
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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

View File

@ -1,44 +0,0 @@
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

View File

@ -1,27 +0,0 @@
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

View File

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

View File

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

View File

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

View File

@ -1,300 +0,0 @@
import { useMutation } from '@apollo/react-hooks'
import { FontAwesome } from '@expo/vector-icons'
import { useNavigation, useTheme } from '@react-navigation/native'
import * as AppAuth from 'expo-app-auth'
import * as AppleAuthentication from 'expo-apple-authentication'
import Constants from 'expo-constants'
import * as Facebook from 'expo-facebook'
import * as Google from 'expo-google-app-auth'
import * as Notifications from 'expo-notifications'
import gql from 'graphql-tag'
import React, { useContext, useEffect, useState } from 'react'
import { Platform, TouchableOpacity, View } from 'react-native'
import getEnvVars from '../../../environment'
import { login } from '../../apollo/server'
import {
EnategaImage,
FdEmailBtn,
FdFacebookBtn,
FdGoogleBtn,
FlashMessage,
RegistrationHeader,
Spinner,
TextDefault,
WrapperView
} from '../../components'
import UserContext from '../../context/User'
import { alignment } from '../../utils/alignment'
import Analytics from '../../utils/analytics'
import { NAVIGATION_SCREEN } from '../../utils/constant'
import { scale } from '../../utils/scaling'
import useStyle from './styles'
const { IOS_CLIENT_ID_GOOGLE, ANDROID_CLIENT_ID_GOOGLE, FACEBOOK_APP_ID } =
getEnvVars()
const LOGIN = gql`
${login}
`
const Logo = require('../../../assets/logo.png')
const CreateAccount = () => {
const styles = useStyle()
const { colors } = useTheme()
const navigation = useNavigation()
const [enableApple, setEnableApple] = useState(false)
const [loginButton, loginButtonSetter] = useState(null)
const [loading, setLoading] = useState(false)
const { setTokenAsync } = useContext(UserContext)
useEffect(() => {
checkIfSupportsAppleAuthentication()
}, [])
const [mutate] = useMutation(LOGIN, { onCompleted, onError })
async function checkIfSupportsAppleAuthentication() {
setEnableApple(await AppleAuthentication.isAvailableAsync())
}
async function onCompleted(data) {
try {
const trackingOpts = {
id: data.login.userId,
usernameOrEmail: data.login.email
}
Analytics.identify(data.login.userId, trackingOpts)
Analytics.track(Analytics.events.USER_CREATED_ACCOUNT, trackingOpts)
setTokenAsync(data.login.token)
navigation.navigate(NAVIGATION_SCREEN.Menu)
} catch (e) {
console.log(e)
} finally {
setLoading(false)
}
}
function onError(error) {
try {
console.log(JSON.stringify(error))
FlashMessage({
message: error.graphQLErrors[0].message
})
loginButtonSetter(null)
} catch (e) {
console.log(e)
} finally {
setLoading(false)
}
}
async function mutateLogin(user) {
setLoading(true)
let notificationToken = null
if (Constants.isDevice) {
const { status: existingStatus } =
await Notifications.getPermissionsAsync()
if (existingStatus === 'granted') {
notificationToken = (await Notifications.getExpoPushTokenAsync()).data
}
}
mutate({ variables: { ...user, notificationToken } })
}
function renderAppleAction() {
if (loading && loginButton === 'Apple') {
return (
<View style={styles.buttonBackground}>
<Spinner backColor="rgba(0,0,0,0.1)" spinnerColor={colors.tagColor} />
</View>
)
}
return (
<TouchableOpacity
style={styles.appleBtn}
onPress={async() => {
try {
const credential = await AppleAuthentication.signInAsync({
requestedScopes: [
AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
AppleAuthentication.AppleAuthenticationScope.EMAIL
]
})
if (credential) {
const user = {
appleId: credential.user,
phone: '',
email: credential.email,
password: '',
name:
credential.fullName.givenName +
' ' +
credential.fullName.familyName,
picture: '',
type: 'apple'
}
mutateLogin(user)
}
loginButtonSetter('Apple')
// signed in
} catch (e) {
if (e.code === 'ERR_CANCELLED') {
// handle that the user canceled the sign-in flow
loginButtonSetter(null)
} else {
// handle other errors
loginButtonSetter(null)
}
}
}}>
<FontAwesome
style={styles.marginLeft5}
name="apple"
size={scale(19)}
color="#000"
/>
<TextDefault style={alignment.MLsmall} bold>
Signup with Apple
</TextDefault>
</TouchableOpacity>
)
}
async function _facebookSignup() {
try {
await Facebook.initializeAsync({ appId: FACEBOOK_APP_ID })
} catch (err) {
console.log('err', err)
}
try {
const { type, token } = await Facebook.logInWithReadPermissionsAsync({
permissions: ['public_profile', 'email']
})
if (type === 'success') {
// Get the user's name using Facebook's Graph API
const response = await fetch(
`https://graph.facebook.com/me?access_token=${token}&fields=email,name`
)
const user = await response.json()
return user
}
} catch (err) {
console.log('error', err)
}
}
async function _googleSignup() {
try {
const { type, user } = await Google.logInAsync({
iosClientId: IOS_CLIENT_ID_GOOGLE,
iosStandaloneAppClientId: IOS_CLIENT_ID_GOOGLE,
androidClientId: ANDROID_CLIENT_ID_GOOGLE,
androidStandaloneAppClientId: ANDROID_CLIENT_ID_GOOGLE,
redirectUrl: `${AppAuth.OAuthRedirect}:/oauth2redirect/google`,
scopes: ['profile', 'email']
})
if (type === 'success') {
/* `accessToken` is now valid and can be used to get data from the Google API with HTTP requests */
return user
}
} catch (err) {
console.log('err', err)
}
}
function renderFacebookAction() {
return (
<FdFacebookBtn
loadingIcon={loading && loginButton === 'Facebook'}
onPressIn={() => {
loginButtonSetter('Facebook')
}}
onPress={async() => {
const facebookUser = await _facebookSignup()
if (facebookUser) {
const user = {
facebookId: facebookUser.id,
phone: '',
email: facebookUser.email,
password: '',
name: facebookUser.name,
picture: '',
type: 'facebook'
}
mutateLogin(user)
}
}}
/>
)
}
function renderGoogleAction() {
return (
<FdGoogleBtn
loadingIcon={loading && loginButton === 'Google'}
onPressIn={() => {
loginButtonSetter('Google')
}}
onPress={async() => {
const googleUser = await _googleSignup()
if (googleUser) {
const user = {
phone: '',
email: googleUser.email,
password: '',
name: googleUser.name,
picture: googleUser.photoUrl,
type: 'google'
}
mutateLogin(user)
}
}}
/>
)
}
function renderEmailAction() {
return (
<FdEmailBtn
loadingIcon={loading && loginButton === 'Email'}
onPress={() => {
loginButtonSetter('Email')
navigation.navigate(NAVIGATION_SCREEN.Register)
}}
/>
)
}
return (
<WrapperView>
<View style={[styles.mainContainer, styles.flex]}>
<RegistrationHeader title={'Get Started'} />
<View style={styles.subContainer}>
<View style={[styles.flex, styles.upperContainer]}>
<EnategaImage
imgStyle={styles.imgResponsive}
imgSource={Logo}
spinnerProps={{ style: styles.loadingView }}
/>
</View>
<View style={styles.width100}>
{Platform.OS === 'ios' && renderFacebookAction()}
<View style={alignment.MTmedium}>{renderGoogleAction()}</View>
{enableApple && (
<View style={alignment.MTmedium}>{renderAppleAction()}</View>
)}
<View style={alignment.MTmedium}>{renderEmailAction()}</View>
<TouchableOpacity
activeOpacity={0.7}
style={styles.alreadyBtn}
onPress={() => navigation.navigate(NAVIGATION_SCREEN.Login)}>
<TextDefault style={[alignment.MLsmall]} bold>
Already a member? Log in
</TextDefault>
</TouchableOpacity>
</View>
</View>
</View>
</WrapperView>
)
}
export default CreateAccount

View File

@ -1,54 +0,0 @@
import { AntDesign } from '@expo/vector-icons'
import { useNavigation } from '@react-navigation/native'
import React, { useLayoutEffect } from 'react'
import { TouchableOpacity, View } from 'react-native'
import i18n from '../../../i18n'
import { TextDefault, WrapperView } from '../../components'
import { NAVIGATION_SCREEN } from '../../utils/constant'
import useStyle from './styles'
const links = [
{
title: 'Product Page',
url: 'https://market.nativebase.io/view/react-native-food-delivery-backend-app'
},
{ title: 'Docs', url: 'https://enatega.gitbook.io/enatega-full-app/' },
{
title: 'Blog',
url: 'https://blog.nativebase.io/enatega-full-food-delivery-app-is-finally-here-a6039de4a09d'
},
{ title: 'About Us', url: 'https://ninjascode.com/pages/ourteam.html' }
]
function Help() {
const styles = useStyle()
const navigation = useNavigation()
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: i18n.t('titleHelp'),
headerRight: null
})
}, [navigation])
return (
<WrapperView>
<View style={styles.flex}>
{links.map(({ title, url }, index) => (
<TouchableOpacity
onPress={() =>
navigation.navigate(NAVIGATION_SCREEN.HelpBrowser, { title, url })
}
style={styles.itemContainer}
key={index}>
<TextDefault H4>{title}</TextDefault>
<TouchableOpacity>
<AntDesign name="arrowright" size={22} color="black" />
</TouchableOpacity>
</TouchableOpacity>
))}
</View>
</WrapperView>
)
}
export default Help

View File

@ -1,235 +0,0 @@
import { useNavigation, useRoute } from '@react-navigation/native'
import React, { useContext, useEffect, useState } from 'react'
import { ScrollView, View } from 'react-native'
import { WrapperView } from '../../components'
import CartComponent from '../../components/CustomizeComponents/CartComponent/CartComponent'
import CheckComponent from '../../components/CustomizeComponents/CheckComponent/CheckComponent'
import HeadingComponent from '../../components/CustomizeComponents/HeadingComponent/HeadingComponent'
import ImageHeader from '../../components/CustomizeComponents/ImageHeader/ImageHeader'
import RadioComponent from '../../components/CustomizeComponents/RadioComponent/RadioComponent'
import TitleComponent from '../../components/CustomizeComponents/TitleComponent/TitleComponent'
import UserContext from '../../context/User'
import { alignment } from '../../utils/alignment'
import { NAVIGATION_SCREEN } from '../../utils/constant'
import useStyle from './styles'
function ItemDetail() {
const route = useRoute()
const styles = useStyle()
const navigation = useNavigation()
const [food] = useState(route.params.food ?? null)
const [selectedVariation, setSelectedVariation] = useState(food.variations[0])
const [selectedAddons, setSelectedAddons] = useState([])
const { cart, addQuantity, addCartItem } = useContext(UserContext)
useEffect(() => {
navigation.setOptions({
title: 'Customize',
headerRight: () => null
})
}, [navigation])
function validateButton() {
if (!selectedVariation) return false
const validatedAddons = []
selectedVariation.addons.forEach(addon => {
const selected = selectedAddons.find(ad => ad._id === addon._id)
if (!selected && addon.quantity_minimum === 0) {
validatedAddons.push(false)
} else if (
selected &&
selected.options.length >= addon.quantity_minimum &&
selected.options.length <= addon.quantity_maximum
) {
validatedAddons.push(false)
} else validatedAddons.push(true)
})
return validatedAddons.every(val => val === false)
}
async function onAddToCart(quantity) {
if (validateOrderItem()) {
const addons = selectedAddons.map(addon => ({
...addon,
options: addon.options.map(({ _id }) => ({
_id
}))
}))
const cartItem = cart.find(cartItem => {
if (
cartItem._id === food._id &&
cartItem.variation._id === selectedVariation._id
) {
if (cartItem.addons.length === addons.length) {
if (addons.length === 0) return true
const addonsResult = addons.every(newAddon => {
const cartAddon = cartItem.addons.find(
ad => ad._id === newAddon._id
)
if (!cartAddon) return false
const optionsResult = newAddon.options.every(newOption => {
const cartOption = cartAddon.options.find(
op => op._id === newOption._id
)
if (!cartOption) return false
return true
})
return optionsResult
})
return addonsResult
}
}
return false
})
if (!cartItem) {
await addCartItem(food._id, selectedVariation._id, quantity, addons)
} else {
await addQuantity(cartItem.key, quantity)
}
navigation.navigate(NAVIGATION_SCREEN.Cart)
}
}
function onSelectVariation(variation) {
setSelectedVariation(variation)
}
async function onSelectOption(addon, option) {
const addons = selectedAddons
const index = addons.findIndex(ad => ad._id === addon._id)
if (index > -1) {
if (addon.quantity_minimum === 1 && addon.quantity_maximum === 1) {
addons[index].options = [option]
} else {
const optionIndex = addons[index].options.findIndex(
opt => opt._id === option._id
)
if (optionIndex > -1) {
addons[index].options = addons[index].options.filter(
opt => opt._id !== option._id
)
} else {
addons[index].options.push(option)
}
if (!addons[index].options.length) {
addons.splice(index, 1)
}
}
} else {
addons.push({ _id: addon._id, options: [option] })
}
setSelectedAddons([...addons])
}
function calculatePrice() {
const variation = selectedVariation.price
let addons = 0
selectedAddons.forEach(addon => {
addons += addon.options.reduce((acc, option) => {
return acc + option.price
}, 0)
})
return (variation + addons).toFixed(2)
}
function validateOrderItem() {
const validatedAddons = selectedVariation.addons.map(addon => {
const selected = selectedAddons.find(ad => ad._id === addon._id)
if (!selected && addon.quantity_minimum === 0) {
addon.error = false
} else if (
selected &&
selected.options.length >= addon.quantity_minimum &&
selected.options.length <= addon.quantity_maximum
) {
addon.error = false
} else addon.error = true
return addon
})
setSelectedVariation({ ...selectedVariation, addons: validatedAddons })
return validatedAddons.every(addon => addon.error === false)
}
function renderOption(addon) {
if (addon.quantity_minimum === 1 && addon.quantity_maximum === 1) {
return (
<RadioComponent
options={addon.options}
onPress={onSelectOption.bind(this, addon)}
/>
)
} else {
return (
<CheckComponent
options={addon.options}
onPress={onSelectOption.bind(this, addon)}
/>
)
}
}
return (
<WrapperView>
<View style={styles.flex}>
<ScrollView
showsVerticalScrollIndicator={false}
style={styles.scrollViewContainer}>
{!!food.img_url && <ImageHeader image={food.img_url} />}
<View style={styles.subContainer}>
<HeadingComponent
title={food.title}
price={calculatePrice()}
desc={food.description}
/>
<View style={styles.line}></View>
{food.variations.length > 1 && (
<>
<TitleComponent
title="Select Variation"
subTitle="Select one"
status="Required"
/>
<View style={[alignment.PLmedium, alignment.PRmedium]}>
<RadioComponent
options={food.variations}
selected={selectedVariation}
onPress={onSelectVariation}
/>
</View>
</>
)}
{selectedVariation.addons.map(addon => (
<View key={addon._id}>
<TitleComponent
title={addon.title}
subTitle={addon.description}
error={addon.error}
status={
addon.quantity_minimum === 0
? 'OPTIONAL'
: `${addon.quantity_minimum} REQUIRED`
}
/>
{renderOption(addon)}
</View>
))}
</View>
</ScrollView>
<CartComponent
stock={food.stock}
onPress={onAddToCart}
disabled={validateButton()}
/>
</View>
</WrapperView>
)
}
export default ItemDetail

View File

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

View File

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

View File

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

View File

@ -1,140 +0,0 @@
export const de = {
home: 'Home',
title0: 'Gewählte Sprache',
subtitle0: 'English',
description0:
'Wählen Sie eine Sprache Ihrer Wahl, um den Inhalt der App in die gewünschte Sprache zu ändern.',
title1: 'Lecker',
subtitle1: 'Frühstück',
description1:
'Frühstück ist alles. Der Anfang, das Erste. Es ist der Mundvoll, der die Verpflichtung zu einem neuen Tag, einem fortwährenden Leben ist.',
title2: 'Erfrischend',
subtitle2: 'Getränke',
description2:
'Wahre Stille ist der Rest des Geistes und ist für den Geist das, was Schlaf für den Körper ist, Nahrung und Erfrischung.',
title3: 'Köstlich',
subtitle3: 'Eis',
description3:
'Das Alter mindert nicht die extreme Enttäuschung darüber, dass eine Kugel Eis vom Kegel fällt',
getStarted: 'Loslegen!',
welcome:
'Willkommen bei Enatega, manchmal brauchen Sie nur Liebe. Aber ein bisschen Essen tut ab und zu nicht weh.',
loginBtn: 'Anmeldung',
registerBtn: 'Registrieren',
name: 'Name',
phone: 'Telefon',
email: 'Email',
emailphone: 'E-Mail oder Telefon',
password: 'Passwort',
deliveryAddress: 'Lieferadresse',
fullDeliveryAddress: 'Ihre vollständige Lieferadresse',
deliveryDetails: 'Erforderliche Angaben, z. Boden / Gebäude',
myAddresses: 'Meine Adressen',
addAddress: 'Neue Adressen hinzufügen',
editAddress: 'Adresse bearbeiten',
registerText: 'Oder registriere dich bei',
forgotPassword: 'Passwort vergessen?',
loginText: 'Oder Einloggen mit',
deliveryLocation:
'Stellen Sie Ihren Lieferort so ein, dass wir Ihnen einen unendlichen Geschmack köstlichen Essens zusenden können.',
locationBtn: 'Standort einschalten',
locationPermissionDenied:
'Die Berechtigung zum Zugriff auf den Speicherort wurde verweigert',
locationOff: 'Ort einschalten und erneut versuchen',
titleLanguage: 'Sprache ändern',
titleMenu: 'Speisekarte',
titleOrders: 'meine Bestellungen',
titleNotifications: 'Benachrichtigungen',
titleReviews: 'Bewertungen',
titleProfile: 'Profiel',
titleHelp: 'Hilfe',
titleChat: 'Plaudern',
titleLogout: 'Ausloggen',
titleCart: 'Mein Warenkorb',
titlePayment: 'Zahlung',
totalOrderAmount: 'Gesamtbestellmenge',
reOrder: 'Nachbestellen',
unReadNotifications: 'Keine ungelesenen Benachrichtigungen',
upload: 'Hochladen',
saveBtn: 'sparen',
saveContBtn: 'SPEICHERN UND FORTFAHREN',
emailUs: 'Mailen Sie uns an',
question1: 'Wo finden wir das Essen?',
question2: 'Wie treten wir in Kontakt?',
question3: 'Wie kann ich den Zusteller bezahlen?',
question4: 'Ist der Dienst in meiner Stadt verfügbar?',
answer1:
'Sie finden das Essen in einem Geschäft in Ihrer Nähe, ohne den Kundenservice zu belasten. Unsere Gebühren sind im Vergleich zu anderen extrem niedrig.',
answer2:
'Sie können uns über unsere E-Mail, Telefonnummer oder unsere Website kontaktieren.',
answer3:
'Sie können den Zusteller persönlich bezahlen oder auch online mit Kredit- oder Debitkarte bezahlen.',
answer4:
'Derzeit ist dieser Service in den Städten Islamabad und Karachi verfügbar. Sie können uns kontaktieren, um diesen Service in Ihrer Stadt in Anspruch zu nehmen.',
add: 'HINZUFÜGEN',
quantity: 'Menge',
size: 'Größe',
addToCart: 'in den Warenkorb legen',
orderNow: 'Jetzt bestellen',
addToCartMessage: 'Zum Warenkorb hinzugefügt',
emptyCart: 'Keine Artikel im Warenkorb',
itemTotal: 'Artikel Gesamt',
delvieryCharges: 'Versandkosten',
total: 'Gesamt',
contactInfo: 'Kontaktinformation',
deliveryAddressmessage: 'Lieferadresse einstellen',
proceedCheckout: 'Zur Kasse',
paymentText: 'Wie möchten Sie bezahlen?',
checkout: 'Auschecken',
creditCard: 'Kreditkarte Debitkarte',
paypal: 'Paypal',
cod: 'Nachnahme',
thankYou: 'Danke dir!',
orderConfirmed: 'Ihre Bestellung wird bestätigt',
orderId: 'Ihre Bestellnummer',
orderAmount: 'Ihre Bestellmenge',
orderDetail: 'Bestelldetails',
paymentMethod: 'Zahlungsmethode',
trackOrder: 'Versandverfolgung',
backToMenu: 'Zurück zum Menü',
foodItem: 'Essensgegenstand',
deliveredTo: 'Geliefert an',
writeAReview: 'Eine Rezension schreiben',
orderReceived: 'Bestellung erhalten',
cancelled: 'Abgebrochen',
foodPreparing: 'Essen wird zubereitet',
delivered: 'Geliefert',
rateAndReview: 'Bewerten und bewerten',
reviewPlaceholder: 'Detaillierte Bewertungen erhalten mehr Sichtbarkeit ...',
submit: 'einreichen',
noWorriesText: 'Keine Sorge, lassen Sie sich von uns helfen!',
yourEmail: 'Deine E-Mail',
send: 'Senden',
checkEmail:
'Überprüfen Sie Ihre E-Mail-Adresse auf den Link zum Zurücksetzen des Kennworts',
languageText: 'Bitte wählen Sie Ihre gewünschte Sprache',
countryCodePickerTranslation: 'deu',
countryCodeSelect: 'Ländercode auswählen',
paymentNotSupported: 'Diese Zahlungsmethode unterstützt diese Währung nicht',
unReadReviews: 'Noch keine Bewertungen!',
unReadOrders: 'Noch keine Bestellungen!',
error: 'Error',
noMoreItems: 'Keine Artikel mehr auf Lager',
hungry: 'Hungrig',
emptyCartBtn: 'Zurück zum Essen',
subTotal: 'Zwischensumme',
deliveryFee: 'Liefergebühr',
haveVoucher: 'Hast du einen Gutschein?',
remove: 'Entfernen',
change: 'Veränderung',
condition1:
'Mit Abschluss dieser Bestellung stimme ich allen Allgemeinen Geschäftsbedingungen zu.',
condition2:
'Ich bin damit einverstanden und fordere Sie auf, den bestellten Service vor Ablauf der Widerrufsfrist auszuführen. Mir ist bekannt, dass ich nach vollständiger Erfüllung der Leistung mein Rücktrittsrecht verliere.',
orderBtn: 'Bestellung aufgeben',
coupanApply: 'Gutscheinrabatt angewendet',
coupanFailed: 'Gutschein nicht verfügbar',
invalidCoupan: 'Ungültiger Gutschein',
validateItems: 'Artikel vor dem Auschecken in den Warenkorb legen',
validateDelivery: 'Stellen Sie die Lieferadresse vor dem Auschecken ein'
}

View File

@ -1,143 +0,0 @@
export const en = {
home: 'Home',
title0: 'Selected Language',
subtitle0: 'English',
description0:
'Select any language of your choice to change the content of the app to your required language.',
title1: 'Tasty',
subtitle1: 'BreakFast',
description1:
'Breakfast is everything. The beginning, the first thing. It is the mouthful that is the commitment to a new day, a continuing life.',
title2: 'Refreshing',
subtitle2: 'Drinks',
description2:
'True silence is the rest of the mind, and is to the spirit what sleep is to the body, nourishment and refreshment.',
title3: 'Delicous',
subtitle3: 'Icecream',
description3:
'Age does not diminish the extreme disappointment of having a scoop of ice cream fall from the cone',
getStarted: 'Get Started!',
welcome:
"Welcome to Enatega, sometimes all you need is love. But a little food now and then doesn't hurt.",
loginBtn: 'Login',
registerBtn: 'Register',
name: 'Name',
phone: 'Phone Number',
email: 'Email',
emailphone: 'Email or Phone',
password: 'Password',
deliveryAddress: 'Delivery Address',
fullDeliveryAddress: 'Your full delivery address',
deliveryDetails: 'Required details -e.g. floor/ building',
myAddresses: 'My Addresses',
addAddress: 'Add Address',
editAddress: 'Edit Address',
registerText: 'Or Register With',
forgotPassword: 'Forgot Password?',
loginText: 'Or Login With',
deliveryLocation:
'Turn on location so we could send you endless taste of delicious food.',
locationBtn: 'Turn on Location',
locationPermissionDenied: 'Permission to access location was denied',
cameraRollPermissionDenied: 'Permission to access Camera Roll was denied',
locationOff: 'Turn on location and try again',
titleLanguage: 'Change Language',
titleMenu: 'Menu',
titleOrders: 'My Orders',
titleNotifications: 'Notifications',
titleReviews: 'Reviews',
titleProfile: 'Profile',
titleSettings: 'Settings',
titleHelp: 'Help',
titleChat: 'Chat',
titleLogout: 'Logout',
titleCart: 'My Cart',
titlePayment: 'Payment',
totalOrderAmount: 'Total Order Amount',
reOrder: 'Reorder',
unReadNotifications: 'No unread notifications',
upload: 'Upload',
saveBtn: 'Save Changes',
saveContBtn: 'SAVE AND CONTINUE',
emailUs: 'Email us at',
question1: 'Where do we find the food?',
question2: 'How do we contact?',
question3: 'How can I pay the delivery person?',
question4: 'Is the service available in my city?',
answer1:
'You can find the food at your nearest store without paying anything to customer service.Our charges are extremely low as compared to others.',
answer2: 'You can contact us through our email, phone number or our website.',
answer3:
'You can pay the delivery person in person or pay online as well through credit or debit card.',
answer4:
'Currently this service is available in cities Islamabad and Karachi you can contact us to avail this service in your city.',
add: 'ADD',
quantity: 'Quantity',
size: 'Size',
addToCart: 'Add to Cart',
orderNow: 'Order Now',
addToCartMessage: 'Added to cart',
emptyCart: 'No items in cart',
itemTotal: 'Item Total',
delvieryCharges: 'Delivery Charges',
total: 'Total',
contactInfo: 'Contact Info',
deliveryAddressmessage: 'Set delivery address',
proceedCheckout: 'Proceed to Checkout',
paymentText: 'How do you wish to pay?',
checkout: 'Checkout',
creditCart: 'Credit Card/Debit Card',
paypal: 'Paypal',
cod: 'Cash on delivery',
thankYou: 'Thank You!',
orderConfirmed: 'Your Order is confirmed',
orderId: 'Your Order Id',
orderAmount: 'Your Order Amount',
orderDetail: 'Order Detail',
paymentMethod: 'Payment Method',
trackOrder: 'Track Order',
backToMenu: 'Back To Menu',
foodItem: 'Food item',
deliveredTo: 'Delivered to',
writeAReview: 'Write a Review',
orderReceived: 'Order Received',
orderPicked: 'Your order is on its way',
orderDelivered: 'Delivered',
completed: 'Completed',
cancelled: 'Cancelled',
orderPreparing: 'Your order is being prepared',
delivered: 'Delivered',
rateAndReview: 'Rate and Review',
reviewPlaceholder: 'More detailed reviews get more visibility...',
submit: 'Submit',
noWorriesText: 'No worries, let us help you out!',
yourEmail: 'Your Email',
send: 'Send',
apply: 'Apply',
checkEmail: 'Check your email for reset password link',
languageText: 'Please select your required language',
countryCodePickerTranslation: 'eng',
countryCodeSelect: 'Select Country Code',
paymentNotSupported: 'This payment method does not support this Currency',
loginOrCreateAccount: 'Login/Create Account',
unReadReviews: 'No Reviews Yet!',
unReadOrders: 'No Orders Yet!',
error: 'Error',
noMoreItems: 'No more items in stock',
hungry: 'Hungry',
emptyCartBtn: 'Back to Food',
subTotal: 'SubTotal',
deliveryFee: 'Delivery Fee',
haveVoucher: 'Do you have a voucher',
remove: 'Remove',
change: 'Change',
condition1: 'By completing this order, I agree to all Terms & Conditions.',
condition2:
'I agree and I demand that you execute the ordered service before the end of the revocation period. I am aware that after complete fulfillment of the service I lose my right of rescission.',
orderBtn: 'Place order',
coupanApply: 'Coupon discount applied',
coupanFailed: 'Coupon Unavailable',
invalidCoupan: 'Invalid Coupon',
validateItems: 'Add items to cart before checkout',
validateDelivery: 'Set delivery address before checkout'
}

View File

@ -1,141 +0,0 @@
export const fr = {
home: 'Home',
title0: 'Langue sélectionnée',
subtitle0: 'English',
description0:
"Sélectionnez la langue de votre choix pour modifier le contenu de l'application dans la langue de votre choix.",
title1: 'Savoureux',
subtitle1: 'Petit déjeuner',
description1:
"Le petit déjeuner est tout. Le début, la première chose. C'est la bouchée qui est l'engagement pour un nouveau jour, une vie continue.",
title2: 'Rafraîchissant',
subtitle2: 'Boissons',
description2:
"Le vrai silence est le reste de l'esprit, et à l'esprit ce que le sommeil est pour le corps, nourriture et rafraîchissement.",
title3: 'Délicieux',
subtitle3: 'Crème glacée',
description3:
"L'âge ne diminue en rien l'extrême déception d'avoir une boule de glace tombée du cône.",
getStarted: 'Commencer!',
welcome:
"Bienvenue dans Enatega, parfois tout ce dont vous avez besoin est de l'amour. Mais un peu de nourriture maintenant et ensuite ne fait pas mal.",
loginBtn: "S'identifier",
registerBtn: 'registre',
name: 'prénom',
phone: 'Téléphone',
email: 'Email',
emailphone: 'Email ou téléphone',
password: 'Mot de passe',
deliveryAddress: 'Adresse de livraison',
fullDeliveryAddress: 'Votre adresse de livraison complète',
deliveryDetails: 'Détails requis -e.g. étage / bâtiment',
myAddresses: 'Mes adresses',
addAddress: 'Ajouter une nouvelle adresse',
editAddress: "Modifier l'adresse",
registerText: "Ou s'inscrire avec",
forgotPassword: 'Mot de passe oublié?',
loginText: 'Ou connectez-vous avec',
deliveryLocation:
'Définissez votre lieu de livraison afin que nous puissions vous envoyer un goût infini de plats délicieux.',
locationBtn: "Activer l'emplacement",
locationPermissionDenied:
"La permission d'accéder à l'emplacement a été refusée",
locationOff: "Activer l'emplacement et réessayer",
titleLanguage: 'Changer de langue',
titleMenu: 'Menu',
titleOrders: 'Mes commandes',
titleNotifications: 'Les notifications',
titleReviews: 'Avis',
titleProfile: 'Profil',
titleHelp: 'Aidez-moi',
titleChat: 'Bavarder',
titleLogout: 'Connectez - Out',
titleCart: 'Mon panier',
titlePayment: 'Paiement',
totalOrderAmount: 'Total de la commande',
reOrder: 'Réorganiser',
unReadNotifications: 'Pas de notifications non lues',
upload: 'Télécharger',
saveBtn: 'sauvegarder',
saveContBtn: 'SAUVEGARDER ET CONTINUER',
emailUs: 'écrivez-nous à',
question1: 'Où trouvons-nous la nourriture?',
question2: 'Comment pouvons-nous contacter?',
question3: 'Comment puis-je payer le livreur?',
question4: 'Le service est-il disponible dans ma ville?',
answer1:
'Vous pouvez trouver la nourriture dans le magasin le plus proche sans rien payer au service client. Nos frais sont extrêmement bas comparés aux autres.',
answer2:
'Vous pouvez nous contacter via notre email, numéro de téléphone ou notre site web.',
answer3:
'Vous pouvez payer le livreur en personne ou en ligne, par carte de crédit ou de débit.',
answer4:
"Actuellement, ce service est disponible dans les villes d'Islamabad et de Karachi. Vous pouvez nous contacter pour bénéficier de ce service dans votre ville.",
add: 'AJOUTER',
quantity: 'Quantité',
size: 'Taille',
addToCart: 'Ajouter au panier',
orderNow: 'Commandez maintenant',
addToCartMessage: 'Ajouté au panier',
emptyCart: 'Aucun article dans le panier',
itemTotal: 'Objet total',
delvieryCharges: 'Frais de livraison',
total: 'Total',
contactInfo: 'Informations de contact',
deliveryAddressmessage: "Définir l'adresse de livraison",
proceedCheckout: 'Passer à la caisse',
paymentText: 'Comment souhaitez-vous payer?',
checkout: 'Check-out',
creditCard: 'Carte de crédit carte de débit',
paypal: 'Pay Pal',
cod: 'Paiement à la livraison',
thankYou: 'Je vous remercie!',
orderConfirmed: 'Votre commande est confirmée',
orderId: 'Votre identifiant de commande',
orderAmount: 'Le montant de votre commande',
orderDetail: 'Détails de la commande',
paymentMethod: 'Mode de paiement',
trackOrder: 'Suivi de commande',
backToMenu: 'Suivi de commande',
foodItem: 'Produit alimentaire',
deliveredTo: 'livré à',
writeAReview: 'Écrire une critique',
orderReceived: 'Ordre reçu',
cancelled: 'Annulé',
foodPreparing: 'La nourriture est en cours de préparation',
delivered: 'Livré',
rateAndReview: 'Notez et évaluez',
reviewPlaceholder: 'Des revues plus détaillées ont plus de visibilité ...',
submit: 'Soumettre',
noWorriesText: 'Pas de soucis, laissez-nous vous aider!',
yourEmail: 'Votre email',
send: 'Envoyer',
checkEmail:
'Vérifiez votre email pour le lien de réinitialisation du mot de passe',
languageText: "S'il vous plaît sélectionnez votre langue requise",
countryCodePickerTranslation: 'fra',
countryCodeSelect: 'Sélectionnez le code pays',
paymentNotSupported:
'Ce mode de paiement ne prend pas en charge cette devise',
unReadReviews: "Pas encore d'avis!",
unReadOrders: 'Pas de commande pour le moment!',
error: 'Erreur',
noMoreItems: "Plus d'articles en stock",
hungry: 'Faim',
emptyCartBtn: 'Retour à la nourriture',
subTotal: 'Total',
deliveryFee: 'Frais de livraison',
haveVoucher: 'Avez-vous un bon',
remove: 'Retirer',
change: 'Changement',
condition1:
"En remplissant cette commande, j'accepte toutes les conditions générales.",
condition2:
"J'accepte et je vous demande d'exécuter le service commandé avant la fin de la période de révocation. Je suis conscient qu'après l'accomplissement complet du service, je perds mon droit de résolution.",
orderBtn: 'Passer la commande',
coupanApply: 'Remise de coupon appliquée',
coupanFailed: 'Coupon non disponible',
invalidCoupan: 'Coupon non valide',
validateItems: 'Ajouter des articles au panier avant le paiement',
validateDelivery: "Définir l'adresse de livraison avant le paiement"
}

View File

@ -1,136 +0,0 @@
export const km = {
home: 'Home',
title0: 'ភាសាដែលបានជ្រើស',
subtitle0: 'English',
description0:
'ជ្រើសរើសភាសាណាមួយនៃជម្រើសរបស់អ្នកដើម្បីប្តូរមាតិកានៃកម្មវិធីទៅភាសាដែលអ្នកត្រូវការ។',
title1: 'ហ៊ាន',
subtitle1: 'អាហារពេលព្រឹក',
description1:
'អាហារពេលព្រឹកគឺជាអ្វីគ្រប់យ៉ាង។ ការចាប់ផ្តើមរឿងដំបូង។ វាគឺជាមាត់ដែលជាការប្តេជ្ញាចិត្តចំពោះថ្ងៃថ្មីនិងជីវិតដែលនៅតែបន្ត។',
title2: 'ធ្វើឱ្យស្រស់',
subtitle2: 'ភេសជ្ជៈ',
description2:
'ភាពស្ងៀមស្ងាត់ពិតគឺជាគំនិតដែលនៅសល់ហើយជាវិញ្ញាណដែលជាការដេកលក់ដល់រាងកាយការថែទាំនិងការសំរាក។',
title3: 'ឆ្ងាញ់',
subtitle3: 'ការ៉េម',
description3:
'អាយុមិនបន្ថយនូវការខកចិត្តយ៉ាងខ្លាំងនៃការធ្លាក់ចុះនៃការ៉េមពីកោណទេ',
getStarted: 'ចាប់ផ្ដើម!',
welcome:
'សូមស្វាគមន៏ទៅ Enatega ពេលខ្លះអ្វីដែលអ្នកត្រូវការគឺស្នេហា។ ប៉ុន្តែអាហារតិចតួចឥឡូវនេះហើយបន្ទាប់មកមិនឈឺទេ។',
loginBtn: 'ចូល',
registerBtn: 'ចុះឈ្មោះ',
name: 'ឈ្មោះ',
phone: 'ទូរស័ព្ទ',
email: 'អ៊ីមែល',
emailphone: 'អី​ុ​ម៉ែ​ល​ឬ​ទូរស័ព្ទ',
password: 'ពាក្យសម្ងាត់',
deliveryAddress: 'អាស័យ​ដ្ឋាន​សំរាប់​ការ​ដឹកជញ្ជូន',
fullDeliveryAddress: 'អាសយដ្ឋានចែកចាយពេញរបស់អ្នក',
deliveryDetails: 'ព័ត៌មានលម្អិតចាំបាច់ -e. ជាន់ / អាគារ',
myAddresses: 'អាស័យដ្ឋានរបស់ខ្ញុំ',
addAddress: 'បន្ថែមអាសយដ្ឋានថ្មី',
editAddress: 'កែសម្រួលអាសយដ្ឋាន',
registerText: 'ឬចុះឈ្មោះជាមួយ',
forgotPassword: 'ភ្លេច​លេខសំងាត់​?',
loginText: 'ឬចូលជាមួយ',
deliveryLocation:
'កំណត់ទីតាំងដឹកជញ្ជូនរបស់អ្នកដូច្នេះយើងអាចផ្ញើឱ្យអ្នកនូវរសជាតិអាហារឆ្ងាញ់គ្មានទីបញ្ចប់។',
locationBtn: 'បើកទីតាំង',
locationPermissionDenied: 'ការអនុញ្ញាតចូលទៅកាន់ទីតាំងត្រូវបានបដិសេធ',
locationOff: 'បើកទីតាំងហើយព្យាយាមម្តងទៀត',
titleLanguage: 'ប្ដូរ​ភាសា',
titleMenu: 'ម៉ឺនុយ',
titleOrders: 'ការបញ្ជាទិញរបស់ខ្ញុំ',
titleNotifications: 'ការជូនដំណឹង',
titleReviews: 'ពិនិត្យ',
titleProfile: 'ប្រវត្តិរូប',
titleHelp: 'ជំនួយ',
titleChat: 'ជជែក',
titleLogout: 'ចាកចេញ',
titleCart: 'កន្ត្រករបស់ខ្ញុំ',
titlePayment: 'ការទូទាត់',
totalOrderAmount: 'បរិមាណសរុប',
reOrder: 'តម្រៀបឡើងវិញ',
unReadNotifications: 'គ្មានការជូនដំណឹងមិនទាន់អាន',
upload: 'ផ្ទុកឡើង',
saveBtn: 'រក្សាទុក',
saveContBtn: 'រក្សាទុកនិងបន្ត',
emailUs: 'អ៊ីម៉ែលមកយើងនៅ',
question1: 'តើយើងរកម្ហូបបាននៅឯណា?',
question2: 'តើយើងទាក់ទងយ៉ាងដូចម្តេច?',
question3: 'តើខ្ញុំអាចបង់ប្រាក់ដល់មនុស្សដែលត្រូវដឹកជញ្ជូន?',
question4: 'តើសេវាកម្មនេះមាននៅក្នុងទីក្រុងរបស់ខ្ញុំដែរឬទេ?',
answer1:
'អ្នកអាចរកឃើញម្ហូបអាហារនៅហាងដែលនៅជិតបំផុតរបស់អ្នកដោយមិនបង់អ្វីឱ្យសេវាកម្មបំរើអតិថិជន។ ការចោទប្រកាន់របស់យើងមានកម្រិតទាបខ្លាំងបើប្រៀបធៀបទៅនឹងអ្នកដទៃ។',
answer2: 'អ្នកអាចទាក់ទងយើងតាមរយៈអ៊ីម៉ែលលេខទូរស័ព្ទឬវេបសាយរបស់យើង។',
answer3:
'អ្នកអាចបង់ប្រាក់ទៅកាន់បុគ្គលដឹកជញ្ជូនដោយផ្ទាល់ឬបង់ប្រាក់តាមរយៈអ៊ីនធឺណេតតាមរយៈប័ណ្ណឥណទានឬឥណពន្ធផងដែរ។',
answer4:
'បច្ចុប្បន្នសេវាកម្មនេះអាចរកបាននៅក្នុងទីក្រុងអ៊ីស្លាម៉ាបាតនិងការ៉ាជីដែលអ្នកអាចទាក់ទងមកយើងដើម្បីទទួលបានសេវាកម្មនេះនៅក្នុងទីក្រុងរបស់អ្នក។',
add: 'បន្ថែម',
quantity: 'បរិមាណ',
size: 'ទំហំ',
addToCart: 'បន្ថែមទៅកន្ត្រក',
orderNow: 'បញ្ជាទិញឥឡូវ',
addToCartMessage: 'បានបន្ថែមទៅរទេះ',
emptyCart: 'គ្មានធាតុក្នុងរទេះទេ',
itemTotal: 'ធាតុសរុប',
delvieryCharges: 'ការដឹកជញ្ជូន',
total: 'សរុប',
contactInfo: 'ព័ត៌មានទំនាក់ទំនង',
deliveryAddressmessage: 'កំណត់អាសយដ្ឋានបញ្ជូន',
proceedCheckout: 'បន្តដើម្បីពិនិត្យចេញ',
paymentText: 'តើអ្នកចង់បង់ប្រាក់ដោយរបៀបណា?',
checkout: 'ពិនិត្យ​មុន​ពេល​ចេញ',
creditCard: 'ប័ណ្ណឥណទាន / ប័ណ្ណឥណពន្ធ',
paypal: 'Paypal',
cod: 'សាច់ប្រាក់នៅពេលប្រគល់',
thankYou: 'សូមអរគុណ!',
orderConfirmed: 'បញ្ជាទិញរបស់អ្នកត្រូវបានបញ្ជាក់',
orderId: 'លេខសម្គាល់លំដាប់របស់អ្នក',
orderAmount: 'ចំនួនទឹកប្រាក់នៃការបញ្ជាទិញរបស់អ្នក',
orderDetail: 'លំអិតលំដាប់',
paymentMethod: 'វិធី​សា​ស្រ្ត​ទូទាត់',
trackOrder: 'លំដាប់តាមបទ',
backToMenu: 'លំដាប់តាមបទ',
foodItem: 'ម្ហូបអាហារ',
deliveredTo: 'បញ្ជូនទៅ',
writeAReview: 'សរសេរ​សង្ខេប​ឡើងវិញ',
orderReceived: 'បញ្ជាទិញដែលទទួលបាន',
cancelled: 'បានបោះបង់',
foodPreparing: 'ម្ហូបកំពុងត្រូវបានរៀបចំ',
delivered: 'បានបញ្ជូន',
rateAndReview: 'វាយតម្លៃនិងពិនិត្យ',
reviewPlaceholder: 'ការពិនិត្យលម្អិតបន្ថែមទៀតទទួលបានភាពមើលឃើញកាន់តែច្រើន ...',
submit: 'ដាក់ស្នើ',
noWorriesText: 'គ្មានការព្រួយបារម្ភសូមឱ្យយើងជួយអ្នកចេញ!',
yourEmail: 'អ៊ីមែល​របស់​អ្នក',
send: 'ផ្ញើ',
checkEmail: 'ពិនិត្យអ៊ីមែលរបស់អ្នកសម្រាប់តំណពាក្យសម្ងាត់ឡើងវិញ',
languageText: 'សូមជ្រើសរើសភាសាដែលអ្នកត្រូវការ',
countryCodePickerTranslation: 'eng',
countryCodeSelect: 'ជ្រើសរើសលេខកូដប្រទេស',
paymentNotSupported: 'វិធីសាស្ត្រទូទាត់នេះមិនគាំទ្ររូបិយប័ណ្ណនេះទេ',
unReadReviews: 'មិនទាន់មានការពិនិត្យឡើងវិញទេ!',
unReadOrders: 'មិនទាន់មានការបញ្ជាទិញនៅឡើយទេ!',
error: 'កំហុស',
noMoreItems: 'មិនមានរបស់នៅក្នុងស្តុកទៀតទេ',
hungry: 'ឃ្លាន',
emptyCartBtn: 'ត្រឡប់ទៅអាហារ',
subTotal: 'SubTotal',
deliveryFee: 'ថ្លៃសេវាដឹកជញ្ជូន',
haveVoucher: 'តើអ្នកមានប័ណ្ណទូទាត់ទេ?',
remove: 'យកចេញ',
change: 'ផ្លាស់ប្តូរ',
condition1: 'ដោយបំពេញការបញ្ជាទិញនេះខ្ញុំយល់ព្រមនឹងល័ក្ខខ័ណ្ឌទាំងអស់។',
condition2:
'ខ្ញុំយល់ព្រមហើយខ្ញុំទាមទារឱ្យអ្នកប្រតិបត្តិសេវាកម្មដែលបានបញ្ជាទិញមុនពេលចុងបញ្ចប់នៃរយៈពេលដកហូត។ ខ្ញុំដឹងថាបន្ទាប់ពីការបំពេញសេវាកម្មពេញលេញខ្ញុំបាត់បង់សិទ្ធិក្នុងការរំដោះខ្លួន។',
orderBtn: 'ដាក់បញ្ជាទិញ',
coupanApply: 'ការបញ្ចុះតម្លៃប័ណ្ណត្រូវបានអនុវត្ត',
coupanFailed: 'គូប៉ុងមិនមានទេ',
invalidCoupan: 'គូប៉ុងមិនត្រឹមត្រូវ',
validateItems: 'បន្ថែមរបស់របរទៅរទេះមុនពេលឆែក',
validateDelivery: 'កំណត់អាសយដ្ឋានដឹកជញ្ជូនមុនពេលពិនិត្យចេញ'
}

View File

@ -1,132 +0,0 @@
export const zh = {
home: 'Home',
title0: '选定的语言',
subtitle0: 'English',
description0: '选择您选择的任何语言,将应用内容更改为您所需的语言。',
title1: '可口',
subtitle1: '早餐',
description1:
'早餐就是一切。一开始,第一件事。这是对新的一天,持续生活的承诺。',
title2: '清爽',
subtitle2: '饮料',
description2:
'真正的沉默是心灵的其余部分,对于精神来说,睡眠对身体,营养和茶点来说都是如此。',
title3: '美味的',
subtitle3: '冰淇淋',
description3: '年龄不会减少从冰锥中舀出一勺冰淇淋的极度失望',
getStarted: '开始吧!',
welcome:
'欢迎来到Enatega有时您需要的只是爱。但是偶尔会有点食物不会受到伤害。',
loginBtn: '登录',
registerBtn: '寄存器',
name: '名称',
phone: '电话',
email: '电子邮件',
emailphone: '邮件或者电话',
password: '密码',
deliveryAddress: '邮寄地址',
fullDeliveryAddress: '您的完整收货地址',
deliveryDetails: '必填详细信息-例如 楼层/建筑物',
myAddresses: '我的地址',
addAddress: '添加新地址',
editAddress: '编辑地址',
registerText: '或注册',
forgotPassword: '忘记密码?',
loginText: '或登录',
deliveryLocation: '设置您的送货地点,以便我们可以向您发送无尽的美味食物。',
locationBtn: '打开位置',
locationPermissionDenied: '访问位置的权限被拒绝',
locationOff: '访问位置的权限被拒绝',
titleLanguage: '改变语言',
titleMenu: '菜单',
titleOrders: '我的订单',
titleNotifications: '通知',
titleReviews: '评测',
titleProfile: '轮廓',
titleHelp: '救命',
titleChat: '聊',
titleLogout: '登出',
titleCart: '我的车',
titlePayment: '付款',
totalOrderAmount: '总订单金额',
reOrder: '重新排序',
unReadNotifications: '没有未读通知',
upload: '上传',
saveBtn: '保存',
saveContBtn: '保存并继续',
emailUs: '给我们发电子邮件',
question1: '我们在哪里找到食物?',
question2: '我们如何联系?',
question3: '我该如何付款给送货人?',
question4: '我的城市有这项服务吗?',
answer1:
'您可以在离您最近的商店找到食物,而无需向客户支付任何费用。与其他人相比,我们的收费极低。',
answer2: '您可以通过我们的电子邮件,电话号码或我们的网站联系我们。',
answer3: '您可以亲自向付款人付款或使用信用卡或借记卡在线付款。',
answer4:
'目前,这项服务在伊斯兰堡和卡拉奇市提供,您可以联系我们以便在您所在的城市使用此服务。',
add: '加',
quantity: '数量',
size: '尺寸',
addToCart: '添加到购物车',
orderNow: '现在下单',
addToCartMessage: '已添加到购物车',
emptyCart: '购物车中没有商品',
itemTotal: '项目总计',
delvieryCharges: '送货费',
total: '总',
contactInfo: '联系信息',
deliveryAddressmessage: '设置送货地址',
proceedCheckout: '进行结算',
paymentText: '你想怎么付钱?',
checkout: '查看',
creditCard: '信用卡/借记卡',
paypal: '贝宝',
cod: '货到付款',
thankYou: 'ស谢谢!',
orderConfirmed: '您的订单已确认',
orderId: '您的订单ID',
orderAmount: '您的订单金额',
orderDetail: '订单详情',
paymentMethod: '付款方法',
trackOrder: '跟踪订单',
backToMenu: '跟踪订单',
foodItem: '食品',
deliveredTo: '送到了(送去了',
writeAReview: '写评论',
orderReceived: '订单已经收到',
cancelled: '取消',
foodPreparing: '食物正在准备中',
delivered: '交付',
rateAndReview: '打分和评论',
reviewPlaceholder: '更详细的评论获得更多可见性......',
submit: '提交',
noWorriesText: '不用担心,让我们帮帮你吧!',
yourEmail: '你的邮件',
send: '发送',
checkEmail: '查看您的电子邮件以重置密码链接',
languageText: '请选择您需要的语言',
countryCodePickerTranslation: 'zho',
countryCodeSelect: '选择国家代码',
paymentNotSupported: '此付款方式不支持此货币',
unReadReviews: '暂无评论!',
unReadOrders: '尚无订单!',
error: '错误',
noMoreItems: '库存不多',
hungry: '饥饿',
emptyCartBtn: '回到食物',
subTotal: '小计',
deliveryFee: '快递费',
haveVoucher: '你有优惠券吗',
remove: '去掉',
change: '更改',
condition1: '完成此订单,即表示我同意所有条款和条件。',
condition2:
'我同意,我要求您在吊销期结束之前执行订购的服务。 我知道,在完全完成服务后,我将失去撤销的权利。',
orderBtn: '下订单',
coupanApply: '优惠券折扣',
coupanFailed: '优惠券不可用',
invalidCoupan: '优惠券无效',
validateItems: '结帐前将商品添加到购物车',
validateDelivery: '结帐前设置送货地址'
}

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

@ -0,0 +1,4 @@
{
"expoServerPort": 19000,
"packagerPort": 19000
}

View File

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

1
CustomerApp/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/node_modules

1
CustomerApp/.npmrc Normal file
View File

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

View File

@ -47,6 +47,7 @@ export default function App() {
setupClient(client)
await i18n.initAsync()
// load fonts
await Font.loadAsync({
Poppin300: require('./src/assets/font/Poppin/Poppins-Light.ttf'),
Poppin400: require('./src/assets/font/Poppin/Poppins-Regular.ttf'),

View File

@ -1,9 +1,13 @@
{
"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",
"version": "1.0.22",
"scheme": "enategasinglevendor",
"description": "Enatega is a starter kit food ordering app built in React Native using Expo for IOS and Android. It's made keeping good aesthetics in mind as well keeping the best coding practices in mind. Its fully customisable to easily help you in your next food delivery project. https://enatega.com/enatega-single-vendor/",
"slug": "enategasinglevendor",
"owner": "ninjas_code",
"currentFullName": "@ninjas_code/enategasinglevendor",
"originalFullName": "@ninjas_code/enategasinglevendor",
"privacy": "public",
"androidStatusBar": {
"backgroundColor": "#000"
@ -20,7 +24,8 @@
"backgroundColor": "#febb2c"
},
"updates": {
"fallbackToCacheTimeout": 0
"fallbackToCacheTimeout": 0,
"url": "https://u.expo.dev/e7c3fd70-4054-4dc8-bbdb-a572a3cc6fb1"
},
"assetBundlePatterns": [
"**/*"
@ -33,7 +38,8 @@
},
"usesAppleSignIn": true,
"infoPlist": {
"NSLocationWhenInUseUsageDescription": "This app uses the location to determine the delivery address for your orders."
"NSLocationWhenInUseUsageDescription": "This app uses the location to determine the delivery address for your orders.",
"NSUserTrackingUsageDescription": "Allow this app to collect app-related data that can be used for tracking you or your device."
}
},
"notification": {
@ -44,13 +50,12 @@
"androidCollapsedTitle": "Enatega"
},
"android": {
"versionCode": 22,
"versionCode": 26,
"package": "com.enatega.vendor",
"googleServicesFile": "./google-services-prod.json",
"useNextNotificationsApi": true,
"config": {
"googleMaps": {
"apiKey": ""
"apiKey": "AIzaSyCzNP5qQql2a5y8lOoO-1yj1lj_tzjVImA"
}
},
"adaptiveIcon": {
@ -72,6 +77,14 @@
],
"facebookScheme": "fb3017447961609878",
"facebookAppId": "3017447961609878",
"facebookDisplayName": "Food delivery"
"facebookDisplayName": "Food delivery",
"extra": {
"eas": {
"projectId": "e7c3fd70-4054-4dc8-bbdb-a572a3cc6fb1"
}
},
"runtimeVersion": {
"policy": "sdkVersion"
}
}
}

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 345 KiB

After

Width:  |  Height:  |  Size: 345 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

View File

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

41
CustomerApp/eas.json Normal file
View File

@ -0,0 +1,41 @@
{
"cli": {
"version": ">= 3.8.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"ios": {
"resourceClass": "m-medium"
},
"channel": "development"
},
"preview": {
"distribution": "internal",
"ios": {
"resourceClass": "m-medium"
},
"channel": "preview"
},
"production": {
"channel": "production",
"android": {
"buildType": "apk"
}
}
},
"submit": {
"production": {
"android": {
"serviceAccountKeyPath": "./google-service-account.json",
"track": "production"
},
"ios": {
"appleId": "sharan.gohar@icloud.com",
"ascAppId": "1526488093",
"appleTeamId": "GDFK7MVY6P"
}
}
}
}

View File

@ -0,0 +1,73 @@
/*****************************
* environment.js
* path: '/environment.js' (root of your project)
******************************/
import Constants from "expo-constants";
const ENV = {
development: {
GRAPHQL_URL: "https://enatega-singlevendor.up.railway.app/graphql",
WS_GRAPHQL_URL: "wss://enatega-singlevendor.up.railway.app/graphql",
SERVER_URL: "https://enatega-singlevendor.up.railway.app/",
Expo_CLIENT_ID_GOOGLE:
"967541328677-2lkpq6a9cj7bnokht7ich14igsi3brs5.apps.googleusercontent.com",
IOS_CLIENT_ID_GOOGLE:
"967541328677-uq7f7odvmeea2pb2sq0l7q320ds86536.apps.googleusercontent.com",
ANDROID_CLIENT_ID_GOOGLE:
"967541328677-u9lbhmiesp67j3md9b8nk6mkhooeljur.apps.googleusercontent.com",
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://enatega-singlevendor.up.railway.app/graphql",
WS_GRAPHQL_URL: "wss://enatega-singlevendor.up.railway.app/graphql",
SERVER_URL: "https://enatega-singlevendor.up.railway.app/", // 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: "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://enatega-singlevendor.up.railway.app/graphql",
WS_GRAPHQL_URL: "wss://enatega-singlevendor.up.railway.app/graphql",
SERVER_URL: "https://enatega-singlevendor.up.railway.app/", // 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;

View File

@ -0,0 +1,12 @@
{
"type": "service_account",
"project_id": "pc-api-8741271665364646084-744",
"private_key_id": "ac6cf3caa3f03a39b82511e6cf118e0f4349f204",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCYl3+dsZuMKn8K\nqYyae5IH4ax4JbTsOipt8XTG1MQpEh2kt2oxCYi64WPWxI6waOyORo+v+IEQRbuG\nH5gaD4mGsXEsxIPhJg3lTui+FeWmglZBEe/jI7GeVqGpi/yd/pPbEqP7kJJPQWvK\nIa6PmqiLR6TMCHBm7xJ/+etvKn9sKURtxTaIgs3wZPdH8noNeP2eL3KRuB2hiFNO\ngfVAb0clCMNPPuqQoXHbowfiuFZwoquoX2lbZC3npl19dZJs2H5l7ea/zrwIU+x/\nKTKZazN9jdjElLGbfxvmb8yhuuGOXBHVOmGAITg09b1ALICGv3p2QJEPuTgfahsn\nkZmYAORvAgMBAAECggEAM82S9I08Wmx+7ra61iNHY0eZDrz2XBAvIV4MoAfRhIPy\n7l2aPoWXFqK4C0x1iKxGStLnqvz5i/WwgQsuzwIhVUneOy2H/CK4KvYMC6RRb6Ll\n93dIcltGzJNqlK3CmDy6I3CDnT7qfN+f4WJn6ba+q3IqH15qEnftVucYp4fM9IHT\n1hmKFPtPsaEsnA2VVw1lvYTWhH89lz9bJPLgMllzYJ+p/qHQDsyIdVTEVTLBniDa\ne7SOKA8P3c+jIcXQldH/4BFen4aYThHO8zcG+bj3IX5gOxrg2QrqNxRp04Lqymr0\nDsCTLaChwmGTAi+AYw84uYzDWHKDQD+yZLmXXpaOyQKBgQDHhaJmbcA4rkNYvTkr\nPQ+al8bX91xUDSDqkvJAFbUU9raZrnxiVO5MvxDMRrQAEyz4qj70RrLx2bjghRn0\nQlPewH6nSWzoRe/LE+ixXbzND1sMsK2l3N5jGD9/Y7WjhcYmHttAYNuhlw4lYh2e\nD0IQ0KIdmkXzH+hA0LsAjP584wKBgQDDyRCqZ4k3mVxg3cvCWfWCy2AfnCr0UcLS\nIwkqLoRT0vNDr5ritd15G6L6Z5IqAp/6KcfWtAy+ZbmnV6/Tvitolq5OGXTBuLmE\ncMN//kv0j3rXG0nH0yhRmG+wqurg12xAZqNoV8H0JmjcNIJmTyGBEIdBfym/sNQx\n5WNRF9P8BQKBgQCgmWBvMkhXV22+MBGkTDITLbhQfjtDLI4iQsXb750ikrPIYDqe\nq95kyCatRvv8U3MPdXnXBlFjeuzlTD3n7ruzwR4xaVjQXfr2a8ARhHJEXOfc/xnH\nOFGJUitKTugWB8fHR28UEuK23u/0B1XvtDhpcIYNbfCAEl7QTTM47kSqIQKBgFhV\nonhP6IA2aJCn4aQZtITDv+XjLxo2vYDUH/FxNXEgj3NtiqNZTMi0qG70ReVAc++J\n5ElByTIqcX5IOON/PNSej5xbLeutrb5MplhcYua/ybu96ycGZX2TGmmKZBj3+TaB\nWJ7eYXsHzW31HxSMBWDXFT9+4VZEsSimB45yAsoFAoGAWcqPXt9j6MfTuA2JGuw6\nbKLuXC4JT/Mhte0S7X5WuiKTV5CRwHYRVgyVFO69PMR4pmsmi5OHxpii9fBimgGi\nTeSwYCjrrqj2hKlPOTKDpbowNBKomDGBnLESc7uiTXlmKVLvjQTg/gxwrhjDRkSm\ndRhJ6ccoldcoZFAq1hBlajI=\n-----END PRIVATE KEY-----\n",
"client_email": "android-playstore-eas@pc-api-8741271665364646084-744.iam.gserviceaccount.com",
"client_id": "115125915270931853179",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/android-playstore-eas%40pc-api-8741271665364646084-744.iam.gserviceaccount.com"
}

View File

@ -7,10 +7,11 @@ import { en } from './translations/en'
import { fr } from './translations/fr'
import { km } from './translations/km'
import { zh } from './translations/zh'
import { ar } from './translations/ar'
i18n.initAsync = async() => {
i18n.fallbacks = true
i18n.translations = { fr, en, km, zh, de }
i18n.translations = { fr, en, km, zh, de, ar }
// i18n.locale = 'km'
if (Platform.OS === 'android') {
const lang = await AsyncStorage.getItem('enatega-language')

8
CustomerApp/index.js Normal file
View File

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

View File

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

22890
CustomerApp/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

126
CustomerApp/package.json Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

1
CustomerApp/src/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/node_modules

View File

@ -17,10 +17,12 @@ const COLORS = {
primaryLightBlue: '#0cc8d5',
lightBlueShadeGrey: '#f8f9fa',
mediumBlueShadeGrey: '#f2f4f5',
dkmediumBlueShadeGrey: '#202020',
black06: 'rgba(0,0,0,0.6)',
white06: 'rgba(255,255,255,0.6)',
redishOrange: '#FA7751',
blueColor: '#00b9c6',
yellowishOrange: '#fff1d4'
yellowishOrange: '#fff1d4',
fontMainColor: '#000'
}
export { COLORS }

View File

@ -62,7 +62,7 @@ const Theme = {
fontSecondColor: COLORS.whitishGrey,
placeHolderColor: COLORS.lightGrey,
buttonBackground: COLORS.primary,
buttonBackgroundLight: COLORS.mediumBlueShadeGrey,
buttonBackgroundLight: COLORS.dkmediumBlueShadeGrey,
buttonBackgroundBlue: COLORS.primaryLightBlue,
active: COLORS.primaryLightBlue,
buttonText: COLORS.white,

View File

@ -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");
console.log("token", 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;

View File

@ -3,13 +3,14 @@ mutation Login($facebookId:String,$email:String,$password:String,$type:String!,$
login(facebookId:$facebookId,email:$email,password:$password,type:$type,appleId:$appleId,name:$name,notificationToken:$notificationToken){
userId
token
is_active
tokenExpiration
name
email
phone
}
}
`
`;
export const categories = `
{
@ -19,7 +20,7 @@ export const categories = `
description
img_menu
}
}`
}`;
export const foods = `
query FoodByCategory($category:String!,$onSale:Boolean,$inStock:Boolean,$min:Float,$max:Float,$search:String){
@ -50,7 +51,7 @@ query FoodByCategory($category:String!,$onSale:Boolean,$inStock:Boolean,$min:Flo
img_url
stock
}
}`
}`;
export const createUser = `
mutation CreateUser($facebookId:String,$phone:String,$email:String,$password:String,$name:String,$notificationToken:String,$appleId:String){
@ -71,16 +72,17 @@ export const createUser = `
phone
notificationToken
}
}`
}`;
export const updateUser = `
mutation UpdateUser($name:String!,$phone:String!){
updateUser(updateUserInput:{name:$name,phone:$phone}){
mutation UpdateUser($name:String!,$phone:String!,$is_active:Boolean!){
updateUser(updateUserInput:{name:$name,phone:$phone,is_active:$is_active}){
_id
name
phone
is_active
}
}`
}`;
export const updateNotificationStatus = `
mutation UpdateNotificationStatus($offerNotification:Boolean!,$orderNotification:Boolean!){
@ -90,7 +92,7 @@ export const updateNotificationStatus = `
is_order_notification
is_offer_notification
}
}`
}`;
export const profile = `
query{
profile{
@ -98,6 +100,8 @@ export const profile = `
name
phone
email
is_active
notificationToken
is_order_notification
is_offer_notification
@ -111,7 +115,7 @@ export const profile = `
selected
}
}
}`
}`;
export const order = `query Order($id:String!){
order(id:$id){
@ -184,7 +188,7 @@ export const order = `query Order($id:String!){
}
}
}
`
`;
export const myOrders = `query Orders($offset:Int){
orders(offset:$offset){
@ -257,7 +261,7 @@ export const myOrders = `query Orders($offset:Int){
}
}
}
`
`;
//
// can we get userId from request instead??
@ -340,7 +344,7 @@ export const orderStatusChanged = `subscription OrderStatusChanged($userId:Strin
}
}
}
`
`;
//
// status queue??
@ -417,7 +421,7 @@ mutation PlaceOrder($orderInput:[OrderInput!]!,$paymentMethod:String!,$couponCod
description
}
}
}`
}`;
export const reviewOrder = `mutation ReviewOrder(
$orderId:String!,
@ -440,18 +444,15 @@ export const reviewOrder = `mutation ReviewOrder(
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{
@ -460,7 +461,7 @@ export const getConfiguration = `query Configuration{
currency_symbol
delivery_charges
}
}`
}`;
export const foodByIds = `query FoodByIds($ids:[String!]!){
foodByIds(ids: $ids) {
@ -492,7 +493,7 @@ export const foodByIds = `query FoodByIds($ids:[String!]!){
}
}
}
}`
}`;
export const getCoupon = `mutation Coupon($coupon:String!){
coupon(coupon:$coupon){
@ -501,7 +502,7 @@ export const getCoupon = `mutation Coupon($coupon:String!){
discount
enabled
}
}`
}`;
export const deleteAddress = `mutation DeleteAddress($id:ID!){
deleteAddress(id:$id){
@ -516,7 +517,7 @@ export const deleteAddress = `mutation DeleteAddress($id:ID!){
selected
}
}
}`
}`;
export const createAddress = `mutation CreateAddress($addressInput:AddressInput!){
createAddress(addressInput:$addressInput){
@ -531,7 +532,7 @@ export const createAddress = `mutation CreateAddress($addressInput:AddressInput!
selected
}
}
}`
}`;
export const editAddress = `mutation EditAddress($addressInput:AddressInput!){
editAddress(addressInput:$addressInput){
@ -542,17 +543,17 @@ export const editAddress = `mutation EditAddress($addressInput:AddressInput!){
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){
@ -567,7 +568,7 @@ export const selectAddress = `mutation SelectAddress($id:String!){
selected
}
}
}`
}`;
export const subscriptionRiderLocation = `subscription SubscriptionRiderLocation($riderId:String!){
subscriptionRiderLocation(riderId:$riderId) {
@ -577,7 +578,7 @@ export const subscriptionRiderLocation = `subscription SubscriptionRiderLocation
longitude
}
}
}`
}`;
export const rider = `query Rider($id:String){
rider(id:$id){
@ -587,4 +588,4 @@ export const rider = `query Rider($id:String){
longitude
}
}
}`
}`;

Some files were not shown because too many files have changed in this diff Show More