diff --git a/android/app/build.gradle b/android/app/build.gradle index d0932d6..4a3db4e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -85,7 +85,7 @@ dependencies { androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' implementation 'com.android.support:multidex:1.0.3' - implementation 'com.facebook.android:facebook-android-sdk:[5,6)' + implementation 'com.google.firebase:firebase-analytics:17.2.2' } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2a8acd4..aa08b40 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + > @@ -37,7 +38,8 @@ - + @@ -57,5 +59,5 @@ - + diff --git a/cloud_functions/.firebaserc b/cloud_functions/.firebaserc new file mode 100644 index 0000000..9cacdf2 --- /dev/null +++ b/cloud_functions/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "guava-27f21" + } +} diff --git a/cloud_functions/.gitignore b/cloud_functions/.gitignore new file mode 100644 index 0000000..f626852 --- /dev/null +++ b/cloud_functions/.gitignore @@ -0,0 +1,65 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +firebase-debug.log* + +# Firebase cache +.firebase/ + +# Firebase config + +# Uncomment this if you'd like others to create their own Firebase project. +# For a team working on the same Firebase project(s), it is recommended to leave +# it commented so all members can deploy to the same project(s) in .firebaserc. +# .firebaserc + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env diff --git a/cloud_functions/firebase.json b/cloud_functions/firebase.json new file mode 100644 index 0000000..67a1501 --- /dev/null +++ b/cloud_functions/firebase.json @@ -0,0 +1,8 @@ +{ + "functions": { + "predeploy": [ + "npm --prefix \"$RESOURCE_DIR\" run lint", + "npm --prefix \"$RESOURCE_DIR\" run build" + ] + } +} diff --git a/cloud_functions/functions/.gitignore b/cloud_functions/functions/.gitignore new file mode 100644 index 0000000..7fbb8b4 --- /dev/null +++ b/cloud_functions/functions/.gitignore @@ -0,0 +1,8 @@ +## Compiled JavaScript files +**/*.js +**/*.js.map + +# Typescript v1 declaration files +typings/ + +node_modules/ \ No newline at end of file diff --git a/cloud_functions/functions/package-lock.json b/cloud_functions/functions/package-lock.json new file mode 100644 index 0000000..4c6e675 --- /dev/null +++ b/cloud_functions/functions/package-lock.json @@ -0,0 +1,2336 @@ +{ + "name": "functions", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@firebase/app-types": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz", + "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg==" + }, + "@firebase/auth-interop-types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz", + "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==" + }, + "@firebase/component": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.15.tgz", + "integrity": "sha512-HqFb1qQl1vtlUMIzPM15plNz27jqM8DWjuQQuGeDfG+4iRRflwKfgNw1BOyoP4kQ8vOBCL7t/71yPXSomNdJdQ==", + "requires": { + "@firebase/util": "0.2.50", + "tslib": "^1.11.1" + } + }, + "@firebase/database": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.6.tgz", + "integrity": "sha512-TqUJOaCATF/h3wpqhPT9Fz1nZI6gBv/M2pHZztUjX4A9o9Bq93NyqUurYiZnGB7zpSkEADFCVT4f0VBrWdHlNw==", + "requires": { + "@firebase/auth-interop-types": "0.1.5", + "@firebase/component": "0.1.15", + "@firebase/database-types": "0.5.1", + "@firebase/logger": "0.2.5", + "@firebase/util": "0.2.50", + "faye-websocket": "0.11.3", + "tslib": "^1.11.1" + } + }, + "@firebase/database-types": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.1.tgz", + "integrity": "sha512-onQxom1ZBYBJ648w/VNRzUewovEDAH7lvnrrpCd69ukkyrMk6rGEO/PQ9BcNEbhlNtukpsqRS0oNOFlHs0FaSA==", + "requires": { + "@firebase/app-types": "0.6.1" + } + }, + "@firebase/logger": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.5.tgz", + "integrity": "sha512-qqw3m0tWs/qrg7axTZG/QZq24DIMdSY6dGoWuBn08ddq7+GLF5HiqkRj71XznYeUUbfRq5W9C/PSFnN4JxX+WA==" + }, + "@firebase/util": { + "version": "0.2.50", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.50.tgz", + "integrity": "sha512-vFE6+Jfc25u0ViSpFxxq0q5s+XmuJ/y7CL3ud79RQe+WLFFg+j0eH1t23k0yNSG9vZNM7h3uHRIXbV97sYLAyw==", + "requires": { + "tslib": "^1.11.1" + } + }, + "@google-cloud/common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.4.0.tgz", + "integrity": "sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg==", + "optional": true, + "requires": { + "@google-cloud/projectify": "^1.0.0", + "@google-cloud/promisify": "^1.0.0", + "arrify": "^2.0.0", + "duplexify": "^3.6.0", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^5.5.0", + "retry-request": "^4.0.0", + "teeny-request": "^6.0.0" + } + }, + "@google-cloud/firestore": { + "version": "3.8.6", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.8.6.tgz", + "integrity": "sha512-ox80NbrM1MLJgvAAUd1quFLx/ie/nSjrk1PtscSicpoYDlKb9e6j7pHrVpbopBMyliyfNl3tLJWaDh+x+uCXqw==", + "optional": true, + "requires": { + "deep-equal": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^1.15.3", + "readable-stream": "^3.4.0", + "through2": "^3.0.0" + } + }, + "@google-cloud/paginator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz", + "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + } + }, + "@google-cloud/projectify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz", + "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==", + "optional": true + }, + "@google-cloud/promisify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz", + "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==", + "optional": true + }, + "@google-cloud/storage": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.7.0.tgz", + "integrity": "sha512-f0guAlbeg7Z0m3gKjCfBCu7FG9qS3M3oL5OQQxlvGoPtK7/qg3+W+KQV73O2/sbuS54n0Kh2mvT5K2FWzF5vVQ==", + "optional": true, + "requires": { + "@google-cloud/common": "^2.1.1", + "@google-cloud/paginator": "^2.0.0", + "@google-cloud/promisify": "^1.0.0", + "arrify": "^2.0.0", + "compressible": "^2.0.12", + "concat-stream": "^2.0.0", + "date-and-time": "^0.13.0", + "duplexify": "^3.5.0", + "extend": "^3.0.2", + "gaxios": "^3.0.0", + "gcs-resumable-upload": "^2.2.4", + "hash-stream-validation": "^0.2.2", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "onetime": "^5.1.0", + "p-limit": "^2.2.0", + "pumpify": "^2.0.0", + "readable-stream": "^3.4.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "through2": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "gaxios": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz", + "integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + } + } + }, + "@grpc/grpc-js": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.5.tgz", + "integrity": "sha512-Hm+xOiqAhcpT9RYM8lc15dbQD7aQurM7ZU8ulmulepiPlN7iwBXXwP3vSBUimoFoApRqz7pSIisXU8pZaCB4og==", + "optional": true, + "requires": { + "semver": "^6.2.0" + } + }, + "@grpc/proto-loader": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz", + "integrity": "sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==", + "optional": true, + "requires": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "optional": true + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "optional": true + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "optional": true + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "optional": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "optional": true + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "optional": true + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "optional": true + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "optional": true + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "optional": true + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", + "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.8.tgz", + "integrity": "sha512-1SJZ+R3Q/7mLkOD9ewCBDYD2k0WyZQtWYqF/2VvoNN2/uhI49J9CDN4OAm+wGMA0DbArA4ef27xl4+JwMtGggw==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/fs-extra": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz", + "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.157", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.157.tgz", + "integrity": "sha512-Ft5BNFmv2pHDgxV5JDsndOWTRJ+56zte0ZpYLowp03tW+K+t8u8YMOzAnpuqPgzX6WO1XpDIUm7u04M8vdDiVQ==", + "dev": true + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "optional": true + }, + "@types/mime": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz", + "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q==" + }, + "@types/node": { + "version": "8.10.61", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.61.tgz", + "integrity": "sha512-l+zSbvT8TPRaCxL1l9cwHCb0tSqGAGcjPJFItGGYat5oCTiq1uQQKYg5m7AF1mgnEBzFXGLJ2LRmNjtreRX76Q==" + }, + "@types/qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==" + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + }, + "@types/serve-static": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.4.tgz", + "integrity": "sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "optional": true, + "requires": { + "debug": "4" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "optional": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true + }, + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "optional": true, + "requires": { + "array-filter": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "optional": true + }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "optional": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "optional": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "optional": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "optional": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "optional": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "optional": true + }, + "date-and-time": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.13.1.tgz", + "integrity": "sha512-/Uge9DJAT+s+oAcDxtBhyR8+sKjUnZbYmyhbmWjTHNtX7B7oWD8YyYdeXcBRbwSj6hVvj+IQegJam7m7czhbFw==", + "optional": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-equal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz", + "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==", + "optional": true, + "requires": { + "es-abstract": "^1.17.5", + "es-get-iterator": "^1.1.0", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.0.5", + "isarray": "^2.0.5", + "object-is": "^1.1.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "requires": { + "streamsearch": "0.1.2" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "optional": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "optional": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + } + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "requires": { + "once": "^1.4.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "optional": true + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "optional": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, + "fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", + "optional": true + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "firebase-admin": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.13.0.tgz", + "integrity": "sha512-krXj5ncWMJBhCpXSn9UFY6zmDWjFjqgx+1e9ATXKFYndEjmKtNBuJzqdrAdDh7aTUR7X6+0TPx4Hbc08kd0lwQ==", + "requires": { + "@firebase/database": "^0.6.0", + "@google-cloud/firestore": "^3.0.0", + "@google-cloud/storage": "^4.1.2", + "@types/node": "^8.10.59", + "dicer": "^0.3.0", + "jsonwebtoken": "^8.5.1", + "node-forge": "^0.7.6" + } + }, + "firebase-functions": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.7.0.tgz", + "integrity": "sha512-+ROj2Gs2/KyM+T8jYo7AKaHynFsN49sXbgZMll3zuGa9/8oiDsXp9e1Iy2JMkFmSZg67jeYw5Ue2OSpz0XiqFQ==", + "requires": { + "@types/express": "4.17.3", + "cors": "^2.8.5", + "express": "^4.17.1", + "lodash": "^4.17.14" + } + }, + "firebase-functions-test": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.1.tgz", + "integrity": "sha512-+ZaNrDoRVy0ar4NGtrYbqVTsnitL3/Ud5yC7ElZUkX3956j+AzPCcrsCfa+5GJnpnVODXkMKpw9AySFJ/12nvA==", + "dev": true, + "requires": { + "@types/lodash": "^4.14.104", + "lodash": "^4.17.5" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "optional": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "optional": true + }, + "gaxios": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcp-metadata": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "optional": true, + "requires": { + "gaxios": "^2.1.0", + "json-bigint": "^0.3.0" + } + }, + "gcs-resumable-upload": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz", + "integrity": "sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "configstore": "^5.0.0", + "gaxios": "^2.0.0", + "google-auth-library": "^5.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "google-auth-library": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", + "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^2.1.0", + "gcp-metadata": "^3.4.0", + "gtoken": "^4.1.0", + "jws": "^4.0.0", + "lru-cache": "^5.0.0" + } + }, + "google-gax": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.15.3.tgz", + "integrity": "sha512-3JKJCRumNm3x2EksUTw4P1Rad43FTpqrtW9jzpf3xSMYXx+ogaqTM1vGo7VixHB4xkAyATXVIa3OcNSh8H9zsQ==", + "optional": true, + "requires": { + "@grpc/grpc-js": "~1.0.3", + "@grpc/proto-loader": "^0.5.1", + "@types/fs-extra": "^8.0.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^3.6.0", + "google-auth-library": "^5.0.0", + "is-stream-ended": "^0.1.4", + "lodash.at": "^4.6.0", + "lodash.has": "^4.5.2", + "node-fetch": "^2.6.0", + "protobufjs": "^6.8.9", + "retry-request": "^4.0.0", + "semver": "^6.0.0", + "walkdir": "^0.4.0" + } + }, + "google-p12-pem": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz", + "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==", + "optional": true, + "requires": { + "node-forge": "^0.9.0" + }, + "dependencies": { + "node-forge": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==", + "optional": true + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "optional": true + }, + "gtoken": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", + "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", + "optional": true, + "requires": { + "gaxios": "^2.1.0", + "google-p12-pem": "^2.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "hash-stream-validation": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.3.tgz", + "integrity": "sha512-OEohGLoUOh+bwsIpHpdvhIXFyRGjeLqJbT8Yc5QTZPbRM7LKywagTQxnX/6mghLDOrD9YGz88hy5mLN2eKflYQ==", + "optional": true, + "requires": { + "through2": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", + "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "optional": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "optional": true + }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", + "optional": true + }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "optional": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "optional": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "optional": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "optional": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "optional": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "optional": true + }, + "is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "optional": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "optional": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typed-array": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", + "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", + "optional": true, + "requires": { + "available-typed-arrays": "^1.0.0", + "es-abstract": "^1.17.4", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "optional": true + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "optional": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "optional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-bigint": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz", + "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==", + "optional": true, + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.at": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", + "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=", + "optional": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "optional": true + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", + "optional": true + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "optional": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "optional": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "optional": true, + "requires": { + "semver": "^6.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "optional": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "optional": true + }, + "node-forge": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", + "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "optional": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "optional": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "optional": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "optional": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "optional": true + }, + "protobufjs": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz", + "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==", + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "13.13.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.12.tgz", + "integrity": "sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw==", + "optional": true + } + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "optional": true, + "requires": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + }, + "dependencies": { + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "optional": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + } + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "optional": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "retry-request": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", + "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", + "optional": true, + "requires": { + "debug": "^4.1.1", + "through2": "^3.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "optional": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "optional": true + }, + "snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", + "optional": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, + "requires": { + "stubs": "^3.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "optional": true + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + } + } + }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "optional": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "teeny-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.3.tgz", + "integrity": "sha512-TZG/dfd2r6yeji19es1cUIwAlVD8y+/svB1kAC2Y0bjEyysrfbO8EZvJBRwIE6WkwmUoB7uvWLwTIhJbMXZ1Dw==", + "optional": true, + "requires": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.2.0", + "stream-events": "^1.0.5", + "uuid": "^7.0.0" + } + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "optional": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "optional": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "optional": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", + "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "optional": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "optional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "optional": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "optional": true, + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "optional": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", + "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", + "optional": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "es-abstract": "^1.17.5", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "optional": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "optional": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "optional": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "optional": true + } + } +} diff --git a/cloud_functions/functions/package.json b/cloud_functions/functions/package.json new file mode 100644 index 0000000..08e276b --- /dev/null +++ b/cloud_functions/functions/package.json @@ -0,0 +1,26 @@ +{ + "name": "functions", + "scripts": { + "lint": "tslint --project tsconfig.json", + "build": "tsc", + "serve": "npm run build && firebase emulators:start --only functions", + "shell": "npm run build && firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "10" + }, + "main": "lib/index.js", + "dependencies": { + "firebase-admin": "^8.10.0", + "firebase-functions": "^3.6.1" + }, + "devDependencies": { + "tslint": "^5.12.0", + "typescript": "^3.8.0", + "firebase-functions-test": "^0.2.0" + }, + "private": true +} diff --git a/cloud_functions/functions/src/index.ts b/cloud_functions/functions/src/index.ts new file mode 100644 index 0000000..d1992fd --- /dev/null +++ b/cloud_functions/functions/src/index.ts @@ -0,0 +1,34 @@ +import * as functions from 'firebase-functions'; +import * as admin from 'firebase-admin'; +admin.initializeApp(); +// // Start writing Firebase Functions +// // https://firebase.google.com/docs/functions/typescript +// +const db = admin.firestore(); +const fcm = admin.messaging(); + +export const helloWorld = functions.https.onRequest((request, response) => { + response.send("Hello from Firebase!"); +}); + +export const sendToDevice = functions.firestore.document('users').onCreate(async snapshot => { + + const querySnapshot = await db.collection('tokens').get(); + + const tokens = new Array(); + + querySnapshot.forEach(async tokenDoc => { + tokens.push(tokenDoc.data().token); + }); + + const payload : admin.messaging.MessagingPayload = { + notification : { + title : 'Guava ', + body : 'How are you today? ', + click_action : 'FLUTTER_NOTIFICATION_CLICK' + } + }; + + return fcm.sendToDevice(tokens , payload); + +}); diff --git a/cloud_functions/functions/tsconfig.json b/cloud_functions/functions/tsconfig.json new file mode 100644 index 0000000..7ce05d0 --- /dev/null +++ b/cloud_functions/functions/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "noImplicitReturns": true, + "noUnusedLocals": true, + "outDir": "lib", + "sourceMap": true, + "strict": true, + "target": "es2017" + }, + "compileOnSave": true, + "include": [ + "src" + ] +} diff --git a/cloud_functions/functions/tslint.json b/cloud_functions/functions/tslint.json new file mode 100644 index 0000000..98b2bfd --- /dev/null +++ b/cloud_functions/functions/tslint.json @@ -0,0 +1,115 @@ +{ + "rules": { + // -- Strict errors -- + // These lint rules are likely always a good idea. + + // Force function overloads to be declared together. This ensures readers understand APIs. + "adjacent-overload-signatures": true, + + // Do not allow the subtle/obscure comma operator. + "ban-comma-operator": true, + + // Do not allow internal modules or namespaces . These are deprecated in favor of ES6 modules. + "no-namespace": true, + + // Do not allow parameters to be reassigned. To avoid bugs, developers should instead assign new values to new vars. + "no-parameter-reassignment": true, + + // Force the use of ES6-style imports instead of /// imports. + "no-reference": true, + + // Do not allow type assertions that do nothing. This is a big warning that the developer may not understand the + // code currently being edited (they may be incorrectly handling a different type case that does not exist). + "no-unnecessary-type-assertion": true, + + // Disallow nonsensical label usage. + "label-position": true, + + // Disallows the (often typo) syntax if (var1 = var2). Replace with if (var2) { var1 = var2 }. + "no-conditional-assignment": true, + + // Disallows constructors for primitive types (e.g. new Number('123'), though Number('123') is still allowed). + "no-construct": true, + + // Do not allow super() to be called twice in a constructor. + "no-duplicate-super": true, + + // Do not allow the same case to appear more than once in a switch block. + "no-duplicate-switch-case": true, + + // Do not allow a variable to be declared more than once in the same block. Consider function parameters in this + // rule. + "no-duplicate-variable": [true, "check-parameters"], + + // Disallows a variable definition in an inner scope from shadowing a variable in an outer scope. Developers should + // instead use a separate variable name. + "no-shadowed-variable": true, + + // Empty blocks are almost never needed. Allow the one general exception: empty catch blocks. + "no-empty": [true, "allow-empty-catch"], + + // Functions must either be handled directly (e.g. with a catch() handler) or returned to another function. + // This is a major source of errors in Cloud Functions and the team strongly recommends leaving this rule on. + "no-floating-promises": true, + + // Do not allow any imports for modules that are not in package.json. These will almost certainly fail when + // deployed. + "no-implicit-dependencies": true, + + // The 'this' keyword can only be used inside of classes. + "no-invalid-this": true, + + // Do not allow strings to be thrown because they will not include stack traces. Throw Errors instead. + "no-string-throw": true, + + // Disallow control flow statements, such as return, continue, break, and throw in finally blocks. + "no-unsafe-finally": true, + + // Expressions must always return a value. Avoids common errors like const myValue = functionReturningVoid(); + "no-void-expression": [true, "ignore-arrow-function-shorthand"], + + // Disallow duplicate imports in the same file. + "no-duplicate-imports": true, + + + // -- Strong Warnings -- + // These rules should almost never be needed, but may be included due to legacy code. + // They are left as a warning to avoid frustration with blocked deploys when the developer + // understand the warning and wants to deploy anyway. + + // Warn when an empty interface is defined. These are generally not useful. + "no-empty-interface": {"severity": "warning"}, + + // Warn when an import will have side effects. + "no-import-side-effect": {"severity": "warning"}, + + // Warn when variables are defined with var. Var has subtle meaning that can lead to bugs. Strongly prefer const for + // most values and let for values that will change. + "no-var-keyword": {"severity": "warning"}, + + // Prefer === and !== over == and !=. The latter operators support overloads that are often accidental. + "triple-equals": {"severity": "warning"}, + + // Warn when using deprecated APIs. + "deprecation": {"severity": "warning"}, + + // -- Light Warnings -- + // These rules are intended to help developers use better style. Simpler code has fewer bugs. These would be "info" + // if TSLint supported such a level. + + // prefer for( ... of ... ) to an index loop when the index is only used to fetch an object from an array. + // (Even better: check out utils like .map if transforming an array!) + "prefer-for-of": {"severity": "warning"}, + + // Warns if function overloads could be unified into a single function with optional or rest parameters. + "unified-signatures": {"severity": "warning"}, + + // Prefer const for values that will not change. This better documents code. + "prefer-const": {"severity": "warning"}, + + // Multi-line object literals and function calls should have a trailing comma. This helps avoid merge conflicts. + "trailing-comma": {"severity": "warning"} + }, + + "defaultSeverity": "error" +} diff --git a/images/camilia.jpg b/images/camilia.jpg deleted file mode 100644 index b2e7518..0000000 Binary files a/images/camilia.jpg and /dev/null differ diff --git a/images/default.png b/images/default.png deleted file mode 100644 index 822078a..0000000 Binary files a/images/default.png and /dev/null differ diff --git a/images/facebook.png b/images/facebook.png deleted file mode 100644 index 1c3d7fe..0000000 Binary files a/images/facebook.png and /dev/null differ diff --git a/images/food.jpg b/images/food.jpg deleted file mode 100644 index 2fc4dcb..0000000 Binary files a/images/food.jpg and /dev/null differ diff --git a/images/health.jpg b/images/health.jpg deleted file mode 100644 index a71d28c..0000000 Binary files a/images/health.jpg and /dev/null differ diff --git a/images/onboarding/cooking.png b/images/onboarding/cooking.png new file mode 100644 index 0000000..160b158 Binary files /dev/null and b/images/onboarding/cooking.png differ diff --git a/images/onboarding/health2.png b/images/onboarding/health2.png new file mode 100644 index 0000000..b2eff82 Binary files /dev/null and b/images/onboarding/health2.png differ diff --git a/images/onboarding/medical.png b/images/onboarding/medical.png new file mode 100644 index 0000000..0fed6d5 Binary files /dev/null and b/images/onboarding/medical.png differ diff --git a/images/onboarding/working_out.png b/images/onboarding/working_out.png new file mode 100644 index 0000000..ee68c0e Binary files /dev/null and b/images/onboarding/working_out.png differ diff --git a/images/beef.jpeg b/images/recipes/beef.jpeg similarity index 100% rename from images/beef.jpeg rename to images/recipes/beef.jpeg diff --git a/images/chiken.jpg b/images/recipes/chiken.jpg similarity index 100% rename from images/chiken.jpg rename to images/recipes/chiken.jpg diff --git a/images/greek.jpg b/images/recipes/greek.jpg similarity index 100% rename from images/greek.jpg rename to images/recipes/greek.jpg diff --git a/images/marsala.jpeg b/images/recipes/marsala.jpeg similarity index 100% rename from images/marsala.jpeg rename to images/recipes/marsala.jpeg diff --git a/images/nutty-chicken-sate-strips.jpg b/images/recipes/nutty-chicken-sate-strips.jpg similarity index 100% rename from images/nutty-chicken-sate-strips.jpg rename to images/recipes/nutty-chicken-sate-strips.jpg diff --git a/images/pomegranate-chicken.jpg b/images/recipes/pomegranate-chicken.jpg similarity index 100% rename from images/pomegranate-chicken.jpg rename to images/recipes/pomegranate-chicken.jpg diff --git a/images/prawn-harissa-spaghetti.jpg b/images/recipes/prawn-harissa-spaghetti.jpg similarity index 100% rename from images/prawn-harissa-spaghetti.jpg rename to images/recipes/prawn-harissa-spaghetti.jpg diff --git a/images/ree.jpeg b/images/recipes/ree.jpeg similarity index 100% rename from images/ree.jpeg rename to images/recipes/ree.jpeg diff --git a/images/spiced-carrot.jpg b/images/recipes/spiced-carrot.jpg similarity index 100% rename from images/spiced-carrot.jpg rename to images/recipes/spiced-carrot.jpg diff --git a/images/yogurt-cake.jpeg b/images/recipes/yogurt-cake.jpeg similarity index 100% rename from images/yogurt-cake.jpeg rename to images/recipes/yogurt-cake.jpeg diff --git a/images/sick.jpg b/images/sick.jpg deleted file mode 100644 index 11b0b78..0000000 Binary files a/images/sick.jpg and /dev/null differ diff --git a/images/working_out.gif b/images/working_out.gif new file mode 100644 index 0000000..55e8422 Binary files /dev/null and b/images/working_out.gif differ diff --git a/lib/Animation/FadeAnimation.dart b/lib/Animation/FadeAnimation.dart deleted file mode 100644 index 055a9af..0000000 --- a/lib/Animation/FadeAnimation.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:simple_animations/simple_animations.dart'; - -class FadeAnimation extends StatelessWidget { - final double delay; - final Widget child; - - FadeAnimation(this.delay, this.child); - - @override - Widget build(BuildContext context) { - final tween = MultiTrackTween([ - Track("opacity").add(Duration(milliseconds: 500), Tween(begin: 0.0, end: 1.0)), - Track("translateY").add( - Duration(milliseconds: 500), Tween(begin: -30.0, end: 0.0), - curve: Curves.easeOut) - ]); - - return ControlledAnimation( - delay: Duration(milliseconds: (500 * delay).round()), - duration: tween.duration, - tween: tween, - child: child, - builderWithChild: (context, child, animation) => Opacity( - opacity: animation["opacity"], - child: Transform.translate( - offset: Offset(0, animation["translateY"]), - child: child - ), - ), - ); - } -} \ No newline at end of file diff --git a/lib/Others/loading.dart b/lib/Others/loading.dart new file mode 100644 index 0000000..1699bae --- /dev/null +++ b/lib/Others/loading.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; + +class Loading extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + child: SpinKitPumpingHeart( + color: Colors.blue, + size: 50.0, + ), + ); + } +} \ No newline at end of file diff --git a/lib/Others/moods.dart b/lib/Others/moods.dart index 1ebc792..4c144ec 100644 --- a/lib/Others/moods.dart +++ b/lib/Others/moods.dart @@ -1,4 +1,6 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class MoodsSelector extends StatefulWidget { // MoodsSelector({Key key}) : super(key: key); @@ -14,6 +16,7 @@ class _MoodsSelectorState extends State { @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Center( child: ToggleButtons( selectedColor: Colors.blueAccent, diff --git a/lib/Others/theme.dart b/lib/Others/theme.dart new file mode 100644 index 0000000..bfadfdc --- /dev/null +++ b/lib/Others/theme.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +class ThemeChanger with ChangeNotifier { + ThemeData _themeData; + + ThemeChanger(this._themeData); + + getTheme() => _themeData; + setTheme(ThemeData theme) { + _themeData = theme; + + notifyListeners(); + } +} diff --git a/lib/Others/utisl.dart b/lib/Others/utisl.dart index edbc19c..d49b3ca 100644 --- a/lib/Others/utisl.dart +++ b/lib/Others/utisl.dart @@ -7,16 +7,15 @@ const lightColor = Colors.greenAccent; const darkRedColor = Colors.cyan; const lightRedColor = Color(0xFFFD685A); -const purpleGradient = LinearGradient( +const cyanGradient = LinearGradient( colors: [darkColor, midColor, lightColor], stops: [0.0, 0.5, 1.0], begin: Alignment.centerLeft, end: Alignment.centerRight, ); - -const redGradient = LinearGradient( - colors: [darkRedColor, lightRedColor], - stops: [0.0, 1.0], +const whiteGradient = LinearGradient( + colors: [Colors.black54, Colors.black54, Colors.black12], + stops: [0.0, 0.5, 1.0], begin: Alignment.centerLeft, end: Alignment.centerRight, ); diff --git a/lib/Recipes/eight.dart b/lib/Recipes/eight.dart new file mode 100644 index 0000000..9881240 --- /dev/null +++ b/lib/Recipes/eight.dart @@ -0,0 +1,229 @@ +import 'package:app/Others/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class EightRecipe extends StatefulWidget { + @override + _EightRecipeState createState() => _EightRecipeState(); +} + +class _EightRecipeState extends State { + + final String image = "images/recipes/chiken.jpg"; + var favIcon = Icon(Icons.favorite_border); + + void btnToggle(){ + if (favIcon != Icon(Icons.favorite)) { + favIcon = Icon(Icons.favorite); + } else if(favIcon == Icon(Icons.favorite)) { + favIcon = Icon(Icons.favorite_border); + } + } + _video() async { + const url = 'https://www.youtube.com/watch?v=UzUqoLe4At0'; + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } + @override + Widget build(BuildContext context) { + final theme = Provider.of(context); + return Scaffold( + body: Stack( + children: [ + Container( + foregroundDecoration: BoxDecoration( + color: Colors.black26 + ), + height: 400, + child: Image.asset(image, fit: BoxFit.cover)), + SingleChildScrollView( + padding: const EdgeInsets.only(top: 16.0,bottom: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 250), + Padding( + padding: const EdgeInsets.symmetric(horizontal:16.0), + child: Text( + "Chicken Satay Salad", + style: TextStyle(color: Colors.white, fontSize: 28.0, fontWeight: FontWeight.bold), + ), + ), + Row( + children: [ + const SizedBox(width: 16.0), + Container( + padding: const EdgeInsets.symmetric( + vertical: 8.0, + horizontal: 16.0, + ), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(20.0)), + child: Text( + "255 reviews", + style: TextStyle(color: Colors.white, fontSize: 13.0), + ), + ), + Spacer(), + IconButton( + color: Colors.white, + icon: favIcon, + onPressed: () { + setState(() { + btnToggle(); + }); + }, + ) + ], + ), + Container( + padding: const EdgeInsets.all(32.0), + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + ], + ), + ], + ), + ), + ], + ), + const SizedBox(height: 30.0), + SizedBox( + width: double.infinity, + child: RaisedButton( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)), + color: Colors.blueAccent, + textColor: Colors.white, + child: Text("Video", style: TextStyle( + fontWeight: FontWeight.normal + ),), + padding: const EdgeInsets.symmetric( + vertical: 16.0, + horizontal: 32.0, + ), + onPressed: _video, + ), + ), + const SizedBox(height: 30.0), + Text("Ingredients".toUpperCase(), style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0 + ),), + const SizedBox(height: 10.0), + Text( + """ +1 pound extra-lean ground beef + +1 onion, diced + +4 cloves garlic, minced + +1 jalapeno, minced + +1 red pepper, diced + +1 can small red beans or pinto beans, preferably low sodium drained and rinsed + +1 1/2 cups no-salt-added tomato sauce + +2 tablespoons tomato paste + +1 tablespoon red wine vinegar + +1 tablespoon molasses + +1 tablespoon Worcestershire sauce + +1 teaspoon mustard powder + +3/4 teaspoon salt + +Freshly ground black pepper + +8 whole-wheat burger buns + + """, + textAlign: TextAlign.justify, style: TextStyle( + fontWeight: FontWeight.w300, + fontSize: 14.0 + ),), + const SizedBox(height: 10.0), + Text("Method".toUpperCase(), style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0 + ),), + Text( + """ +1. Brown the meat and the onion in a large nonstick skillet over medium-high heat for 5 minutes, +2. breaking up the meat into crumbles as it cooks. Pour the drippings out of the pan and discard. +3. Add the garlic, jalapeno, and red pepper and cook 5 minutes more, stirring occasionally. +4. Stir in the rest of the ingredients, reduce heat to low, and simmer for 5 minutes more. +5. Place a half-cup scoop of the mixture onto each bun and serve. + + """ + , textAlign: TextAlign.justify, style: TextStyle( + fontWeight: FontWeight.w300, + fontSize: 14.0 + ),), + ], + ), + ), + ], + ), + ), + Positioned( + top: 0, + left: 0, + right: 0, + child: AppBar( + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + title: Text("DETAIL",style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.normal + ),), + ), + ), + ], + ), + ); + } +} + diff --git a/lib/Recipes/five.dart b/lib/Recipes/five.dart index 6e43cd6..ac0a76e 100644 --- a/lib/Recipes/five.dart +++ b/lib/Recipes/five.dart @@ -1,4 +1,6 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class FiveRecipe extends StatefulWidget { @@ -9,7 +11,7 @@ class FiveRecipe extends StatefulWidget { class _FiveRecipeState extends State { - final String image = "images/ree.jpeg"; + final String image = "images/recipes/ree.jpeg"; var favIcon = Icon(Icons.favorite_border); void btnToggle(){ @@ -29,6 +31,7 @@ class _FiveRecipeState extends State { } @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( body: Stack( children: [ @@ -81,7 +84,7 @@ class _FiveRecipeState extends State { ), Container( padding: const EdgeInsets.all(32.0), - color: Colors.white, + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/lib/Recipes/four.dart b/lib/Recipes/four.dart index 715e4f0..d76c9c4 100644 --- a/lib/Recipes/four.dart +++ b/lib/Recipes/four.dart @@ -1,4 +1,6 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class FourRecipe extends StatefulWidget { @@ -9,7 +11,7 @@ class FourRecipe extends StatefulWidget { class _FourRecipeState extends State { - final String image = "images/beef.jpeg"; + final String image = "images/recipes/beef.jpeg"; var favIcon = Icon(Icons.favorite_border); void btnToggle(){ @@ -29,6 +31,8 @@ class _FourRecipeState extends State { } @override Widget build(BuildContext context) { + final theme = Provider.of(context); + return Scaffold( body: Stack( children: [ @@ -81,7 +85,7 @@ class _FourRecipeState extends State { ), Container( padding: const EdgeInsets.all(32.0), - color: Colors.white, + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/lib/Recipes/nine.dart b/lib/Recipes/nine.dart new file mode 100644 index 0000000..c5c0cae --- /dev/null +++ b/lib/Recipes/nine.dart @@ -0,0 +1,229 @@ +import 'package:app/Others/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class NineRecipe extends StatefulWidget { + @override + _NineRecipeState createState() => _NineRecipeState(); +} + +class _NineRecipeState extends State { + + final String image = "images/recipes/chiken.jpg"; + var favIcon = Icon(Icons.favorite_border); + + void btnToggle(){ + if (favIcon != Icon(Icons.favorite)) { + favIcon = Icon(Icons.favorite); + } else if(favIcon == Icon(Icons.favorite)) { + favIcon = Icon(Icons.favorite_border); + } + } + _video() async { + const url = 'https://www.youtube.com/watch?v=UzUqoLe4At0'; + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } + @override + Widget build(BuildContext context) { + final theme = Provider.of(context); + return Scaffold( + body: Stack( + children: [ + Container( + foregroundDecoration: BoxDecoration( + color: Colors.black26 + ), + height: 400, + child: Image.asset(image, fit: BoxFit.cover)), + SingleChildScrollView( + padding: const EdgeInsets.only(top: 16.0,bottom: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 250), + Padding( + padding: const EdgeInsets.symmetric(horizontal:16.0), + child: Text( + "Chicken Satay Salad", + style: TextStyle(color: Colors.white, fontSize: 28.0, fontWeight: FontWeight.bold), + ), + ), + Row( + children: [ + const SizedBox(width: 16.0), + Container( + padding: const EdgeInsets.symmetric( + vertical: 8.0, + horizontal: 16.0, + ), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(20.0)), + child: Text( + "255 reviews", + style: TextStyle(color: Colors.white, fontSize: 13.0), + ), + ), + Spacer(), + IconButton( + color: Colors.white, + icon: favIcon, + onPressed: () { + setState(() { + btnToggle(); + }); + }, + ) + ], + ), + Container( + padding: const EdgeInsets.all(32.0), + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + ], + ), + ], + ), + ), + ], + ), + const SizedBox(height: 30.0), + SizedBox( + width: double.infinity, + child: RaisedButton( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)), + color: Colors.blueAccent, + textColor: Colors.white, + child: Text("Video", style: TextStyle( + fontWeight: FontWeight.normal + ),), + padding: const EdgeInsets.symmetric( + vertical: 16.0, + horizontal: 32.0, + ), + onPressed: _video, + ), + ), + const SizedBox(height: 30.0), + Text("Ingredients".toUpperCase(), style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0 + ),), + const SizedBox(height: 10.0), + Text( + """ +1 pound extra-lean ground beef + +1 onion, diced + +4 cloves garlic, minced + +1 jalapeno, minced + +1 red pepper, diced + +1 can small red beans or pinto beans, preferably low sodium drained and rinsed + +1 1/2 cups no-salt-added tomato sauce + +2 tablespoons tomato paste + +1 tablespoon red wine vinegar + +1 tablespoon molasses + +1 tablespoon Worcestershire sauce + +1 teaspoon mustard powder + +3/4 teaspoon salt + +Freshly ground black pepper + +8 whole-wheat burger buns + + """, + textAlign: TextAlign.justify, style: TextStyle( + fontWeight: FontWeight.w300, + fontSize: 14.0 + ),), + const SizedBox(height: 10.0), + Text("Method".toUpperCase(), style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0 + ),), + Text( + """ +1. Brown the meat and the onion in a large nonstick skillet over medium-high heat for 5 minutes, +2. breaking up the meat into crumbles as it cooks. Pour the drippings out of the pan and discard. +3. Add the garlic, jalapeno, and red pepper and cook 5 minutes more, stirring occasionally. +4. Stir in the rest of the ingredients, reduce heat to low, and simmer for 5 minutes more. +5. Place a half-cup scoop of the mixture onto each bun and serve. + + """ + , textAlign: TextAlign.justify, style: TextStyle( + fontWeight: FontWeight.w300, + fontSize: 14.0 + ),), + ], + ), + ), + ], + ), + ), + Positioned( + top: 0, + left: 0, + right: 0, + child: AppBar( + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + title: Text("DETAIL",style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.normal + ),), + ), + ), + ], + ), + ); + } +} + diff --git a/lib/Recipes/one.dart b/lib/Recipes/one.dart index d0810e6..41de8c0 100644 --- a/lib/Recipes/one.dart +++ b/lib/Recipes/one.dart @@ -1,4 +1,6 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class Recipe extends StatefulWidget { @@ -8,7 +10,7 @@ class Recipe extends StatefulWidget { class _RecipeState extends State { - final String image = "images/chiken.jpg"; + final String image = "images/recipes/chiken.jpg"; var favIcon = Icon(Icons.favorite_border); void btnToggle(){ @@ -28,6 +30,7 @@ void btnToggle(){ } @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( body: Stack( children: [ @@ -80,7 +83,7 @@ void btnToggle(){ ), Container( padding: const EdgeInsets.all(32.0), - color: Colors.white, + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/lib/Recipes/seven.dart b/lib/Recipes/seven.dart new file mode 100644 index 0000000..f9f43a8 --- /dev/null +++ b/lib/Recipes/seven.dart @@ -0,0 +1,229 @@ +import 'package:app/Others/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class SevenRecipe extends StatefulWidget { + @override + _SevenRecipeState createState() => _SevenRecipeState(); +} + +class _SevenRecipeState extends State { + + final String image = "https://food.fnr.sndimg.com/content/dam/images/food/fullset/2011/11/4/1/CCHAP402_Sloppy-Joes_s4x3.jpg.rend.hgtvcom.826.620.suffix/1382540648899.jpeg"; + var favIcon = Icon(Icons.favorite_border); + + void btnToggle(){ + if (favIcon != Icon(Icons.favorite)) { + favIcon = Icon(Icons.favorite); + } else if(favIcon == Icon(Icons.favorite)) { + favIcon = Icon(Icons.favorite_border); + } + } + _video() async { + const url = 'https://www.youtube.com/watch?v=UzUqoLe4At0'; + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } + @override + Widget build(BuildContext context) { + final theme = Provider.of(context); + return Scaffold( + body: Stack( + children: [ + Container( + foregroundDecoration: BoxDecoration( + color: Colors.black26 + ), + height: 400, + child: Image.network(image, fit: BoxFit.cover)), + SingleChildScrollView( + padding: const EdgeInsets.only(top: 16.0,bottom: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 250), + Padding( + padding: const EdgeInsets.symmetric(horizontal:16.0), + child: Text( + "Sloppy Joes", + style: TextStyle(color: Colors.white, fontSize: 28.0, fontWeight: FontWeight.bold), + ), + ), + Row( + children: [ + const SizedBox(width: 16.0), + Container( + padding: const EdgeInsets.symmetric( + vertical: 8.0, + horizontal: 16.0, + ), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(20.0)), + child: Text( + "255 reviews", + style: TextStyle(color: Colors.white, fontSize: 13.0), + ), + ), + Spacer(), + IconButton( + color: Colors.white, + icon: favIcon, + onPressed: () { + setState(() { + btnToggle(); + }); + }, + ) + ], + ), + Container( + padding: const EdgeInsets.all(32.0), + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + ], + ), + ], + ), + ), + ], + ), + const SizedBox(height: 30.0), + SizedBox( + width: double.infinity, + child: RaisedButton( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)), + color: Colors.blueAccent, + textColor: Colors.white, + child: Text("Video", style: TextStyle( + fontWeight: FontWeight.normal + ),), + padding: const EdgeInsets.symmetric( + vertical: 16.0, + horizontal: 32.0, + ), + onPressed: _video, + ), + ), + const SizedBox(height: 30.0), + Text("Ingredients".toUpperCase(), style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0 + ),), + const SizedBox(height: 10.0), + Text( + """ +1 pound extra-lean ground beef + +1 onion, diced + +4 cloves garlic, minced + +1 jalapeno, minced + +1 red pepper, diced + +1 can small red beans or pinto beans, preferably low sodium drained and rinsed + +1 1/2 cups no-salt-added tomato sauce + +2 tablespoons tomato paste + +1 tablespoon red wine vinegar + +1 tablespoon molasses + +1 tablespoon Worcestershire sauce + +1 teaspoon mustard powder + +3/4 teaspoon salt + +Freshly ground black pepper + +8 whole-wheat burger buns + + """, + textAlign: TextAlign.justify, style: TextStyle( + fontWeight: FontWeight.w300, + fontSize: 14.0 + ),), + const SizedBox(height: 10.0), + Text("Method".toUpperCase(), style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0 + ),), + Text( + """ +1. Brown the meat and the onion in a large nonstick skillet over medium-high heat for 5 minutes, +2. breaking up the meat into crumbles as it cooks. Pour the drippings out of the pan and discard. +3. Add the garlic, jalapeno, and red pepper and cook 5 minutes more, stirring occasionally. +4. Stir in the rest of the ingredients, reduce heat to low, and simmer for 5 minutes more. +5. Place a half-cup scoop of the mixture onto each bun and serve. + + """ + , textAlign: TextAlign.justify, style: TextStyle( + fontWeight: FontWeight.w300, + fontSize: 14.0 + ),), + ], + ), + ), + ], + ), + ), + Positioned( + top: 0, + left: 0, + right: 0, + child: AppBar( + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + title: Text("DETAIL",style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.normal + ),), + ), + ), + ], + ), + ); + } +} + diff --git a/lib/Recipes/six.dart b/lib/Recipes/six.dart index 335362c..0b28d04 100644 --- a/lib/Recipes/six.dart +++ b/lib/Recipes/six.dart @@ -1,4 +1,6 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class SixRecipe extends StatefulWidget { @@ -8,7 +10,7 @@ class SixRecipe extends StatefulWidget { class _SixRecipeState extends State { - final String image = "images/nutty-chicken-sate-strips.jpg"; + final String image = "images/recipes/nutty-chicken-sate-strips.jpg"; var favIcon = Icon(Icons.favorite_border); void btnToggle(){ @@ -28,6 +30,7 @@ void btnToggle(){ } @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( body: Stack( children: [ @@ -80,7 +83,7 @@ void btnToggle(){ ), Container( padding: const EdgeInsets.all(32.0), - color: Colors.white, + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/lib/Recipes/ten.dart b/lib/Recipes/ten.dart new file mode 100644 index 0000000..b6384c7 --- /dev/null +++ b/lib/Recipes/ten.dart @@ -0,0 +1,229 @@ +import 'package:app/Others/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class TenRecipe extends StatefulWidget { + @override + _TenRecipeState createState() => _TenRecipeState(); +} + +class _TenRecipeState extends State { + + final String image = "images/recipes/chiken.jpg"; + var favIcon = Icon(Icons.favorite_border); + + void btnToggle(){ + if (favIcon != Icon(Icons.favorite)) { + favIcon = Icon(Icons.favorite); + } else if(favIcon == Icon(Icons.favorite)) { + favIcon = Icon(Icons.favorite_border); + } + } + _video() async { + const url = 'https://www.youtube.com/watch?v=UzUqoLe4At0'; + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } + @override + Widget build(BuildContext context) { + final theme = Provider.of(context); + return Scaffold( + body: Stack( + children: [ + Container( + foregroundDecoration: BoxDecoration( + color: Colors.black26 + ), + height: 400, + child: Image.asset(image, fit: BoxFit.cover)), + SingleChildScrollView( + padding: const EdgeInsets.only(top: 16.0,bottom: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 250), + Padding( + padding: const EdgeInsets.symmetric(horizontal:16.0), + child: Text( + "Chicken Satay Salad", + style: TextStyle(color: Colors.white, fontSize: 28.0, fontWeight: FontWeight.bold), + ), + ), + Row( + children: [ + const SizedBox(width: 16.0), + Container( + padding: const EdgeInsets.symmetric( + vertical: 8.0, + horizontal: 16.0, + ), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(20.0)), + child: Text( + "255 reviews", + style: TextStyle(color: Colors.white, fontSize: 13.0), + ), + ), + Spacer(), + IconButton( + color: Colors.white, + icon: favIcon, + onPressed: () { + setState(() { + btnToggle(); + }); + }, + ) + ], + ), + Container( + padding: const EdgeInsets.all(32.0), + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + Icon( + Icons.star, + color: Colors.amber, + ), + ], + ), + ], + ), + ), + ], + ), + const SizedBox(height: 30.0), + SizedBox( + width: double.infinity, + child: RaisedButton( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)), + color: Colors.blueAccent, + textColor: Colors.white, + child: Text("Video", style: TextStyle( + fontWeight: FontWeight.normal + ),), + padding: const EdgeInsets.symmetric( + vertical: 16.0, + horizontal: 32.0, + ), + onPressed: _video, + ), + ), + const SizedBox(height: 30.0), + Text("Ingredients".toUpperCase(), style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0 + ),), + const SizedBox(height: 10.0), + Text( + """ +1 pound extra-lean ground beef + +1 onion, diced + +4 cloves garlic, minced + +1 jalapeno, minced + +1 red pepper, diced + +1 can small red beans or pinto beans, preferably low sodium drained and rinsed + +1 1/2 cups no-salt-added tomato sauce + +2 tablespoons tomato paste + +1 tablespoon red wine vinegar + +1 tablespoon molasses + +1 tablespoon Worcestershire sauce + +1 teaspoon mustard powder + +3/4 teaspoon salt + +Freshly ground black pepper + +8 whole-wheat burger buns + + """, + textAlign: TextAlign.justify, style: TextStyle( + fontWeight: FontWeight.w300, + fontSize: 14.0 + ),), + const SizedBox(height: 10.0), + Text("Method".toUpperCase(), style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0 + ),), + Text( + """ +1. Brown the meat and the onion in a large nonstick skillet over medium-high heat for 5 minutes, +2. breaking up the meat into crumbles as it cooks. Pour the drippings out of the pan and discard. +3. Add the garlic, jalapeno, and red pepper and cook 5 minutes more, stirring occasionally. +4. Stir in the rest of the ingredients, reduce heat to low, and simmer for 5 minutes more. +5. Place a half-cup scoop of the mixture onto each bun and serve. + + """ + , textAlign: TextAlign.justify, style: TextStyle( + fontWeight: FontWeight.w300, + fontSize: 14.0 + ),), + ], + ), + ), + ], + ), + ), + Positioned( + top: 0, + left: 0, + right: 0, + child: AppBar( + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + title: Text("DETAIL",style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.normal + ),), + ), + ), + ], + ), + ); + } +} + diff --git a/lib/Recipes/three.dart b/lib/Recipes/three.dart index 378d15b..bf5a0d7 100644 --- a/lib/Recipes/three.dart +++ b/lib/Recipes/three.dart @@ -1,4 +1,6 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class ThirdRecipe extends StatefulWidget { @@ -9,7 +11,7 @@ class ThirdRecipe extends StatefulWidget { class _ThirdRecipeState extends State { - final String image = "images/yogurt-cake.jpeg"; + final String image = "images/recipes/yogurt-cake.jpeg"; var favIcon = Icon(Icons.favorite_border); void btnToggle(){ @@ -29,6 +31,8 @@ class _ThirdRecipeState extends State { } @override Widget build(BuildContext context) { + final theme = Provider.of(context); + return Scaffold( body: Stack( children: [ @@ -81,7 +85,7 @@ class _ThirdRecipeState extends State { ), Container( padding: const EdgeInsets.all(32.0), - color: Colors.white, + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/lib/Recipes/two.dart b/lib/Recipes/two.dart index de5d911..59667fb 100644 --- a/lib/Recipes/two.dart +++ b/lib/Recipes/two.dart @@ -1,4 +1,6 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class SecondRecipe extends StatefulWidget { @@ -10,7 +12,7 @@ class SecondRecipe extends StatefulWidget { class _SecondRecipeState extends State { - final String image = "images/marsala.jpeg"; + final String image = "images/recipes/marsala.jpeg"; var favIcon = Icon(Icons.favorite_border); void btnToggle(){ @@ -30,6 +32,8 @@ class _SecondRecipeState extends State { } @override Widget build(BuildContext context) { + final theme = Provider.of(context); + return Scaffold( body: Stack( children: [ @@ -82,7 +86,7 @@ class _SecondRecipeState extends State { ), Container( padding: const EdgeInsets.all(32.0), - color: Colors.white, + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/lib/Widgets/messaging.dart b/lib/Widgets/messaging.dart deleted file mode 100644 index 5f60b72..0000000 --- a/lib/Widgets/messaging.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:app/models/messages.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter/material.dart'; - -class Messaging extends StatefulWidget { - @override - _MessagingState createState() => _MessagingState(); -} - -class _MessagingState extends State { - final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); - final List messages = []; - - @override - void initState() { - super.initState(); - _firebaseMessaging.configure( - onMessage: (Map message) async { - print("onMessage: $message"); - final notification = message['notification']; - setState(() { - messages.add(Message( - title: notification['title'], body: notification['body'])); - }); - }, - onLaunch: (Map message) async { - print("onLaunch: $message"); - - final notification = message['data']; - setState(() { - messages.add(Message( - title: '${notification['title']}', - body: '${notification['body']}', - )); - }); - }, - onResume: (Map message) async { - print("onResume: $message"); - }, - ); - _firebaseMessaging.requestNotificationPermissions( - const IosNotificationSettings(sound: true, badge: true, alert: true)); - } - - @override - Widget build(BuildContext context) => ListView( - children: messages.map(buildMessage).toList(), - ); - - Widget buildMessage(Message message) => ListTile( - title: Text(message.title), - subtitle: Text(message.body), - ); -} \ No newline at end of file diff --git a/lib/auth/login.dart b/lib/auth/login.dart new file mode 100644 index 0000000..cb8ade5 --- /dev/null +++ b/lib/auth/login.dart @@ -0,0 +1,227 @@ +import 'package:app/main.dart'; +import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/services.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import '../Others/loading.dart'; + + +class Login extends StatefulWidget { + @override + _LoginState createState() => _LoginState(); +} + +class _LoginState extends State { + + TextEditingController _email = TextEditingController(); + + TextEditingController _passowrd = TextEditingController(); + + final _formKey = GlobalKey(); + + bool loading = false; + @override + Widget build(BuildContext context) { + return loading ? Loading() : Scaffold( + resizeToAvoidBottomPadding: false, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Stack( + children: [ + Container( + padding: EdgeInsets.fromLTRB(15.0, 110.0, 0.0, 0.0), + child: Text('Hello', + style: TextStyle( + fontSize: 80.0, fontWeight: FontWeight.bold)), + ), + Container( + padding: EdgeInsets.fromLTRB(16.0, 175.0, 0.0, 0.0), + child: Text('There', + style: TextStyle( + fontSize: 80.0, fontWeight: FontWeight.bold)), + ), + Container( + padding: EdgeInsets.fromLTRB(220.0, 175.0, 0.0, 0.0), + child: Text('.', + style: TextStyle( + fontSize: 80.0, + fontWeight: FontWeight.bold, + color: Colors.blue)), + ) + ], + ), + ), + Form( + key: _formKey, + child: Container( + padding: EdgeInsets.only(top: 35.0, left: 20.0, right: 20.0), + child: Column( + children: [ + TextFormField( + controller: _email, + validator: (value) { + if (value.isEmpty) { + return 'Enter your email'; + } + }, + decoration: InputDecoration( + + labelText: 'EMAIL', + + labelStyle: TextStyle( + fontFamily: 'Montserrat', + fontWeight: FontWeight.bold, + color: Colors.grey), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.blue))), + ), + SizedBox(height: 20.0), + TextFormField( + validator: (value) { + if (value.isEmpty) { + return "Enter your password"; + + } + }, + controller: _passowrd, + decoration: InputDecoration( + labelText: 'PASSWORD', + labelStyle: TextStyle( + fontFamily: 'Montserrat', + fontWeight: FontWeight.bold, + color: Colors.grey), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.blue))), + obscureText: true, + ), + SizedBox(height: 5.0), + Container( + alignment: Alignment(1.0, 0.0), + padding: EdgeInsets.only(top: 15.0, left: 20.0), + child: InkWell( + child: GestureDetector( + onTap: () { + Navigator.pushNamed(context, '/reset_password'); + }, + child: Text( + 'Forgot Password', + style: TextStyle( + color: Colors.blue, + fontWeight: FontWeight.bold, + fontFamily: 'Montserrat', + decoration: TextDecoration.underline), + ), + ), + ), + ), + SizedBox(height: 40.0), + Container( + height: 40.0, + child: Material( + borderRadius: BorderRadius.circular(20.0), + shadowColor: Colors.blue, + color: Colors.blueAccent, + elevation: 7.0, + child: Builder( + builder: (context) => GestureDetector( + onTap: () async{ + if (_formKey.currentState.validate()) { + try { + + var result = await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email.text, password: _passowrd.text); + if (result != null) { + setState(() { + loading = true; + }); + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString('email', result.user.email); + Navigator.pushReplacement(context, + MaterialPageRoute(builder: (BuildContext ctx) => OnBoarding())); + }else{ + setState(() { + loading = false; + }); + } + }on PlatformException catch (e) { + Scaffold.of(context).showSnackBar(SnackBar(content: Text(e.message.toString()))); + } + } + + }, + child: Center( + child: Text( + 'LOGIN', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontFamily: 'Montserrat'), + ), + ), + ), + ), + ), + ), + // SizedBox(height: 20.0), + // Container( + // height: 40.0, + // color: Colors.transparent, + // child: Container( + // decoration: BoxDecoration( + // border: Border.all( + // color: Colors.black, + // style: BorderStyle.solid, + // width: 1.0), + // color: Colors.transparent, + // borderRadius: BorderRadius.circular(20.0)), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // // Center( + // // child: + // // ImageIcon(AssetImage('assets/facebook.png')), + // // ), + // // SizedBox(width: 10.0), + // // Center( + // // child: Text('Log in with facebook', + // // style: TextStyle( + // // fontWeight: FontWeight.bold, + // // fontFamily: 'Montserrat')), + // // ) + // ], + // ), + // ), + // ) + ], + ), + ), + ), + SizedBox(height: 15.0), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'New to Guava ?', + style: TextStyle(fontFamily: 'Montserrat'), + ), + SizedBox(width: 5.0), + InkWell( + onTap: () { + Navigator.of(context).pushNamed('/register'); + }, + child: Text( + 'Register', + style: TextStyle( + color: Colors.blue, + fontFamily: 'Montserrat', + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline), + ), + ) + ], + ) + ], + )); + } +} \ No newline at end of file diff --git a/lib/auth/register.dart b/lib/auth/register.dart new file mode 100644 index 0000000..5149d62 --- /dev/null +++ b/lib/auth/register.dart @@ -0,0 +1,195 @@ +import 'package:app/Others/loading.dart'; +import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/services.dart'; + +class Register extends StatefulWidget { + @override + _RegisterState createState() => _RegisterState(); +} + +class _RegisterState extends State { + + TextEditingController _name = TextEditingController(); + TextEditingController _email = TextEditingController(); + TextEditingController _passowrd = TextEditingController(); + + final _formKey = GlobalKey(); + bool loading = false; + + + @override + Widget build(BuildContext context) { + return loading ? Loading() : Scaffold( + resizeToAvoidBottomPadding: false, + body: Column(crossAxisAlignment: CrossAxisAlignment.start, children: < + Widget>[ + Container( + child: Stack( + children: [ + Container( + padding: EdgeInsets.fromLTRB(15.0, 110.0, 0.0, 0.0), + child: Text( + 'Signup', + style: + TextStyle(fontSize: 80.0, fontWeight: FontWeight.bold), + ), + ), + Container( + padding: EdgeInsets.fromLTRB(260.0, 125.0, 0.0, 0.0), + child: Text( + '.', + style: TextStyle( + fontSize: 80.0, + fontWeight: FontWeight.bold, + color: Colors.blue), + ), + ) + ], + ), + ), + Form( + key: _formKey, + child: Container( + padding: EdgeInsets.only(top: 35.0, left: 20.0, right: 20.0), + child: Column( + children: [ + TextFormField( + controller: _name, + validator: (value) { + if (value.isEmpty) { + return "Enter your name"; + } + }, + decoration: InputDecoration( + labelText: 'NAME ', + labelStyle: TextStyle( + fontFamily: 'Montserrat', + fontWeight: FontWeight.bold, + color: Colors.grey), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.blue))), + ), + SizedBox(height: 10.0), + TextFormField( + controller: _email, + validator: (value) { + if (value.isEmpty) { + return "Enter your email"; + } + }, + decoration: InputDecoration( + labelText: 'EMAIL', + labelStyle: TextStyle( + fontFamily: 'Montserrat', + fontWeight: FontWeight.bold, + color: Colors.grey), + // hintText: 'EMAIL', + // hintStyle: , + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.blue))), + ), + SizedBox(height: 10.0), + TextFormField( + controller: _passowrd, + validator: (value) { + if (value.isEmpty) { + return "Enter your password"; + } + }, + decoration: InputDecoration( + labelText: 'PASSWORD ', + labelStyle: TextStyle( + fontFamily: 'Montserrat', + fontWeight: FontWeight.bold, + color: Colors.grey), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.blue))), + obscureText: true, + ), + SizedBox(height: 50.0), + Container( + height: 40.0, + child: Material( + borderRadius: BorderRadius.circular(20.0), + shadowColor: Colors.blue, + color: Colors.blueAccent, + elevation: 7.0, + child: Builder( + builder: (context) => GestureDetector( + onTap: () async{ + if (_formKey.currentState.validate()) { + try { + var result = await FirebaseAuth.instance.createUserWithEmailAndPassword(email: _email.text, password: _passowrd.text); + if (result != null ) { + setState(() { + loading = true; + }); + Firestore.instance.collection('users').document().setData({ + 'name' : _name.text, + 'email': _email.text, + }); + Navigator.pushNamed(context, '/login'); + } else{ + setState(() { + loading = false; + }); + } + }on PlatformException catch (error) { + Scaffold.of(context).showSnackBar(SnackBar(content: Text(error.message.toString()))); + + } + + } + }, + child: Center( + child: Text( + 'SIGNUP', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontFamily: 'Montserrat'), + ), + ), + ), + ), + ), + ), + SizedBox(height: 20.0), + Container( + height: 40.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.black, + style: BorderStyle.solid, + width: 1.0), + color: Colors.transparent, + borderRadius: BorderRadius.circular(20.0)), + child: InkWell( + onTap: () { + Navigator.of(context).pop(); + }, + child: + + Center( + child: Text('Go Back', + style: TextStyle( + fontWeight: FontWeight.bold, + fontFamily: 'Montserrat')), + ), + + + ), + ), + ), + ], + )), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/auth/reset_password.dart b/lib/auth/reset_password.dart new file mode 100644 index 0000000..56fadc7 --- /dev/null +++ b/lib/auth/reset_password.dart @@ -0,0 +1,123 @@ +import 'package:app/Others/loading.dart'; +import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/services.dart'; + +class Reset_Password extends StatefulWidget { + @override + _Reset_PasswordState createState() => _Reset_PasswordState(); +} + +class _Reset_PasswordState extends State { + + TextEditingController _email = TextEditingController(); + final _formKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Reset Password"), + backgroundColor: Colors.blue[900], + automaticallyImplyLeading: false, + centerTitle: true, + + ), + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Form( + key: _formKey, + child: TextFormField( + validator: (value) { + if (value.isEmpty) { + return "Enter your email"; + } + }, + controller: _email, + decoration: InputDecoration( + + labelText: 'EMAIL', + + labelStyle: TextStyle( + fontFamily: 'Montserrat', + fontWeight: FontWeight.bold, + color: Colors.grey), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.blue))), + ), + ), + SizedBox(height: 40.0), + Container( + height: 40.0, + child: Material( + borderRadius: BorderRadius.circular(20.0), + shadowColor: Colors.blue, + color: Colors.blueAccent, + elevation: 7.0, + child: Builder( + builder: (context) => GestureDetector( + onTap: () async{ + if (_formKey.currentState.validate()) { + try { + await FirebaseAuth.instance.sendPasswordResetEmail(email: _email.text); + } on PlatformException catch (e) { + Scaffold.of(context).showSnackBar(SnackBar(content: Text(e.message.toString()))); + } + + + // var result = await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email.text, password: _passowrd.text); + // if (result != null) { + // Navigator.pushNamed(context, '/onboarding'); + // } + } + }, + child: Center( + child: Text( + 'Reset Password', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontFamily: 'Montserrat'), + ), + ), + ), + ), + ), + ), + SizedBox(height: 20.0), + Container( + height: 40.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.black, + style: BorderStyle.solid, + width: 1.0), + color: Colors.transparent, + borderRadius: BorderRadius.circular(20.0)), + child: InkWell( + onTap: () { + Navigator.of(context).pop(); + }, + child: + + Center( + child: Text('Go Back', + style: TextStyle( + fontWeight: FontWeight.bold, + fontFamily: 'Montserrat')), + ), + + + ), + ), + ), + + ], + ), + + ); + } +} \ No newline at end of file diff --git a/lib/details/patient_detail.dart b/lib/details/patient_detail.dart new file mode 100644 index 0000000..d3f232a --- /dev/null +++ b/lib/details/patient_detail.dart @@ -0,0 +1,258 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/material.dart'; + +class Foods extends StatefulWidget { + + final DocumentSnapshot food; + Foods({this.food}); + + @override + _FoodsState createState() => _FoodsState(); +} + +class _FoodsState extends State { + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Foods'), + backgroundColor: Colors.red, + ), + body: GridView.count( + crossAxisCount: 2, + children: [ + new Container( + child: Card( + elevation: 10.0, + child: Column( + children:[ + Image.network( + '${widget.food.data['food_1_img']}', + fit: BoxFit.cover, + height: 140.0, + width: 200.0, + ), + SizedBox(height: 5.0), + + Padding( + padding: EdgeInsets.only(right: 5.0, left: 5.0), + child: Text( + widget.food.data['food_1'], + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 15.0, + ), + ), + ), + + + ], + + + ), + + ), + ), + new Container( + child: Card( + elevation: 10.0, + child: Column( + children:[ + Image.network( + '${widget.food.data['food_2_img']}', + fit: BoxFit.cover, + height: 140.0, + width: 200.0, + ), + SizedBox(height: 5.0), + + Padding( + padding: EdgeInsets.only(right: 5.0, left: 5.0), + child: Text( + widget.food.data['food_2'], + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 20.0, + ), + ), + ), + ], + ), + ), + ), + new Container( + child: Card( + elevation: 10.0, + child: Column( + children:[ + Image.network( + '${widget.food.data['food_3_img']}', + fit: BoxFit.cover, + height: 140.0, + width: 200.0, + ), + SizedBox(height: 5.0), + + Padding( + padding: EdgeInsets.only(right: 5.0, left: 5.0), + child: Text( + widget.food.data['food_3'], + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 20.0, + ), + ), + ), + ], + ), + ), + ), + new Container( + child: Card( + elevation: 10.0, + child: Column( + children:[ + Image.network( + '${widget.food.data['food_4_img']}', + fit: BoxFit.cover, + height: 140.0, + width: 200.0, + ), + SizedBox(height: 5.0), + + Padding( + padding: EdgeInsets.only(right: 5.0, left: 5.0), + child: Text( + widget.food.data['food_4'], + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 20.0, + ), + ), + ), + ], + ), + ), + ), + new Container( + child: Card( + elevation: 10.0, + child: Column( + children:[ + Image.network( + '${widget.food.data['food_5_img']}', + fit: BoxFit.cover, + height: 140.0, + width: 200.0, + ), + SizedBox(height: 5.0), + + Padding( + padding: EdgeInsets.only(right: 5.0, left: 5.0), + child: Text( + widget.food.data['food_5'], + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 15.0, + ), + ), + ), + ], + ), + ), + ), + new Container( + child: Card( + elevation: 10.0, + child: Column( + children:[ + Image.network( + '${widget.food.data['food_6_img']}', + fit: BoxFit.cover, + height: 140.0, + width: 200.0, + ), + SizedBox(height: 5.0), + + Padding( + padding: EdgeInsets.only(right: 5.0, left: 5.0), + child: Text( + widget.food.data['food_6'], + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 20.0, + ), + ), + ), + ], + ), + ), + ), + new Container( + child: Card( + elevation: 10.0, + child: Column( + children:[ + Image.network( + '${widget.food.data['food_7_img']}', + fit: BoxFit.cover, + height: 140.0, + width: 200.0, + ), + SizedBox(height: 5.0), + + Padding( + padding: EdgeInsets.only(right: 5.0, left: 5.0), + child: Text( + widget.food.data['food_7'], + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 20.0, + ), + ), + ), + ], + ), + ), + ), + new Container( + child: Card( + elevation: 10.0, + child: Column( + children:[ + Image.network( + '${widget.food.data['food_8_img']}', + fit: BoxFit.cover, + height: 140.0, + width: 200.0, + ), + SizedBox(height: 5.0), + + Padding( + padding: EdgeInsets.only(right: 5.0, left: 5.0), + child: Text( + widget.food.data['food_8'], + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 20.0, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 74ed7be..0dd58ed 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,78 +1,130 @@ -// import 'package:app/pages/groceries.dart'; +import 'package:app/auth/login.dart'; +import 'package:app/auth/register.dart'; +import 'package:app/auth/reset_password.dart'; import 'package:app/pages/calendar.dart'; import 'package:app/pages/paitent.dart'; import 'package:app/pages/recipes.dart'; import 'package:app/pages/settings.dart'; -import 'package:app/patients/corona.dart'; +import 'package:app/pages/working_out.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import './pages/calories_calculator.dart'; -import 'package:app/patients/diabetes.dart'; -import 'package:app/patients/flu.dart'; -import 'package:app/patients/heart.dart'; import 'package:curved_navigation_bar/curved_navigation_bar.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'Misc/Terms.dart'; import 'Misc/privacy.dart'; +import 'Others/theme.dart'; +import 'Recipes/eight.dart'; import 'Recipes/five.dart'; import 'Recipes/four.dart'; +import 'Recipes/nine.dart'; import 'Recipes/one.dart'; +import 'Recipes/seven.dart'; import 'Recipes/six.dart'; +import 'Recipes/ten.dart'; import 'Recipes/three.dart'; import 'Recipes/two.dart'; -//import 'Widgets/messaging.dart'; +import 'details/patient_detail.dart'; import 'pages/home.dart'; -import 'package:splashscreen/splashscreen.dart'; import 'package:introduction_screen/introduction_screen.dart'; import 'pages/diet.dart'; -void main() => runApp(MaterialApp( - home: Splash(), - routes: { - '/onboarding': (context) => OnBoarding(), - '/navigate': (context) => Navigation(), - '/settings': (context) => Settings(), - '/terms' : (context) => Terms(), - '/calories_calc' : (context) => Calculator(), - '/calendar' : (context) => Calendar(), - '/privacy' : (context) => Privacy(), - '/heart' : (context) => Heart(), - '/flu' : (context) => Flu(), - '/corona' : (context) => Corona(), - '/diabetes' : (context) => Diabetes(), - '/r1': (context) => Recipe(), - '/r2': (context) => SecondRecipe(), - '/r3': (context) => ThirdRecipe(), - '/r4': (context) => FourRecipe(), - '/r5': (context) => FiveRecipe(), - '/r6': (context) => SixRecipe(), - - - }, -)); - -class Splash extends StatefulWidget { +bool dark = false; +var email; +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + SharedPreferences prefs = await SharedPreferences.getInstance(); + dark = prefs.getBool('dark') ?? false; + email = prefs.getString('email'); + runApp(MyApp()); +} + + class MyApp extends StatefulWidget { @override - _SplashState createState() => _SplashState(); + _MyAppState createState() => _MyAppState(); } -class _SplashState extends State { +class _MyAppState extends State { @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (_) => !dark ? ThemeChanger(ThemeData.light()): ThemeChanger(ThemeData.dark()), + child: new MaterialAppWithTheme(), + ); + + } +} +class MaterialAppWithTheme extends StatefulWidget { + @override + _MaterialAppWithThemeState createState() => _MaterialAppWithThemeState(); +} + +class _MaterialAppWithThemeState extends State { + + @override Widget build(BuildContext context) { - return SplashScreen( - seconds: 15, - backgroundColor: Colors.white10, - image: Image.asset('images/Guava.png'), - loaderColor: Colors.black, - photoSize: 200.0, - navigateAfterSeconds: OnBoarding(), + final theme = Provider.of(context); + + return MaterialApp( + home: email == null ? Login() : Navigation(), + theme: theme.getTheme(), + routes: { + '/onboarding': (context) => OnBoarding(), + '/food': (context) => Foods(), + '/navigate': (context) => Navigation(), + '/settings': (context) => Settings(), + '/login': (context) => Login(), + '/register': (context) => Register(), + '/reset_password': (context) => Reset_Password(), + '/terms' : (context) => Terms(), + '/calories_calc' : (context) => Calculator(), + '/calendar' : (context) => Calendar(), + '/privacy' : (context) => Privacy(), + '/r1': (context) => Recipe(), + '/r2': (context) => SecondRecipe(), + '/r3': (context) => ThirdRecipe(), + '/r4': (context) => FourRecipe(), + '/r5': (context) => FiveRecipe(), + '/r6': (context) => SixRecipe(), + '/r7': (context) => SevenRecipe(), + '/r8': (context) => EightRecipe(), + '/r9': (context) => NineRecipe(), + '/r10': (context) => TenRecipe(), + }, ); } } + +// class Splash extends StatefulWidget { +// @override +// _SplashState createState() => _SplashState(); +// } + +// class _SplashState extends State { + + +// @override + +// Widget build(BuildContext context) { +// return SplashScreen( +// seconds: 15, +// backgroundColor: Colors.white10, +// image: Image.asset('images/Guava.png'), +// loaderColor: Colors.black, +// photoSize: 200.0, +// ); +// } +// } + + class Navigation extends StatefulWidget { @override + _NavigationState createState() => _NavigationState(); } @@ -84,7 +136,8 @@ class _NavigationState extends State { Patient(), Recipes(), Diet(), - // Grocery(), + WorkingOut(), + //Grocery(), // Profile(), ]; @@ -96,6 +149,7 @@ class _NavigationState extends State { } @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( body: Column( children: [ @@ -105,14 +159,14 @@ class _NavigationState extends State { ], ), bottomNavigationBar: CurvedNavigationBar( - color: Colors.blue[800], + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.blue[800], backgroundColor: Colors.transparent, items: [ - Icon(Icons.tag_faces, size: 30, color: Colors.white), - Icon(Icons.add, size: 30, color: Colors.white), - Icon(Icons.fastfood, size: 30, color: Colors.white), - Icon(Icons.filter_vintage, size: 30, color: Colors.white), - // Icon(Icons.person_pin, size: 30, color: Colors.white), + Icon(FontAwesomeIcons.laughBeam, size: 30, color: Colors.white), + Icon(FontAwesomeIcons.heartbeat, size: 30, color: Colors.white), + Icon(FontAwesomeIcons.appleAlt, size: 30, color: Colors.white), + Icon(FontAwesomeIcons.spa, size: 30, color: Colors.white), + Icon(FontAwesomeIcons.dumbbell, size: 30, color: Colors.white), ], onTap: ( int index) { @@ -135,33 +189,40 @@ class OnBoarding extends StatelessWidget { "that will care about your health more than u do", ), PageViewModel( - image: Image.asset('images/health.jpg'), + image: Image.asset('images/onboarding/health2.png'), title: 'Health Treatment', body: "We are giving the top doctors' advices to remain healthy, and " "we will check you daily because your health is our top priority", ), PageViewModel( - image: Image.asset('images/food.jpg'), + image: Image.asset('images/onboarding/cooking.png'), title: 'Healthy Foods', body: "We'll recommend top healthy-recipes that're provided by professional chef-bloggers " "besides it's ingredients and it's cooking technique ", ), PageViewModel( - image: Image.asset('images/sick.jpg'), + image: Image.asset('images/onboarding/medical.png'), title: 'Situations!', body: "Don't Worry! We will make sure that you'll be provided per your health situation and " "we won't stop caring ", ), + PageViewModel( + image: Image.asset('images/onboarding/working_out.png'), + title: 'Working Out', + body: "The perfect mind comes with a healthy body, so we are recommending some excersies for you to make your body remains in its health shape ", + ), ]; } @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( body: IntroductionScreen( done: Text('Get Started', style: TextStyle(color: Colors.black),), - globalBackgroundColor: Colors.white, + globalBackgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[850] : Colors.white, pages: getPages(), - onDone: () => Navigator.pushNamed(context, '/navigate'), + onDone: () => Navigator.pushReplacement(context, + MaterialPageRoute(builder: (BuildContext ctx) => Navigation())), ), ); } diff --git a/lib/models/messages.dart b/lib/models/messages.dart deleted file mode 100644 index 3f23036..0000000 --- a/lib/models/messages.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter/material.dart'; - -@immutable -class Message { - final String title; - final String body; - - const Message({ - @required this.title, - @required this.body, - }); -} \ No newline at end of file diff --git a/lib/pages/calendar.dart b/lib/pages/calendar.dart index 6a52317..1f64615 100644 --- a/lib/pages/calendar.dart +++ b/lib/pages/calendar.dart @@ -7,31 +7,7 @@ class Calendar extends StatefulWidget { } class _CalendarState extends State { - CalendarController _controller; - Map> _events; - @override - void initState() { - super.initState(); - _controller = CalendarController(); - _events = {}; - } - - Map encodeMap(Map map) { - Map newMap = {}; - map.forEach((key, value) { - newMap[key.toString()] = map[key]; - }); - return newMap; - } - - Map decodeMap(Map map) { - Map newMap = {}; - map.forEach((key, value) { - newMap[DateTime.parse(key)] = map[key]; - }); - return newMap; - } @override Widget build(BuildContext context) { return Scaffold( @@ -44,17 +20,6 @@ class _CalendarState extends State { body: SingleChildScrollView( child: Column( children: [ - TableCalendar( - calendarController: _controller, - events: _events, - calendarStyle: CalendarStyle( - todayColor: Colors.greenAccent[400], - selectedColor: Colors.black, - - holidayStyle: TextStyle().copyWith(color: Colors.blue[800]), - - ), - ), ], ), ), diff --git a/lib/pages/calories_calculator.dart b/lib/pages/calories_calculator.dart index 11f2888..fd2f818 100644 --- a/lib/pages/calories_calculator.dart +++ b/lib/pages/calories_calculator.dart @@ -163,6 +163,8 @@ class _CalculatorState extends State { Padding( padding: const EdgeInsets.all(8.0), child: RaisedButton( + color: Colors.greenAccent, + child: Text("Calculate"), onPressed: Calculate, ), diff --git a/lib/pages/diet.dart b/lib/pages/diet.dart index 82a4c98..14d520e 100644 --- a/lib/pages/diet.dart +++ b/lib/pages/diet.dart @@ -1,5 +1,8 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:liquid_progress_indicator/liquid_progress_indicator.dart'; +import 'package:provider/provider.dart'; final Color darkBlue = Color.fromARGB(255, 18, 32, 47); @@ -21,11 +24,12 @@ class _DietState extends State { @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( appBar: AppBar( automaticallyImplyLeading: false, title: Text('Diet'), - backgroundColor: Colors.blue[800], + backgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.blue[800], actions: [ IconButton( icon: Icon(Icons.settings), @@ -37,28 +41,7 @@ class _DietState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - margin: EdgeInsets.only(left: 80), - child: Row( - children: [ - Text( - """ -Hello! -I'm Dr.Camilia - """, - style: - TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: CircleAvatar( - backgroundImage: AssetImage('images/camilia.jpg'), - radius: 45.0, - ), - ), - ], - ), - ), + Row( children: [ Container( @@ -95,20 +78,11 @@ I'm Dr.Camilia children: [ Center( child: IconButton( - icon: Icon(Icons.add_circle), + icon: Icon(FontAwesomeIcons.calculator), onPressed: () => Navigator.pushNamed(context, '/calories_calc'), iconSize: 40.0, color: Colors.greenAccent, splashColor: Colors.transparent, - ), - ), - Center( - child: IconButton( - icon: Icon(Icons.calendar_today), - onPressed: () => Navigator.pushNamed(context, '/calendar'), - iconSize: 40.0, - color: Colors.greenAccent, - splashColor: Colors.transparent, ), ), ], diff --git a/lib/pages/groceries.dart b/lib/pages/groceries.dart index 74cd4fb..e7dabc6 100644 --- a/lib/pages/groceries.dart +++ b/lib/pages/groceries.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; + class Grocery extends StatefulWidget { @override _GroceryState createState() => _GroceryState(); @@ -37,7 +38,8 @@ class _GroceryState extends State fontFamily: 'Varela', fontSize: 42.0, fontWeight: FontWeight.bold, - ),), + ), + ), TabBar( controller: _tabController, indicatorColor: Colors.transparent, diff --git a/lib/pages/home.dart b/lib/pages/home.dart index e6fe207..4da1451 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -1,7 +1,12 @@ +import 'package:app/Others/theme.dart'; import 'package:app/Others/utisl.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../Others/moods.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; + class Home extends StatefulWidget { @override _HomeState createState() => _HomeState(); @@ -9,11 +14,23 @@ class Home extends StatefulWidget { class _HomeState extends State { + final FirebaseMessaging _fcm = FirebaseMessaging(); + + @override + void initState() { + _fcm.getToken().then((token) { + Firestore.instance.collection('tokens').document().setData({ + 'token' : token, + }); + }); + super.initState(); + } @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( - backgroundColor: mainBgColor, + backgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[850] : mainBgColor, body: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.start, @@ -61,7 +78,8 @@ class _HomeState extends State { ); } - Positioned _moodsHolder() { + Widget _moodsHolder() { + final theme = Provider.of(context); return Positioned( bottom: -45, child: Container( @@ -72,7 +90,7 @@ class _HomeState extends State { .width - 40, padding: EdgeInsets.all(10), decoration: BoxDecoration( - color: Colors.white, + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.black : Colors.white, borderRadius: BorderRadius.all(Radius.circular(28)), boxShadow: [ BoxShadow( @@ -86,11 +104,12 @@ class _HomeState extends State { ); } - Container _backBgCover() { + Widget _backBgCover() { + final theme = Provider.of(context); return Container( height: 260.0, decoration: BoxDecoration( - gradient: purpleGradient, + gradient: (theme.getTheme() == ThemeData.dark() ) ? whiteGradient : cyanGradient, borderRadius: BorderRadius.only( bottomLeft: Radius.circular(40), bottomRight: Radius.circular(40), @@ -133,6 +152,7 @@ class _HomeState extends State { Widget _areaSpecialistsText() { + final theme = Provider.of(context); return Container( margin: EdgeInsets.only(top: 20.0, bottom: 20.0), child: Row( @@ -143,7 +163,7 @@ class _HomeState extends State { style: TextStyle( fontSize: 18, fontWeight: FontWeight.w500, - color: Colors.black, + color: (theme.getTheme() == ThemeData.dark() ) ? Colors.white : Colors.black, ), ), ], @@ -471,7 +491,7 @@ class _HomeState extends State { CircleAvatar( backgroundColor: Color(0xFFD9D9D9), backgroundImage: NetworkImage( - 'https://i.pinimg.com/originals/47/03/09/4703093a70ba47001bf2c86319aae091.gif', + 'https://i.pinimg.com/originals/ce/78/ed/ce78ed7de1ec6e604578b61755717cf4.gif', ), radius: 36.0, ), @@ -492,7 +512,7 @@ class _HomeState extends State { ), children: [ TextSpan( - text: 'Move more', + text: 'Working Out', style: TextStyle( color: Colors.black, fontSize: 16, diff --git a/lib/pages/paitent.dart b/lib/pages/paitent.dart index 063caf2..8c17fb1 100644 --- a/lib/pages/paitent.dart +++ b/lib/pages/paitent.dart @@ -1,374 +1,128 @@ -import 'package:app/Others/utisl.dart'; +import 'package:app/Others/theme.dart'; +import 'package:app/details/patient_detail.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; - +import 'package:provider/provider.dart'; class Patient extends StatefulWidget { @override _PatientState createState() => _PatientState(); } class _PatientState extends State { - + Future getPosts() async{ + var firestore = Firestore.instance; + QuerySnapshot qn = await firestore.collection('patients').getDocuments(); + return qn.documents; + } + navigateToDetail(DocumentSnapshot food){ + Navigator.push(context, MaterialPageRoute(builder: (context) => Foods(food: food))); + } @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( appBar: AppBar( - automaticallyImplyLeading: false, - backgroundColor: Colors.blue[800], - title: Text('Patient'), + title: Text("Patient"), + backgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.blue[800], actions: [ - IconButton(icon: Icon(Icons.settings), - onPressed: () => Navigator.pushNamed(context, '/settings')), + IconButton( + icon: Icon(Icons.settings), + onPressed: () => Navigator.pushNamed(context, '/settings') + ), ], - ), - backgroundColor: mainBgColor, - body: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 50.0, - ), - SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Padding( - padding: EdgeInsets.only(top: 1.0,left: 5.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, + body: Padding( + padding: const EdgeInsets.all(10.0), + child: FutureBuilder( + future: getPosts(), + builder: (_,snapshot){ + if (snapshot.connectionState == ConnectionState.waiting) { + return Center(child: Text("Loading"),); + } else{ + return ListView.builder( + itemCount: snapshot.data.length, + itemBuilder: (_,index){ + return GestureDetector( + onTap: () => navigateToDetail(snapshot.data[index]), + child: Container( + padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), + margin: EdgeInsets.only( + bottom: 5.0, + top: 15.0, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.0), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.2), + spreadRadius: 1.0, + blurRadius: 6.0, + ), + ]), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - _firstpatient(), - _secondadvice(), - _thirdadvice(), - _fourthadvice(), - - //_specialistsCardInfo(), - - ], - ), - ), - - ), - ], - ), - ), - ); - } - - - - Widget _firstpatient() { - return Container( - padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), - margin: EdgeInsets.only( - bottom: 20.0, - ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12.0), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.2), - spreadRadius: 1.0, - blurRadius: 6.0, - ), - ]), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureDetector( - onTap: () { - Navigator.pushNamed(context, '/heart'); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CircleAvatar( - backgroundColor: Color(0xFFD9D9D9), - backgroundImage: NetworkImage( - 'https://image.freepik.com/free-vector/vector-realistic-human-heart_77430-10.jpg' - ), - radius: 36.0, - ), - SizedBox( - width: 10.0, - ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - RichText( - text: TextSpan( - style: TextStyle( - color: Colors.purple, - fontSize: 12, - fontWeight: FontWeight.w400, - height: 1.3, - ), - children: [ - TextSpan( - text: 'Heart ', - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w600, + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + backgroundColor: Color(0xFFD9D9D9), + backgroundImage: NetworkImage('${snapshot.data[index].data['image']}'), + radius: 36.0, ), - ), - ], - ), - ), - SizedBox( - height: 6.0, - ), - - ], - - ), - - ], - - ), - ), - ], - ), - ); - } - - Widget _secondadvice() { - return Container( - padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), - margin: EdgeInsets.only( - bottom: 20.0, - ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12.0), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.2), - spreadRadius: 1.0, - blurRadius: 6.0, - ), - ]), - child: GestureDetector( - onTap: () { - Navigator.pushNamed(context, '/flu'); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CircleAvatar( - backgroundColor: Color(0xFFD9D9D9), - backgroundImage: NetworkImage( - 'https://image.freepik.com/free-vector/person-with-cold-concept_23-2148406700.jpg' - ), - radius: 36.0, - ), - SizedBox( - width: 10.0, - ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - RichText( - text: TextSpan( - style: TextStyle( - color: Colors.purple, - fontSize: 12, - fontWeight: FontWeight.w400, - height: 1.3, - ), - children: [ - TextSpan( - text: 'Flu ', - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w600, + SizedBox( + width: 10.0, ), - ), - ], - ), - ), - SizedBox( - height: 6.0, - ), - - ], + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.purple, + fontSize: 12, + fontWeight: FontWeight.w400, + height: 1.3, + ), + children: [ + TextSpan( + text: snapshot.data[index].data['name'], + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + SizedBox( + height: 6.0, + ), + + ], - ), + ), - ], + ], - ), - ], - ), - ), - ); - } - - Widget _thirdadvice() { - return Container( - padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), - margin: EdgeInsets.only( - bottom: 20.0, - ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12.0), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.2), - spreadRadius: 1.0, - blurRadius: 6.0, - ), - ]), - child: GestureDetector( - onTap: () { - Navigator.pushNamed(context, '/corona'); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CircleAvatar( - backgroundColor: Color(0xFFD9D9D9), - backgroundImage: NetworkImage( - 'https://i.pinimg.com/736x/a1/9d/c2/a19dc2a04f0de08e11c6ec5dd6b9f9b9.jpg', - ), - radius: 36.0, - ), - SizedBox( - width: 10.0, - ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - RichText( - text: TextSpan( - style: TextStyle( - color: Colors.purple, - fontSize: 12, - fontWeight: FontWeight.w400, - height: 1.3, ), - children: [ - TextSpan( - text: 'Corona', - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - ], - ), - ), - SizedBox( - height: 6.0, + ], ), + ), + ); + }); - ], - - ), - - ], - - ), - ], - ), + } + },), ), ); } +} - Widget _fourthadvice() { - return Container( - padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), - margin: EdgeInsets.only( - bottom: 20.0, - ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12.0), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.2), - spreadRadius: 1.0, - blurRadius: 6.0, - ), - ]), - child: GestureDetector( - onTap: () { - Navigator.pushNamed(context, '/diabetes'); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CircleAvatar( - backgroundColor: Color(0xFFD9D9D9), - backgroundImage: NetworkImage( - 'https://i2.wp.com/www.additudemag.com/wp-content/uploads/2020/04/The-ADHD-Diabetes-Link_1920x1080.jpg?resize=1280%2C720px&ssl=1', - ), - radius: 36.0, - ), - SizedBox( - width: 10.0, - ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - RichText( - text: TextSpan( - style: TextStyle( - color: Colors.purple, - fontSize: 12, - fontWeight: FontWeight.w400, - height: 1.3, - ), - children: [ - TextSpan( - text: 'Diabetes', - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - ], - ), - ), - SizedBox( - height: 6.0, - ), - - ], - - ), - - ], - ), - ], - ), - ), - ); - } -} \ No newline at end of file diff --git a/lib/pages/recipes.dart b/lib/pages/recipes.dart index d62a1aa..25d8bb8 100644 --- a/lib/pages/recipes.dart +++ b/lib/pages/recipes.dart @@ -1,5 +1,7 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; class Recipes extends StatefulWidget { @@ -11,10 +13,11 @@ class _RecipesState extends State { @override Widget build(BuildContext context) { + final theme = Provider.of(context); return Scaffold( appBar: AppBar( automaticallyImplyLeading: false, - backgroundColor: Colors.blue[800], + backgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.blue[800], title: Text('Recipes'), actions: [ IconButton(icon: Icon(Icons.settings), @@ -57,7 +60,7 @@ class _RecipesState extends State { child: Image( fit: BoxFit.contain, alignment: Alignment.topRight, - image: AssetImage('images/chiken.jpg'), + image: AssetImage('images/recipes/chiken.jpg'), ), ), ), @@ -139,7 +142,7 @@ class _RecipesState extends State { fit: BoxFit.contain, alignment: Alignment.topRight, image: AssetImage( - 'images/yogurt-cake.jpeg'), + 'images/recipes/yogurt-cake.jpeg'), ), ), ), @@ -178,7 +181,7 @@ class _RecipesState extends State { child: Image( fit: BoxFit.contain, alignment: Alignment.topRight, - image: AssetImage("images/beef.jpeg"), + image: AssetImage("images/recipes/beef.jpeg"), ),), ), ],) @@ -218,7 +221,7 @@ class _RecipesState extends State { fit: BoxFit.contain, alignment: Alignment.topRight, image: AssetImage( - "images/ree.jpeg"), + "images/recipes/ree.jpeg"), ),), ), ],) @@ -258,7 +261,7 @@ class _RecipesState extends State { fit: BoxFit.contain, alignment: Alignment.topRight, image: AssetImage( - "images/nutty-chicken-sate-strips.jpg"), + "images/recipes/nutty-chicken-sate-strips.jpg"), ),), ), ],) @@ -267,6 +270,46 @@ class _RecipesState extends State { ), ), ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Container( + child: new FittedBox( + + child: GestureDetector( + onTap: () => Navigator.pushNamed(context, '/r7'), + child: Material( + color: Colors.white, + elevation: 14.0, + borderRadius: BorderRadius.circular(24.0), + shadowColor: Color(0x802196F3), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Padding( + padding: const EdgeInsets.only(left: 16.0), + child: myDetailsContainer7(), + ), + ), + + Container( + width: 250, + height: 180, + child: ClipRRect( + borderRadius: new BorderRadius.circular(24.0), + child: Image( + fit: BoxFit.contain, + alignment: Alignment.topRight, + image: NetworkImage('https://food.fnr.sndimg.com/content/dam/images/food/fullset/2011/11/4/1/CCHAP402_Sloppy-Joes_s4x3.jpg.rend.hgtvcom.966.725.suffix/1382540648899.jpeg'), + ), + ) + ), + ],) + ), + ), + ), + ), + ), ], @@ -510,3 +553,48 @@ Widget myDetailsContainer6() { ], ); } +Widget myDetailsContainer7() { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Container(child: Text("Sloppy Joes", + style: TextStyle(color: Colors.blueAccent, + fontSize: 24.0, + fontWeight: FontWeight.bold),)), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container(child: Text("5.0", + style: TextStyle(color: Colors.black54, fontSize: 18.0,),)), + Container(child: Icon( + FontAwesomeIcons.solidStar, color: Colors.amber, + size: 15.0,),), + Container(child: Icon( + FontAwesomeIcons.solidStar, color: Colors.amber, + size: 15.0,),), + Container(child: Icon( + FontAwesomeIcons.solidStar, color: Colors.amber, + size: 15.0,),), + Container(child: Icon( + FontAwesomeIcons.solidStar, color: Colors.amber, + size: 15.0,),), + Container(child: Icon( + FontAwesomeIcons.solidStar, color: Colors.amber, + size: 15.0,),), + Container(child: Text(" (89)", + style: TextStyle(color: Colors.black54, fontSize: 18.0,),)), + ],)), + ), + Container(child: Text("Ellie Krieger", + style: TextStyle(color: Colors.black54, + fontSize: 18.0, + fontWeight: FontWeight.bold),)), + ], + ); +} \ No newline at end of file diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 224487f..286d6ac 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -1,5 +1,10 @@ +import 'package:app/Others/theme.dart'; import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; import 'package:settings_ui/settings_ui.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:shared_preferences/shared_preferences.dart'; const url = "https://flutter.io"; @@ -12,74 +17,127 @@ class Settings extends StatefulWidget { } class _SettingsState extends State { - // bool _value = false; + bool value = false; String _version = '5.0'; + _video() async { + const url = 'https://mazenomar.pythonanywhere.com/'; + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } +bool check; + checkNight() async{ + SharedPreferences prefs = await SharedPreferences.getInstance(); + check = prefs.getBool('dark'); + print(check); + if(check){ + setState(() { + value = true; + }); + } else{ + setState(() { + value = false; + }); + } + } + @override + void initState() { + checkNight(); + super.initState(); + } + @override Widget build(BuildContext context) { + ThemeChanger _themeChanger = Provider.of(context); return Scaffold( appBar: AppBar( backgroundColor: Colors.black, title: Text('Settings'), ), -// bottomNavigationBar: BottomNavigationBar( -// currentIndex: _currentindex, -// items: [ -// BottomNavigationBarItem(icon: Icon(Icons.tag_faces), title: Text("")), -// BottomNavigationBarItem(icon: Icon(Icons.fastfood), title: Text("")), -// BottomNavigationBarItem(icon: Icon(Icons.add_shopping_cart), title: Text("")), -// ], -// onTap: (int index) { -// setState(() { -// _currentindex = index; -// }); -// }, -// ), - body: SettingsList( - sections: [ - SettingsSection( - title: 'Section', - tiles: [ - SettingsTile( - title: 'Language', - subtitle: 'English', - leading: Icon(Icons.language), - onTap: () {}, - ), - SettingsTile( - title: 'Permissions', - leading: Icon(Icons.lock_open), - onTap: () {}, - ), - ], - ), - SettingsSection( - title: 'Misc', - tiles: [ - SettingsTile( - title: 'Terms and Conditions', - leading: Icon(Icons.assignment), - onTap: () => Navigator.pushNamed(context, '/terms'), - ), - SettingsTile( - title: 'Privacy Policy', - leading: Icon(Icons.description), - onTap: () => Navigator.pushNamed(context, '/privacy'), - ), - ], - ), - SettingsSection( - title: 'About', - tiles: [ - SettingsTile( - title: 'Version', - subtitle: _version, - leading: Icon(Icons.info), - onTap: () {}, - ), - ], - ), - ], + body: Container( + child: SettingsList( + sections: [ + SettingsSection( + title: 'Section', + tiles: [ + SettingsTile( + title: 'Language', + subtitle: 'English', + leading: Icon(Icons.language), + onTap: () {}, + ), + SettingsTile( + title: 'Permissions', + leading: Icon(Icons.lock_open), + onTap: () {}, + ), + ], + ), + SettingsSection( + title: 'Theme', + tiles: [ + SettingsTile.switchTile( + title: value ? 'Day' : 'Night', + leading: value ? Icon(FontAwesomeIcons.solidSun) : Icon(FontAwesomeIcons.moon), + switchValue: value, + onToggle: (val) async{ + setState(() { + value = !value; + }); + if (value) { + _themeChanger.setTheme(ThemeData.dark()); + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setBool('dark', true); + } else { + _themeChanger.setTheme(ThemeData.light()); + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setBool('dark', false); + } + }, + ), + ], + ), + SettingsSection( + title: 'Misc', + tiles: [ + SettingsTile( + title: 'Terms and Conditions', + leading: Icon(Icons.assignment), + onTap: () => Navigator.pushNamed(context, '/terms'), + ), + SettingsTile( + title: 'Privacy Policy', + leading: Icon(Icons.description), + onTap: () => Navigator.pushNamed(context, '/privacy'), + ), + ], + ), + SettingsSection( + title: 'About', + tiles: [ + SettingsTile( + title: 'Version', + subtitle: _version, + leading: Icon(Icons.info), + onTap: () {}, + ), + ], + ), + SettingsSection( + title: 'Owner', + tiles: [ + SettingsTile( + title: 'Mazen Omar', + leading: Icon(Icons.person), + onTap: _video, + ), + ], + ), + ], + ), ), ); } diff --git a/lib/pages/working_out.dart b/lib/pages/working_out.dart new file mode 100644 index 0000000..12c9d46 --- /dev/null +++ b/lib/pages/working_out.dart @@ -0,0 +1,404 @@ +import 'package:app/Others/theme.dart'; +import 'package:app/auth/login.dart'; +import 'package:app/pages/settings.dart'; +import 'package:flutter/material.dart'; +import 'package:liquid_progress_indicator/liquid_progress_indicator.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class WorkingOut extends StatefulWidget { + @override + _WorkingOutState createState() => _WorkingOutState(); +} + +class _WorkingOutState extends State { + @override + Widget build(BuildContext context) { + final theme = Provider.of(context); + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + backgroundColor: (theme.getTheme() == ThemeData.dark()) ? Colors + .grey[900] : Colors.blue[800], + title: Text('Working Out'), + actions: [ + IconButton(icon: Icon(Icons.settings), + onPressed: () => Navigator.pushNamed(context, '/settings')), + ], + ), + body: SingleChildScrollView( + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Image( + image: AssetImage('images/working_out.gif'), + width: 200.0, + ), + ), + Container( + child: Text("10 min workout for each per day"), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), + margin: EdgeInsets.only( + bottom: 5.0, + top: 15.0, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.0), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.2), + spreadRadius: 1.0, + blurRadius: 6.0, + ), + ]), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + backgroundColor: Color(0xFFD9D9D9), + backgroundImage: NetworkImage( + 'https://cdn.dribbble.com/users/1532610/screenshots/3906806/___.gif'), + radius: 36.0, + ), + SizedBox( + width: 10.0, + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.purple, + fontSize: 12, + fontWeight: FontWeight.w400, + height: 1.3, + ), + children: [ + TextSpan( + text: 'Push up', + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + SizedBox( + height: 6.0, + ), + + ], + + ), + + ], + + ), + ], + ), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), + margin: EdgeInsets.only( + bottom: 5.0, + top: 15.0, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.0), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.2), + spreadRadius: 1.0, + blurRadius: 6.0, + ), + ]), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + backgroundColor: Color(0xFFD9D9D9), + backgroundImage: NetworkImage( + 'https://hips.hearstapps.com/ame-prod-menshealth-assets.s3.amazonaws.com/main/assets/bodyweight-squat.gif?resize=480:*'), + radius: 36.0, + ), + SizedBox( + width: 10.0, + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.purple, + fontSize: 12, + fontWeight: FontWeight.w400, + height: 1.3, + ), + children: [ + TextSpan( + text: 'Standard Squat', + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + SizedBox( + height: 6.0, + ), + + ], + + ), + + ], + + ), + ], + ), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), + margin: EdgeInsets.only( + bottom: 5.0, + top: 15.0, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.0), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.2), + spreadRadius: 1.0, + blurRadius: 6.0, + ), + ]), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + backgroundColor: Color(0xFFD9D9D9), + backgroundImage: NetworkImage( + 'https://i.pinimg.com/originals/34/cb/99/34cb992c8c0c57e896a22c1036a7c038.gif'), + radius: 36.0, + ), + SizedBox( + width: 10.0, + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.purple, + fontSize: 12, + fontWeight: FontWeight.w400, + height: 1.3, + ), + children: [ + TextSpan( + text: 'Jumping Jacks', + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + SizedBox( + height: 6.0, + ), + + ], + + ), + + ], + + ), + ], + ), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), + margin: EdgeInsets.only( + bottom: 5.0, + top: 15.0, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.0), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.2), + spreadRadius: 1.0, + blurRadius: 6.0, + ), + ]), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + backgroundColor: Color(0xFFD9D9D9), + backgroundImage: NetworkImage( + 'https://media1.tenor.com/images/25f33bf7a836e92d9ac08cd7cef017c2/tenor.gif?itemid=16591507'), + radius: 36.0, + ), + SizedBox( + width: 10.0, + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.purple, + fontSize: 12, + fontWeight: FontWeight.w400, + height: 1.3, + ), + children: [ + TextSpan( + text: 'Hip Bridge', + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + SizedBox( + height: 6.0, + ), + + ], + + ), + + ], + + ), + ], + ), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0), + margin: EdgeInsets.only( + bottom: 5.0, + top: 15.0, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.0), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.2), + spreadRadius: 1.0, + blurRadius: 6.0, + ), + ]), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + backgroundColor: Color(0xFFD9D9D9), + backgroundImage: NetworkImage( + 'https://media0.giphy.com/media/2UqZvQq4p9DjTBDVRc/giphy.gif'), + radius: 36.0, + ), + SizedBox( + width: 10.0, + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.purple, + fontSize: 12, + fontWeight: FontWeight.w400, + height: 1.3, + ), + children: [ + TextSpan( + text: 'Plank', + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + SizedBox( + height: 6.0, + ), + + ], + + ), + + ], + + ), + ], + ), + ), + + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/patients/corona.dart b/lib/patients/corona.dart deleted file mode 100644 index 3ea9c28..0000000 --- a/lib/patients/corona.dart +++ /dev/null @@ -1,255 +0,0 @@ -import 'package:flutter/material.dart'; -// import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -class Corona extends StatefulWidget { - - @override - _CoronaState createState() => _CoronaState(); -} - -class _CoronaState extends State { - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: Colors.green[600], - title: Text('Corona'), - ), - body: GridView.count( - crossAxisCount: 2, - children: [ - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://edge.bonnieplants.com/www/uploads/20180920004011/red-bell-pepper.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Red bell peppers", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.green[600], - fontSize: 20.0, - ), - ), - ), - - - ], - - - ), - - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://static.independent.co.uk/s3fs-public/thumbnails/image/2020/05/20/19/istock-1143163513.jpg?w968h681', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Strawberries", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.green[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.jessicagavin.com/wp-content/uploads/2019/09/types-of-garlic-1-1200.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Garlic", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.green[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.seriouseats.com/2019/06/20190614-yogurt-vicky-wasik-8-1500x1125.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Yogurt", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.green[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://i.ytimg.com/vi/zoUz8d_e-Ww/maxresdefault.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Chickpeas", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.green[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://snaped.fns.usda.gov/sites/default/files/styles/crop_ratio_7_5/public/seasonal-produce/2018-05/mushrooms.jpg?h=b754914e&itok=Kldbq8Du', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Mushrooms", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.green[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.jessicagavin.com/wp-content/uploads/2019/05/how-to-cook-broccoli-20-1200.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Broccoli", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.green[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://sc01.alicdn.com/kf/HTB1HCEMq5OYBuNjSsD4q6zSkFXaF.jpg_350x350.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Sunflower seeds", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.green[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/patients/diabetes.dart b/lib/patients/diabetes.dart deleted file mode 100644 index dafe9b8..0000000 --- a/lib/patients/diabetes.dart +++ /dev/null @@ -1,255 +0,0 @@ -import 'package:flutter/material.dart'; -// import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -class Diabetes extends StatefulWidget { - - @override - _DiabetesState createState() => _DiabetesState(); -} - -class _DiabetesState extends State { - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: Colors.pink[600], - title: Text('Diabetes'), - ), - body: GridView.count( - crossAxisCount: 2, - children: [ - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/articles/health_tools/fatty_fish_that_are_high_in_omega_3s_slideshow/493ss_thinkstock_rf_atlantic_mackerel.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Fatty Fish", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.pink[600], - fontSize: 20.0, - ), - ), - ), - - - ], - - - ), - - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://miro.medium.com/max/7160/0*Qg-sACv60IYe7Iav.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Leafy Greens", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.pink[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://i0.wp.com/images-prod.healthline.com/hlcmsresource/images/AN_images/scoop-of-cinnamon-1296x728.jpg?w=1155&h=1528', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Cinnamon", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.pink[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.simplyrecipes.com/wp-content/uploads/2014/07/hard-boiled-eggs-horiz-800.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Eggs", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.pink[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://5.imimg.com/data5/WD/HY/MY-4195389/chia-seeds-500x500.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Chia Seeds", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.pink[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://i0.wp.com/cdn-prod.medicalnewstoday.com/content/images/articles/327/327455/turmeric-root-and-powder.jpg?w=1155&h=1675', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Turmeric", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.pink[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.seriouseats.com/2019/06/20190614-yogurt-vicky-wasik-8-1500x1125.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Yogurt", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.pink[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://images-na.ssl-images-amazon.com/images/I/71QAe7Xq-yL._SL1117_.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Nuts", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.pink[600], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/patients/flu.dart b/lib/patients/flu.dart deleted file mode 100644 index e9db3c7..0000000 --- a/lib/patients/flu.dart +++ /dev/null @@ -1,255 +0,0 @@ -import 'package:flutter/material.dart'; -// import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -class Flu extends StatefulWidget { - - @override - _FluState createState() => _FluState(); -} - -class _FluState extends State { - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: Colors.purple[900], - title: Text('Flu'), - ), - body: GridView.count( - crossAxisCount: 2, - children: [ - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://food.fnr.sndimg.com/content/dam/images/food/fullset/2019/9/10/0/FNK_Chicken-Broth_H_s4x3.jpg.rend.hgtvcom.826.620.suffix/1568395014401.jpeg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Broth", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.purple[900], - fontSize: 20.0, - ), - ), - ), - - - ], - - - ), - - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://i.ytimg.com/vi/o91gT73mQhg/maxresdefault.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Chicken Soup", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.purple[900], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.jessicagavin.com/wp-content/uploads/2019/09/types-of-garlic-1-1200.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Garlic", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.purple[900], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.seriouseats.com/2019/06/20190614-yogurt-vicky-wasik-8-1500x1125.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Yogurt", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.purple[900], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/article_thumbnails/slideshows/foods_with_vitamin_c_besides_oranges_slideshow/1800x1200_foods_with_vitamin_c_besides_oranges_slideshow.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Vit. C Fruits", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.purple[900], - fontSize: 15.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://miro.medium.com/max/7160/0*Qg-sACv60IYe7Iav.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Leafy greens", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.purple[900], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.jessicagavin.com/wp-content/uploads/2019/05/how-to-cook-broccoli-20-1200.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Broccoli", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.purple[900], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.eatingbirdfood.com/wp-content/uploads/2019/04/egg-white-protein-oatmeal-4.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Oatmeal", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.purple[900], - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/patients/heart.dart b/lib/patients/heart.dart deleted file mode 100644 index 1524075..0000000 --- a/lib/patients/heart.dart +++ /dev/null @@ -1,255 +0,0 @@ -import 'package:flutter/material.dart'; -// import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -class Heart extends StatefulWidget { - - @override - _HeartState createState() => _HeartState(); -} - -class _HeartState extends State { - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: Colors.red[900], - title: Text('Heart'), - ), - body: GridView.count( - crossAxisCount: 2, - children: [ - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://images-prod.healthline.com/hlcmsresource/images/AN_images/berry-almond-salad-1296x728.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Leafy Green Vegetables", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.red, - fontSize: 15.0, - ), - ), - ), - - - ], - - - ), - - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://static01.nyt.com/images/2020/03/17/well/askwell-wholegrains/askwell-wholegrains-mediumSquareAt3X.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Whole Grains", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.red, - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://images.unsplash.com/photo-1474480109237-15a7ca8f0685?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1053&q=80', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Berries", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.red, - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.verywellhealth.com/thmb/dFmKvt9jP4QzC1ddY9U4UbvP8mw=/2077x1443/filters:fill(87E3EF,1)/avocadosGettyImages-961101662-5b9eda1bc9e77c0050a7fafa.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Avocados", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.red, - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://omegaquant.com/wp-content/uploads/2019/04/omega-3s-in-fish-and-fish-oil.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Fatty Fish and Fish Oil", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.red, - fontSize: 15.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.healthline.com/hlcmsresource/images/AN_images/AN378-Walnuts-Hands-732x549-thumb.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Walnuts", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.red, - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://www.gracefullittlehoneybee.com/wp-content/uploads/2014/09/Slow-Cooker-Pinto-Beans-3.jpg', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Beans", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.red, - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - new Container( - child: Card( - elevation: 10.0, - child: Column( - children:[ - Image.network( - 'https://i1.wp.com/www.eatthis.com/wp-content/uploads/2017/10/dark-chocolate-bar-squares.jpg?fit=1024%2C750&ssl=1', - fit: BoxFit.cover, - height: 140.0, - width: 200.0, - ), - SizedBox(height: 5.0), - - Padding( - padding: EdgeInsets.only(right: 5.0, left: 5.0), - child: Text( - "Dark Chocolates", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.red, - fontSize: 20.0, - ), - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} diff --git a/pubspec.lock b/pubspec.lock index 293ac46..717ff18 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -50,6 +50,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0+1" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.7" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1+2" collection: dependency: transitive description: @@ -98,14 +119,63 @@ packages: name: curved_navigation_bar url: "https://pub.dartlang.org" source: hosted - version: "0.3.2" + version: "0.3.3" dots_indicator: dependency: transitive description: name: dots_indicator url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" + firebase: + dependency: transitive + description: + name: firebase + url: "https://pub.dartlang.org" + source: hosted + version: "7.3.0" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.1" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.8" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3+1" + firebase_core: + dependency: transitive + description: + name: firebase_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.5" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1+2" firebase_messaging: dependency: "direct main" description: @@ -118,20 +188,20 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_facebook_login: + flutter_html: dependency: "direct main" description: - name: flutter_facebook_login + name: flutter_html url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" - flutter_html: + version: "1.0.0" + flutter_spinkit: dependency: "direct main" description: - name: flutter_html + name: flutter_spinkit url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "4.1.2+1" flutter_svg: dependency: transitive description: @@ -163,6 +233,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.14.0+3" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.1" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.4" image: dependency: transitive description: @@ -183,14 +267,14 @@ packages: name: introduction_screen url: "https://pub.dartlang.org" source: hosted - version: "1.0.8" + version: "1.0.9" js: dependency: transitive description: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.1+1" + version: "0.6.2" liquid_progress_indicator: dependency: "direct main" description: @@ -212,6 +296,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.8" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" open_iconic_flutter: dependency: transitive description: @@ -240,6 +331,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.4" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.0" petitparser: dependency: transitive description: @@ -254,6 +352,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.2.1" + platform_detect: + dependency: transitive + description: + name: platform_detect + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" plugin_platform_interface: dependency: transitive description: @@ -261,6 +366,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "4.3.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.4" quiver: dependency: transitive description: @@ -288,14 +407,14 @@ packages: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "0.5.7+2" + version: "0.5.7+3" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "0.0.1+9" + version: "0.0.1+10" shared_preferences_platform_interface: dependency: transitive description: @@ -310,13 +429,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.2+7" - simple_animations: - dependency: "direct main" - description: - name: simple_animations - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.12" simple_gesture_detector: dependency: transitive description: @@ -398,14 +510,14 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "5.4.7" + version: "5.4.11" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "0.0.1+5" + version: "0.0.1+7" url_launcher_platform_interface: dependency: transitive description: @@ -419,7 +531,7 @@ packages: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "0.1.1+5" + version: "0.1.2" vector_math: dependency: transitive description: @@ -433,7 +545,7 @@ packages: name: video_player url: "https://pub.dartlang.org" source: hosted - version: "0.10.11+1" + version: "0.10.11+2" video_player_platform_interface: dependency: transitive description: @@ -447,7 +559,7 @@ packages: name: video_player_web url: "https://pub.dartlang.org" source: hosted - version: "0.1.3+1" + version: "0.1.3+2" wakelock: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 07b4d34..c8885c7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: A new Flutter application. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0+1 +version: 5.0.0+1 environment: sdk: ">=2.1.0 <3.0.0" @@ -26,16 +26,18 @@ dependencies: settings_ui: ^0.2.0 flutter_html: ^1.0.0 firebase_messaging: ^6.0.16 - simple_animations: ^1.3.3 font_awesome_flutter: ^8.8.1 url_launcher: ^5.4.7 introduction_screen: ^1.0.8 cupertino_icons: ^0.1.3 - shared_preferences: ^0.5.7+2 - flutter_facebook_login: ^3.0.0 liquid_progress_indicator: ^0.3.2 table_calendar: ^2.2.3 - + firebase_auth: ^0.16.1 + cloud_firestore: ^0.13.7 + shared_preferences: ^0.5.7+3 + flutter_spinkit: "^4.1.2" + provider: ^4.3.0 + dev_dependencies: flutter_test: sdk: flutter @@ -56,6 +58,10 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - images/ + - images/onboarding/ + - images/recipes/ + + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware.