From 2953cc8a35a8ef5073ec112baba66e0df7c268c5 Mon Sep 17 00:00:00 2001 From: Maxence Lanone Date: Wed, 16 Nov 2022 17:27:53 +0100 Subject: [PATCH 1/2] =?UTF-8?q?debut=20page=20repertoire=20+=20ajout=20des?= =?UTF-8?q?=20differente=20fonctions=20(ajout,=20suppression,=20modif),=20?= =?UTF-8?q?manque=20requete=20api=20a=20la=20base=20de=20donn=C3=A9es)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/JTT_CrM.code-workspace | 11 + server-api/package-lock.json | 670 ++++++++++++++++++++++++ server-api/package.json | 2 + src/api/contacts.js | 6 + src/components/Contact/AddContact.js | 42 ++ src/components/Contact/ContactCard.js | 33 ++ src/components/Contact/ContactDetail.js | 33 ++ src/components/Contact/ContactList.js | 43 ++ src/components/Contact/EditContact.js | 47 ++ src/components/Contact/Header.js | 13 + src/images/icon.jpg | Bin 0 -> 6520 bytes src/images/user.jpg | Bin 0 -> 47816 bytes src/index.js | 2 +- src/pages/Repertoire.js | 138 ++++- 14 files changed, 1034 insertions(+), 6 deletions(-) create mode 100644 public/JTT_CrM.code-workspace create mode 100644 src/api/contacts.js create mode 100644 src/components/Contact/AddContact.js create mode 100644 src/components/Contact/ContactCard.js create mode 100644 src/components/Contact/ContactDetail.js create mode 100644 src/components/Contact/ContactList.js create mode 100644 src/components/Contact/EditContact.js create mode 100644 src/components/Contact/Header.js create mode 100644 src/images/icon.jpg create mode 100644 src/images/user.jpg diff --git a/public/JTT_CrM.code-workspace b/public/JTT_CrM.code-workspace new file mode 100644 index 0000000..7987921 --- /dev/null +++ b/public/JTT_CrM.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": ".." + }, + { + "path": "../../Downloads/react-contact-management-app-master" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/server-api/package-lock.json b/server-api/package-lock.json index 7213a78..478c9e4 100644 --- a/server-api/package-lock.json +++ b/server-api/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", + "@google-cloud/local-auth": "^2.1.0", "@mui/material": "^5.10.13", "body": "^5.1.0", "body-parser": "^1.20.1", @@ -18,6 +19,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "fullcalendar": "^5.11.3", + "googleapis": "^105.0.0", "mysql": "^2.18.1", "parser": "^0.1.4" }, @@ -576,6 +578,20 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, + "node_modules/@google-cloud/local-auth": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/local-auth/-/local-auth-2.1.0.tgz", + "integrity": "sha512-ymZ1XuyKcRcro0aiMYz3hVGbZ+QZmN5V1Eyjvw2k1xqq76PwmDer0DIPxdxkLzfW9Inr8+g+MS9t9fZ7dOlTOQ==", + "dependencies": { + "arrify": "^2.0.1", + "google-auth-library": "^8.0.2", + "open": "^7.0.3", + "server-destroy": "^1.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -907,6 +923,38 @@ "node": ">= 0.6" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -936,6 +984,14 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -956,6 +1012,25 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -1092,6 +1167,11 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/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": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1366,6 +1446,14 @@ "csstype": "^3.0.2" } }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1507,6 +1595,16 @@ } ] }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1594,6 +1692,32 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gaxios": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.0.2.tgz", + "integrity": "sha512-TjtV2AJOZoMQqRYoy5eM8cCQogYwazWNYLQ72QB0kwa6vHHruYkGmhhyrlzbmgNHK1dNnuP2WSH81urfzyN2Og==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.0.1.tgz", + "integrity": "sha512-jiRJ+Fk7e8FH68Z6TLaqwea307OktJpDjmYnU7/li6ziwvVvU2RlrCyQo5vkdeP94chm0kcSCOOszvmuaioq3g==", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -1637,6 +1761,80 @@ "node": ">=4" } }, + "node_modules/google-auth-library": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.7.0.tgz", + "integrity": "sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.0.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/googleapis": { + "version": "105.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-105.0.0.tgz", + "integrity": "sha512-wH/jU/6QpqwsjTKj4vfKZz97ne7xT7BBbKwzQEwnbsG8iH9Seyw19P+AuLJcxNNrmgblwLqfr3LORg4Okat1BQ==", + "dependencies": { + "google-auth-library": "^8.0.2", + "googleapis-common": "^6.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-6.0.3.tgz", + "integrity": "sha512-Xyb4FsQ6PQDu4tAE/M/ev4yzZhFe2Gc7+rKmuCX2ZGk1ajBKbafsGlVYpmzGqQOT93BRDe8DiTmQb6YSkbICrA==", + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^5.0.1", + "google-auth-library": "^8.0.2", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1700,6 +1898,39 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1773,6 +2004,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1803,6 +2048,28 @@ "node": ">=0.12.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1825,6 +2092,14 @@ "node": ">=4" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -1842,6 +2117,25 @@ "node": ">=6" } }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -1858,6 +2152,17 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1948,6 +2253,33 @@ "node": ">= 0.6" } }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", @@ -2033,6 +2365,21 @@ "node": ">= 0.8" } }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2373,6 +2720,11 @@ "node": ">= 0.8.0" } }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -2527,6 +2879,11 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2579,6 +2936,11 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2592,6 +2954,14 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2600,6 +2970,25 @@ "node": ">= 0.8" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", @@ -3026,6 +3415,17 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, + "@google-cloud/local-auth": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/local-auth/-/local-auth-2.1.0.tgz", + "integrity": "sha512-ymZ1XuyKcRcro0aiMYz3hVGbZ+QZmN5V1Eyjvw2k1xqq76PwmDer0DIPxdxkLzfW9Inr8+g+MS9t9fZ7dOlTOQ==", + "requires": { + "arrify": "^2.0.1", + "google-auth-library": "^8.0.2", + "open": "^7.0.3", + "server-destroy": "^1.0.1" + } + }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -3218,6 +3618,29 @@ "negotiator": "0.6.3" } }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -3241,6 +3664,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, "babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -3257,6 +3685,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -3365,6 +3798,11 @@ "update-browserslist-db": "^1.0.9" } }, + "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": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -3567,6 +4005,14 @@ "csstype": "^3.0.2" } }, + "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", @@ -3678,6 +4124,16 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3748,6 +4204,26 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "gaxios": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.0.2.tgz", + "integrity": "sha512-TjtV2AJOZoMQqRYoy5eM8cCQogYwazWNYLQ72QB0kwa6vHHruYkGmhhyrlzbmgNHK1dNnuP2WSH81urfzyN2Og==", + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.7" + } + }, + "gcp-metadata": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.0.1.tgz", + "integrity": "sha512-jiRJ+Fk7e8FH68Z6TLaqwea307OktJpDjmYnU7/li6ziwvVvU2RlrCyQo5vkdeP94chm0kcSCOOszvmuaioq3g==", + "requires": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3779,6 +4255,62 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "peer": true }, + "google-auth-library": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.7.0.tgz", + "integrity": "sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.0.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + } + }, + "google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "requires": { + "node-forge": "^1.3.1" + } + }, + "googleapis": { + "version": "105.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-105.0.0.tgz", + "integrity": "sha512-wH/jU/6QpqwsjTKj4vfKZz97ne7xT7BBbKwzQEwnbsG8iH9Seyw19P+AuLJcxNNrmgblwLqfr3LORg4Okat1BQ==", + "requires": { + "google-auth-library": "^8.0.2", + "googleapis-common": "^6.0.0" + } + }, + "googleapis-common": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-6.0.3.tgz", + "integrity": "sha512-Xyb4FsQ6PQDu4tAE/M/ev4yzZhFe2Gc7+rKmuCX2ZGk1ajBKbafsGlVYpmzGqQOT93BRDe8DiTmQb6YSkbICrA==", + "requires": { + "extend": "^3.0.2", + "gaxios": "^5.0.1", + "google-auth-library": "^8.0.2", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + } + }, + "gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "requires": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3829,6 +4361,30 @@ "toidentifier": "1.0.1" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3884,6 +4440,11 @@ "has": "^1.0.3" } }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3905,6 +4466,19 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3921,6 +4495,14 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "peer": true }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3932,6 +4514,25 @@ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "peer": true }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "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==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3945,6 +4546,14 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4008,6 +4617,19 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", @@ -4065,6 +4687,15 @@ "ee-first": "1.1.1" } }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4341,6 +4972,11 @@ "send": "0.18.0" } }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -4455,6 +5091,11 @@ "nopt": "~1.0.10" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -4485,6 +5126,11 @@ "picocolors": "^1.0.0" } }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4495,11 +5141,35 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", diff --git a/server-api/package.json b/server-api/package.json index 07bc2fe..eb95c4f 100644 --- a/server-api/package.json +++ b/server-api/package.json @@ -11,6 +11,7 @@ "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", + "@google-cloud/local-auth": "^2.1.0", "@mui/material": "^5.10.13", "body": "^5.1.0", "body-parser": "^1.20.1", @@ -18,6 +19,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "fullcalendar": "^5.11.3", + "googleapis": "^105.0.0", "mysql": "^2.18.1", "parser": "^0.1.4" }, diff --git a/src/api/contacts.js b/src/api/contacts.js new file mode 100644 index 0000000..571bdf0 --- /dev/null +++ b/src/api/contacts.js @@ -0,0 +1,6 @@ +import axios from 'axios'; + + +export default axios.create({ + baseURL:"http://localhost:3007/", +}); \ No newline at end of file diff --git a/src/components/Contact/AddContact.js b/src/components/Contact/AddContact.js new file mode 100644 index 0000000..c9c0c60 --- /dev/null +++ b/src/components/Contact/AddContact.js @@ -0,0 +1,42 @@ +import React, {useState} from 'react' +import {useNavigate} from 'react-router-dom'; +// HERE ABOVE useHistory IS REPLACED WITH useNavigate + +function AddContact(props) { + + const navigate=useNavigate(); + const [User, setUser] = useState({name:"", email:""}); + + let add = (e) => { + e.preventDefault(); + if(User.name === "" || User.email === ""){ + alert("All fields are mandatory!!!"); + return + } + // THIS IS USED TO SHOW THE LIST DATA ON THE APP.JS FILE + props.addContactHandler(User); + // THIS IS USED FOR WHEN THE ADD BUTTON IS PRESSED THE INPUT FILED AGAIN GETS EMPTY + setUser({name:"", email:""}); + //console.log(props); + navigate('/'); + } + + return ( +
+

Add Contact

+
+
+ + setUser({...User, name: e.target.value})}/> +
+
+ + setUser({...User, email: e.target.value})}/> +
+ +
+
+ ) +} + +export default AddContact diff --git a/src/components/Contact/ContactCard.js b/src/components/Contact/ContactCard.js new file mode 100644 index 0000000..93b99f3 --- /dev/null +++ b/src/components/Contact/ContactCard.js @@ -0,0 +1,33 @@ +import React from 'react' +import { Link } from 'react-router-dom'; +import icon from '../../images/icon.jpg'; + +function ContactCard(props) { + + const { id, name, email } = props.contact; + console.log(props.contact); + return ( +
+ icon +
+ +
{name}
+
{email}
+ +
+ props.clickHandler(id)} + > + + + + + +
+ ) +} + +export default ContactCard diff --git a/src/components/Contact/ContactDetail.js b/src/components/Contact/ContactDetail.js new file mode 100644 index 0000000..3611764 --- /dev/null +++ b/src/components/Contact/ContactDetail.js @@ -0,0 +1,33 @@ +import React from 'react' +import {Link,useLocation} from'react-router-dom'; +import user from '../../images/user.jpg'; + +const ContactDetail = (props) => { + + //console.log(location); + // HERE DUE TO NEW VERSION OF ROUTER useLocation IS USED AND + // FROM CONTACTCARD IN LINK IT TOOK STATE AND THEN IT IS PASSED HERE + let location = useLocation(); + const {name, email} = location.state.contact; + + return ( +
+
+
+ user +
+
+
{name}
+
{email}
+
+
+ +
+ +
+ +
+ ) +} + +export default ContactDetail diff --git a/src/components/Contact/ContactList.js b/src/components/Contact/ContactList.js new file mode 100644 index 0000000..1036afe --- /dev/null +++ b/src/components/Contact/ContactList.js @@ -0,0 +1,43 @@ +import React, {useRef} from 'react' +import ContactCard from './ContactCard'; +import {Link} from 'react-router-dom'; + +function ContactList(props) { + + console.log(props); + const inputEl = useRef(""); + + const deletContactHandler = (id) => { + props.getContactId(id); + } + + const renderContactList = props.contacts.map((contact)=>{ + return( + + ); + }) + + const getSearchTerm = () =>{ + props.searchKeyword(inputEl.current.value); + } + + return ( +
+

Contact List + + + +

+
+
+ + +
+
+
+ {renderContactList.length >0 ? renderContactList:"No Contacts available"} +
+
+ ) +} +export default ContactList diff --git a/src/components/Contact/EditContact.js b/src/components/Contact/EditContact.js new file mode 100644 index 0000000..770cffb --- /dev/null +++ b/src/components/Contact/EditContact.js @@ -0,0 +1,47 @@ +import React, {useState} from 'react' +import {Link,useLocation} from'react-router-dom'; +import {useNavigate} from 'react-router-dom'; +// HERE ABOVE useHistory IS REPLACED WITH useNavigate + +function EditContact(props) { + + const navigate = useNavigate(); + let location = useLocation(); + const {id, name, email} = location.state.contact; + const [User, setUser] = useState({id,name,email}); + + + + + let update = (e) => { + e.preventDefault(); + if(User.name === "" || User.email === ""){ + alert("All fields are mandatory!!!"); + return + } + // THIS IS USED TO SHOW THE LIST DATA ON THE APP.JS FILE + props.updateContactHandler(User); + // THIS IS USED FOR WHEN THE ADD BUTTON IS PRESSED THE INPUT FILED AGAIN GETS EMPTY + setUser({name:"", email:""}); + navigate('/'); + } + + return ( +
+

Edit Contact

+
+
+ + setUser({...User, name: e.target.value})}/> +
+
+ + setUser({...User, email: e.target.value})}/> +
+ +
+
+ ) +} + +export default EditContact diff --git a/src/components/Contact/Header.js b/src/components/Contact/Header.js new file mode 100644 index 0000000..584e618 --- /dev/null +++ b/src/components/Contact/Header.js @@ -0,0 +1,13 @@ +import React from 'react' + +function Header() { + return ( +
+
+

Contact Manager

+
+
+ ) +} + +export default Header diff --git a/src/images/icon.jpg b/src/images/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5fe1328f3d86d3e83579c2fb7c6cc8773b95f12e GIT binary patch literal 6520 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 VvhvGcyKm5!Sf2O4X#i$U{s$^0%K`uZ literal 0 HcmV?d00001 diff --git a/src/images/user.jpg b/src/images/user.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4dd9dda7072e97c87fffd3094408029afe15d73f GIT binary patch literal 47816 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 AfB*mh literal 0 HcmV?d00001 diff --git a/src/index.js b/src/index.js index 83df876..0abce70 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,5 @@ import React from 'react'; -import ReactDOM from 'react-dom/client'; +import ReactDOM from 'react-dom'; import App from './App'; import "./styles/index.scss"; diff --git a/src/pages/Repertoire.js b/src/pages/Repertoire.js index 1458847..e2c8155 100644 --- a/src/pages/Repertoire.js +++ b/src/pages/Repertoire.js @@ -1,13 +1,141 @@ -import React from 'react'; import NavigationDashboard from '../components/NavigationDashboard'; +import React, { useState, useEffect } from 'react'; +import { BrowserRouter as Router, Switch, Route, Routes } from 'react-router-dom'; +import { v4 as uuid } from 'uuid'; +import Header from '../components/Contact/Header'; +import AddContact from '../components/Contact/AddContact' +import ContactList from '../components/Contact/ContactList'; +import ContactDetail from '../components/Contact/ContactDetail'; +import EditContact from '../components/Contact/EditContact'; +import axios from 'axios'; +import user from '../images/user.jpg'; +import {Link,useLocation} from'react-router-dom'; +const api = axios.create({ + baseURL: 'http://localhost:8080' +}) -const Repertoire = () => { +function Admin_list() { + + const [contact, setContacts] = useState([]); + const [SearchTerm, setSearchTerm] = useState(""); + const [SearchResults, setSearchResults] = useState([]); + + useEffect(() =>{ + api.get('/Contact/All/').then((response) => { + setContacts(response.data); + setSearchTerm(response.data[0].idcontact); + }); + }, []); + + const handleClick = (event, idcontact) => { + setSearchTerm(idContact); + }; return ( - - coucou - +
+
+
+ user +
+
+
{name}
+
{email}
+
+
+ +
+ +
+ +
); +} + +function Repertoire() { + + // // NOW WITH THE USE OF HOOKS WE WILL GET THE CONTACTS + // const LOCAL_STORAGE_KEY = "contacts" + // const [contacts, setContacts] = useState([]); + // const [SearchTerm, setSearchTerm] = useState(""); + // const [SearchResults, setSearchResults] = useState([]); + + // const addContactHandler = async (contact) => { + // const request = { + // id: uuid(), + // ...contact + // } + // const response = await api.post("/contacts", request) + // setContacts([...contacts, response.data]); + // } + + // // UPDATE CONTACT + // const updateContactHandler = async (contact) => { + // const response = await api.put(`/contacts/${contact.id}`, contact); + // const { id, name, email } = response.data; + // setContacts(contacts.map(contact => { + // return contact.id === id ? { ...response.data } : contact; + // })) + // } + + // // FOR DELETING THE ITEMS + // const removeContactHandler = async (id) => { + // await api.delete(`/contacts/${id}`); + // const newContactList = contacts.filter((contact) => { + // return contact.id !== id; + // }); + // setContacts(newContactList); + // } + + // // SEARCHING THE CONTACTS + // const searchHandler = (searchTerm) => { + // setSearchTerm(searchTerm); + // if (searchTerm !== "") { + // const newContactList = contacts.filter((contact) => { + // return Object.values(contact).join(" ").toLowerCase().includes(searchTerm.toLowerCase()); + // }); + // setSearchResults(newContactList); + // } else { + // setSearchResults(contacts); + // } + // } + + // useEffect(() => { + // const retrieveContacts = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY)); + // if (retrieveContacts) setContacts(retrieveContacts); + // } + // , []); + + // useEffect(() => { + // localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(contacts)); + // } + // , [contacts]); + + // return ( + //
+ // + //
+ // + // } + // render={(props)=>} + // /> + // } + // //render={(props)=>} + // /> + // } + // /> + // } /> + // + // {/* */} + // {/*Here in contact list props are used to get the values in the above contact array*/} + // {/* */} + // + //
+ // ) + + }; export default Repertoire; \ No newline at end of file From 6f0ed413fe70fe70077c1c24d310259fe5194ca6 Mon Sep 17 00:00:00 2001 From: Maxence Lanone Date: Thu, 17 Nov 2022 10:43:54 +0100 Subject: [PATCH 2/2] ajout liste contact dans page repertoire + ajout images svg light --- server-api/api.js | 11 ++ src/api/contacts.js | 6 - src/img/logo_calendrier_light.svg | 1 + src/img/logo_calendrier_vide_light.svg | 1 + src/img/logo_graph_light.svg | 1 + src/img/logo_graph_vide_light.svg | 1 + src/img/logo_group_light.svg | 1 + src/img/logo_group_vide_light.svg | 1 + src/img/logo_parametre_light.svg | 1 + src/img/logo_parametre_vide_light.svg | 1 + src/img/logo_personEntouré_light.svg | 1 + src/img/logo_person_light.svg | 1 + src/img/logo_person_vide_light.svg | 1 + src/img/logo_speed_light.svg | 1 + src/img/logo_speed_vide_light.svg | 1 + src/pages/Repertoire.js | 244 ++++++++++++++----------- 16 files changed, 161 insertions(+), 113 deletions(-) delete mode 100644 src/api/contacts.js create mode 100644 src/img/logo_calendrier_light.svg create mode 100644 src/img/logo_calendrier_vide_light.svg create mode 100644 src/img/logo_graph_light.svg create mode 100644 src/img/logo_graph_vide_light.svg create mode 100644 src/img/logo_group_light.svg create mode 100644 src/img/logo_group_vide_light.svg create mode 100644 src/img/logo_parametre_light.svg create mode 100644 src/img/logo_parametre_vide_light.svg create mode 100644 src/img/logo_personEntouré_light.svg create mode 100644 src/img/logo_person_light.svg create mode 100644 src/img/logo_person_vide_light.svg create mode 100644 src/img/logo_speed_light.svg create mode 100644 src/img/logo_speed_vide_light.svg diff --git a/server-api/api.js b/server-api/api.js index e9eb6ba..149ebdb 100644 --- a/server-api/api.js +++ b/server-api/api.js @@ -164,4 +164,15 @@ app.post('/User/Update/:id', (req, res) => { console.log(result); res.send('Post added...' + result.insertId); }); +}); + +//Api pour les contacts de la page repertoire + +app.get('/Contact/All', (req, res) => { + let sql = 'SELECT * FROM contacts ORDER BY idcontact'; + db.query(sql, (err, result) => { + if (err) throw err; + console.log(result); + res.send(result); + }); }); \ No newline at end of file diff --git a/src/api/contacts.js b/src/api/contacts.js deleted file mode 100644 index 571bdf0..0000000 --- a/src/api/contacts.js +++ /dev/null @@ -1,6 +0,0 @@ -import axios from 'axios'; - - -export default axios.create({ - baseURL:"http://localhost:3007/", -}); \ No newline at end of file diff --git a/src/img/logo_calendrier_light.svg b/src/img/logo_calendrier_light.svg new file mode 100644 index 0000000..dc57ec2 --- /dev/null +++ b/src/img/logo_calendrier_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_calendrier_vide_light.svg b/src/img/logo_calendrier_vide_light.svg new file mode 100644 index 0000000..ecc362c --- /dev/null +++ b/src/img/logo_calendrier_vide_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_graph_light.svg b/src/img/logo_graph_light.svg new file mode 100644 index 0000000..96eb267 --- /dev/null +++ b/src/img/logo_graph_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_graph_vide_light.svg b/src/img/logo_graph_vide_light.svg new file mode 100644 index 0000000..60c8a0c --- /dev/null +++ b/src/img/logo_graph_vide_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_group_light.svg b/src/img/logo_group_light.svg new file mode 100644 index 0000000..f0843a5 --- /dev/null +++ b/src/img/logo_group_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_group_vide_light.svg b/src/img/logo_group_vide_light.svg new file mode 100644 index 0000000..87c00b4 --- /dev/null +++ b/src/img/logo_group_vide_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_parametre_light.svg b/src/img/logo_parametre_light.svg new file mode 100644 index 0000000..5d63cba --- /dev/null +++ b/src/img/logo_parametre_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_parametre_vide_light.svg b/src/img/logo_parametre_vide_light.svg new file mode 100644 index 0000000..0b7e64e --- /dev/null +++ b/src/img/logo_parametre_vide_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_personEntouré_light.svg b/src/img/logo_personEntouré_light.svg new file mode 100644 index 0000000..15eaccc --- /dev/null +++ b/src/img/logo_personEntouré_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_person_light.svg b/src/img/logo_person_light.svg new file mode 100644 index 0000000..b0af0b5 --- /dev/null +++ b/src/img/logo_person_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_person_vide_light.svg b/src/img/logo_person_vide_light.svg new file mode 100644 index 0000000..88082df --- /dev/null +++ b/src/img/logo_person_vide_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_speed_light.svg b/src/img/logo_speed_light.svg new file mode 100644 index 0000000..68ba5a3 --- /dev/null +++ b/src/img/logo_speed_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/img/logo_speed_vide_light.svg b/src/img/logo_speed_vide_light.svg new file mode 100644 index 0000000..55f0e56 --- /dev/null +++ b/src/img/logo_speed_vide_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/pages/Repertoire.js b/src/pages/Repertoire.js index e2c8155..fa9e4e1 100644 --- a/src/pages/Repertoire.js +++ b/src/pages/Repertoire.js @@ -9,133 +9,163 @@ import ContactDetail from '../components/Contact/ContactDetail'; import EditContact from '../components/Contact/EditContact'; import axios from 'axios'; import user from '../images/user.jpg'; -import {Link,useLocation} from'react-router-dom'; +import { Link, useLocation } from 'react-router-dom'; + +import { TableContainer, Table, TableHead, TableBody, TableRow, TableCell } from '@mui/material'; +import { Paper } from '@mui/material'; + + const api = axios.create({ baseURL: 'http://localhost:8080' }) -function Admin_list() { +function Repertoire() { - const [contact, setContacts] = useState([]); + const [contacts, setContacts] = useState([]); const [SearchTerm, setSearchTerm] = useState(""); const [SearchResults, setSearchResults] = useState([]); - useEffect(() =>{ - api.get('/Contact/All/').then((response) => { + useEffect(() => { + api.get('/Contact/All').then((response) => { setContacts(response.data); setSearchTerm(response.data[0].idcontact); }); }, []); - const handleClick = (event, idcontact) => { - setSearchTerm(idContact); - }; return ( -
-
-
- user -
-
-
{name}
-
{email}
+
+ + {/* Create a page to delete an user in the admin page*/} + +
+

Admin

+

Liste des utilisateurs

+
+
+ + + + +
+ + + + + Nom + Prénom + Identifiant + Téléphone + + + + {contacts.map((contact) => ( + handleClick(event, contact.idcontact)} + // selected={contact.idcontact === selectedIdcontact} + > + {contact.lastname} + {contact.firstname} + {contact.phone} + {contact.mail} + + ))} + +
+
- -
- -
-
); } -function Repertoire() { - - // // NOW WITH THE USE OF HOOKS WE WILL GET THE CONTACTS - // const LOCAL_STORAGE_KEY = "contacts" - // const [contacts, setContacts] = useState([]); - // const [SearchTerm, setSearchTerm] = useState(""); - // const [SearchResults, setSearchResults] = useState([]); - - // const addContactHandler = async (contact) => { - // const request = { - // id: uuid(), - // ...contact - // } - // const response = await api.post("/contacts", request) - // setContacts([...contacts, response.data]); - // } - - // // UPDATE CONTACT - // const updateContactHandler = async (contact) => { - // const response = await api.put(`/contacts/${contact.id}`, contact); - // const { id, name, email } = response.data; - // setContacts(contacts.map(contact => { - // return contact.id === id ? { ...response.data } : contact; - // })) - // } - - // // FOR DELETING THE ITEMS - // const removeContactHandler = async (id) => { - // await api.delete(`/contacts/${id}`); - // const newContactList = contacts.filter((contact) => { - // return contact.id !== id; - // }); - // setContacts(newContactList); - // } - - // // SEARCHING THE CONTACTS - // const searchHandler = (searchTerm) => { - // setSearchTerm(searchTerm); - // if (searchTerm !== "") { - // const newContactList = contacts.filter((contact) => { - // return Object.values(contact).join(" ").toLowerCase().includes(searchTerm.toLowerCase()); - // }); - // setSearchResults(newContactList); - // } else { - // setSearchResults(contacts); - // } - // } - - // useEffect(() => { - // const retrieveContacts = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY)); - // if (retrieveContacts) setContacts(retrieveContacts); - // } - // , []); - - // useEffect(() => { - // localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(contacts)); - // } - // , [contacts]); - - // return ( - //
- // - //
- // - // } - // render={(props)=>} - // /> - // } - // //render={(props)=>} - // /> - // } - // /> - // } /> - // - // {/* */} - // {/*Here in contact list props are used to get the values in the above contact array*/} - // {/* */} - // - //
- // ) - - -}; +// function Repertoire() { + +// // NOW WITH THE USE OF HOOKS WE WILL GET THE CONTACTS +// const LOCAL_STORAGE_KEY = "contacts" +// const [contacts, setContacts] = useState([]); +// const [SearchTerm, setSearchTerm] = useState(""); +// const [SearchResults, setSearchResults] = useState([]); + +// const addContactHandler = async (contact) => { +// const request = { +// id: uuid(), +// ...contact +// } +// const response = await api.post("/contacts", request) +// setContacts([...contacts, response.data]); +// } + +// // UPDATE CONTACT +// const updateContactHandler = async (contact) => { +// const response = await api.put(`/contacts/${contact.id}`, contact); +// const { id, name, email } = response.data; +// setContacts(contacts.map(contact => { +// return contact.id === id ? { ...response.data } : contact; +// })) +// } + +// // FOR DELETING THE ITEMS +// const removeContactHandler = async (id) => { +// await api.delete(`/contacts/${id}`); +// const newContactList = contacts.filter((contact) => { +// return contact.id !== id; +// }); +// setContacts(newContactList); +// } + +// // SEARCHING THE CONTACTS +// const searchHandler = (searchTerm) => { +// setSearchTerm(searchTerm); +// if (searchTerm !== "") { +// const newContactList = contacts.filter((contact) => { +// return Object.values(contact).join(" ").toLowerCase().includes(searchTerm.toLowerCase()); +// }); +// setSearchResults(newContactList); +// } else { +// setSearchResults(contacts); +// } +// } + +// useEffect(() => { +// const retrieveContacts = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY)); +// if (retrieveContacts) setContacts(retrieveContacts); +// } +// , []); + +// useEffect(() => { +// localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(contacts)); +// } +// , [contacts]); + +// return ( +//
+// +//
+// +// } +// render={(props)=>} +// /> +// } +// //render={(props)=>} +// /> +// } +// /> +// } /> +// +// {/* */} +// {/*Here in contact list props are used to get the values in the above contact array*/} +// {/* */} +// +//
+// ) + + +// }; export default Repertoire; \ No newline at end of file