diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/e-commerce_website.iml b/.idea/e-commerce_website.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/e-commerce_website.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..281a9e2 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1050c23..ba53996 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,9 +24,11 @@ "custom-react-inner-image-zoom": "^3.0.6", "firebase": "^10.8.0", "leaflet": "^1.9.4", + "nanoid": "^5.0.7", "react": "^18.2.0", "react-bootstrap": "^2.10.0", "react-dom": "^18.2.0", + "react-hook-form": "^7.51.4", "react-image-zoom": "^1.3.1", "react-inner-image-zoom": "^3.0.2", "react-lazy-load-image-component": "^1.6.0", @@ -39,6 +41,7 @@ "reactjs-image-zoom": "^1.0.8", "rn-range-slider": "^2.2.2", "styled-components": "^5.3.11", + "uuidv4": "^6.2.13", "web-vitals": "^2.1.4" }, "devDependencies": { @@ -46,6 +49,8 @@ "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/preset-react": "^7.24.1", "eslint-plugin-react": "^7.34.1", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", "prettier": "3.0.1" } }, @@ -5788,6 +5793,11 @@ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, "node_modules/@types/warning": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", @@ -7443,6 +7453,87 @@ "node": ">=0.10.0" } }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -10339,6 +10430,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -10927,6 +11030,21 @@ "node": ">=10.17.0" } }, + "node_modules/husky": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", + "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "dev": true, + "bin": { + "husky": "bin.mjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -13941,6 +14059,308 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/lint-staged": { + "version": "15.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", + "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "dev": true, + "dependencies": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/listr2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", + "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.3.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -14016,6 +14436,147 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "node_modules/log-update": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -14317,9 +14878,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", + "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", "funding": [ { "type": "github", @@ -14327,10 +14888,10 @@ } ], "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18 || >=20" } }, "node_modules/natural-compare": { @@ -14847,6 +15408,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -16253,6 +16826,23 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -16721,6 +17311,21 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-hook-form": { + "version": "7.51.4", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.4.tgz", + "integrity": "sha512-V14i8SEkh+V1gs6YtD0hdHYnoL4tp/HX/A45wWQN15CYr9bFRmmRdYStSO5L65lCCZRF+kYiSKhm9alqbcdiVA==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-image-zoom": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/react-image-zoom/-/react-image-zoom-1.3.1.tgz", @@ -17375,6 +17980,22 @@ "node": ">=10" } }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -17392,6 +18013,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -17946,6 +18573,46 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -18134,6 +18801,15 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-convert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", @@ -19171,6 +19847,15 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/uuidv4": { + "version": "6.2.13", + "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz", + "integrity": "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==", + "dependencies": { + "@types/uuid": "8.3.4", + "uuid": "8.3.2" + } + }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", diff --git a/package.json b/package.json index 3e12305..633626c 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,11 @@ "custom-react-inner-image-zoom": "^3.0.6", "firebase": "^10.8.0", "leaflet": "^1.9.4", + "nanoid": "^5.0.7", "react": "^18.2.0", "react-bootstrap": "^2.10.0", "react-dom": "^18.2.0", + "react-hook-form": "^7.51.4", "react-image-zoom": "^1.3.1", "react-inner-image-zoom": "^3.0.2", "react-lazy-load-image-component": "^1.6.0", @@ -33,6 +35,7 @@ "reactjs-image-zoom": "^1.0.8", "rn-range-slider": "^2.2.2", "styled-components": "^5.3.11", + "uuidv4": "^6.2.13", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/src/App.js b/src/App.js index 0bd857c..b041e57 100644 --- a/src/App.js +++ b/src/App.js @@ -1,33 +1,30 @@ -import "bootstrap/dist/css/bootstrap.min.css"; -import { - getDatabase, - onValue, - ref -} from "firebase/database"; -import React, { createContext, useEffect, useState } from "react"; -import { HashRouter, Route, Routes } from "react-router-dom"; -import "./App.css"; -import Loader from "./assets/images/loading.gif"; -import Footer from "./components/footer/footer"; -import Header from "./components/header/header"; -import About from "./pages/About"; -import AddProductForm from "./pages/AddProd"; -import DetailsPage from "./pages/Details"; -import Home from "./pages/Home/index"; -import Listing from "./pages/Listing"; -import NotFound from "./pages/NotFound"; -import SignIn from "./pages/SignIn"; -import SignUp from "./pages/SignUp"; -import ResetPassword from "./pages/ResetPassword"; -import Cart from "./pages/cart"; -import Wishlist from "./pages/wishList"; -import "./responsive.css"; +import 'bootstrap/dist/css/bootstrap.min.css'; +import { getDatabase, onValue, ref } from 'firebase/database'; +import React, { createContext, useEffect, useState } from 'react'; +import { HashRouter, Route, Routes } from 'react-router-dom'; +import './App.css'; +import Loader from './assets/images/loading.gif'; +import Footer from './components/footer/footer'; +import Header from './components/header/header'; +import About from './pages/About'; +import AddProductForm from './pages/AddProd'; +import DetailsPage from './pages/Details'; +import Home from './pages/Home/index'; +import Listing from './pages/Listing'; +import NotFound from './pages/NotFound'; +import SignIn from './pages/SignIn'; +import SignUp from './pages/SignUp'; +import ResetPassword from './pages/ResetPassword'; +import Cart from './pages/cart'; +import Wishlist from './pages/wishList'; +import './responsive.css'; // import data from './data'; -import { collection, doc, getDocs } from "firebase/firestore"; -import MapComponent from "./components/map/ITEMmap"; -import { db } from "./firebase"; -import SellerForm from "./pages/SellerRegistration"; +import { collection, doc, getDocs } from 'firebase/firestore'; +import MapComponent from './components/map/ITEMmap'; +import { db } from './firebase'; +import SellerForm from './pages/SellerRegistration'; +import { Account } from './components/AccountDetails/Account'; const MyContext = createContext(); @@ -58,8 +55,8 @@ function App() { const fetchCartProducts = async () => { try { - const cartRef = doc(db, "carts", localStorage.getItem("uid")); - const productsCollectionRef = collection(cartRef, "products"); + const cartRef = doc(db, 'carts', localStorage.getItem('uid')); + const productsCollectionRef = collection(cartRef, 'products'); const querySnapshot = await getDocs(productsCollectionRef); const products = []; querySnapshot.forEach((doc) => { @@ -68,14 +65,14 @@ function App() { setCartItems(products); setCartCount(products.length); // Set the product count } catch (error) { - console.error("Error fetching cart products:", error); + console.error('Error fetching cart products:', error); } }; const fetchWishlistProducts = async () => { try { - const wishlistRef = doc(db, "wishlists", localStorage.getItem("uid")); - const productsCollectionRef = collection(wishlistRef, "products"); + const wishlistRef = doc(db, 'wishlists', localStorage.getItem('uid')); + const productsCollectionRef = collection(wishlistRef, 'products'); const querySnapshot = await getDocs(productsCollectionRef); const products = []; querySnapshot.forEach((doc) => { @@ -84,7 +81,7 @@ function App() { setWishlistItems(products); setWishlistCount(products.length); // Set the product count } catch (error) { - console.error("Error fetching wishlist products:", error); + console.error('Error fetching wishlist products:', error); } }; @@ -92,15 +89,15 @@ function App() { const fetchData = async () => { try { const response = await fetch( - "https://mavrick-1.github.io/DataApi/data.json" + 'https://mavrick-1.github.io/DataApi/data.json' ); if (!response.ok) { - throw new Error("Network response was not ok"); + throw new Error('Network response was not ok'); } const data = await response.json(); setData(data); } catch (error) { - console.error("Error fetching data:", error); + console.error('Error fetching data:', error); } }; @@ -110,7 +107,7 @@ function App() { useEffect(() => { getData(); - const is_Login = localStorage.getItem("isLogin"); + const is_Login = localStorage.getItem('isLogin'); setIsLogin(is_Login); setTimeout(() => { @@ -125,7 +122,7 @@ function App() { const db = getDatabase(); // Reference to the node or path you want to fetch data from - const dataRef = ref(db, localStorage.getItem("user")); + const dataRef = ref(db, localStorage.getItem('user')); // Fetch data from the specified path onValue( @@ -135,11 +132,11 @@ function App() { setCartItems(data); }, (error) => { - console.error("Error fetching data:", error); + console.error('Error fetching data:', error); } ); } catch (error) { - console.error("Error:", error); + console.error('Error:', error); } }; @@ -149,7 +146,7 @@ function App() { const db = getDatabase(); // Reference to the node or path you want to fetch data from - const dataRef = ref(db, localStorage.getItem("user")); + const dataRef = ref(db, localStorage.getItem('user')); // Fetch data from the specified path onValue( @@ -159,17 +156,17 @@ function App() { setCartItems(data); }, (error) => { - console.error("Error fetching data:", error); + console.error('Error fetching data:', error); } ); } catch (error) { - console.error("Error:", error); + console.error('Error:', error); } }; const addToCart = async (item) => { try { - const user = localStorage.getItem("user"); + const user = localStorage.getItem('user'); // Initialize Firebase database with the provided database URL const db = getDatabase(); const cartRef = ref(db, user); @@ -178,7 +175,7 @@ function App() { // Add item to the cart in Firebase setCartItems([...cartItems, { ...item, quantity: 1 }]); } catch (error) { - console.error("Error adding item to cart:", error); + console.error('Error adding item to cart:', error); } }; @@ -192,12 +189,12 @@ function App() { }; const signIn = () => { - const is_Login = localStorage.getItem("isLogin"); + const is_Login = localStorage.getItem('isLogin'); setIsLogin(is_Login); }; const signOut = () => { - localStorage.removeItem("isLogin"); + localStorage.removeItem('isLogin'); setIsLogin(false); }; @@ -223,7 +220,7 @@ function App() { wishlistCount, setWishlistCount, fetchCartProducts, - fetchWishlistProducts, + fetchWishlistProducts }; return data && data.productData ? ( @@ -261,13 +258,18 @@ function App() { /> } /> } /> + } /> {/* sign in , signup Protection */} {isLogin === null && ( } /> )} {isLogin === null && ( - } /> + } + /> )} {isLogin === null && ( } /> @@ -294,4 +296,3 @@ function App() { export default App; export { MyContext }; - diff --git a/src/Model/useModel.js b/src/Model/useModel.js new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/images/pfp.jpg b/src/assets/images/pfp.jpg new file mode 100644 index 0000000..e719cb8 Binary files /dev/null and b/src/assets/images/pfp.jpg differ diff --git a/src/components/AccountDetails/Account.css b/src/components/AccountDetails/Account.css new file mode 100644 index 0000000..baf594e --- /dev/null +++ b/src/components/AccountDetails/Account.css @@ -0,0 +1,25 @@ +.cardwidth { + width: 75%; + height: auto; +} + +.negmargin { + top: 0; + bottom: 0; + height: 100%; + width: 100%; + position: absolute; +} + +.profileImageP { + height: 200px; + width: 200px; + border-radius: 50%; +} + +.imgbackground { + height: 600px; + width: 100vw; + opacity: 0.5; + filter: blur(2px); +} diff --git a/src/components/AccountDetails/Account.js b/src/components/AccountDetails/Account.js new file mode 100644 index 0000000..71955fa --- /dev/null +++ b/src/components/AccountDetails/Account.js @@ -0,0 +1,279 @@ +import { useForm } from 'react-hook-form'; +import { Button, Card } from '@mui/material'; +import { + CardBody, + CardFooter, + CardHeader, + CardImg, + CardText, + CardTitle, + Col, + Form, + Row +} from 'react-bootstrap'; +import './Account.css'; +import imageBackground from '../../assets/images/slider-1.png'; +import pfp from '../../assets/images/pfp.jpg'; +import React, { useEffect, useState } from 'react'; +import { + getDownloadURL, + ref, + uploadBytes, + updateMetadata +} from 'firebase/storage'; +import { useNavigate } from 'react-router-dom'; +import { + addDoc, + collection, + doc, + getDoc, + onSnapshot, + setDoc, + updateDoc, + query, + where, + documentId, + getDocs +} from 'firebase/firestore'; +import { db, storage } from '../../firebase'; +import { nanoid } from 'nanoid'; + +export function Account() { + const { + register, + handleSubmit, + formState: { errors, isSubmitting } + } = useForm(); + + const user_uid = localStorage.getItem('uid'); + const userImage = localStorage.getItem('userImage'); + const userName = localStorage.getItem('uname'); + const userEmail = localStorage.getItem('uemail'); + + const [name, setName] = useState(userName); + const [email, setEmail] = useState(userEmail); + const [address, setAddress] = useState(''); + const [file, setFile] = useState(pfp); + const navigate = useNavigate(); + + useEffect(() => { + (async () => { + const docref = doc(db, 'users', `${user_uid ? user_uid : nanoid()}`); + const docSnap = await getDoc(docref); + if (docSnap.exists()) { + setName(docSnap.data().Name); + setEmail(docSnap.data().Email); + setAddress(docSnap.data().Address); + setFile(docSnap.data().photo); + } else { + console.log(null); + } + })(); + }, []); + + function handlehistory() { + navigate('/'); + } + + function Onsubmit(e) { + e.preventDefault(); + const collectionRef = collection(db, 'users'); + + const querySnapshot = getDocs(collectionRef); + + // return updateUser(name, email, address, file) + + querySnapshot.then((doc) => { + console.log(doc.docs.includes(user_uid)); + if (doc.docs.includes(user_uid)) { + return updateUser(name, email, address, file); + } else { + return addUser(name, email, address, file); + } + }); + } + + const addUser = async (name, email, address, file) => { + try { + const imageRef = ref( + storage, + `AccountImage/${localStorage.getItem('uid')}` + ); + await uploadBytes(imageRef, file); + const imageUrl = await getDownloadURL(imageRef); + await setDoc(doc(db, 'users', `${user_uid}`), { + Name: name, + Email: email, + Address: address, + photo: imageUrl + }); + setFile(imageUrl); + } catch (error) { + console.log(error); + } + }; + + const updateUser = async (name, email, address, file) => { + try { + const imageRef = ref( + storage, + `AccountImage/${localStorage.getItem('uid')}` + ); + await uploadBytes(imageRef, file); + + const imageUrl = await getDownloadURL(imageRef); + + console.log(imageUrl); + console.log(name); + console.log(email); + console.log(address); + + await updateDoc(doc(db, 'users', `${user_uid}`), { + Name: name, + Email: email, + Address: address, + photo: imageUrl + }); + } catch (err) { + console.log(err); + } + }; + + return ( + <> +
+

+ + My Account +

+ + +
+ + + + + {userImage !== '' ? ( + + ) : ( +
+ + setFile(e.target.files[0])} + /> +
+ )} + + + + +

{name}

+ + +

{email}

+ +
+ + {address} + + + +
+
+
+
+ + +

Personal

+
+ +
+ + Name + { + setName(e.target.value); + }} + value={name} + required={true} + isInvalid={!!errors.name} + /> + + {errors.name?.message} + + + + Email + { + setEmail(e.target.value); + }} + isInvalid={!!errors.email} + /> + + {errors.email?.message} + + + + Address + { + setAddress(e.target.value); + }} + isInvalid={!!errors.address} + /> + + {errors.address?.message} + + +
+
+
+ + + +
+
+ + ); +} diff --git a/src/components/footer/footer.js b/src/components/footer/footer.js index 5b43bc9..cb4a40c 100644 --- a/src/components/footer/footer.js +++ b/src/components/footer/footer.js @@ -2,10 +2,10 @@ import React from 'react'; import './footer.css'; import Icon1 from '../../assets/images/icon-1.svg'; -import Icon2 from '../../assets/images/icon-2.svg' -import Icon3 from '../../assets/images/icon-3.svg' -import Icon4 from '../../assets/images/icon-4.svg' -import Icon5 from '../../assets/images/icon-5.svg' +import Icon2 from '../../assets/images/icon-2.svg'; +import Icon3 from '../../assets/images/icon-3.svg'; +import Icon4 from '../../assets/images/icon-4.svg'; +import Icon5 from '../../assets/images/icon-5.svg'; import Logo from '../../assets/images/logo.svg'; import { Link } from 'react-router-dom'; import LocationOnOutlinedIcon from '@mui/icons-material/LocationOnOutlined'; @@ -24,230 +24,297 @@ import Newsletter from '../../components/newsletter/index'; import NewsletterImg from '../../assets/images/newsletter.png'; const Footer = () => { - const currentYear = new Date().getFullYear(); - return ( - <> - -
-
-
-
-

Stay home & get your daily
needs from our shop

-

Start You'r Daily Shopping with Nest Mart

-

- -
- -
- -
-
+ const currentYear = new Date().getFullYear(); + return ( + <> +
+
+
+
+

+ Stay home & get your daily
+ needs from our shop +

+

Start You'r Daily Shopping with Nest Mart

+
+
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+ + + +
+

Best prices & offers

+

Orders $50 or more

+
-
- -
-
-
-
-
-
- -
-

Best prices & offers

-

Orders $50 or more

-
-
-
- -
-
- -
-

Free delivery

-

Orders $50 or more

-
-
-
- -
-
- -
-

Great daily deal

-

Orders $50 or more

-
-
-
- - -
-
- -
-

Wide assortment

-

Orders $50 or more

-
-
-
- - -
-
- -
-

Easy returns

-

Orders $50 or more

-
-
-
- -
-
+
+ +
+
+ + + +
+

Free delivery

+

Orders $50 or more

+
+
+
+ +
+
+ + + +
+

Great daily deal

+

Orders $50 or more

+
+
+
+ +
+
+ + + +
+

Wide assortment

+

Orders $50 or more

+
+
+
+ +
+
+ + + +
+

Easy returns

+

Orders $50 or more

+
+
+
+
+ + + +
+
+
+
+ + + +
+
+

Awesome grocery store website template

+
+ +

+ Address: 5171 W + Campbell Ave undefined Kent, Utah 53127 United States +

+

+ Call Us: (+91) - + 540-025-124553{' '} +

+

+ Email: sale@Nest.com +

+

+ Hours: 10:00 - + 18:00, Mon - Sat +

+
+ +
+
+
+

Company

+
    +
  • + About Us +
  • +
  • + Delivery Information +
  • +
  • + Privacy Policy +
  • +
  • + Terms & Conditions +
  • +
  • + Contact Us +
  • +
  • + Support Center +
  • +
  • + Careers +
  • +
+
+ +
+

Corporate

+
    +
  • + About Us +
  • +
  • + Delivery Information +
  • +
  • + Privacy Policy +
  • +
  • + Terms & Conditions +
  • +
  • + Contact Us +
  • +
  • + Support Center +
  • +
  • + Careers +
  • +
+
+ +
+

Popular

+
    +
  • + About Us +
  • +
  • + Delivery Information +
  • +
  • + Privacy Policy +
  • +
  • + Terms & Conditions +
  • +
  • + Contact Us +
  • +
  • + Support Center +
  • +
  • + Careers +
  • +
+
+
+
+ +
+

Install App

+
+

From App Store or Google Play

+ +
+ + + + + +
+
-
-
-
-
- -

-

Awesome grocery store website template

-
- -

Address: 5171 W Campbell Ave undefined Kent, Utah 53127 United States

-

Call Us: (+91) - 540-025-124553

-

Email: sale@Nest.com

-

Hours: 10:00 - 18:00, Mon - Sat

- -
- - -
-
-
-

Company

-
    -
  • About Us
  • -
  • Delivery Information
  • -
  • Privacy Policy
  • -
  • Terms & Conditions
  • -
  • Contact Us
  • -
  • Support Center
  • -
  • Careers
  • -
-
- - -
-

Corporate

-
    -
  • About Us
  • -
  • Delivery Information
  • -
  • Privacy Policy
  • -
  • Terms & Conditions
  • -
  • Contact Us
  • -
  • Support Center
  • -
  • Careers
  • -
-
- - -
-

Popular

-
    -
  • About Us
  • -
  • Delivery Information
  • -
  • Privacy Policy
  • -
  • Terms & Conditions
  • -
  • Contact Us
  • -
  • Support Center
  • -
  • Careers
  • -
-
-
-
- - -
-

Install App

-
-

From App Store or Google Play

- -
- - -
- -
- -

Secured Payment Gateways

- -
- -
- - -
- - - -
-
-

© {currentYear}, Nest - HTML Ecommerce Template

-

All rights reserved

-
- -
-
-
- -
-

1900 - 888

-

24/7 Support Center

-
-
- -
- -
-

1900 - 888

-

24/7 Support Center

-
-
-
-
- - -
-
-
Follow Us
-
    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • - -
-
-
-
+

Secured Payment Gateways

+ +
+
+
+ +
+
+

© {currentYear}, Nest - HTML Ecommerce Template

+

All rights reserved

+
+ +
+
+
+ + + +
+

1900 - 888

+

24/7 Support Center

-
- - + + +
+ + + +
+

1900 - 888

+

24/7 Support Center

+
+
+ + + +
+
+
Follow Us
+
    +
  • + + + +
  • +
  • + + + +
  • +
  • + + + +
  • +
  • + + + +
  • +
+
+
- - ) -} + + + + + ); +}; export default Footer; diff --git a/src/components/header/header.js b/src/components/header/header.js index bdeef78..167032f 100644 --- a/src/components/header/header.js +++ b/src/components/header/header.js @@ -63,6 +63,8 @@ const Header = (props) => { 'Fresh Seafood' ]); + const navigate = useNavigate(); + const countryList = []; useEffect(() => { @@ -129,6 +131,10 @@ const Header = (props) => { context.setIsopenNavigation(false); }; + const handleAccountClick = () => { + navigate('/account'); + }; + return ( <>
@@ -321,7 +327,10 @@ const Header = (props) => { {isOpenDropDown !== false && (
  • -
  • diff --git a/src/components/header/nav/nav.js b/src/components/header/nav/nav.js index 9ae3a64..20f8ca4 100644 --- a/src/components/header/nav/nav.js +++ b/src/components/header/nav/nav.js @@ -10,141 +10,203 @@ import { MyContext } from '../../../App'; import { useSelector } from 'react-redux'; const Nav = (props) => { + const logged = useSelector((state) => state.authReducer.value.isAuth); - const logged = useSelector((state)=>state.authReducer.value.isAuth) - - const [navData, setNavData] = useState([]); - const [isOpenNav, setIsOpenNav] = useState(false); - const [windowWidth, setWindowWidth] = useState(window.innerWidth); - const [openDropdownMenu, setDropdownMenu] = useState(false); - const [openDropdownMenuIndex, setDropdownMenuIndex] = useState(null); - - const [openMegaMenu, setOpenMegaMenu] = useState(false); - const context = useContext(MyContext); - - useEffect(() => { - setNavData(props.data); - }, []); - - useEffect(() => { - setIsOpenNav(props.openNav) - }, [props.openNav]) - - - const closeNav=()=>{ - props.closeNav(); - } - - const openDropdownFun=(index)=>{ - setDropdownMenu(!openDropdownMenu) - setDropdownMenuIndex(index) - } - - return ( - <> - { - isOpenNav === true &&
    - } -
    -
    -
    -
    - -
    + const [navData, setNavData] = useState([]); + const [isOpenNav, setIsOpenNav] = useState(false); + const [windowWidth, setWindowWidth] = useState(window.innerWidth); + const [openDropdownMenu, setDropdownMenu] = useState(false); + const [openDropdownMenuIndex, setDropdownMenuIndex] = useState(null); -
    -
- -
+ {windowWidth < 992 && ( + <> + {context.isLogin !== 'true' && ( +
+
+ + + +
+ )} + + )} + + -
-
- -
-

1900 - 888

-

24/7 Support Center

-
-
-
- +
+
+ + + +
+

1900 - 888

+

24/7 Support Center

+
- - ) -} + + + + + ); +}; export default Nav; diff --git a/src/pages/About/about.css b/src/pages/About/about.css index 360bbe1..3684ebb 100644 --- a/src/pages/About/about.css +++ b/src/pages/About/about.css @@ -196,4 +196,4 @@ width: 120px; height: 120px; } -} \ No newline at end of file +} diff --git a/src/pages/About/index.js b/src/pages/About/index.js index 77a81f8..03d42d4 100644 --- a/src/pages/About/index.js +++ b/src/pages/About/index.js @@ -75,4 +75,4 @@ function Tes() { ); } -export default Tes; \ No newline at end of file +export default Tes; diff --git a/src/pages/ResetPassword/index.js b/src/pages/ResetPassword/index.js index 4083aa2..dbbe586 100644 --- a/src/pages/ResetPassword/index.js +++ b/src/pages/ResetPassword/index.js @@ -1,44 +1,41 @@ -import React, { useState, useContext } from "react"; -import { Link, useNavigate } from "react-router-dom"; -import "./style.css"; -import { collection, doc, setDoc ,getDocs} from "firebase/firestore"; - - -import Box from "@mui/material/Box"; -import TextField from "@mui/material/TextField"; -import VisibilityOutlinedIcon from "@mui/icons-material/VisibilityOutlined"; -import VisibilityOffOutlinedIcon from "@mui/icons-material/VisibilityOffOutlined"; -import { Button, Snackbar, Typography } from "@mui/material"; +import React, { useState, useContext } from 'react'; +import { Link, useNavigate } from 'react-router-dom'; +import './style.css'; +import { collection, doc, setDoc, getDocs } from 'firebase/firestore'; + +import Box from '@mui/material/Box'; +import TextField from '@mui/material/TextField'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; +import { Button, Snackbar, Typography } from '@mui/material'; import { getAuth, - signInWithEmailAndPassword, GoogleAuthProvider, signInWithPopup, fetchSignInMethodsForEmail, - sendPasswordResetEmail, -} from "firebase/auth"; -import { app,db } from "../../firebase"; -import Backdrop from "@mui/material/Backdrop"; -import CircularProgress from "@mui/material/CircularProgress"; -import { MyContext } from "../../App"; -import GoogleImg from "../../assets/images/google.png"; -import useLoggedInUserEmail from "../../Hooks/useLoggedInUserEmail"; -import { useDispatch } from "react-redux"; -import { logIn } from "../../Redux/auth-slice"; + sendPasswordResetEmail +} from 'firebase/auth'; +import { app, db } from '../../firebase'; +import Backdrop from '@mui/material/Backdrop'; +import CircularProgress from '@mui/material/CircularProgress'; +import { MyContext } from '../../App'; +import GoogleImg from '../../assets/images/google.png'; +import useLoggedInUserEmail from '../../Hooks/useLoggedInUserEmail'; +import { useDispatch } from 'react-redux'; +import { logIn } from '../../Redux/auth-slice'; const auth = getAuth(app); const googleProvider = new GoogleAuthProvider(); const SignIn = () => { - const [showLoader, setShowLoader] = useState(false); const [mssg, setmssg] = useState(); const [formFields, setFormFields] = useState({ - email: "", - password: "", + email: '', + password: '' }); - const [error, setError] = useState(""); + const [error, setError] = useState(''); const context = useContext(MyContext); const history = useNavigate(); const [snackbarOpen, setSnackbarOpen] = useState(false); @@ -46,19 +43,14 @@ const SignIn = () => { const [isDisabled, setIsDisabled] = useState(true); const [inputErrors, setInputErrors] = useState({ - email: "", - + email: '' }); - - - - const dispatch = useDispatch() - + const dispatch = useDispatch(); function replaceSpecialCharacters(inputString) { // Use a regular expression to replace special characters with underscore _ - const replacedString = inputString.replace(/[#$\[\].]/g, "_"); + const replacedString = inputString.replace(/[#$\[\].]/g, '_'); return replacedString; } @@ -69,63 +61,62 @@ const SignIn = () => { }; // Password validation function - + const onChangeField = (e) => { const name = e.target.name; const value = e.target.value; - setFormFields((prevFormFields) => ({ ...prevFormFields, - [name]: value, + [name]: value })); - + let errors = { ...inputErrors }; // Validate email - - errors.email = ""; -setInputErrors(errors) - }; - + errors.email = ''; + setInputErrors(errors); + }; const forgotPassword = async (e) => { e.preventDefault(); let errors = { ...inputErrors }; // Validate email - console.log(formFields.email) - errors.email = !validateEmail(formFields.email) ? "Invalid email address" : ""; - setInputErrors(errors) - if(!validateEmail(formFields.email)){ - - setmssg("Invalid email address") - return; - } - - let signInMethods = await fetchSignInMethodsForEmail(auth, formFields.email); - console.log(signInMethods,"count") - - try{ - const email = formFields.email; - const res=await sendPasswordResetEmail( auth,email); - console.log(res) + console.log(formFields.email); + errors.email = !validateEmail(formFields.email) + ? 'Invalid email address' + : ''; + setInputErrors(errors); + if (!validateEmail(formFields.email)) { + setmssg('Invalid email address'); + return; + } + + let signInMethods = await fetchSignInMethodsForEmail( + auth, + formFields.email + ); + console.log(signInMethods, 'count'); + + try { + const email = formFields.email; + const res = await sendPasswordResetEmail(auth, email); + console.log(res); setSnackbarOpen(true); - formFields.email="" - - setmssg("Password reset mail has been sent!") - - - } - catch{(error) => { - console.log(error) - setmssg("some error has occured!") - - setError(error.message); - }} -} + formFields.email = ''; + setmssg('Password reset mail has been sent!'); + } catch { + (error) => { + console.log(error); + setmssg('some error has occured!'); + + setError(error.message); + }; + } + }; const handleCloseSnackbar = () => { setSnackbarOpen(false); @@ -148,7 +139,7 @@ setInputErrors(errors)
theme.zIndex.drawer + 1 }} + sx={{ color: '#000', zIndex: (theme) => theme.zIndex.drawer + 1 }} open={showLoader} className="formLoader" > @@ -172,29 +163,21 @@ setInputErrors(errors) {inputErrors.email && ( {inputErrors.email} )}
- -
- - - - -
diff --git a/src/pages/ResetPassword/style.css b/src/pages/ResetPassword/style.css index 774c120..337fd0d 100644 --- a/src/pages/ResetPassword/style.css +++ b/src/pages/ResetPassword/style.css @@ -1,4 +1,4 @@ -*{ +* { box-sizing: border-box; } .loginWrapper { @@ -66,17 +66,17 @@ } @media (max-width: 586px) { - .loginWrapper { - padding: 75px 0px; - background: #f1f1f1; - height: auto; - } - .loginWrapper .card { - width: 650px; - margin: auto; - height: auto; - padding: 40px; - border: 0px !important; - height: auto; - } -} \ No newline at end of file + .loginWrapper { + padding: 75px 0px; + background: #f1f1f1; + height: auto; + } + .loginWrapper .card { + width: 650px; + margin: auto; + height: auto; + padding: 40px; + border: 0px !important; + height: auto; + } +} diff --git a/src/pages/SignIn/index.js b/src/pages/SignIn/index.js index fe94abe..ae33150 100644 --- a/src/pages/SignIn/index.js +++ b/src/pages/SignIn/index.js @@ -145,7 +145,7 @@ const SignIn = () => { }; const forgotPassword = async () => { - history("/resetpassword") + history('/resetpassword'); }; const handleCloseSnackbar = () => { setSnackbarOpen(false); @@ -239,10 +239,13 @@ const SignIn = () => { )}
- -
+ +
- -

Don't have an account?{' '} diff --git a/src/pages/wishList/index.js b/src/pages/wishList/index.js index bdc8c4a..7af0948 100644 --- a/src/pages/wishList/index.js +++ b/src/pages/wishList/index.js @@ -32,7 +32,6 @@ const WishList = () => { const navigate = useNavigate(); const [uid, setUid] = useState(localStorage.getItem('uid')); - useEffect(() => { try { if (context.isLogin === 'true') { diff --git a/yarn.lock b/yarn.lock index b0bd030..c34a78c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11197,4 +11197,4 @@ yargs@^17.7.2: yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== \ No newline at end of file