From bdf1c994db41f0b8d58518cea583ac1ad0b110d2 Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Wed, 5 Oct 2022 18:03:52 +0200 Subject: [PATCH] Add others screens + init sync --- ComApp/README.md | 5 +- ComApp/android/app/build.gradle | 2 + ComApp/package-lock.json | 374 +++++++++++++++++++ ComApp/package.json | 3 + ComApp/src/App.js | 40 +- ComApp/src/App/Controllers/SyncController.js | 59 +++ ComApp/src/App/Models/Setting.js | 6 + ComApp/src/App/Models/User.js | 64 ++++ ComApp/src/App/Store/Reducers/AppReducer.js | 4 +- ComApp/src/App/Views/LoginScreen.js | 54 +++ ComApp/src/App/Views/SyncScreen.js | 101 +++++ ComApp/src/Database.js | 22 +- ComApp/src/Resources/Styles/LoginStyle.js | 25 ++ ComApp/src/Resources/Styles/SyncStyle.js | 14 + ComApp/yarn.lock | 135 ++++++- 15 files changed, 896 insertions(+), 12 deletions(-) create mode 100644 ComApp/src/App/Controllers/SyncController.js create mode 100644 ComApp/src/App/Models/User.js create mode 100644 ComApp/src/App/Views/LoginScreen.js create mode 100644 ComApp/src/App/Views/SyncScreen.js create mode 100644 ComApp/src/Resources/Styles/LoginStyle.js create mode 100644 ComApp/src/Resources/Styles/SyncStyle.js diff --git a/ComApp/README.md b/ComApp/README.md index 73f187f..6d315db 100644 --- a/ComApp/README.md +++ b/ComApp/README.md @@ -11,4 +11,7 @@ - @react-navigation/native - react-native-screens - react-native-safe-area-context -- @react-navigation/native-stack \ No newline at end of file +- @react-navigation/native-stack +- react-native-vector-icons +- react-native-progress +- react-native-svg \ No newline at end of file diff --git a/ComApp/android/app/build.gradle b/ComApp/android/app/build.gradle index a09bf6b..c9e30a4 100644 --- a/ComApp/android/app/build.gradle +++ b/ComApp/android/app/build.gradle @@ -311,3 +311,5 @@ def isNewArchitectureEnabled() { // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true` return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true" } + +apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" \ No newline at end of file diff --git a/ComApp/package-lock.json b/ComApp/package-lock.json index 5255f49..6cde5cd 100644 --- a/ComApp/package-lock.json +++ b/ComApp/package-lock.json @@ -19,8 +19,11 @@ "npm": "^8.19.2", "react": "18.1.0", "react-native": "0.70.1", + "react-native-progress": "^5.0.0", "react-native-safe-area-context": "^4.4.1", "react-native-screens": "^3.18.0", + "react-native-svg": "^13.2.0", + "react-native-vector-icons": "^9.2.0", "react-redux": "^8.0.4", "realm": "^11.0.0-rc.2", "redux": "^4.2.0" @@ -5752,6 +5755,11 @@ "node": ">=0.6" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/bplist-creator": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", @@ -6563,6 +6571,44 @@ "node": ">=8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -6969,6 +7015,30 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -6992,6 +7062,33 @@ "node": ">=8" } }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -7063,6 +7160,17 @@ "node": ">=8.6" } }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-editor": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", @@ -11513,6 +11621,11 @@ "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==" }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -15332,6 +15445,17 @@ "inBundle": true, "license": "ISC" }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -16506,6 +16630,17 @@ "integrity": "sha512-oOanj84fJEXUg9FoEAQomA8ISG+DVIrTZ3qF7m69VQUJyOGYyDZmPqKcjvRku4KXlEH6hWO9i4ACLzNBh8gC0A==", "license": "MIT" }, + "node_modules/react-native-progress": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-native-progress/-/react-native-progress-5.0.0.tgz", + "integrity": "sha512-KjnGIt3r9i5Kn2biOD9fXLJocf0bwxPRxOyAgXEnZTJQU2O+HyzgGFRCbM5h3izm9kKIkSc1txh8aGmMafCD9A==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react-native-svg": "*" + } + }, "node_modules/react-native-safe-area-context": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.4.1.tgz", @@ -16528,6 +16663,91 @@ "react-native": "*" } }, + "node_modules/react-native-svg": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.2.0.tgz", + "integrity": "sha512-bDvMeFReA3F9pVp0EhACPrEerRcITzTu9N2m2lAPinhIMVvwzGzVXyFsXI8fCMSoeOIh+77hKvukoCedh06tLw==", + "dependencies": { + "css-select": "^5.1.0", + "css-tree": "^1.1.3" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-vector-icons": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-9.2.0.tgz", + "integrity": "sha512-wKYLaFuQST/chH3AJRjmOLoLy3JEs1JR6zMNgTaemFpNoXs0ztRnTxcxFD9xhX7cJe1/zoN5BpQYe7kL0m5yyA==", + "dependencies": { + "prop-types": "^15.7.2", + "yargs": "^16.1.1" + }, + "bin": { + "fa5-upgrade": "bin/fa5-upgrade.sh", + "generate-icon": "bin/generate-icon.js" + } + }, + "node_modules/react-native-vector-icons/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/react-native-vector-icons/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native-vector-icons/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native-vector-icons/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/react-native/node_modules/metro-runtime": { "version": "0.72.1", "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.72.1.tgz", @@ -23930,6 +24150,11 @@ } } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "bplist-creator": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", @@ -24509,6 +24734,32 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -24790,6 +25041,21 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -24807,6 +25073,24 @@ } } }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -24859,6 +25143,11 @@ "ansi-colors": "^4.1.1" } }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + }, "env-editor": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", @@ -28031,6 +28320,11 @@ "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==" }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -30778,6 +31072,14 @@ "path-key": "^2.0.0" } }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -31654,6 +31956,14 @@ "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.70.3.tgz", "integrity": "sha512-oOanj84fJEXUg9FoEAQomA8ISG+DVIrTZ3qF7m69VQUJyOGYyDZmPqKcjvRku4KXlEH6hWO9i4ACLzNBh8gC0A==" }, + "react-native-progress": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-native-progress/-/react-native-progress-5.0.0.tgz", + "integrity": "sha512-KjnGIt3r9i5Kn2biOD9fXLJocf0bwxPRxOyAgXEnZTJQU2O+HyzgGFRCbM5h3izm9kKIkSc1txh8aGmMafCD9A==", + "requires": { + "prop-types": "^15.7.2" + } + }, "react-native-safe-area-context": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.4.1.tgz", @@ -31669,6 +31979,70 @@ "warn-once": "^0.1.0" } }, + "react-native-svg": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.2.0.tgz", + "integrity": "sha512-bDvMeFReA3F9pVp0EhACPrEerRcITzTu9N2m2lAPinhIMVvwzGzVXyFsXI8fCMSoeOIh+77hKvukoCedh06tLw==", + "requires": { + "css-select": "^5.1.0", + "css-tree": "^1.1.3" + } + }, + "react-native-vector-icons": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-9.2.0.tgz", + "integrity": "sha512-wKYLaFuQST/chH3AJRjmOLoLy3JEs1JR6zMNgTaemFpNoXs0ztRnTxcxFD9xhX7cJe1/zoN5BpQYe7kL0m5yyA==", + "requires": { + "prop-types": "^15.7.2", + "yargs": "^16.1.1" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + } + } + }, "react-redux": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.4.tgz", diff --git a/ComApp/package.json b/ComApp/package.json index 51438b3..80252db 100644 --- a/ComApp/package.json +++ b/ComApp/package.json @@ -21,8 +21,11 @@ "npm": "^8.19.2", "react": "18.1.0", "react-native": "0.70.1", + "react-native-progress": "^5.0.0", "react-native-safe-area-context": "^4.4.1", "react-native-screens": "^3.18.0", + "react-native-svg": "^13.2.0", + "react-native-vector-icons": "^9.2.0", "react-redux": "^8.0.4", "realm": "^11.0.0-rc.2", "redux": "^4.2.0" diff --git a/ComApp/src/App.js b/ComApp/src/App.js index b221e78..55884de 100644 --- a/ComApp/src/App.js +++ b/ComApp/src/App.js @@ -7,7 +7,7 @@ */ import React from 'react'; -import { View, Image, TextInput, TouchableOpacity, Icon } from 'react-native'; +import { View, Image, TextInput, TouchableOpacity } from 'react-native'; // Redux import { Provider } from 'react-redux'; // Store @@ -16,6 +16,8 @@ import { store } from './App/Store/ConfigureStore'; import { NavigationContainer } from '@react-navigation/native'; import { createNativeStackNavigator } from '@react-navigation/native-stack'; import CustomNavigation from './Navigation'; +// Icons +import FontAwesome5 from 'react-native-vector-icons/FontAwesome5'; // Translations import i18n from "./I18n"; // Navigations style @@ -25,6 +27,8 @@ import { Setting } from "./Database"; // Views import InstallScreen from './App/Views/InstallScreen'; import HomeScreen from './App/Views/HomeScreen'; +import LoginScreen from './App/Views/LoginScreen'; +import SyncScreen from './App/Views/SyncScreen'; // Lang Flags import flagFR from './Resources/assets/img/flags/fr.png'; import flagEN from './Resources/assets/img/flags/en.png'; @@ -46,7 +50,7 @@ const App = () => { if (savedLocale !== undefined) { locale = savedLocale.value; } else { - locale = store.getState().locale; + locale = store.getState().app.locale; } let flag; @@ -69,6 +73,30 @@ const App = () => { + CustomNavigation.LogoTitle(i18n.t('global.synchronization')) }} + /> + ({ + headerTitle: () => CustomNavigation.LogoTitle(i18n.t('global.login')), + headerRight: () => ( + + { + store.dispatch({ type: 'UPDATE_LOCALE' }); + this.setState({ state: this.state }); // to force re-rendering + }} + style={{ marginRight: 15 }}> + + + + ), + })} + /> { this.setState({ searchTxt: '' }); } }}> - + { navigation.navigation.navigate('MySpaceScreen')} style={{ marginRight: 15 }}> - + )} { }) } style={{ marginRight: 15 }}> - + { store.dispatch({ type: 'SET_LOGGED', data: false }); }} style={{ marginRight: 15 }}> - + ) diff --git a/ComApp/src/App/Controllers/SyncController.js b/ComApp/src/App/Controllers/SyncController.js new file mode 100644 index 0000000..f78bd3a --- /dev/null +++ b/ComApp/src/App/Controllers/SyncController.js @@ -0,0 +1,59 @@ +// Lodash +import _ from 'lodash'; +// Http Client +import axios from 'axios'; +// Network Infos +import NetInfo from "@react-native-community/netinfo"; +// Application infos +import * as Application from 'expo-application'; +// Database +import { Setting } from '../../Database'; + +const api_token = 'toto'; +const app_uuid = '1f6eda31-1f6d-49fe-aa81-4f0aece0f7ca'; +const url = "https://dev-app.rhd-ldc.fr"; + +class SyncController { + + async checkConnection() { + NetInfo.fetch().then(state => { + return state.isConnected; + }); + return false; + } + + async getVersion() { + return axios({ + method: 'GET', + url: url + '/api/version', + responseType: 'json', + params: { + token: api_token, + app_uuid: app_uuid, + app_version: Application.nativeApplicationVersion + }, + }); + } + + async getUsers() { + return axios({ + method: 'GET', + url: url + '/api/users', + responseType: 'json', + params: { + token: api_token + }, + }); + } + + updateShowIsActive(value) { + const local = Setting.get('ShowIsActive'); + if (local === false || local === undefined) { + Setting.add({ key: 'ShowIsActive', value: value }); + } else { + Setting.update({ id: local.id, key: 'ShowIsActive', value: value }); + } + } +} + +export default new SyncController(); \ No newline at end of file diff --git a/ComApp/src/App/Models/Setting.js b/ComApp/src/App/Models/Setting.js index c23248f..67bbdab 100644 --- a/ComApp/src/App/Models/Setting.js +++ b/ComApp/src/App/Models/Setting.js @@ -32,6 +32,12 @@ class SettingModel { } } + update(data) { + this.realm.write(() => { + this.realm.create(this.schema, data, 'modified'); + }); + } + get(key) { let tmp = this.realm.objects(this.schema); if (tmp.length === 0) { diff --git a/ComApp/src/App/Models/User.js b/ComApp/src/App/Models/User.js new file mode 100644 index 0000000..4aa626d --- /dev/null +++ b/ComApp/src/App/Models/User.js @@ -0,0 +1,64 @@ +class UserModel { + constructor(realm) { + this.schema = 'Users'; + this.realm = realm; + } + + add(data) { + this.realm.write(() => { + if (data.id === undefined) { + let id = this.realm.objects(this.schema).max('id'); + data.id = id === undefined ? 1 : id + 1; + } + try { + this.realm.create(this.schema, data, 'never'); + } catch (e) { + console.log('db setting add', e); + } + }); + } + + upsert(data) { + let tmp = this.get(data.key); + if (tmp === false || tmp === undefined) { + this.add(data); + } else { + if (data.id === undefined) { + data.id = tmp.id; + } + this.realm.write(() => { + this.realm.create(this.schema, data, 'modified'); + }); + } + } + + update(data) { + this.realm.write(() => { + this.realm.create(this.schema, data, 'modified'); + }); + } + + get(key) { + let tmp = this.realm.objects(this.schema); + if (tmp.length === 0) { + return false; + } else { + tmp = tmp.filtered('key = "' + key + '"')[0]; + } + return tmp; + } + + getAll() { + let tmp = this.realm.objects(this.schema); + return tmp; + } + + clear() { + this.realm.write(() => { + this.realm.delete(this.getAll()); + }); + } + +} + +export default UserModel; diff --git a/ComApp/src/App/Store/Reducers/AppReducer.js b/ComApp/src/App/Store/Reducers/AppReducer.js index e26b909..db4bafa 100644 --- a/ComApp/src/App/Store/Reducers/AppReducer.js +++ b/ComApp/src/App/Store/Reducers/AppReducer.js @@ -1,3 +1,5 @@ +import SyncController from "../../Controllers/SyncController"; + const initialState = { locale: 'fr', users: {}, @@ -93,7 +95,7 @@ const reducer = (state = initialState, action) => { syncVersion: action.data, }; case 'UPDATE_SHOW_IS_ACTIVE': - Sync.updateShowIsActive(action.data); + SyncController.updateShowIsActive(action.data); return { ...state, ShowIsActive: action.data, diff --git a/ComApp/src/App/Views/LoginScreen.js b/ComApp/src/App/Views/LoginScreen.js new file mode 100644 index 0000000..971b143 --- /dev/null +++ b/ComApp/src/App/Views/LoginScreen.js @@ -0,0 +1,54 @@ +import React from 'react'; +import { View, ImageBackground, TextInput, Button, Image } from 'react-native'; +// Common Styles +import commonStyles from '../../Resources/CommonStyles'; +// Style +import styles from '../../Resources/Styles/LoginStyle'; +// Translations +import i18n from "../../I18n"; +// FileSytem +import * as FileSystem from 'expo-file-system'; + +class LoginScreen extends React.Component { + state = { + login: '', + password: '', + }; + + render() { + return ( + + + + + this.setState({ login: text })} + autoCapitalize={'none'} + autoCorrect={false} + keyboardType={'email-address'} + /> + this.setState({ password: text })} + secureTextEntry={true} + autoCapitalize={'none'} + autoCorrect={false} + /> +