Skip to content
Snippets Groups Projects
Commit 0d336d98 authored by xulirong2000's avatar xulirong2000
Browse files

555

parent 3c5b211e
No related branches found
No related tags found
No related merge requests found
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
"@testing-library/jest-dom": "^5.14.1", "@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0", "@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1", "@testing-library/user-event": "^13.2.1",
"firebase": "^10.12.2",
"phosphor-react": "^1.4.1", "phosphor-react": "^1.4.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
...@@ -2449,6 +2450,585 @@ ...@@ -2449,6 +2450,585 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
} }
}, },
"node_modules/@fastify/busboy": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
"engines": {
"node": ">=14"
}
},
"node_modules/@firebase/analytics": {
"version": "0.10.4",
"resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.4.tgz",
"integrity": "sha512-OJEl/8Oye/k+vJ1zV/1L6eGpc1XzAj+WG2TPznJ7PszL7sOFLBXkL9IjHfOCGDGpXeO3btozy/cYUqv4zgNeHg==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/installations": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/analytics-compat": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.10.tgz",
"integrity": "sha512-ia68RcLQLLMFWrM10JfmFod7eJGwqr4/uyrtzHpTDnxGX/6gNCBTOuxdAbyWIqXI5XmcMQdz9hDijGKOHgDfPw==",
"dependencies": {
"@firebase/analytics": "0.10.4",
"@firebase/analytics-types": "0.8.2",
"@firebase/component": "0.6.7",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/analytics-types": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.2.tgz",
"integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw=="
},
"node_modules/@firebase/app": {
"version": "0.10.5",
"resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.5.tgz",
"integrity": "sha512-iY/fNot+hWPk9sTX8aHMqlcX9ynRvpGkskWAdUZ2eQQdLo8d1hSFYcYNwPv0Q/frGMasw8udKWMcFOEpC9fG8g==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"idb": "7.1.1",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/app-check": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.4.tgz",
"integrity": "sha512-2tjRDaxcM5G7BEpytiDcIl+NovV99q8yEqRMKDbn4J4i/XjjuThuB4S+4PkmTnZiCbdLXQiBhkVxNlUDcfog5Q==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/app-check-compat": {
"version": "0.3.11",
"resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.11.tgz",
"integrity": "sha512-t01zaH3RJpKEey0nGduz3Is+uSz7Sj4U5nwOV6lWb+86s5xtxpIvBJzu/lKxJfYyfZ29eJwpdjEgT1/lm4iQyA==",
"dependencies": {
"@firebase/app-check": "0.8.4",
"@firebase/app-check-types": "0.5.2",
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/app-check-interop-types": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz",
"integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ=="
},
"node_modules/@firebase/app-check-types": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.2.tgz",
"integrity": "sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA=="
},
"node_modules/@firebase/app-compat": {
"version": "0.2.35",
"resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.35.tgz",
"integrity": "sha512-vgay/WRjeH0r97/Q6L6df2CMx7oyNFDsE5yPQ9oR1G+zx2eT0s8vNNh0WlKqQxUEWaOLRnXhQ8gy7uu0cBgTRg==",
"dependencies": {
"@firebase/app": "0.10.5",
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/app-types": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz",
"integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ=="
},
"node_modules/@firebase/auth-compat": {
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.9.tgz",
"integrity": "sha512-RX8Zh/3zz2CsVbmYfgHkfUm4fAEPCl+KHVIImNygV5jTGDF6oKOhBIpf4Yigclyu8ESQKZ4elyN0MBYm9/7zGw==",
"dependencies": {
"@firebase/auth": "1.7.4",
"@firebase/auth-types": "0.12.2",
"@firebase/component": "0.6.7",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/auth-compat/node_modules/@firebase/auth": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.4.tgz",
"integrity": "sha512-d2Fw17s5QesojwebrA903el20Li9/YGgkoOGJjagM4I1qAT36APa/FcZ+OX86KxbYKCtQKTMqraU8pxG7C2JWA==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app": "0.x",
"@react-native-async-storage/async-storage": "^1.18.1"
},
"peerDependenciesMeta": {
"@react-native-async-storage/async-storage": {
"optional": true
}
}
},
"node_modules/@firebase/auth-interop-types": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz",
"integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ=="
},
"node_modules/@firebase/auth-types": {
"version": "0.12.2",
"resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz",
"integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==",
"peerDependencies": {
"@firebase/app-types": "0.x",
"@firebase/util": "1.x"
}
},
"node_modules/@firebase/component": {
"version": "0.6.7",
"resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.7.tgz",
"integrity": "sha512-baH1AA5zxfaz4O8w0vDwETByrKTQqB5CDjRls79Sa4eAGAoERw4Tnung7XbMl3jbJ4B/dmmtsMrdki0KikwDYA==",
"dependencies": {
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/database": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.5.tgz",
"integrity": "sha512-cAfwBqMQuW6HbhwI3Cb/gDqZg7aR0OmaJ85WUxlnoYW2Tm4eR0hFl5FEijI3/gYPUiUcUPQvTkGV222VkT7KPw==",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.2",
"@firebase/auth-interop-types": "0.2.3",
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"faye-websocket": "0.11.4",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/database-compat": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.5.tgz",
"integrity": "sha512-NDSMaDjQ+TZEMDMmzJwlTL05kh1+0Y84C+kVMaOmNOzRGRM7VHi29I6YUhCetXH+/b1Wh4ZZRyp1CuWkd8s6hg==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/database": "1.0.5",
"@firebase/database-types": "1.0.3",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/database-types": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.3.tgz",
"integrity": "sha512-39V/Riv2R3O/aUjYKh0xypj7NTNXNAK1bcgY5Kx+hdQPRS/aPTS8/5c0CGFYKgVuFbYlnlnhrCTYsh2uNhGwzA==",
"dependencies": {
"@firebase/app-types": "0.9.2",
"@firebase/util": "1.9.6"
}
},
"node_modules/@firebase/firestore": {
"version": "4.6.3",
"resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.6.3.tgz",
"integrity": "sha512-d/+N2iUsiJ/Dc7fApdpdmmTXzwuTCromsdA1lKwYfZtMIOd1fI881NSLwK2wV4I38wkLnvfKJUV6WpU1f3/ONg==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"@firebase/webchannel-wrapper": "1.0.0",
"@grpc/grpc-js": "~1.9.0",
"@grpc/proto-loader": "^0.7.8",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"engines": {
"node": ">=10.10.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/firestore-compat": {
"version": "0.3.32",
"resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.32.tgz",
"integrity": "sha512-at71mwK7a/mUXH0OgyY0+gUzedm/EUydDFYSFsBoO8DYowZ23Mgd6P4Rzq/Ll3zI/3xJN7LGe7Qp4iE/V/3Arg==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/firestore": "4.6.3",
"@firebase/firestore-types": "3.0.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/firestore-types": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz",
"integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==",
"peerDependencies": {
"@firebase/app-types": "0.x",
"@firebase/util": "1.x"
}
},
"node_modules/@firebase/functions": {
"version": "0.11.5",
"resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.5.tgz",
"integrity": "sha512-qrHJ+l62mZiU5UZiVi84t/iLXZlhRuSvBQsa2qvNLgPsEWR7wdpWhRmVdB7AU8ndkSHJjGlMICqrVnz47sgU7Q==",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.2",
"@firebase/auth-interop-types": "0.2.3",
"@firebase/component": "0.6.7",
"@firebase/messaging-interop-types": "0.2.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/functions-compat": {
"version": "0.3.11",
"resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.11.tgz",
"integrity": "sha512-Qn+ts/M6Lj2/6i1cp5V5TRR+Hi9kyXyHbo+w9GguINJ87zxrCe6ulx3TI5AGQkoQa8YFHUhT3DMGmLFiJjWTSQ==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/functions": "0.11.5",
"@firebase/functions-types": "0.6.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/functions-types": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.2.tgz",
"integrity": "sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w=="
},
"node_modules/@firebase/installations": {
"version": "0.6.7",
"resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.7.tgz",
"integrity": "sha512-i6iGoXRu5mX4rTsiMSSKrgh9pSEzD4hwBEzRh5kEhOTr8xN/wvQcCPZDSMVYKwM2XyCPBLVq0JzjyerwL0Rihg==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/util": "1.9.6",
"idb": "7.1.1",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/installations-compat": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.7.tgz",
"integrity": "sha512-RPcbD+3nqHbnhVjIOpWK2H5qzZ8pAAAScceiWph0VNTqpKyPQ5tDcp4V5fS0ELpfgsHYvroMLDKfeHxpfvm8cw==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/installations": "0.6.7",
"@firebase/installations-types": "0.5.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/installations-types": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz",
"integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==",
"peerDependencies": {
"@firebase/app-types": "0.x"
}
},
"node_modules/@firebase/logger": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz",
"integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/messaging": {
"version": "0.12.9",
"resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.9.tgz",
"integrity": "sha512-IH+JJmzbFGZXV3+TDyKdqqKPVfKRqBBg2BfYYOy7cm7J+SwV+uJMe8EnDKYeQLEQhtpwciPfJ3qQXJs2lbxDTw==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/installations": "0.6.7",
"@firebase/messaging-interop-types": "0.2.2",
"@firebase/util": "1.9.6",
"idb": "7.1.1",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/messaging-compat": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.9.tgz",
"integrity": "sha512-5jN6wyhwPgBH02zOtmmoOeyfsmoD7ty48D1m0vVPsFg55RqN2Z3Q9gkZ5GmPklFPjTPLcxB1ObcHOZvThTkm7g==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/messaging": "0.12.9",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/messaging-interop-types": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz",
"integrity": "sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA=="
},
"node_modules/@firebase/performance": {
"version": "0.6.7",
"resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.7.tgz",
"integrity": "sha512-d+Q4ltjdJZqjzcdms5i0UC9KLYX7vKGcygZ+7zHA/Xk+bAbMD2CPU0nWTnlNFWifZWIcXZ/2mAMvaGMW3lypUA==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/installations": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/performance-compat": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.7.tgz",
"integrity": "sha512-cb8ge/5iTstxfIGW+iiY+7l3FtN8gobNh9JSQNZgLC9xmcfBYWEs8IeEWMI6S8T+At0oHc3lv+b2kpRMUWr8zQ==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/performance": "0.6.7",
"@firebase/performance-types": "0.2.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/performance-types": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.2.tgz",
"integrity": "sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA=="
},
"node_modules/@firebase/remote-config": {
"version": "0.4.7",
"resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.7.tgz",
"integrity": "sha512-5oPNrPFLsbsjpq0lUEIXoDF2eJK7vAbyXe/DEuZQxnwJlfR7aQbtUlEkRgQWcicXpyDmAmDLo7q7lDbCYa6CpA==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/installations": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/remote-config-compat": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.7.tgz",
"integrity": "sha512-Fq0oneQ4SluLnfr5/HfzRS1TZf1ANj1rWbCCW3+oC98An3nE+sCdp+FSuHsEVNwgMg4Tkwx9Oom2lkKeU+Vn+w==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/remote-config": "0.4.7",
"@firebase/remote-config-types": "0.3.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/remote-config-types": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz",
"integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA=="
},
"node_modules/@firebase/storage": {
"version": "0.12.5",
"resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.5.tgz",
"integrity": "sha512-nGWBOGFNr10j0LA4NJ3/Yh3us/lb0Q1xSIKZ38N6FcS+vY54nqJ7k3zE3PENregHC8+8txRow++A568G3v8hOA==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/storage-compat": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.8.tgz",
"integrity": "sha512-qDfY9kMb6Ch2hZb40sBjDQ8YPxbjGOxuT+gU1Z0iIVSSpSX0f4YpGJCypUXiA0T11n6InCXB+T/Dknh2yxVTkg==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/storage": "0.12.5",
"@firebase/storage-types": "0.8.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/storage-types": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz",
"integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==",
"peerDependencies": {
"@firebase/app-types": "0.x",
"@firebase/util": "1.x"
}
},
"node_modules/@firebase/util": {
"version": "1.9.6",
"resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.6.tgz",
"integrity": "sha512-IBr1MZbp4d5MjBCXL3TW1dK/PDXX4yOGbiwRNh1oAbE/+ci5Uuvy9KIrsFYY80as1I0iOaD5oOMA9Q8j4TJWcw==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/vertexai-preview": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.2.tgz",
"integrity": "sha512-NOOL63kFQRq45ioi5P+hlqj/4LNmvn1URhGjQdvyV54c1Irvoq26aW861PRRLjrSMIeNeiLtCLD5pe+ediepAg==",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.2",
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0"
},
"engines": {
"node": ">=18.0.0"
},
"peerDependencies": {
"@firebase/app": "0.x",
"@firebase/app-types": "0.x"
}
},
"node_modules/@firebase/webchannel-wrapper": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.0.tgz",
"integrity": "sha512-zuWxyfXNbsKbm96HhXzainONPFqRcoZblQ++e9cAIGUuHfl2cFSBzW01jtesqWG/lqaUyX3H8O1y9oWboGNQBA=="
},
"node_modules/@grpc/grpc-js": {
"version": "1.9.14",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz",
"integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==",
"dependencies": {
"@grpc/proto-loader": "^0.7.8",
"@types/node": ">=12.12.47"
},
"engines": {
"node": "^8.13.0 || >=10.10.0"
}
},
"node_modules/@grpc/proto-loader": {
"version": "0.7.13",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz",
"integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==",
"dependencies": {
"lodash.camelcase": "^4.3.0",
"long": "^5.0.0",
"protobufjs": "^7.2.5",
"yargs": "^17.7.2"
},
"bin": {
"proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/@grpc/proto-loader/node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@grpc/proto-loader/node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@grpc/proto-loader/node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"engines": {
"node": ">=12"
}
},
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.14", "version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
...@@ -3446,6 +4026,60 @@ ...@@ -3446,6 +4026,60 @@
} }
} }
}, },
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
},
"node_modules/@protobufjs/base64": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
},
"node_modules/@protobufjs/codegen": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
},
"node_modules/@protobufjs/eventemitter": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
},
"node_modules/@protobufjs/fetch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
"dependencies": {
"@protobufjs/aspromise": "^1.1.1",
"@protobufjs/inquire": "^1.1.0"
}
},
"node_modules/@protobufjs/float": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
},
"node_modules/@protobufjs/inquire": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
},
"node_modules/@protobufjs/path": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
},
"node_modules/@protobufjs/pool": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
},
"node_modules/@protobufjs/utf8": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
"node_modules/@remix-run/router": { "node_modules/@remix-run/router": {
"version": "1.16.1", "version": "1.16.1",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz",
...@@ -8185,6 +8819,61 @@ ...@@ -8185,6 +8819,61 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/firebase": {
"version": "10.12.2",
"resolved": "https://registry.npmjs.org/firebase/-/firebase-10.12.2.tgz",
"integrity": "sha512-ZxEdtSvP1I9su1yf32D8TIdgxtPgxwr6z3jYAR1TXS/t+fVfpoPc/N1/N2bxOco9mNjUoc+od34v5Fn4GeKs6Q==",
"dependencies": {
"@firebase/analytics": "0.10.4",
"@firebase/analytics-compat": "0.2.10",
"@firebase/app": "0.10.5",
"@firebase/app-check": "0.8.4",
"@firebase/app-check-compat": "0.3.11",
"@firebase/app-compat": "0.2.35",
"@firebase/app-types": "0.9.2",
"@firebase/auth": "1.7.4",
"@firebase/auth-compat": "0.5.9",
"@firebase/database": "1.0.5",
"@firebase/database-compat": "1.0.5",
"@firebase/firestore": "4.6.3",
"@firebase/firestore-compat": "0.3.32",
"@firebase/functions": "0.11.5",
"@firebase/functions-compat": "0.3.11",
"@firebase/installations": "0.6.7",
"@firebase/installations-compat": "0.2.7",
"@firebase/messaging": "0.12.9",
"@firebase/messaging-compat": "0.2.9",
"@firebase/performance": "0.6.7",
"@firebase/performance-compat": "0.2.7",
"@firebase/remote-config": "0.4.7",
"@firebase/remote-config-compat": "0.2.7",
"@firebase/storage": "0.12.5",
"@firebase/storage-compat": "0.3.8",
"@firebase/util": "1.9.6",
"@firebase/vertexai-preview": "0.0.2"
}
},
"node_modules/firebase/node_modules/@firebase/auth": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.4.tgz",
"integrity": "sha512-d2Fw17s5QesojwebrA903el20Li9/YGgkoOGJjagM4I1qAT36APa/FcZ+OX86KxbYKCtQKTMqraU8pxG7C2JWA==",
"dependencies": {
"@firebase/component": "0.6.7",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.6",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app": "0.x",
"@react-native-async-storage/async-storage": "^1.18.1"
},
"peerDependenciesMeta": {
"@react-native-async-storage/async-storage": {
"optional": true
}
}
},
"node_modules/flat-cache": { "node_modules/flat-cache": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
...@@ -11909,6 +12598,11 @@ ...@@ -11909,6 +12598,11 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
}, },
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
},
"node_modules/lodash.debounce": { "node_modules/lodash.debounce": {
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
...@@ -11934,6 +12628,11 @@ ...@@ -11934,6 +12628,11 @@
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
}, },
"node_modules/long": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
"integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
},
"node_modules/loose-envify": { "node_modules/loose-envify": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
...@@ -14142,6 +14841,29 @@ ...@@ -14142,6 +14841,29 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
}, },
"node_modules/protobufjs": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz",
"integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==",
"hasInstallScript": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
"@protobufjs/codegen": "^2.0.4",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
"@protobufjs/inquire": "^1.1.0",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
"@protobufjs/utf8": "^1.1.0",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/proxy-addr": { "node_modules/proxy-addr": {
"version": "2.0.7", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
...@@ -16599,16 +17321,16 @@ ...@@ -16599,16 +17321,16 @@
} }
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "5.4.5", "version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"peer": true, "peer": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
"tsserver": "bin/tsserver" "tsserver": "bin/tsserver"
}, },
"engines": { "engines": {
"node": ">=14.17" "node": ">=4.2.0"
} }
}, },
"node_modules/unbox-primitive": { "node_modules/unbox-primitive": {
...@@ -16630,6 +17352,17 @@ ...@@ -16630,6 +17352,17 @@
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
"integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
}, },
"node_modules/undici": {
"version": "5.28.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
"integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "5.26.5", "version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
......
...@@ -3,7 +3,10 @@ import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; ...@@ -3,7 +3,10 @@ import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import { Navbar } from "./components/navbar"; import { Navbar } from "./components/navbar";
import { Shop } from "./pages/shop/shop"; import { Shop } from "./pages/shop/shop";
import { Contact } from "./pages/contact"; import { Contact } from "./pages/contact";
import { Checkout } from "./pages/checkout";
import { Cart } from "./pages/cart/cart"; import { Cart } from "./pages/cart/cart";
import {AddProduct} from "./pages/AddProduct";
import {Signup} from "./pages/Signup";
import { ShopContextProvider } from "./context/shop-context"; import { ShopContextProvider } from "./context/shop-context";
function App() { function App() {
...@@ -15,6 +18,9 @@ function App() { ...@@ -15,6 +18,9 @@ function App() {
<Routes> <Routes>
<Route path="/" element={<Shop />} /> <Route path="/" element={<Shop />} />
<Route path="/contact" element={<Contact />} /> <Route path="/contact" element={<Contact />} />
<Route path="/checkout" element={<Checkout />} />
<Route path="/add-product" element={<AddProduct />} />
<Route path="/signup" element={<Signup />} />
<Route path="/cart" element={<Cart />} /> <Route path="/cart" element={<Cart />} />
</Routes> </Routes>
</Router> </Router>
......
.navbar {
width: 100%;
height: 80px;
background-color: rgb(19, 19, 19);
display: flex;
justify-content: flex-end;
align-items: center;
}
.links {
margin-right: 50px;
display: flex;
align-items: center;
}
.links a {
text-decoration: none;
color: white;
margin-left: 20px;
font-size: 25px;
}
\ No newline at end of file
// navbar.js
import React from "react"; import React from "react";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { ShoppingCart } from "phosphor-react"; import { ShoppingCart } from "phosphor-react";
...@@ -12,6 +13,8 @@ export const Navbar = () => { ...@@ -12,6 +13,8 @@ export const Navbar = () => {
<Link to="/cart"> <Link to="/cart">
<ShoppingCart size={32} /> <ShoppingCart size={32} />
</Link> </Link>
<Link to="/add-product"> Add Product </Link>
<Link to="/signup"> Sign Up </Link>
</div> </div>
</div> </div>
); );
......
import { createContext, useEffect, useState } from "react";
import { PRODUCTS } from "../products";
export const ShopContext = createContext(null);
const getDefaultCart = () => {
let cart = {};
for (let i = 1; i < PRODUCTS.length + 1; i++) {
cart[i] = 0;
}
return cart;
};
export const ShopContextProvider = (props) => {
const [cartItems, setCartItems] = useState(getDefaultCart());
const getTotalCartAmount = () => {
let totalAmount = 0;
for (const item in cartItems) {
if (cartItems[item] > 0) {
let itemInfo = PRODUCTS.find((product) => product.id === Number(item));
totalAmount += cartItems[item] * itemInfo.price;
}
}
return totalAmount;
};
const addToCart = (itemId) => {
setCartItems((prev) => ({ ...prev, [itemId]: prev[itemId] + 1 }));
};
const removeFromCart = (itemId) => {
setCartItems((prev) => ({ ...prev, [itemId]: prev[itemId] - 1 }));
};
const updateCartItemCount = (newAmount, itemId) => {
setCartItems((prev) => ({ ...prev, [itemId]: newAmount }));
};
const checkout = () => {
setCartItems(getDefaultCart());
};
const contextValue = {
cartItems,
addToCart,
updateCartItemCount,
removeFromCart,
getTotalCartAmount,
checkout,
};
return (
<ShopContext.Provider value={contextValue}>
{props.children}
</ShopContext.Provider>
);
};
// firebaseConfig.js
import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";
import { getFirestore } from "firebase/firestore";
const firebaseConfig = {
apiKey: "AIzaSyA61BW4vGOjCkfvKK9azjjAFET7mF5lHy0",
authDomain: "protech-shop1.firebaseapp.com",
projectId: "protech-shop1",
storageBucket: "protech-shop1.appspot.com",
messagingSenderId: "154428282416",
appId: "1:154428282416:web:34373700850dfafcb87ff5"
};
const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
const db = getFirestore(app);
export { auth, db };
// src/pages/AddProduct.js
import React, { useState } from "react";
import { db } from "../firebaseConfig"; // 确保路径正确
import { collection, addDoc } from "firebase/firestore";
const AddProduct = () => {
const [productName, setProductName] = useState("");
const [price, setPrice] = useState("");
const handleAddProduct = async (e) => {
e.preventDefault();
try {
await addDoc(collection(db, "products"), {
productName,
price: parseFloat(price)
});
alert("Product added successfully!");
} catch (error) {
alert(error.message);
}
};
return (
<form onSubmit={handleAddProduct}>
<input
type="text"
placeholder="Product Name"
value={productName}
onChange={(e) => setProductName(e.target.value)}
required
/>
<input
type="number"
placeholder="Price"
value={price}
onChange={(e) => setPrice(e.target.value)}
required
/>
<button type="submit">Add Product</button>
</form>
);
};
export default AddProduct;
// src/pages/Signup.js
import React, { useState } from "react";
import { auth } from "../firebaseConfig"; // 确保路径正确
import { createUserWithEmailAndPassword } from "firebase/auth";
const Signup = () => {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const handleSignup = async (e) => {
e.preventDefault();
try {
await createUserWithEmailAndPassword(auth, email, password);
alert("User signed up successfully!");
} catch (error) {
alert(error.message);
}
};
return (
<form onSubmit={handleSignup}>
<input
type="email"
placeholder="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
required
/>
<input
type="password"
placeholder="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
/>
<button type="submit">Sign Up</button>
</form>
);
};
export default Signup;
...@@ -41,4 +41,3 @@ ...@@ -41,4 +41,3 @@
margin: 10px; margin: 10px;
cursor: pointer; cursor: pointer;
} }
\ No newline at end of file
/* checkout.css */
.checkout {
padding: 20px;
max-width: 800px;
margin: auto;
}
.checkoutTitle {
text-align: center;
margin-bottom: 20px;
}
.checkoutContent {
display: flex;
flex-direction: column;
}
form {
display: flex;
flex-direction: column;
}
label {
margin-bottom: 10px;
}
input {
padding: 10px;
margin-top: 5px;
margin-bottom: 15px;
border: 1px solid #ccc;
border-radius: 5px;
}
button {
padding: 10px 20px;
border: none;
background-color: #007bff;
color: white;
cursor: pointer;
border-radius: 5px;
}
button:hover {
background-color: #0056b3;
}
\ No newline at end of file
// checkout.js
import React, { useState } from "react";
import "./checkout.css";
export const Checkout = () => {
const [isOrderPlaced, setIsOrderPlaced] = useState(false);
const handleOrderSubmit = (event) => {
event.preventDefault();
setIsOrderPlaced(true);
// 模拟一个网络请求
setTimeout(() => {
setIsOrderPlaced(false);
alert("Your order has been successfully placed!");
}, 1000);
};
return (
<div className="checkout">
<div className="checkoutTitle">
<h1>Checkout</h1>
</div>
<div className="checkoutContent">
<form onSubmit={handleOrderSubmit}>
<h2>Shipping Address</h2>
<label>
Name:
<input type="text" name="name" required />
</label>
<label>
Address:
<input type="text" name="address" required />
</label>
<label>
City:
<input type="text" name="city" required />
</label>
<label>
State:
<input type="text" name="state" required />
</label>
<label>
Zip Code:
<input type="text" name="zip" required />
</label>
<label>
Country:
<input type="text" name="country" required />
</label>
<h2>Payment Information</h2>
<label>
Card Number:
<input type="text" name="cardNumber" required />
</label>
<label>
Expiration Date:
<input type="text" name="expirationDate" required />
</label>
<label>
CVV:
<input type="text" name="cvv" required />
</label>
<button type="submit" disabled={isOrderPlaced}>
{isOrderPlaced ? "Placing Order..." : "Place Order"}
</button>
</form>
</div>
</div>
);
};
.contact {
padding: 20px;
max-width: 800px;
margin: auto;
}
.contactTitle {
text-align: center;
margin-bottom: 20px;
}
.contactContent {
display: flex;
flex-direction: column;
}
.contactForm, .contactInfo {
margin-bottom: 20px;
}
.contactForm form {
display: flex;
flex-direction: column;
}
.contactForm label {
margin-bottom: 10px;
}
.contactForm input, .contactForm textarea {
padding: 10px;
margin-top: 5px;
margin-bottom: 15px;
border: 1px solid #ccc;
border-radius: 5px;
}
.contactForm button {
padding: 10px 20px;
border: none;
background-color: #007bff;
color: white;
cursor: pointer;
border-radius: 5px;
}
.contactForm button:hover {
background-color: #0056b3;
}
.contactInfo p {
margin: 10px 0;
}
.socialMediaLinks a {
display: inline-block;
margin-right: 10px;
text-decoration: none;
color: #007bff;
}
.socialMediaLinks a:hover {
text-decoration: underline;
}
\ No newline at end of file
import React from "react"; // contact.js
import React, { useState } from "react";
import "./contact.css";
export const Contact = () => { export const Contact = () => {
return <div>contact</div>; const [isSubmitted, setIsSubmitted] = useState(false);
const handleSubmit = (event) => {
event.preventDefault();
setIsSubmitted(true);
// 模拟一个网络请求
setTimeout(() => {
setIsSubmitted(false);
alert("Your message has been successfully submitted!");
}, 1000);
};
return (
<div className="contact">
<div className="contactTitle">
<h1>Contact Us</h1>
</div>
<div className="contactContent">
<div className="contactForm">
<h2>Get in Touch</h2>
<form onSubmit={handleSubmit}>
<label>
Name:
<input type="text" name="name" required />
</label>
<label>
Email:
<input type="email" name="email" required />
</label>
<label>
Message:
<textarea name="message" rows="5" required></textarea>
</label>
<button type="submit" disabled={isSubmitted}>
{isSubmitted ? "Submitting..." : "Submit"}
</button>
</form>
</div>
<div className="contactInfo">
<h2>Contact Information</h2>
<p><b>Address:</b> 123 ProTech Street, Tech City, TC 12345</p>
<p><b>Phone:</b> (123) 456-7890</p>
<p><b>Email:</b> support@protechshop.com</p>
<h2>Working Hours</h2>
<p><b>Monday - Friday:</b> 9:00 AM - 6:00 PM</p>
<p><b>Saturday:</b> 10:00 AM - 4:00 PM</p>
<p><b>Sunday:</b> Closed</p>
<h2>Follow Us</h2>
<div className="socialMediaLinks">
<a href="https://www.facebook.com/protechshop" target="_blank" rel="noopener noreferrer">Facebook</a>
<a href="https://www.twitter.com/protechshop" target="_blank" rel="noopener noreferrer">Twitter</a>
<a href="https://www.instagram.com/protechshop" target="_blank" rel="noopener noreferrer">Instagram</a>
</div>
</div>
</div>
</div>
);
}; };
import React from "react"; import React, { useEffect, useState } from "react";
import { PRODUCTS } from "../../products"; import { db } from "./firebaseConfig";
import { Product } from "./product"; import { collection, getDocs } from "firebase/firestore";
import "./shop.css"; import "./shop.css";
export const Shop = () => { export const Shop = () => {
const [products, setProducts] = useState([]);
useEffect(() => {
const fetchProducts = async () => {
const productsCollection = collection(db, "products");
const productSnapshot = await getDocs(productsCollection);
const productList = productSnapshot.docs.map(doc => ({
id: doc.id,
...doc.data()
}));
setProducts(productList);
};
fetchProducts();
}, []);
return ( return (
<div className="shop"> <div className="shop">
<div className="shopTitle"> <div className="shopTitle">
<h1>PedroTech Shop</h1> <h1>ProTech Shop</h1>
</div> </div>
<div className="products"> <div className="products">
{PRODUCTS.map((product) => ( {products.map((product) => (
<Product data={product} /> <div className="product" key={product.id}>
<p><b>{product.productName}</b></p>
<p>${product.price}</p>
</div>
))} ))}
</div> </div>
</div> </div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment