From b3f64dfe2a857fd1a297f091b87d7234388705d7 Mon Sep 17 00:00:00 2001 From: Isaacc20 Date: Fri, 2 Feb 2024 14:40:00 +0100 Subject: [PATCH 1/7] paystack bug --- package-lock.json | 10 +++ package.json | 1 + src/Components/Display.jsx | 43 ++++++++-- src/Pages/Cart.jsx | 53 ++++++++----- src/Pages/Checkout.jsx | 157 +++++++++++++++++++++++++++++++++---- src/Redux/OrderSlice.jsx | 36 +++++++++ src/Redux/Store.jsx | 4 +- 7 files changed, 262 insertions(+), 42 deletions(-) create mode 100644 src/Redux/OrderSlice.jsx diff --git a/package-lock.json b/package-lock.json index 32d7014..d4c45e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "react-dom": "^18.2.0", "react-email": "2.0.0", "react-icons": "^4.12.0", + "react-paystack": "^5.0.0", "react-redux": "^9.1.0", "react-router-dom": "^6.20.1", "react-toastify": "^9.1.3", @@ -7857,6 +7858,15 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-paystack": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-paystack/-/react-paystack-5.0.0.tgz", + "integrity": "sha512-d7oA+ksX0GES2Uyh9H6E8Oq4yD/r3CDVfhKpZCjcztW2IIVf6pldscRs6+gFfGWWk9IvEK2G6QqZmaGKlbGHhw==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-redux": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", diff --git a/package.json b/package.json index e0c96a6..59d82dd 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "react-dom": "^18.2.0", "react-email": "2.0.0", "react-icons": "^4.12.0", + "react-paystack": "^5.0.0", "react-redux": "^9.1.0", "react-router-dom": "^6.20.1", "react-toastify": "^9.1.3", diff --git a/src/Components/Display.jsx b/src/Components/Display.jsx index e072224..e670488 100644 --- a/src/Components/Display.jsx +++ b/src/Components/Display.jsx @@ -14,6 +14,7 @@ import { add } from "../Redux/cartSlice"; const Display = () => { const { isFetchingBooks, books, fetchingBooksFailed } = useSelector((state)=>state.BookSlice) const { isFetchingProducts, products, fetchingProductsFailed } = useSelector((state)=>state.productSlice) + // const [addCart, setaddCart] = useState() const cart = JSON.parse(localStorage.getItem('cart')) || [] const dispatch = useDispatch() const navigate = useNavigate() @@ -27,9 +28,38 @@ const Display = () => { if (book) { cart.push(book) localStorage.setItem('cart', JSON.stringify(cart)) + // setaddCart( + // + // ) } else if (product) { cart.push(product) localStorage.setItem('cart', JSON.stringify(cart)) + // setaddCart( + // + // ) + } + } + + const find = (val) => { + let get = cart.find(el=>el.id == val.id) + if (get) { + // setaddCart( + // + // ) + return ( + + ) + } else { + // setaddCart( + // + // ) + return ( + + ) } } @@ -50,9 +80,10 @@ const Display = () => { {el.data.author}
$ {el.data.price} - + { + find(el) + } +
)) @@ -67,9 +98,9 @@ const Display = () => { {/* {el.data.author} */}
$ {el.data.price} - + { + find(el) + }
)) diff --git a/src/Pages/Cart.jsx b/src/Pages/Cart.jsx index fc712a0..c6b7eeb 100644 --- a/src/Pages/Cart.jsx +++ b/src/Pages/Cart.jsx @@ -7,6 +7,7 @@ import { useDispatch, useSelector } from 'react-redux'; const Cart = () => { const [cart, setcart] = useState(JSON.parse(localStorage.getItem('cart'))) + const [amount, setamount] = useState(0) const dispatch = useDispatch() useEffect(() => { @@ -17,7 +18,7 @@ const Cart = () => { console.log(val); const productIndex = cart.findIndex(el=> el.id == val) // console.log(product); - cart.pop(productIndex) + cart.splice(productIndex, 1) localStorage.setItem('cart', JSON.stringify(cart)) setcart(JSON.parse(localStorage.getItem('cart'))) } @@ -28,28 +29,40 @@ const Cart = () => {

Cart

- - + { (cart && cart.length > 0) ? - cart.map((el, i)=>( - - - - - - - - )): +
- {el.data.name || el.data.title}
- { el.data.author && {el.data.author} } -
₦ {el.data.price} - Checkout - -
Nothing here
+ + { + cart.map((el, i)=>( + + + + {/* */} + + + + )) + } + + + + + + + + +
+ {el.data.name || el.data.title}
+ { el.data.author && {el.data.author} } +
₦ {el.data.price} + Checkout + +
+ Checkout all +
: Nothing here } - - ) diff --git a/src/Pages/Checkout.jsx b/src/Pages/Checkout.jsx index a38ae62..917a9d0 100644 --- a/src/Pages/Checkout.jsx +++ b/src/Pages/Checkout.jsx @@ -1,49 +1,127 @@ import React, { useEffect, useState } from 'react' import '../Styles/Checkout.css' import { MdShoppingCartCheckout } from "react-icons/md"; -import { useParams } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; import { useFormik } from 'formik'; import * as yup from 'yup' +import { useDispatch } from 'react-redux'; +import { isSendingOrder, sentOrder, failedSendingOrder } from "../Redux/OrderSlice"; +import { addDoc, collection, doc, getDocs } from 'firebase/firestore'; +import { db } from '../Firebase'; +import { ToastContainer, toast } from 'react-toastify'; +import { PaystackButton } from 'react-paystack'; const Checkout = () => { const [cart, setcart] = useState(JSON.parse(localStorage.getItem('cart'))) const [product, setproduct] = useState() + const [amount, setamount] = useState((0 + '00')) + const [allPrices, setallPrices] = useState() + const [allCopy, setallCopy] = useState() + const [isLoading, setisLoading] = useState(false) + const publicKey = "pk_test_b25929938288a8363832f759f9d5460cffedd2e5" + const navigate = useNavigate() + const dispatch = useDispatch() const route = useParams() const id = route.id + const componentProps = { + email: formik.values.email, + amount, + metadata: { + name: formik.values.name, + phone: formik.values.number1, + }, + publicKey, + text: "Pay Now", + onSuccess: () => + alert("Thanks for doing business with us! Come back soon!!"), + onClose: () => alert("Wait! You need this oil, don't go!!!!"), + } + useEffect(() => { const find = cart.find(el=>el.id == id) if (find) { - setproduct(find) + setproduct([find]) + } else if (id == 'all') { + setproduct(cart) + } else { + navigate('/notfound') } }, []) + useEffect(() => { + if (product && product.length > 0) { + setamount(+(0 + '00')) + let prices = [] + let sum = 0 + product.forEach((el, i) => { + el.copies = 1 + + let price = Number(el.data.price) * Number(el.copies) + console.log(el.data.price, el.copies, price); + prices = [...prices, price] + // console.log(price, prices); + }); + for (let i = 0; i < prices.length; i++) { + sum += prices[i]; + } + console.log(sum, prices); + setallPrices(prices) + setamount(+(sum + '00')) + } + }, [product]) + + const formik = useFormik({ initialValues: { name: '', - phoneNumber: '', - alternativeNumber: '', - location: '' + email: '', + number1: '', + number2: '', + location: '', + products: product }, validationSchema: yup.object({ - name: yup.string().required(), - phoneNumber: yup.number().required(), - alternativeNumber: yup.number().required(), - location: yup.string().required() + name: yup.string().trim().required(), + email: yup.string().trim().required(), + number1: yup.number().required(), + number2: yup.number().required(), + location: yup.string().trim().required(), + products: yup.array() }), onSubmit: (values) => { console.log(values); + placeOrder(values) } }) + const placeOrder = async(values)=>{ + setisLoading(true) + + dispatch(isSendingOrder()) + const orderCollection = collection(db, 'Orders'); + await addDoc(orderCollection, values).then((res)=>{ + console.log(res); + // dispatch(sentOrder(res)) + setisLoading(false) + toast.success('Order successful') + }).catch((err)=>{ + console.log(err); + dispatch(failedSendingOrder(err.message)) + setisLoading(false) + toast.error('Something went wrong') + }) + } + return ( <>
+

Checkout

-
+
#To complete your order, we'll need a few information about you
Do well to fill the following form accordingly !
@@ -51,15 +129,23 @@ const Checkout = () => {
+
@@ -68,10 +154,51 @@ const Checkout = () => {
+
+
Products
+
+ { + (product && product.length > 0) && + product.map((el, i)=>( + + )) + } +
+
+
+
Total amount: ₦ {amount}
+
{/*
Payment option
@@ -94,7 +221,7 @@ const Checkout = () => {
*/} -
+
diff --git a/src/Redux/OrderSlice.jsx b/src/Redux/OrderSlice.jsx new file mode 100644 index 0000000..ef15abd --- /dev/null +++ b/src/Redux/OrderSlice.jsx @@ -0,0 +1,36 @@ +import { createSlice } from "@reduxjs/toolkit"; + +const initialState = { + sendingOrder : false, + order : null, + sendingOrderFailed: false +} + +const OrderSlice = createSlice({ + name: 'OrderSlice', + initialState, + reducers: { + isSendingOrder: (state) => { + state.sendingOrder = true, + state.order = null, + state.sendingOrderFailed = false + }, + SentOrder: (state, action) => { + state.sendingOrder = false, + state.order = action.payload, + state.sendingOrderFailed = false + }, + failedSendingOrder: (state, action) => { + state.sendingOrder = false, + state.order = null, + state.sendingOrderFailed = true + } + } +}) + +export default OrderSlice.reducer +export const { + isSendingOrder, + sentOrder, + failedSendingOrder +} = OrderSlice.actions \ No newline at end of file diff --git a/src/Redux/Store.jsx b/src/Redux/Store.jsx index 7af6d57..d5470b8 100644 --- a/src/Redux/Store.jsx +++ b/src/Redux/Store.jsx @@ -2,11 +2,13 @@ import { configureStore } from "@reduxjs/toolkit"; import productSlice from "./productSlice"; import BookSlice from "./BookSlice"; import cartSlice from "./cartSlice"; +import OrderSlice from "./OrderSlice"; export const store = configureStore({ reducer:{ productSlice, BookSlice, - cartSlice + cartSlice, + OrderSlice } }) \ No newline at end of file From 094b8b46dab6b9d6035669df0800cc98ae689f71 Mon Sep 17 00:00:00 2001 From: Isaacc20 Date: Fri, 2 Feb 2024 19:49:58 +0100 Subject: [PATCH 2/7] paystack persistent bug --- package-lock.json | 1376 +++++++++++++++++++++------------------- src/Pages/Cart.jsx | 60 +- src/Pages/Checkout.jsx | 176 +++-- 3 files changed, 873 insertions(+), 739 deletions(-) diff --git a/package-lock.json b/package-lock.json index d4c45e7..b142788 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,21 +91,21 @@ } }, "node_modules/@babel/core": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", - "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.5", - "@babel/parser": "^7.23.5", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -121,12 +121,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.5", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -136,14 +136,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -276,14 +276,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", - "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -303,9 +303,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -356,34 +356,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -391,9 +391,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -809,9 +809,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dependencies": { "type-fest": "^0.20.2" }, @@ -822,10 +822,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -839,14 +850,14 @@ } }, "node_modules/@firebase/analytics": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.1.tgz", + "integrity": "sha512-5mnH1aQa99J5lZMJwTNzIoRc4yGXHf+fOn+EoEWhCDA3XGPweGHcylCbqq+G1wVJmfILL57fohDMa8ftMZ+44g==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -854,14 +865,14 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.7.tgz", + "integrity": "sha512-17VCly4P0VFBDqaaal7m1nhyYQwsygtaTpSsnc51sFPRrr9XIYtnD8ficon9fneEGEoJQ2g7OtASvhwX9EbK8g==", "dependencies": { - "@firebase/analytics": "0.10.0", + "@firebase/analytics": "0.10.1", "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -874,25 +885,25 @@ "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" }, "node_modules/@firebase/app": { - "version": "0.9.26", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.26.tgz", - "integrity": "sha512-zCjo6KhNhbuFB+V+Z4H9g4+BZ78E7n3ShxaBtuIcRkpwdm7+1BsafzChOsDYuI86m97HUWsyLPurLBhqcupFFA==", + "version": "0.9.27", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.27.tgz", + "integrity": "sha512-p2Dvl1ge4kRsyK5+wWcmdAIE9MSwZ0pDKAYB51LZgZuz6wciUZk4E1yAEdkfQlRxuHehn+Ol9WP5Qk2XQZiHGg==", "dependencies": { - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "idb": "7.1.1", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-check": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.1.tgz", - "integrity": "sha512-zi3vbM5tb/eGRWyiqf+1DXbxFu9Q07dnm46rweodgUpH9B8svxYkHfNwYWx7F5mjHU70SQDuaojH1We5ws9OKA==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.2.tgz", + "integrity": "sha512-A2B5+ldOguYAeqW1quFN5qNdruSNRrg4W59ag1Eq6QzxuHNIkrE+TrapfrW/z5NYFjCxAYqr/unVCgmk80Dwcg==", "dependencies": { - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -900,15 +911,15 @@ } }, "node_modules/@firebase/app-check-compat": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.8.tgz", - "integrity": "sha512-EaETtChR4UgMokJFw+r6jfcIyCTUZSe0a6ivF37D9MxlG9G3wzK1COyXgxoX96GzXmDPc2aubX4PxCrdVHhrnA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.9.tgz", + "integrity": "sha512-7LxyupQ8XeEHRh72mO+tqm69kHT6KbWi2KtFMGedJ6tNbwzFzojcXESMKN8RpADXbYoQgY3loWMJjMx4r2Zt7w==", "dependencies": { - "@firebase/app-check": "0.8.1", + "@firebase/app-check": "0.8.2", "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -926,14 +937,14 @@ "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" }, "node_modules/@firebase/app-compat": { - "version": "0.2.26", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.26.tgz", - "integrity": "sha512-tVNOYvB3lIFkN3RmcTieo5qYRIkYak9iC6E7dZMxax52uMIUJiIKKtPkarbwZh6EnUxru5hJRo8tfUZGuaQDQw==", + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.27.tgz", + "integrity": "sha512-SYlqocfUDKPHR6MSFC8hree0BTiWFu5o8wbf6zFlYXyG41w7TcHp4wJi4H/EL5V6cM4kxwruXTJtqXX/fRAZtw==", "dependencies": { - "@firebase/app": "0.9.26", - "@firebase/component": "0.6.4", + "@firebase/app": "0.9.27", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" } }, @@ -943,13 +954,13 @@ "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" }, "node_modules/@firebase/auth": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.5.1.tgz", - "integrity": "sha512-sVi7rq2YneLGJFqHa5S6nDfCHix9yuVV3RLhj/pWPlB4a36ofXal4E6PJwpeMc8uLjWEr1aovYN1jkXWNB6Avw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.0.tgz", + "integrity": "sha512-Qhl35eJTV6BwvuueTPCY6x8kUlYyzALtjp/Ws0X3fw3AnjVVfuVb7oQ3Xh5VPVfMFhaIuUAd1KXwcAuIklkSDw==", "dependencies": { - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0", "undici": "5.26.5" }, @@ -964,14 +975,14 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.1.tgz", - "integrity": "sha512-rgDZnrDoekRvtzXVji8Z61wxxkof6pTkjYEkybILrjM8tGP9tx4xa9qGpF4ax3AzF+rKr7mIa9NnoXEK4UNqmQ==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.2.tgz", + "integrity": "sha512-pRgje5BPCNR1vXyvGOVXwOHtv88A2WooXfklI8sV7/jWi03ExFqNfpJT26GUo/oD39NoKJ3Kt6rD5gVvdV7lMw==", "dependencies": { - "@firebase/auth": "1.5.1", + "@firebase/auth": "1.6.0", "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", "tslib": "^2.1.0", "undici": "5.26.5" }, @@ -994,58 +1005,58 @@ } }, "node_modules/@firebase/component": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", - "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.5.tgz", + "integrity": "sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==", "dependencies": { - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.2.tgz", - "integrity": "sha512-8X6NBJgUQzDz0xQVaCISoOLINKat594N2eBbMR3Mu/MH/ei4WM+aAMlsNzngF22eljXu1SILP5G3evkyvsG3Ng==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.3.tgz", + "integrity": "sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==", "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-compat": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.2.tgz", - "integrity": "sha512-09ryJnXDvuycsxn8aXBzLhBTuCos3HEnCOBWY6hosxfYlNCGnLvG8YMlbSAt5eNhf7/00B095AEfDsdrrLjxqA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.3.tgz", + "integrity": "sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "1.0.2", - "@firebase/database-types": "1.0.0", + "@firebase/component": "0.6.5", + "@firebase/database": "1.0.3", + "@firebase/database-types": "1.0.1", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", - "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.1.tgz", + "integrity": "sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==", "dependencies": { "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" + "@firebase/util": "1.9.4" } }, "node_modules/@firebase/firestore": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.1.tgz", - "integrity": "sha512-LCWZZ+rgNET1qw3vpugmGCJZVbz7c5NkgKect5pZn36gaBzGVb8+pRQ8WSZ1veYVMOK6SKrBkS1Rw6EqcmPnyw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.2.tgz", + "integrity": "sha512-YaX6ypa/RzU6OkxzUQlpSxwhOIWdTraCNz7sMsbaSEjjl/pj/QvX6TqjkdWGzuBYh2S6rz7ErhDO0g39oZZw/g==", "dependencies": { - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "@firebase/webchannel-wrapper": "0.10.5", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", @@ -1060,14 +1071,14 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.24.tgz", - "integrity": "sha512-Wj5cgqmQwTnqHS4KabOpXCNIaSTtVDP1NitnhjXff04Q4QK0aeIbeO1TPlSSTmUb6S7KzoKD4XR99hfKZDYbfA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.25.tgz", + "integrity": "sha512-+xI7WmsgZCBhMn/+uhDKcg+lsOUJ9FJyt5PGTzkFPbCsozWfeQZ7eVnfPh0rMkUOf0yIQ924RIe04gwvEIbcoQ==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/firestore": "4.4.1", + "@firebase/component": "0.6.5", + "@firebase/firestore": "4.4.2", "@firebase/firestore-types": "3.0.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1084,15 +1095,15 @@ } }, "node_modules/@firebase/functions": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.0.tgz", - "integrity": "sha512-n1PZxKnJ++k73Q8khTPwihlbeKo6emnGzE0hX6QVQJsMq82y/XKmNpw2t/q30VJgwaia3ZXU1fd1C5wHncL+Zg==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.1.tgz", + "integrity": "sha512-3uUa1hB79Gmy6E1gHTfzoHeZolBeHc/I/n3+lOCDe6BOos9AHmzRjKygcFE/7VA2FJjitCE0K+OHI6+OuoY8fQ==", "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0", "undici": "5.26.5" }, @@ -1101,14 +1112,14 @@ } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.6.tgz", - "integrity": "sha512-RQpO3yuHtnkqLqExuAT2d0u3zh8SDbeBYK5EwSCBKI9mjrFeJRXBnd3pEG+x5SxGJLy56/5pQf73mwt0OuH5yg==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.7.tgz", + "integrity": "sha512-uXe6Kmku5lNogp3OpPBcOJbSvnaCOn+YxS3zlXKNU6Q/NLwcvO3RY1zwYyctCos2RemEw3KEQ7YdzcECXjHWLw==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/functions": "0.11.0", + "@firebase/component": "0.6.5", + "@firebase/functions": "0.11.1", "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1121,13 +1132,13 @@ "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" }, "node_modules/@firebase/installations": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.5.tgz", + "integrity": "sha512-0xxnQWw8rSRzu0ZOCkZaO+MJ0LkDAfwwTB2Z1SxRK6FAz5xkxD1ZUwM0WbCRni49PKubCrZYOJ6yg7tSjU7AKA==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "idb": "7.0.1", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1135,14 +1146,14 @@ } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.5.tgz", + "integrity": "sha512-usvoIaog5CHEw082HXLrKAZ1qd4hIC3N/LDe2NqBgI3pkGE/7auLVM4Gn5gvyryp0x8z/IP1+d9fkGUj2OaGLQ==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1157,11 +1168,6 @@ "@firebase/app-types": "0.x" } }, - "node_modules/@firebase/installations/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" - }, "node_modules/@firebase/logger": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", @@ -1171,14 +1177,14 @@ } }, "node_modules/@firebase/messaging": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.5.tgz", - "integrity": "sha512-i/rrEI2k9ueFhdIr8KQsptWGskrsnkC5TkohCTrJKz9P0C/PbNv14IAMkwhMJTqIur5VwuOnrUkc9Kdz7awekw==", + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.6.tgz", + "integrity": "sha512-IORsPp9IPWq4j4yEhTOZ6GAGi3gQwGc+4yexmTAlya+qeBRSdRnJg2iIU/aj+tcKDQYr9RQuQPgHHOdFIx//vA==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -1187,13 +1193,13 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.5.tgz", - "integrity": "sha512-qHQZxm4hEG8/HFU/ls5/bU+rpnlPDoZoqi3ATMeb6s4hovYV9+PfV5I7ZrKV5eFFv47Hx1PWLe5uPnS4e7gMwQ==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.6.tgz", + "integrity": "sha512-Q2xC1s4L7Vpss7P7Gy6GuIS+xmJrf/vm9+gX76IK1Bo1TjoKwleCLHt1LHkPz5Rvqg5pTgzzI8qqPhBpZosFCg==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/messaging": "0.12.5", - "@firebase/util": "1.9.3", + "@firebase/component": "0.6.5", + "@firebase/messaging": "0.12.6", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1206,14 +1212,14 @@ "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" }, "node_modules/@firebase/performance": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.5.tgz", + "integrity": "sha512-OzAGcWhOqEFH9GdwUuY0oC5FSlnMejcnmSAhR+EjpI7exdDvixyLyCR4txjSHYNTbumrFBG+EP8GO11CNXRaJA==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1221,15 +1227,15 @@ } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.5.tgz", + "integrity": "sha512-jJwJkVyDcIMBaVGrZ6CRGs4m5FCZsWB5QCWYI3FdsHyIa9/TfteNDilxj9wGciF2naFIHDW7TgE69U5dAH9Ktg==", "dependencies": { - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.4", + "@firebase/performance": "0.6.5", "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1242,14 +1248,14 @@ "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" }, "node_modules/@firebase/remote-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.5.tgz", + "integrity": "sha512-rGLqc/4OmxrS39RA9kgwa6JmgWytQuMo+B8pFhmGp3d++x2Hf9j+MLQfhOLyyUo64fNw20J19mLXhrXvKHsjZQ==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1257,15 +1263,15 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.5.tgz", + "integrity": "sha512-ImkNnLuGrD/bylBHDJigSY6LMwRrwt37wQbsGZhWG4QQ6KLzHzSf0nnFRRFvkOZodEUE57Ib8l74d6Yn/6TDUQ==", "dependencies": { - "@firebase/component": "0.6.4", + "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.4", + "@firebase/remote-config": "0.4.5", "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1278,12 +1284,12 @@ "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" }, "node_modules/@firebase/storage": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.0.tgz", - "integrity": "sha512-SGs02Y/mmWBRsqZiYLpv4Sf7uZYZzMWVNN+aKiDqPsFBCzD6hLvGkXz+u98KAl8FqcjgB8BtSu01wm4pm76KHA==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.1.tgz", + "integrity": "sha512-KJ5NV7FUh54TeTlEjdkTTX60ciCKOp9EqlbLnpdcXUYRJg0Z4810TXbilPc1z7fTIG4iPjtdi95bGE9n4dBX8A==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", "tslib": "^2.1.0", "undici": "5.26.5" }, @@ -1292,14 +1298,14 @@ } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.3.tgz", - "integrity": "sha512-WNtjYPhpOA1nKcRu5lIodX0wZtP8pI0VxDJnk6lr+av7QZNS1s6zvr+ERDTve+Qu4Hq/ZnNaf3kBEQR2ccXn6A==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.4.tgz", + "integrity": "sha512-Y0m5e2gS/wB9Ioth2X/Sgz76vcxvqgQrCmfa9qwhss/N31kxY2Gks6Frv0nrE18AjVfcSmcfDitqUwxcMOTRSg==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/storage": "0.12.0", + "@firebase/component": "0.6.5", + "@firebase/storage": "0.12.1", "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1316,9 +1322,9 @@ } }, "node_modules/@firebase/util": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", - "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.4.tgz", + "integrity": "sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==", "dependencies": { "tslib": "^2.1.0" } @@ -1329,28 +1335,28 @@ "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", + "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", "dependencies": { - "@floating-ui/core": "^1.5.3", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.6.tgz", - "integrity": "sha512-IB8aCRFxr8nFkdYZgH+Otd9EVQPJoynxeFRGTB8voPoZMRWo8XjYuCRgpI1btvuKY69XMiLnW+ym7zoBHM90Rw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", "dependencies": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.6.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -1392,12 +1398,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -1417,9 +1423,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -1448,38 +1454,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -1494,22 +1468,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -1554,9 +1512,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2726,17 +2684,17 @@ } }, "node_modules/@remix-run/router": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz", - "integrity": "sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz", + "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==", "engines": { "node": ">=14.0.0" } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.7.0.tgz", - "integrity": "sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", "cpu": [ "arm" ], @@ -2747,9 +2705,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.7.0.tgz", - "integrity": "sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", "cpu": [ "arm64" ], @@ -2760,9 +2718,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.7.0.tgz", - "integrity": "sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", "cpu": [ "arm64" ], @@ -2773,9 +2731,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.7.0.tgz", - "integrity": "sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", "cpu": [ "x64" ], @@ -2786,9 +2744,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.7.0.tgz", - "integrity": "sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", "cpu": [ "arm" ], @@ -2799,9 +2757,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.7.0.tgz", - "integrity": "sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", "cpu": [ "arm64" ], @@ -2812,9 +2770,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.7.0.tgz", - "integrity": "sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", "cpu": [ "arm64" ], @@ -2825,9 +2783,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.7.0.tgz", - "integrity": "sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", "cpu": [ "riscv64" ], @@ -2838,9 +2796,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.7.0.tgz", - "integrity": "sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", "cpu": [ "x64" ], @@ -2851,9 +2809,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.7.0.tgz", - "integrity": "sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", "cpu": [ "x64" ], @@ -2864,9 +2822,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.7.0.tgz", - "integrity": "sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", "cpu": [ "arm64" ], @@ -2877,9 +2835,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.7.0.tgz", - "integrity": "sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", "cpu": [ "ia32" ], @@ -2890,9 +2848,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.7.0.tgz", - "integrity": "sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", "cpu": [ "x64" ], @@ -3138,9 +3096,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" @@ -3157,9 +3115,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -3221,9 +3179,9 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" }, "node_modules/@types/node": { - "version": "20.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", - "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", + "version": "20.11.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", + "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -3244,9 +3202,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "18.2.42", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.42.tgz", - "integrity": "sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA==", + "version": "18.2.51", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.51.tgz", + "integrity": "sha512-XeoMaU4CzyjdRr3c4IQQtiH7Rpo18V07rYZUucEZQwOUEtGgTXv7e6igQiQ+xnV6MbMe1qjEmKdgMNnfppnXfg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3254,9 +3212,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", - "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", + "version": "18.2.18", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", + "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", "dependencies": { "@types/react": "*" } @@ -3467,9 +3425,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -3730,9 +3688,9 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", "dev": true, "engines": { "node": ">= 0.4" @@ -3742,11 +3700,11 @@ } }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -3845,9 +3803,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "funding": [ { "type": "opencollective", @@ -3863,8 +3821,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -3969,9 +3927,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001566", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", - "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "version": "1.0.30001583", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz", + "integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==", "funding": [ { "type": "opencollective", @@ -4093,6 +4051,70 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -4102,9 +4124,9 @@ } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", "engines": { "node": ">=6" } @@ -4491,9 +4513,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/electron-to-chromium": { - "version": "1.4.609", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.609.tgz", - "integrity": "sha512-ihiCP7PJmjoGNuLpl7TjNA8pCQWu09vGyjlPYw1Rqww4gvNuCcmvl+44G+2QyJ6S2K4o+wbTS++Xz0YN8Q9ERw==" + "version": "1.4.655", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.655.tgz", + "integrity": "sha512-2yszojF7vIZ68adIOvzV4bku8OZad9w5H9xF3ZAMZjPuOjBarlflUkjN6DggdV+L71WZuKUfKUhov/34+G5QHg==" }, "node_modules/emailjs": { "version": "4.0.3", @@ -4512,9 +4534,9 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/engine.io": { "version": "6.5.4", @@ -4761,14 +4783,14 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4993,9 +5015,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dependencies": { "type-fest": "^0.20.2" }, @@ -5025,6 +5047,17 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -5129,9 +5162,9 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", "dependencies": { "reusify": "^1.0.4" } @@ -5185,36 +5218,36 @@ } }, "node_modules/firebase": { - "version": "10.7.2", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.7.2.tgz", - "integrity": "sha512-zED3kAJyf+Xx5tXpC3vjmlWTm/SIVoJJ6MOLuXYJkqKAUJLG7Q1Jxy6l1DxCzGgBqZHxc0Jh6q+qG++9kimHsw==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-compat": "0.2.6", - "@firebase/app": "0.9.26", - "@firebase/app-check": "0.8.1", - "@firebase/app-check-compat": "0.3.8", - "@firebase/app-compat": "0.2.26", + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.8.0.tgz", + "integrity": "sha512-UJpC24vw8JFuHEOQyArBGKTUd7+kohLISCzHyn0M/prP0KOTx2io1eyLliEid330QqnWI7FOlPxoU97qecCSfQ==", + "dependencies": { + "@firebase/analytics": "0.10.1", + "@firebase/analytics-compat": "0.2.7", + "@firebase/app": "0.9.27", + "@firebase/app-check": "0.8.2", + "@firebase/app-check-compat": "0.3.9", + "@firebase/app-compat": "0.2.27", "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.5.1", - "@firebase/auth-compat": "0.5.1", - "@firebase/database": "1.0.2", - "@firebase/database-compat": "1.0.2", - "@firebase/firestore": "4.4.1", - "@firebase/firestore-compat": "0.3.24", - "@firebase/functions": "0.11.0", - "@firebase/functions-compat": "0.3.6", - "@firebase/installations": "0.6.4", - "@firebase/installations-compat": "0.2.4", - "@firebase/messaging": "0.12.5", - "@firebase/messaging-compat": "0.2.5", - "@firebase/performance": "0.6.4", - "@firebase/performance-compat": "0.2.4", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-compat": "0.2.4", - "@firebase/storage": "0.12.0", - "@firebase/storage-compat": "0.3.3", - "@firebase/util": "1.9.3" + "@firebase/auth": "1.6.0", + "@firebase/auth-compat": "0.5.2", + "@firebase/database": "1.0.3", + "@firebase/database-compat": "1.0.3", + "@firebase/firestore": "4.4.2", + "@firebase/firestore-compat": "0.3.25", + "@firebase/functions": "0.11.1", + "@firebase/functions-compat": "0.3.7", + "@firebase/installations": "0.6.5", + "@firebase/installations-compat": "0.2.5", + "@firebase/messaging": "0.12.6", + "@firebase/messaging-compat": "0.2.6", + "@firebase/performance": "0.6.5", + "@firebase/performance-compat": "0.2.5", + "@firebase/remote-config": "0.4.5", + "@firebase/remote-config-compat": "0.2.5", + "@firebase/storage": "0.12.1", + "@firebase/storage-compat": "0.3.4", + "@firebase/util": "1.9.4" } }, "node_modules/flat-cache": { @@ -5236,9 +5269,9 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -5278,17 +5311,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/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==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -5471,19 +5493,21 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5505,6 +5529,28 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -5632,12 +5678,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5741,9 +5787,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } @@ -6138,12 +6184,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -6300,49 +6346,6 @@ "node": ">=14" } }, - "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/js-beautify/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6664,18 +6667,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7318,9 +7309,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { "node": "14 || >=16.14" } @@ -7539,6 +7530,14 @@ "react": ">=16.0.0" } }, + "node_modules/prism-react-renderer/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", @@ -7754,14 +7753,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/react-email/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, "node_modules/react-email/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -7948,11 +7939,11 @@ } }, "node_modules/react-router": { - "version": "6.20.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz", - "integrity": "sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz", + "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==", "dependencies": { - "@remix-run/router": "1.13.1" + "@remix-run/router": "1.15.0" }, "engines": { "node": ">=14.0.0" @@ -7962,12 +7953,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.20.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz", - "integrity": "sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz", + "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==", "dependencies": { - "@remix-run/router": "1.13.1", - "react-router": "6.20.1" + "@remix-run/router": "1.15.0", + "react-router": "6.22.0" }, "engines": { "node": ">=14.0.0" @@ -8011,6 +8002,14 @@ "react-dom": ">=16" } }, + "node_modules/react-toastify/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -8281,6 +8280,11 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8304,11 +8308,33 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz", - "integrity": "sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, @@ -8317,19 +8343,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.7.0", - "@rollup/rollup-android-arm64": "4.7.0", - "@rollup/rollup-darwin-arm64": "4.7.0", - "@rollup/rollup-darwin-x64": "4.7.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.7.0", - "@rollup/rollup-linux-arm64-gnu": "4.7.0", - "@rollup/rollup-linux-arm64-musl": "4.7.0", - "@rollup/rollup-linux-riscv64-gnu": "4.7.0", - "@rollup/rollup-linux-x64-gnu": "4.7.0", - "@rollup/rollup-linux-x64-musl": "4.7.0", - "@rollup/rollup-win32-arm64-msvc": "4.7.0", - "@rollup/rollup-win32-ia32-msvc": "4.7.0", - "@rollup/rollup-win32-x64-msvc": "4.7.0", + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", "fsevents": "~2.3.2" } }, @@ -8356,13 +8382,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -8393,15 +8419,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8460,15 +8489,16 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dev": true, "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8523,6 +8553,25 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -8538,9 +8587,15 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/socket.io": { "version": "4.7.3", @@ -8666,14 +8721,6 @@ "node": ">=6" } }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "engines": { - "node": ">=8" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -8691,16 +8738,19 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -8717,6 +8767,36 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/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==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -8870,14 +8950,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -8886,41 +8958,6 @@ "node": ">= 6" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -9229,14 +9266,11 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/typed-array-buffer": { @@ -9468,9 +9502,9 @@ } }, "node_modules/vite": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", - "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", "dev": true, "dependencies": { "esbuild": "^0.19.3", @@ -9543,9 +9577,9 @@ } }, "node_modules/webpack": { - "version": "5.90.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", - "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", + "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -9709,16 +9743,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -9728,16 +9762,16 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -9790,36 +9824,60 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "color-convert": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" + } + }, + "node_modules/wrap-ansi/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-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==", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/wrap-ansi/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==", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9893,6 +9951,36 @@ } }, "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==", diff --git a/src/Pages/Cart.jsx b/src/Pages/Cart.jsx index c6b7eeb..c79a118 100644 --- a/src/Pages/Cart.jsx +++ b/src/Pages/Cart.jsx @@ -6,7 +6,7 @@ import { BsCart } from 'react-icons/bs'; import { useDispatch, useSelector } from 'react-redux'; const Cart = () => { - const [cart, setcart] = useState(JSON.parse(localStorage.getItem('cart'))) + const [cart, setcart] = useState(JSON.parse(localStorage.getItem('cart')) || []) const [amount, setamount] = useState(0) const dispatch = useDispatch() @@ -30,39 +30,39 @@ const Cart = () => {

Cart

+ { (cart && cart.length > 0) ? -
- { - cart.map((el, i)=>( - - - - {/* */} - - - - )) - } - - - - - - - - -
- {el.data.name || el.data.title}
- { el.data.author && {el.data.author} } -
₦ {el.data.price} - Checkout - -
- Checkout all -
: Nothing here + { + cart.map((el, i)=>( + + + + {el.data.name || el.data.title}
+ { el.data.author && {el.data.author} } + + {/* */} + ₦ {el.data.price} + + Checkout + + + + )) + } + + + + + + + Checkout all + + + : Nothing here } + ) diff --git a/src/Pages/Checkout.jsx b/src/Pages/Checkout.jsx index 917a9d0..0bd7689 100644 --- a/src/Pages/Checkout.jsx +++ b/src/Pages/Checkout.jsx @@ -9,49 +9,102 @@ import { isSendingOrder, sentOrder, failedSendingOrder } from "../Redux/OrderSli import { addDoc, collection, doc, getDocs } from 'firebase/firestore'; import { db } from '../Firebase'; import { ToastContainer, toast } from 'react-toastify'; -import { PaystackButton } from 'react-paystack'; +import { PaystackConsumer, usePaystackPayment } from 'react-paystack'; const Checkout = () => { - const [cart, setcart] = useState(JSON.parse(localStorage.getItem('cart'))) + const [cart, setcart] = useState(JSON.parse(localStorage.getItem('cart')) || []) const [product, setproduct] = useState() - const [amount, setamount] = useState((0 + '00')) + const [amount, setamount] = useState(0) const [allPrices, setallPrices] = useState() - const [allCopy, setallCopy] = useState() const [isLoading, setisLoading] = useState(false) - const publicKey = "pk_test_b25929938288a8363832f759f9d5460cffedd2e5" + const [paymentSuccess, setpaymentSuccess] = useState(false) const navigate = useNavigate() const dispatch = useDispatch() const route = useParams() const id = route.id + const toastId = React.useRef(null) - const componentProps = { - email: formik.values.email, - amount, - metadata: { - name: formik.values.name, - phone: formik.values.number1, - }, - publicKey, - text: "Pay Now", - onSuccess: () => - alert("Thanks for doing business with us! Come back soon!!"), - onClose: () => alert("Wait! You need this oil, don't go!!!!"), + + const load = () => toastId.current = toast.loading('Sending request') + useEffect(() => { + console.log(isLoading); + if (isLoading) { + load() + }else{ + toast.dismiss(toastId.current); } + }, [isLoading]) + + const formik = useFormik({ + initialValues: { + name: '', + email: '', + number1: '', + number2: '', + location: '', + products: product + }, + validationSchema: yup.object({ + name: yup.string().trim().required(), + email: yup.string().trim().required(), + number1: yup.number().required(), + number2: yup.number().required(), + location: yup.string().trim().required(), + products: yup.array() + }), + onSubmit: (values) => { + console.log(values); + // placeOrder(values) + initializePayment(handleSuccess, handleClose) + } + }) + + const config = { + reference: (new Date()).getTime().toString(), + email: formik.values.email, + amount: amount*100, + publicKey: 'pk_test_b25929938288a8363832f759f9d5460cffedd2e5', + }; + const initializePayment = usePaystackPayment(config) + + const handleSuccess = (reference) => { + // Implementation for whatever you want to do with reference and after success call. + setpaymentSuccess(true) + console.log(reference); + }; + + const handleClose = (reference) => { + // Implementation for whatever you want to do with reference and after success call. + console.log(reference); + }; + + const componentProps = { + ...config, + text: 'Paystack Button Implementation', + onSuccess: (reference) => handleSuccess(reference), + onClose: handleClose + }; useEffect(() => { - const find = cart.find(el=>el.id == id) - if (find) { - setproduct([find]) - } else if (id == 'all') { - setproduct(cart) - } else { + toast.dismiss(toastId.current); + if (cart && cart.length > 0) { + console.log(cart); + const find = cart.find(el=>el.id == id) + if (find) { + setproduct([find]) + } else if (id == 'all') { + setproduct(cart) + } else { + navigate('/notfound') + } + } else { navigate('/notfound') - } + } }, []) useEffect(() => { if (product && product.length > 0) { - setamount(+(0 + '00')) + setamount(0) let prices = [] let sum = 0 product.forEach((el, i) => { @@ -67,50 +120,40 @@ const Checkout = () => { } console.log(sum, prices); setallPrices(prices) - setamount(+(sum + '00')) + setamount(sum) } }, [product]) + + useEffect(() => { + toast.success('Payment successful') + console.log('Payment successful'); + placeOrder(formik.values) + }, [paymentSuccess]) - const formik = useFormik({ - initialValues: { - name: '', - email: '', - number1: '', - number2: '', - location: '', - products: product - }, - validationSchema: yup.object({ - name: yup.string().trim().required(), - email: yup.string().trim().required(), - number1: yup.number().required(), - number2: yup.number().required(), - location: yup.string().trim().required(), - products: yup.array() - }), - onSubmit: (values) => { - console.log(values); - placeOrder(values) - } - }) const placeOrder = async(values)=>{ - setisLoading(true) - - dispatch(isSendingOrder()) - const orderCollection = collection(db, 'Orders'); - await addDoc(orderCollection, values).then((res)=>{ - console.log(res); - // dispatch(sentOrder(res)) - setisLoading(false) - toast.success('Order successful') - }).catch((err)=>{ - console.log(err); - dispatch(failedSendingOrder(err.message)) + console.log(values); + try { + setisLoading(true) + // dispatch(isSendingOrder()) + const orderCollection = collection(db, 'Orders'); + await addDoc(orderCollection, values).then((res)=>{ + console.log(res); + // dispatch(sentOrder(res)) + setisLoading(false) + toast.success('Order successful') + }).catch((err)=>{ + console.log(err); + // dispatch(failedSendingOrder(err.message)) + setisLoading(false) + toast.error('Something went wrong') + }) + } catch (error) { + console.log(error); setisLoading(false) - toast.error('Something went wrong') - }) + // toast.dismiss(toastId.current) + } } @@ -182,8 +225,7 @@ const Checkout = () => { sum += prices[i]; copy = [...copy, e.target.value] } - setallCopy(copy) - setamount(+(sum + '00')) + setamount(sum) let prod = product; prod[i].copies = e.target.value setproduct(prod) @@ -221,7 +263,11 @@ const Checkout = () => { */} -
+
+ {/* + */} + +
From c661eaab14f9e7c32d1fc8fe6fc2851f96efd882 Mon Sep 17 00:00:00 2001 From: Isaacc20 Date: Sat, 10 Feb 2024 23:45:46 +0100 Subject: [PATCH 3/7] bug fixes, design touch-ups --- src/App.jsx | 9 +++- src/Components/Books.jsx | 66 ++++++++++++++++++++++++ src/Components/Display.jsx | 100 +++++++------------------------------ src/Components/Others.jsx | 64 ++++++++++++++++++++++++ src/Pages/Cart.jsx | 37 ++++++++------ src/Pages/Checkout.jsx | 36 +++++++++---- src/Pages/Landing.jsx | 2 +- src/Pages/Shop.jsx | 6 +-- src/Pages/View.jsx | 27 ++++++++-- src/Styles/Cart.css | 24 +++++++++ src/Styles/Home.css | 1 + src/Styles/Landing.css | 4 +- src/Styles/Shop.css | 49 ++++++++++++++---- 13 files changed, 298 insertions(+), 127 deletions(-) create mode 100644 src/Components/Books.jsx create mode 100644 src/Components/Others.jsx diff --git a/src/App.jsx b/src/App.jsx index c44efe6..0f7b48f 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -20,6 +20,8 @@ import Login from "./Pages/Admin/Login"; import Add from "./Pages/Admin/Upload"; import Orders from "./Pages/Admin/Orders"; import Register from "./Pages/Admin/Register"; +import Books from "./Components/Books"; +import Others from "./Components/Others"; // import Home from "./Components/Home"; function App() { @@ -31,7 +33,12 @@ function App() { } /> - } /> + }> + } /> + } /> + } /> + } /> + } /> } /> } /> diff --git a/src/Components/Books.jsx b/src/Components/Books.jsx new file mode 100644 index 0000000..604dc38 --- /dev/null +++ b/src/Components/Books.jsx @@ -0,0 +1,66 @@ +import React from 'react' +import { useSelector } from 'react-redux' +import '../Styles/Shop.css' +import { FaCartPlus } from "react-icons/fa"; +import { Link, useNavigate } from 'react-router-dom' +import { toast } from 'react-toastify'; + +const Books = () => { + const { isFetchingBooks, books, fetchingBooksFailed } = useSelector((state)=>state.BookSlice) + const navigate = useNavigate() + const cart = JSON.parse(localStorage.getItem('cart')) || [] + + + const addOne = (e, val) => { + e.preventDefault() + console.log(val); + const book = books.find(el=>el.id == val) + // const product = products.find(el=>el.id == val) + if (book) { + cart.push(book) + localStorage.setItem('cart', JSON.stringify(cart)) + toast.success(`Book added to cart`) + } + } + + const find = (val) => { + let get = cart.find(el=>el.id == val) + if (get) { + return ( + + ) + } else { + return ( + + ) + } + } + return ( + <> +
+ { + books && books.map((el, i)=>( + +
+ +
+ {el.data.title} + {el.data.author} +
+ $ {el.data.price} + { + find(el.id) + } + +
+ + )) + } +
+ + ) +} + +export default Books \ No newline at end of file diff --git a/src/Components/Display.jsx b/src/Components/Display.jsx index e670488..175b9e6 100644 --- a/src/Components/Display.jsx +++ b/src/Components/Display.jsx @@ -2,66 +2,31 @@ import React, { useState } from "react"; import axios from "axios"; import "../Styles/Shop.css"; import { useEffect } from "react"; -import { FaCartPlus } from "react-icons/fa"; -import { Link, useNavigate } from "react-router-dom"; +import { Link, Outlet, useNavigate } from "react-router-dom"; // import { collection, getDocs } from "firebase/firestore"; // import { db } from "../Firebase"; import { useDispatch, useSelector } from "react-redux"; import { getBooks, getProducts } from "../Services/Controls"; -import { ToastContainer } from "react-toastify"; +import { ToastContainer, toast } from "react-toastify"; import { add } from "../Redux/cartSlice"; const Display = () => { const { isFetchingBooks, books, fetchingBooksFailed } = useSelector((state)=>state.BookSlice) const { isFetchingProducts, products, fetchingProductsFailed } = useSelector((state)=>state.productSlice) - // const [addCart, setaddCart] = useState() + const [color, setcolor] = useState('left') const cart = JSON.parse(localStorage.getItem('cart')) || [] const dispatch = useDispatch() const navigate = useNavigate() - - const addOne = (e, val) => { - e.preventDefault() - // console.log(event); - console.log(val); - const book = books.find(el=>el.id == val) - const product = products.find(el=>el.id == val) - if (book) { - cart.push(book) - localStorage.setItem('cart', JSON.stringify(cart)) - // setaddCart( - // - // ) - } else if (product) { - cart.push(product) - localStorage.setItem('cart', JSON.stringify(cart)) - // setaddCart( - // - // ) - } - } + const route = window.location.pathname.split('/') + const myLocation = route[route.length-1] - const find = (val) => { - let get = cart.find(el=>el.id == val.id) - if (get) { - // setaddCart( - // - // ) - return ( - - ) - } else { - // setaddCart( - // - // ) - return ( - - ) + useEffect(() => { + if (myLocation == 'books' || '' || null) { + setcolor('left') + } else if (myLocation == 'others') { + setcolor('right') } - } + }, [myLocation]) return ( <> @@ -69,43 +34,14 @@ const Display = () => {

All items

-
- { - books && books.map((el, i)=>( - -
- -
- {el.data.title} - {el.data.author} -
- $ {el.data.price} - { - find(el) - } - -
- - )) - } - { - products && products.map((el, i)=>( - -
- -
- {el.data.name} - {/* {el.data.author} */} -
- $ {el.data.price} - { - find(el) - } -
- - )) - } +
+
+
+ Books + Others +
+
diff --git a/src/Components/Others.jsx b/src/Components/Others.jsx new file mode 100644 index 0000000..8283909 --- /dev/null +++ b/src/Components/Others.jsx @@ -0,0 +1,64 @@ +import React from 'react' +import { useSelector } from 'react-redux' +import '../Styles/Shop.css' +import { FaCartPlus } from "react-icons/fa"; +import { Link, useNavigate } from 'react-router-dom' +import { toast } from 'react-toastify'; + +const Others = () => { + const { isFetchingProducts, products, fetchingProductsFailed } = useSelector((state)=>state.productSlice) + const navigate = useNavigate() + const cart = JSON.parse(localStorage.getItem('cart')) || [] + + + const addOne = (e, val) => { + e.preventDefault() + console.log(val); + const product = products.find(el=>el.id == val) + if (product) { + cart.push(product) + localStorage.setItem('cart', JSON.stringify(cart)) + toast.success(`Product added to cart`) + } + } + + const find = (val) => { + let get = cart.find(el=>el.id == val) + if (get) { + return ( + + ) + } else { + return ( + + ) + } + } + return ( + <> +
+ { + products && products.map((el, i)=>( + +
+ +
+ {el.data.name} + {/* {el.data.author} */} +
+ $ {el.data.price} + { + find(el.id) + } +
+ + )) + } +
+ + ) +} + +export default Others \ No newline at end of file diff --git a/src/Pages/Cart.jsx b/src/Pages/Cart.jsx index c79a118..b6fe72d 100644 --- a/src/Pages/Cart.jsx +++ b/src/Pages/Cart.jsx @@ -31,32 +31,41 @@ const Cart = () => { + + + + + + + + { (cart && cart.length > 0) ? { cart.map((el, i)=>( - - - {/* */} - - )) } - - - - - + diff --git a/src/Pages/Checkout.jsx b/src/Pages/Checkout.jsx index 0bd7689..53cf09c 100644 --- a/src/Pages/Checkout.jsx +++ b/src/Pages/Checkout.jsx @@ -42,7 +42,7 @@ const Checkout = () => { number1: '', number2: '', location: '', - products: product + products: '' }, validationSchema: yup.object({ name: yup.string().trim().required(), @@ -55,7 +55,9 @@ const Checkout = () => { onSubmit: (values) => { console.log(values); // placeOrder(values) - initializePayment(handleSuccess, handleClose) + // initializePayment(handleSuccess, handleClose) + // usePaystackPayment(config) + placeOrder(values) } }) @@ -88,8 +90,8 @@ const Checkout = () => { useEffect(() => { toast.dismiss(toastId.current); if (cart && cart.length > 0) { - console.log(cart); - const find = cart.find(el=>el.id == id) + console.log(cart); + const find = cart.find(el=>el.id == id) if (find) { setproduct([find]) } else if (id == 'all') { @@ -113,6 +115,9 @@ const Checkout = () => { let price = Number(el.data.price) * Number(el.copies) console.log(el.data.price, el.copies, price); prices = [...prices, price] + el.price = price + console.log(el); + formik.setFieldValue('products', [el]) // console.log(price, prices); }); for (let i = 0; i < prices.length; i++) { @@ -125,9 +130,11 @@ const Checkout = () => { }, [product]) useEffect(() => { - toast.success('Payment successful') - console.log('Payment successful'); - placeOrder(formik.values) + if (paymentSuccess == true) { + toast.success('Payment successful') + console.log('Payment successful'); + placeOrder(formik.values) + } }, [paymentSuccess]) @@ -143,6 +150,9 @@ const Checkout = () => { // dispatch(sentOrder(res)) setisLoading(false) toast.success('Order successful') + setcart([]) + localStorage.setItem('cart', JSON.stringify([])) + navigate('/complete') }).catch((err)=>{ console.log(err); // dispatch(failedSendingOrder(err.message)) @@ -152,11 +162,15 @@ const Checkout = () => { } catch (error) { console.log(error); setisLoading(false) + toast.error('Something went wrong') + setTimeout(() => { + navigate(-1) + }, 5000); // toast.dismiss(toastId.current) } } - +console.log(formik.errors); return ( <>
@@ -177,8 +191,8 @@ const Checkout = () => {
diff --git a/src/Pages/Landing.jsx b/src/Pages/Landing.jsx index 5b5655f..07a25fc 100644 --- a/src/Pages/Landing.jsx +++ b/src/Pages/Landing.jsx @@ -27,7 +27,7 @@ const Landing = () => {
-

Power the future today.

+

Power the future today.Get Started

{/*
diff --git a/src/Pages/Shop.jsx b/src/Pages/Shop.jsx index f41121e..ad29865 100644 --- a/src/Pages/Shop.jsx +++ b/src/Pages/Shop.jsx @@ -19,13 +19,13 @@ const Shop = () => { return ( <>
- {(isFetchingBooks || isFetchingProducts) &&
} + {(isFetchingBooks || isFetchingProducts) &&
}
-

Lorem is a dummy text

+

Find your desired resources

- + {/*
ImageNameAmountAction
- {el.data.name || el.data.title}
- { el.data.author && {el.data.author} } +
+ ₦ {el.data.price} - Checkout - + +
+ {el.data.name || el.data.title}
+ { el.data.author && {el.data.author} } +
+ ₦ {el.data.price} + {/*
*/} +
+ Checkout + +
+ Total Checkout all
+ + + + + + + + + { + (delivered && delivered.length > 0) ? + + { + delivered.map((el, i)=>{ + console.log(el); + return ( + navigate(`/admin/dashboard/orders/${el.id}`)} style={{cursor: 'pointer'}}> + + + + + + )}) + } + : + } +
ProductCopiesPriceUser
+ { + el.data.products.map((element, index)=>( + {element.data.title || element.data.name}
+ )) + } +
+ { + el.data.products.map((element, index)=>( + {element.copies}
+ )) + } +
{el.data.price.toLocaleString()}{el.data.name}
Nothing here
+ + + ) +} + +export default DeliveredOrders \ No newline at end of file diff --git a/src/Components/NewOrders.jsx b/src/Components/NewOrders.jsx new file mode 100644 index 0000000..3923799 --- /dev/null +++ b/src/Components/NewOrders.jsx @@ -0,0 +1,74 @@ +import React, { useEffect, useState } from 'react' +import { useSelector } from 'react-redux' +import { useNavigate } from 'react-router-dom' + +const NewOrders = () => { + const { gettingOrders, orders, gettingOrdersFailed } = useSelector(state=>state.OrderSlice) + const [newOrders, setnewOrders] = useState([]) + const navigate = useNavigate() + + useEffect(() => { + if (orders && orders.length > 0) { + // console.log(orders[0].data.delivered); + let all = [] + for (let i = 0; i < orders.length; i++) { + const find = orders.find(el=> el.data.delivered == false) + // console.log(find); + if (find) { + // let findSome = orders.splice(find, 1) + all = [...all, find] + } + // console.log(all); + } + setnewOrders(all) + } + }, [orders]) + + return ( + <> +
+ + + + + + + + + + { + (newOrders && newOrders.length > 0) ? + + { + newOrders.map((el, i)=>{ + console.log(el); + return ( + navigate(`/admin/dashboard/orders/${el.id}`)} style={{cursor: 'pointer'}}> + + + + + + )}) + } + : + } +
ProductCopiesPriceUser
+ { + el.data.products.map((element, index)=>( + {element.data.title || element.data.name}
+ )) + } +
+ { + el.data.products.map((element, index)=>( + {element.copies}
+ )) + } +
{el.data.price.toLocaleString()}{el.data.name}
Nothing here
+
+ + ) +} + +export default NewOrders \ No newline at end of file diff --git a/src/Components/OneOrder.jsx b/src/Components/OneOrder.jsx new file mode 100644 index 0000000..253c962 --- /dev/null +++ b/src/Components/OneOrder.jsx @@ -0,0 +1,162 @@ +import { doc, setDoc } from 'firebase/firestore' +import React, { useEffect, useState } from 'react' +import { useSelector } from 'react-redux' +import { useNavigate, useParams } from 'react-router-dom' +import { db } from '../Firebase' +import { toast } from 'react-toastify' + +const OneOrder = () => { + const { gettingOrders, orders, gettingOrdersFailed } = useSelector(state=>state.OrderSlice) + const [currentOrder, setcurrentOrder] = useState() + const navigate = useNavigate() + const route = useParams() + const id = route.id + const toastId = React.useRef(null) + const load = () => toastId.current = toast.loading('Saving', {position: 'top-center'}) + + + const getCurrentOrder = () => { + if (orders && orders.length > 0) { + const find = orders.find(el=>el.id == id) + if (find) { + setcurrentOrder(find) + } else{ + navigate('/notfound') + } + } + } + useEffect(() => { + getCurrentOrder() + }, []) + + useEffect(() => { + getCurrentOrder() + }, [orders]) + + // const confirmOrder = async(val)=>{ + // const confirmAction = confirm(`Are you sure you have delivered to ${currentOrder.data.name}`) + // if (confirmAction) { + // load() + // try { + // let myOrder = currentOrder + // myOrder.data.delivered = true + // const myDoc = doc(db, 'Orders', val) + // await setDoc(myDoc, myOrder).then((res)=>{ + // console.log('Successful'); + // toast.dismiss(toastId.current) + // toast.success('Successful') + // setTimeout(() => { + // navigate('/admin/dashboard/orders') + // }, 5000); + // }).catch((err)=>{ + // console.log(err); + // toast.dismiss(toastId.current) + // toast.error(err.message) + // }) + // } catch (error) { + // // console.log(error); + // toast.dismiss(toastId.current) + // toast.error(error.message) + // } + // } else{ + // console.log(val); + // toast.info("Ok, fine") + // } + // } + + const confirmOrder = async (val) => { + const confirmAction = confirm(`Are you sure you have delivered to ${currentOrder.data.name}`); + + if (confirmAction) { + load(); + + try { + // Create a new object with the updated 'delivered' property + const myOrder = { + ...currentOrder, + data: { + ...currentOrder.data, + delivered: true, + }, + }; + + const myDoc = doc(db, 'Orders', val); + + await setDoc(myDoc, myOrder).then((res) => { + console.log('Successful'); + toast.dismiss(toastId.current); + toast.success('Successful'); + + setTimeout(() => { + navigate('/admin/dashboard/orders'); + }, 5000); + }).catch((err) => { + console.log(err); + toast.dismiss(toastId.current); + toast.error(err.message); + }); + } catch (error) { + console.log(error); + toast.dismiss(toastId.current); + toast.error(error.message); + } + } else { + console.log(val); + toast.info('Ok, fine'); + } + }; + + + return ( + <> +
+ { + currentOrder && +
+
+

User details

+
Name : {currentOrder.data.name}
+
Email address : {currentOrder.data.email}
+
Phone number : {currentOrder.data.number1}
+
Alternative phone number : {currentOrder.data.number2}
+
Location : {currentOrder.data.location}
+
+
+

Products

+ { + currentOrder.data.products.map((el, i)=>( +
+ +
Name : {el.data.name || el.data.title}
+
Author : {el.data.name || el.data.author}
+
Price per copy : ₦{el.data.price.toLocaleString()}
+
Copies : {el.copies}
+
Total price : ₦{el.price.toLocaleString()}
+
Category : {el.data.category}
+
Location : {el.data.location}
+
+ )) + } +
Total : ₦ {currentOrder.data.price.toLocaleString()}
+
+
+

Status

+ { + currentOrder.data.delivered? +
+ Delivered +
: +
+ Not delivered + +
+ } +
+
+ } +
+ + ) +} + +export default OneOrder \ No newline at end of file diff --git a/src/Components/Others.jsx b/src/Components/Others.jsx index 8283909..1a5753d 100644 --- a/src/Components/Others.jsx +++ b/src/Components/Others.jsx @@ -48,7 +48,7 @@ const Others = () => { {el.data.name} {/* {el.data.author} */}
- $ {el.data.price} + $ {el.data.price.toLocaleString()} { find(el.id) } diff --git a/src/Pages/Admin/Orders.jsx b/src/Pages/Admin/Orders.jsx index b75193a..4094999 100644 --- a/src/Pages/Admin/Orders.jsx +++ b/src/Pages/Admin/Orders.jsx @@ -1,9 +1,57 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' +import { Link, Outlet } from 'react-router-dom' +import { getOrders } from '../../Services/Controls' +import { useDispatch, useSelector } from 'react-redux' +import { ToastContainer, toast } from 'react-toastify' +import '../../Styles/Shop.css' const Orders = () => { + const { gettingOrders, orders, gettingOrdersFailed } = useSelector(state=>state.OrderSlice) + const [color, setcolor] = useState('left') + const dispatch = useDispatch() + const toastId = React.useRef(null) + const load = () => toastId.current = toast.loading('Getting Orders', {position: 'top-center'}) + const route = window.location.pathname.split('/') + const myLocation = route[route.length-1] + + useEffect(() => { + if (myLocation == 'new' || '' || null) { + setcolor('left') + } else if (myLocation == 'delivered') { + setcolor('right') + } + }, [myLocation]) + + useEffect(() => { + getOrders(dispatch) + }, []) + useEffect(() => { + if (gettingOrders) { + load() + }else if (orders) { + toast.dismiss(toastId.current) + console.log(orders); + }else if (gettingOrdersFailed) { + toast.dismiss(toastId.current) + toast.error(gettingOrdersFailed) + console.log(gettingOrdersFailed); + } + }, [gettingOrders, orders, gettingOrdersFailed]) + + return ( <> - +
+ +
+
+
+ Standing orders + Delivered +
+
+ +
) } diff --git a/src/Pages/Checkout.jsx b/src/Pages/Checkout.jsx index 53cf09c..3b300ad 100644 --- a/src/Pages/Checkout.jsx +++ b/src/Pages/Checkout.jsx @@ -5,11 +5,10 @@ import { useNavigate, useParams } from 'react-router-dom'; import { useFormik } from 'formik'; import * as yup from 'yup' import { useDispatch } from 'react-redux'; -import { isSendingOrder, sentOrder, failedSendingOrder } from "../Redux/OrderSlice"; import { addDoc, collection, doc, getDocs } from 'firebase/firestore'; import { db } from '../Firebase'; import { ToastContainer, toast } from 'react-toastify'; -import { PaystackConsumer, usePaystackPayment } from 'react-paystack'; +// import { PaystackConsumer, usePaystackPayment } from 'react-paystack'; const Checkout = () => { const [cart, setcart] = useState(JSON.parse(localStorage.getItem('cart')) || []) @@ -17,7 +16,7 @@ const Checkout = () => { const [amount, setamount] = useState(0) const [allPrices, setallPrices] = useState() const [isLoading, setisLoading] = useState(false) - const [paymentSuccess, setpaymentSuccess] = useState(false) + // const [paymentSuccess, setpaymentSuccess] = useState(false) const navigate = useNavigate() const dispatch = useDispatch() const route = useParams() @@ -42,7 +41,9 @@ const Checkout = () => { number1: '', number2: '', location: '', - products: '' + delivered: false, + price: '', + products: [] }, validationSchema: yup.object({ name: yup.string().trim().required(), @@ -50,54 +51,55 @@ const Checkout = () => { number1: yup.number().required(), number2: yup.number().required(), location: yup.string().trim().required(), + delivered: yup.boolean(), + price: yup.number(), products: yup.array() }), onSubmit: (values) => { - console.log(values); - // placeOrder(values) - // initializePayment(handleSuccess, handleClose) - // usePaystackPayment(config) + console.log(values, amount); placeOrder(values) } }) - const config = { - reference: (new Date()).getTime().toString(), - email: formik.values.email, - amount: amount*100, - publicKey: 'pk_test_b25929938288a8363832f759f9d5460cffedd2e5', - }; - const initializePayment = usePaystackPayment(config) + // const config = { + // reference: (new Date()).getTime().toString(), + // email: formik.values.email, + // amount: amount*100, + // publicKey: 'pk_test_b25929938288a8363832f759f9d5460cffedd2e5', + // }; + // const initializePayment = usePaystackPayment(config) - const handleSuccess = (reference) => { - // Implementation for whatever you want to do with reference and after success call. - setpaymentSuccess(true) - console.log(reference); - }; + // const handleSuccess = (reference) => { + // // Implementation for whatever you want to do with reference and after success call. + // setpaymentSuccess(true) + // console.log(reference); + // }; - const handleClose = (reference) => { - // Implementation for whatever you want to do with reference and after success call. - console.log(reference); - }; + // const handleClose = (reference) => { + // // Implementation for whatever you want to do with reference and after success call. + // console.log(reference); + // }; - const componentProps = { - ...config, - text: 'Paystack Button Implementation', - onSuccess: (reference) => handleSuccess(reference), - onClose: handleClose - }; + // const componentProps = { + // ...config, + // text: 'Paystack Button Implementation', + // onSuccess: (reference) => handleSuccess(reference), + // onClose: handleClose + // }; useEffect(() => { toast.dismiss(toastId.current); if (cart && cart.length > 0) { console.log(cart); - const find = cart.find(el=>el.id == id) - if (find) { - setproduct([find]) - } else if (id == 'all') { + if (id == 'all') { setproduct(cart) } else { - navigate('/notfound') + const find = cart.find(el=>el.id == id) + if (find) { + setproduct([find]) + } else { + navigate('/notfound') + } } } else { navigate('/notfound') @@ -126,36 +128,46 @@ const Checkout = () => { console.log(sum, prices); setallPrices(prices) setamount(sum) + formik.setFieldValue('price', sum) } }, [product]) - useEffect(() => { - if (paymentSuccess == true) { - toast.success('Payment successful') - console.log('Payment successful'); - placeOrder(formik.values) - } - }, [paymentSuccess]) + // useEffect(() => { + // if (paymentSuccess == true) { + // toast.success('Payment successful') + // console.log('Payment successful'); + // placeOrder(formik.values) + // } + // }, [paymentSuccess]) const placeOrder = async(values)=>{ - console.log(values); + console.log(values, amount); + // formik.setFieldValue('price', amount) try { setisLoading(true) - // dispatch(isSendingOrder()) const orderCollection = collection(db, 'Orders'); await addDoc(orderCollection, values).then((res)=>{ console.log(res); - // dispatch(sentOrder(res)) setisLoading(false) toast.success('Order successful') - setcart([]) - localStorage.setItem('cart', JSON.stringify([])) + console.log(values.products, cart); + if (id != 'all') { + for (let i = 0; i < cart.length; i++) { + if (id == cart[i].id) { + cart.splice(i, 1) + console.log(cart); + localStorage.setItem('cart', JSON.stringify(cart)) + } + } + } else{ + setcart([]) + localStorage.setItem('cart', JSON.stringify([])) + } navigate('/complete') }).catch((err)=>{ console.log(err); - // dispatch(failedSendingOrder(err.message)) setisLoading(false) toast.error('Something went wrong') }) @@ -170,7 +182,7 @@ const Checkout = () => { } } -console.log(formik.errors); +// console.log(formik.errors); return ( <>
@@ -187,22 +199,22 @@ console.log(formik.errors);
@@ -212,7 +224,7 @@ console.log(formik.errors); @@ -246,40 +258,16 @@ console.log(formik.errors); formik.setFieldValue('products', product) }} className='form-control' defaultValue={1}/> - Amount: {+el.data.price * +el.copies} + Amount: ₦{(+el.data.price * +el.copies).toLocaleString()} )) }
-
Total amount: ₦ {amount}
+
Total amount: ₦ {amount.toLocaleString()}
- {/*
-
Payment option
-
- - -
-
*/}
- {/* - */}
diff --git a/src/Redux/OrderSlice.jsx b/src/Redux/OrderSlice.jsx index ef15abd..eb6a84a 100644 --- a/src/Redux/OrderSlice.jsx +++ b/src/Redux/OrderSlice.jsx @@ -1,36 +1,36 @@ import { createSlice } from "@reduxjs/toolkit"; const initialState = { - sendingOrder : false, - order : null, - sendingOrderFailed: false + gettingOrders : false, + orders : null, + gettingOrdersFailed: false } const OrderSlice = createSlice({ name: 'OrderSlice', initialState, reducers: { - isSendingOrder: (state) => { - state.sendingOrder = true, - state.order = null, - state.sendingOrderFailed = false + isfetchingOrders: (state) => { + state.gettingOrders = true, + state.orders = null, + state.gettingOrdersFailed = false }, - SentOrder: (state, action) => { - state.sendingOrder = false, - state.order = action.payload, - state.sendingOrderFailed = false + fetchedOrders: (state, action) => { + state.gettingOrders = false, + state.orders = action.payload, + state.gettingOrdersFailed = false }, - failedSendingOrder: (state, action) => { - state.sendingOrder = false, - state.order = null, - state.sendingOrderFailed = true + failedfetchingOrders: (state, action) => { + state.gettingOrders = false, + state.orders = null, + state.gettingOrdersFailed = action.payload } } }) export default OrderSlice.reducer export const { - isSendingOrder, - sentOrder, - failedSendingOrder + isfetchingOrders, + fetchedOrders, + failedfetchingOrders } = OrderSlice.actions \ No newline at end of file diff --git a/src/Services/Controls.jsx b/src/Services/Controls.jsx index b048670..1d7f049 100644 --- a/src/Services/Controls.jsx +++ b/src/Services/Controls.jsx @@ -6,6 +6,7 @@ import { v4 } from 'uuid'; import { collection, getDocs } from "firebase/firestore"; import { failedFechingBooks, fetchingBooks, fetchingBooksSuccess } from "../Redux/BookSlice"; import { failedFechingProducts, fetchingProducts, fetchingProductsSuccess } from "../Redux/productSlice"; +import { failedfetchingOrders, fetchedOrders, isfetchingOrders } from "../Redux/OrderSlice"; // UPLOAD FRONTCOVER IMAGE @@ -104,4 +105,35 @@ export const getProducts = async(dispatch) => { console.log(error); dispatch(failedFechingProducts(error.message)) } +} + + +// ORDERS + +export const getOrders = async(dispatch) => { + dispatch(isfetchingOrders()) + try { + const allOrders = [] + const docRef = collection(db, 'Orders') + getDocs(docRef).then((docSnap)=>{ + // console.log(docSnap.docs[0].data()); + if (docSnap.empty) { + console.log('No matching documents.'); + dispatch(failedfetchingOrders('Nothing here')) + return; + } else { + docSnap.forEach((doc) => { + console.log(doc.id, " => ", doc.data()); + allOrders.push({id: doc.id, data: doc.data()}) + }); + dispatch(fetchedOrders(allOrders)) + } + }).catch((err)=>{ + console.log(err); + dispatch(failedfetchingOrders(err.message)) + }) + } catch (error) { + console.log(error); + dispatch(failedfetchingOrders(error.message)) + } } \ No newline at end of file diff --git a/src/Styles/Shop.css b/src/Styles/Shop.css index fa3597a..e758194 100644 --- a/src/Styles/Shop.css +++ b/src/Styles/Shop.css @@ -74,23 +74,23 @@ /* justify-content: space-evenly !important; */ /* gap: 20px; */ } -.display .toggle-div{ +/* .toggle-div{ position: sticky; top: 20px; right: 0; left: 0; -} -.display .toggle{ +} */ +.toggle{ /* background-color: #53276847; */ border: 1px solid rebeccapurple; overflow: hidden; } -.display .toggle .color{ +.toggle .color{ background-color: #532768; z-index: -1; transition: all ease-in-out 1s !important; } -.display .toggle a{ +.toggle a{ color: #532768; text-shadow: 0px 0px 5px white; } From b9bfddf71b5d5087298b93b56f1c919e969ee60c Mon Sep 17 00:00:00 2001 From: Isaacc20 Date: Thu, 22 Feb 2024 06:32:50 +0100 Subject: [PATCH 5/7] project completed --- .env | 1 + package-lock.json | 37 +++-- package.json | 1 + public/env.js | 3 + src/Components/DeliveredOrders.jsx | 42 +++--- src/Components/Display.jsx | 2 +- src/Components/Footer.jsx | 36 +++-- src/Components/NewOrders.jsx | 24 ++-- src/Components/OneOrder.jsx | 59 ++++---- src/Components/Topnav.jsx | 14 -- src/Pages/Checkout.jsx | 210 ++++++++++++----------------- src/Pages/Landing.jsx | 41 ++---- src/Pages/Shop.jsx | 12 +- src/Styles/Home.css | 9 +- src/Styles/Landing.css | 114 ++++------------ src/Styles/Shop.css | 21 ++- 16 files changed, 263 insertions(+), 363 deletions(-) create mode 100644 .env create mode 100644 public/env.js diff --git a/.env b/.env new file mode 100644 index 0000000..0f28148 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +PUBLIC_KEY = FLWPUBK_TEST-8f49044c9bb98c135e81b380bc057787-X \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b142788..66849f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "bootstrap": "^5.3.2", "emailjs": "^4.0.3", "firebase": "^10.7.2", + "flutterwave-react-v3": "^1.3.0", "formik": "^2.4.5", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -4430,14 +4431,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "engines": { - "node": ">=12" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -4932,6 +4925,14 @@ "eslint": ">6.6.0" } }, + "node_modules/eslint-plugin-turbo/node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -5268,6 +5269,26 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, + "node_modules/flutterwave-react-v3": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flutterwave-react-v3/-/flutterwave-react-v3-1.3.0.tgz", + "integrity": "sha512-y0dGSgxh9H/KMSDFurnoPYO3D6DSeOCZHPdLt8DnbtCkjgYgzNdqeXKvxerEaOJyitzXITsmlbzYdrEO/Lju3g==", + "dependencies": { + "axios": "^0.21.1" + }, + "peerDependencies": { + "react": "^15.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^18.0.0" + } + }, + "node_modules/flutterwave-react-v3/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.5", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", diff --git a/package.json b/package.json index 59d82dd..52342a5 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "bootstrap": "^5.3.2", "emailjs": "^4.0.3", "firebase": "^10.7.2", + "flutterwave-react-v3": "^1.3.0", "formik": "^2.4.5", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/public/env.js b/public/env.js new file mode 100644 index 0000000..6ac1fad --- /dev/null +++ b/public/env.js @@ -0,0 +1,3 @@ +window.env = { + "PUBLIC_KEY": "FLWPUBK_TEST-8f49044c9bb98c135e81b380bc057787-X" +}; \ No newline at end of file diff --git a/src/Components/DeliveredOrders.jsx b/src/Components/DeliveredOrders.jsx index 9770718..62abffe 100644 --- a/src/Components/DeliveredOrders.jsx +++ b/src/Components/DeliveredOrders.jsx @@ -1,16 +1,30 @@ import React, { useEffect, useState } from 'react' import { useSelector } from 'react-redux' +import { useNavigate } from 'react-router-dom' const DeliveredOrders = () => { const { gettingOrders, orders, gettingOrdersFailed } = useSelector(state=>state.OrderSlice) const [delivered, setdelivered] = useState([]) + const navigate = useNavigate() useEffect(() => { if (orders && orders.length > 0) { - const findSome = orders.some(el=> el.delivered == true) - console.log(findSome); - setdelivered(findSome) + const all = [] + for (let i = 0; i < orders.length; i++) { + // const find = orders.find(el=> el.data.delivered == true) + // console.log(find); + console.log(orders[i]); + if (orders[i].data.data.delivered == true) { + // let findSome = orders.splice(find, 1) + all.push(orders[i]) + } + // console.log(all); + } + // const findSome = orders.some(el=> el.data.delivered == true) + console.log(all); + setdelivered(all) } + console.log(delivered); }, [orders]) return ( @@ -29,28 +43,26 @@ const DeliveredOrders = () => { (delivered && delivered.length > 0) ? { - delivered.map((el, i)=>{ - console.log(el); - return ( + delivered.map((el, i)=>( navigate(`/admin/dashboard/orders/${el.id}`)} style={{cursor: 'pointer'}}> - { + {/* { el.data.products.map((element, index)=>( - {element.data.title || element.data.name}
)) - } + } */} + {el.data.data.product.data.title || el.data.data.product.data.name}
- { + {/* { el.data.products.map((element, index)=>( - {element.copies}
)) - } + } */} + {el.data.data.product.copies}
- {el.data.price.toLocaleString()} - {el.data.name} + {el.data.data.price} + {el.data.data.name} - )}) + )) } :Nothing here } diff --git a/src/Components/Display.jsx b/src/Components/Display.jsx index 175b9e6..0694885 100644 --- a/src/Components/Display.jsx +++ b/src/Components/Display.jsx @@ -33,7 +33,7 @@ const Display = () => {
-

All items

+ {/*

All items

*/}
diff --git a/src/Components/Footer.jsx b/src/Components/Footer.jsx index 2831bef..4f8067a 100644 --- a/src/Components/Footer.jsx +++ b/src/Components/Footer.jsx @@ -10,40 +10,34 @@ const Footer = () => { <>
-
+
-
-
-

Features

-
-

• Lorem, ipsum.

-

• Lorem, ipsum.

-

• Lorem, ipsum.

-

• Lorem, ipsum.

-

• Lorem, ipsum.

-
+ Power the future today

Quick Links

- Shop - Podcast - Lorem ipsum - Lorem ipsum - Lorem ipsum + Shop + {/* Podcast */} + Cart + Admin + {/* Lorem ipsum + Lorem ipsum */}

Follow us

-
- - - +
+     @elixir_bookss +     @theelixir_brand + {/* */}
+
- © 2023 The elixir brand. All rights reserved. +
+ © 2023 The elixir brand. All rights reserved.
diff --git a/src/Components/NewOrders.jsx b/src/Components/NewOrders.jsx index 3923799..2c614a8 100644 --- a/src/Components/NewOrders.jsx +++ b/src/Components/NewOrders.jsx @@ -10,15 +10,11 @@ const NewOrders = () => { useEffect(() => { if (orders && orders.length > 0) { // console.log(orders[0].data.delivered); - let all = [] + const all = [] for (let i = 0; i < orders.length; i++) { - const find = orders.find(el=> el.data.delivered == false) - // console.log(find); - if (find) { - // let findSome = orders.splice(find, 1) - all = [...all, find] + if (orders[i].data.delivered == false) { + all.push(orders[i]) } - // console.log(all); } setnewOrders(all) } @@ -41,22 +37,22 @@ const NewOrders = () => { { newOrders.map((el, i)=>{ - console.log(el); + console.log(el, i); return ( navigate(`/admin/dashboard/orders/${el.id}`)} style={{cursor: 'pointer'}}> - { + {/* { el.data.products.map((element, index)=>( - {element.data.title || element.data.name}
)) - } + } */} + {el.data.product.data.title || el.data.product.data.name}
- { + {/* { el.data.products.map((element, index)=>( - {element.copies}
)) - } + } */} + {el.data.product.copies}
{el.data.price.toLocaleString()} {el.data.name} diff --git a/src/Components/OneOrder.jsx b/src/Components/OneOrder.jsx index 253c962..3a946ee 100644 --- a/src/Components/OneOrder.jsx +++ b/src/Components/OneOrder.jsx @@ -20,6 +20,7 @@ const OneOrder = () => { const find = orders.find(el=>el.id == id) if (find) { setcurrentOrder(find) + console.log(find); } else{ navigate('/notfound') } @@ -112,43 +113,45 @@ const OneOrder = () => {
{ currentOrder && -
-
-

User details

-
Name : {currentOrder.data.name}
-
Email address : {currentOrder.data.email}
-
Phone number : {currentOrder.data.number1}
-
Alternative phone number : {currentOrder.data.number2}
-
Location : {currentOrder.data.location}
+
+
+

User details

+
Name :      {currentOrder.data.data.name}
+
Email address :      {currentOrder.data.data.email}
+
Phone number :      {currentOrder.data.data.number1}
+
Alternative phone number :      {currentOrder.data.data.number2}
+
Location :      {currentOrder.data.data.location}
-

Products

- { - currentOrder.data.products.map((el, i)=>( -
- -
Name : {el.data.name || el.data.title}
-
Author : {el.data.name || el.data.author}
-
Price per copy : ₦{el.data.price.toLocaleString()}
-
Copies : {el.copies}
-
Total price : ₦{el.price.toLocaleString()}
-
Category : {el.data.category}
-
Location : {el.data.location}
-
- )) - } -
Total : ₦ {currentOrder.data.price.toLocaleString()}
+

Products

+ {/* { + currentOrder.data.products.map((el, i)=>( */} +
+ +
+
Name : {currentOrder.data.data.product.data.name || currentOrder.data.data.product.data.title}
+ {currentOrder.data.data.product.data.author &&
Author : {currentOrder.data.data.product.data.author}
} +
Price per copy : ₦{currentOrder.data.data.product.data.price.toLocaleString()}
+
Copies : {currentOrder.data.data.product.copies}
+
Total price : ₦{currentOrder.data.data.price.toLocaleString()}
+ {currentOrder.data.data.product.data.category &&
Category : {currentOrder.data.data.product.data.category}
} +
+ {/*
Location : {currentOrder.data.data.product.data.location}
*/} +
+ {/* )) + } */} +
Total : ₦ {currentOrder.data.data.price.toLocaleString()}
-
-

Status

+
+

Status

{ - currentOrder.data.delivered? + currentOrder.data.data.delivered ?
Delivered
:
Not delivered - +
}
diff --git a/src/Components/Topnav.jsx b/src/Components/Topnav.jsx index defa224..e51fcc3 100644 --- a/src/Components/Topnav.jsx +++ b/src/Components/Topnav.jsx @@ -5,20 +5,11 @@ import logo from '../assets/logo.png' import logo1 from '../assets/logo 1.png' import { BsCart, BsCart2 } from 'react-icons/bs' import {FaBars} from 'react-icons/fa6' -// import Themes from './Toggles/Themes' const Topnav = () => { return (
- {/* */} LOGO - {/*
-
- - -
- -
*/}
@@ -30,11 +21,6 @@ const Topnav = () => { ABOUT Contact us - {/* Log in - Sign up */} - {/* - */} - {/* About us */}
diff --git a/src/Pages/Checkout.jsx b/src/Pages/Checkout.jsx index 3b300ad..bca6403 100644 --- a/src/Pages/Checkout.jsx +++ b/src/Pages/Checkout.jsx @@ -8,23 +8,40 @@ import { useDispatch } from 'react-redux'; import { addDoc, collection, doc, getDocs } from 'firebase/firestore'; import { db } from '../Firebase'; import { ToastContainer, toast } from 'react-toastify'; -// import { PaystackConsumer, usePaystackPayment } from 'react-paystack'; +import { closePaymentModal, useFlutterwave } from 'flutterwave-react-v3'; const Checkout = () => { const [cart, setcart] = useState(JSON.parse(localStorage.getItem('cart')) || []) const [product, setproduct] = useState() const [amount, setamount] = useState(0) - const [allPrices, setallPrices] = useState() + const [copy, setcopy] = useState() const [isLoading, setisLoading] = useState(false) - // const [paymentSuccess, setpaymentSuccess] = useState(false) + const [paymentSuccessful, setpaymentSuccessful] = useState(false) const navigate = useNavigate() const dispatch = useDispatch() const route = useParams() const id = route.id const toastId = React.useRef(null) + const load = () => toastId.current = toast.loading('Sending request') - const load = () => toastId.current = toast.loading('Sending request') + useEffect(() => { + setcopy(1) + toast.dismiss(toastId.current); + if (cart && cart.length > 0) { + console.log(cart); + const find = cart.find(el=>el.id == id) + if (find) { + console.log(find); + setproduct({...find}) + } else { + navigate('/notfound') + } + } else { + navigate('/notfound') + } + }, []) + useEffect(() => { console.log(isLoading); if (isLoading) { @@ -34,6 +51,18 @@ const Checkout = () => { } }, [isLoading]) + useEffect(() => { + if (product != null) { + console.log(product); + let prod = {...product, copies: copy} + setproduct(prod) + formik.setFieldValue('product', prod) + let price = product.data.price * copy + setamount(price) + formik.setFieldValue('price', price) + } + }, [copy]) + const formik = useFormik({ initialValues: { name: '', @@ -43,7 +72,7 @@ const Checkout = () => { location: '', delivered: false, price: '', - products: [] + product: {...product} }, validationSchema: yup.object({ name: yup.string().trim().required(), @@ -53,98 +82,27 @@ const Checkout = () => { location: yup.string().trim().required(), delivered: yup.boolean(), price: yup.number(), - products: yup.array() + product: yup.object() }), onSubmit: (values) => { - console.log(values, amount); - placeOrder(values) + console.log(values); + // placeOrder(values) + handleFlutterPayment({ + callback: (response) => { + console.log(response); + if (response.status == 'completed' && response.charge_response_message == "Approved Successful") { + // setpaymentSuccessful(true) + placeOrder(values) + } + closePaymentModal() // this will close the modal programmatically + }, + onClose: () => {}, + }); } }) - - // const config = { - // reference: (new Date()).getTime().toString(), - // email: formik.values.email, - // amount: amount*100, - // publicKey: 'pk_test_b25929938288a8363832f759f9d5460cffedd2e5', - // }; - // const initializePayment = usePaystackPayment(config) - - // const handleSuccess = (reference) => { - // // Implementation for whatever you want to do with reference and after success call. - // setpaymentSuccess(true) - // console.log(reference); - // }; - - // const handleClose = (reference) => { - // // Implementation for whatever you want to do with reference and after success call. - // console.log(reference); - // }; - - // const componentProps = { - // ...config, - // text: 'Paystack Button Implementation', - // onSuccess: (reference) => handleSuccess(reference), - // onClose: handleClose - // }; - - useEffect(() => { - toast.dismiss(toastId.current); - if (cart && cart.length > 0) { - console.log(cart); - if (id == 'all') { - setproduct(cart) - } else { - const find = cart.find(el=>el.id == id) - if (find) { - setproduct([find]) - } else { - navigate('/notfound') - } - } - } else { - navigate('/notfound') - } - }, []) - - useEffect(() => { - if (product && product.length > 0) { - setamount(0) - let prices = [] - let sum = 0 - product.forEach((el, i) => { - el.copies = 1 - - let price = Number(el.data.price) * Number(el.copies) - console.log(el.data.price, el.copies, price); - prices = [...prices, price] - el.price = price - console.log(el); - formik.setFieldValue('products', [el]) - // console.log(price, prices); - }); - for (let i = 0; i < prices.length; i++) { - sum += prices[i]; - } - console.log(sum, prices); - setallPrices(prices) - setamount(sum) - formik.setFieldValue('price', sum) - } - }, [product]) - - // useEffect(() => { - // if (paymentSuccess == true) { - // toast.success('Payment successful') - // console.log('Payment successful'); - // placeOrder(formik.values) - // } - // }, [paymentSuccess]) - - const placeOrder = async(values)=>{ console.log(values, amount); - // formik.setFieldValue('price', amount) try { setisLoading(true) const orderCollection = collection(db, 'Orders'); @@ -153,17 +111,12 @@ const Checkout = () => { setisLoading(false) toast.success('Order successful') console.log(values.products, cart); - if (id != 'all') { - for (let i = 0; i < cart.length; i++) { - if (id == cart[i].id) { - cart.splice(i, 1) - console.log(cart); - localStorage.setItem('cart', JSON.stringify(cart)) - } + for (let i = 0; i < cart.length; i++) { + if (id == cart[i].id) { + cart.splice(i, 1) + console.log(cart); + localStorage.setItem('cart', JSON.stringify(cart)) } - } else{ - setcart([]) - localStorage.setItem('cart', JSON.stringify([])) } navigate('/complete') }).catch((err)=>{ @@ -178,11 +131,29 @@ const Checkout = () => { setTimeout(() => { navigate(-1) }, 5000); - // toast.dismiss(toastId.current) } } + + const config = { + public_key: 'FLWPUBK_TEST-8f49044c9bb98c135e81b380bc057787-X', + tx_ref: Date.now(), + amount: formik.values.price, + currency: 'NGN', + payment_options: 'card,mobilemoney,ussd', + customer: { + email: formik.values.email, + phone_number: formik.values.number1 || formik.values.number2, + name: formik.values.name, + }, + customizations: { + title: 'Elixir Books', + description: `Payment for cart item`, + // logo: 'https://st2.depositphotos.com/4403291/7418/v/450/depositphotos_74189661-stock-illustration-online-shop-log.jpg', + }, + }; + + const handleFlutterPayment = useFlutterwave(config); -// console.log(formik.errors); return ( <>
@@ -232,35 +203,20 @@ const Checkout = () => {
Products
{ - (product && product.length > 0) && - product.map((el, i)=>( -
diff --git a/src/Pages/Landing.jsx b/src/Pages/Landing.jsx index 07a25fc..ba146d6 100644 --- a/src/Pages/Landing.jsx +++ b/src/Pages/Landing.jsx @@ -29,10 +29,6 @@ const Landing = () => {

Power the future today.Get Started

- {/*
- - -
*/}
@@ -55,7 +51,7 @@ const Landing = () => {
Podcast
On this page we shall be investing in Posterity by learning and engaging the principle of a fulfilled life, transforming men and women with the tool of wisdom in stewarding God's resources and living a Legendary life.
- +
@@ -65,20 +61,17 @@ const Landing = () => {
Scribing
Are you in need of a scribbler?
This page is coming soon
- +
{/*
*/}
-
- {/*
*/} - {/*
*/} - - {/*
*/} -
+
+ +

About Us

- Elixir is a brand geared towards personal growth and empowerment. + Elixir is a brand geared towards personal growth and empowerment. Discover a world of transformation through our skill-building resources, enlightening books, and insightful podcasts.
Elixir is your partner in the journey of unlocking your potential, cultivating meaningful relationships, and achieving financial prosperity.
@@ -88,27 +81,14 @@ Empower yourself with Elixir. Your journey to a better you starts here. Your journey to a better you is our is our utmost priority! -{/* */}
{/*
*/}
- {/*
-
-
-

Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsum, perspiciatis!

-
-
-
*/} -
+

MEET THE TEAM


- {/*
-
- -
-
*/}
{/* */} @@ -118,7 +98,6 @@ Your journey to a better you is our is our utmost priority!
John Doe
Lorem ipsum dolor
- {/* */}
@@ -146,11 +125,10 @@ Your journey to a better you is our is our utmost priority! {/*
*/}
-
+ {/*

Contact us

- {/*

Our socials

*/}
@@ -162,11 +140,10 @@ Your journey to a better you is our is our utmost priority!

test.twitter.com

test@gmail.com

test area, test street, test, city, Nigeria

- {/* */}
-
+
*/}
diff --git a/src/Pages/Shop.jsx b/src/Pages/Shop.jsx index ad29865..a712f66 100644 --- a/src/Pages/Shop.jsx +++ b/src/Pages/Shop.jsx @@ -21,20 +21,20 @@ const Shop = () => {
{(isFetchingBooks || isFetchingProducts) &&
}
-
-

Find your desired resources

-
+
+

Find your desired assets

+ {/*
- + */} {/* */} - + {/*
-
+
*/}
diff --git a/src/Styles/Home.css b/src/Styles/Home.css index f1a0c68..4f28b45 100644 --- a/src/Styles/Home.css +++ b/src/Styles/Home.css @@ -22,8 +22,13 @@ z-index: 1000; } .topnav .logo:hover{ - border: none; - cursor: pointer; + border: none !important; +} +.topnav .logo:active{ + border: none !important; +} +.topnav .logo:focus-within{ + border: none !important; } /* .topnav .search{ border: 1px solid white; diff --git a/src/Styles/Landing.css b/src/Styles/Landing.css index 7bee51b..8d4b2c7 100644 --- a/src/Styles/Landing.css +++ b/src/Styles/Landing.css @@ -29,20 +29,7 @@ } .top .amico{ background-color: rgba(31, 12, 68, 0.484); - /* position: absolute; - width: 100vw; - z-index: -10; - background-color: rgb(31, 12, 68); - border-radius: 0px 0px 210px 520px; - transform: skewY(6deg); - text-align: end; */ } -/* .top .home div{ - background-image: url('../assets/model_books(7)b.jpg'); - background-size: cover; - background-position: bottom; - background-repeat: no-repeat; -} */ .offers .offer-div{ flex-wrap: wrap !important; @@ -54,17 +41,22 @@ min-width: 250px; max-width: 400px; overflow: hidden; - min-height: fit-content; - /* height: fit-content; */ - /* box-shadow: 0px 0px 2px grey; */ + min-height: 400px; + position: relative; } .offers .offer .div{ - height: 55%; + height: fit-content; + background-color: rgba(255, 255, 255, 0.596); + border-radius: 10% 10% 0 0; + position: absolute; + bottom: 0; + left: 0; + right: 0; } .offers .offer img{ - height: 45%; + height: 50%; } .offers h1{ @@ -83,15 +75,8 @@ transition: all ease-in-out .3s; } -.about-div{ - /* background-color: #ADA0BF; */ -} .about{ position: relative; - /* height: 90vh; */ - /* flex-wrap: wrap; */ - /* background-color: rgb(31, 12, 68); - border-radius: 370px 0 0 0; */ } .about h1{ @@ -99,8 +84,8 @@ } .about span{ - line-height: 27px; - word-spacing: 5px; + /* line-height: 27px; */ + word-spacing: 3px; } .about span button{ border: 1px solid rgb(31, 12, 68) !important; @@ -114,9 +99,6 @@ } .team .offer-div .img{ - /* background-color: rgba(240, 248, 255, 0.578); - border-radius: 50% 0 0 50%; - width: 50vw !important; */ width: 100% !important; height: 75% !important; background-position: center; @@ -134,17 +116,12 @@ background-image: url('../assets/brand hood.jpg'); } -.team{ - /* background-color: rgb(31, 12, 68); */ - /* height: fit-content; - border-radius: 0; */ -} .team .offer-div{ - /* width: 100vw !important; */ display: flex; flex-wrap: nowrap !important; - overflow-x: auto; - + overflow: auto; + width: 100vw; + padding-inline-start: 10%; } .team .container h1{ white-space: nowrap; @@ -152,6 +129,7 @@ } .team .offer{ height: 400px; + width: 30vw; box-shadow: 0px 0px 5px gray; } .team .offer div{ @@ -159,65 +137,19 @@ } -.contact{ - background-color: #ADA0BF; -} -.contact h1{ - color: rgb(31, 12, 68); -} -.contact .div{ - flex-wrap: wrap; -} -.contact form{ - min-width: 250px; -} -.contact .div div p{ - white-space: nowrap; -} -.contact form textarea, .contact form input{ - border: 1px solid rgb(31, 12, 68); - outline-color: rgb(31, 12, 68); -} -.contact form button{ - background-color: rgb(31, 12, 68); - color: white; -} -.contact form button:hover{ - background-color: white; - color: rgb(31, 12, 68); - border: 1px solid rgb(31, 12, 68); -} -.contact p{ - color: rgb(31, 12, 68); -} - -/* .first{ - height: 70vh; - width: 100vw; - margin-top: 0px; - background-image: url('../assets/model_books(9).jpg'); - background-repeat: no-repeat; - background-size: 60vw; - background-position: right; - background-color: black; - background-blend-mode: luminosity; -} */ -/* .first .inner{ - background-color: ; - background-image: linear-gradient(to right, rgba(0, 0, 0), rgba(0, 0, 0), rgba(0, 0, 0, 0)); - -} */ - @media (max-width: 1000px) { - .about{ + /* .about{ flex-direction: column; gap: 20px; - } + } */ .about h1{ position: absolute; top: 0; } - .about img div{ - width: 100% !important; + .about img, .about div, .about div span{ + width: 90vw !important; } + /* .about div span{ + width: !important; + } */ } \ No newline at end of file diff --git a/src/Styles/Shop.css b/src/Styles/Shop.css index e758194..00e2816 100644 --- a/src/Styles/Shop.css +++ b/src/Styles/Shop.css @@ -1,10 +1,10 @@ .shop .search{ background-image: url('../assets/brand-cards.jpg'); background-attachment: fixed; - background-position: center; + background-position: bottom; background-size: cover; box-shadow: 0px 0px 100px rgb(0, 0, 0) inset; - height: 70vh; + /* height: 70vh; */ } .shop .search .search-div{ /* box-shadow: inset 0px 0px 100px #532768; */ @@ -164,11 +164,24 @@ @media (max-width: 500px) { .display .card-div{ - gap: 20px !important; + /* gap: 20px !important; */ + width: 100vw !important; + justify-content: space-around !important; } .display .card-div .cards{ width: 40vw !important; - min-width: 150px !important; + /* min-width: 150px !important; */ height: 200px; } +} + +@media (max-width: 400px) { + .display .card-div{ + gap: 0 !important; + } + .display .card-div .cards{ + /* width: 40vw !important; */ + /* min-width: 150px !important; */ + height: fit-content; + } } \ No newline at end of file From 10bbca446824fb092625ac62c2c644272635c5b6 Mon Sep 17 00:00:00 2001 From: Isaacc20 Date: Mon, 4 Mar 2024 05:29:28 +0100 Subject: [PATCH 6/7] Editted Admin link --- src/Components/Footer.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Footer.jsx b/src/Components/Footer.jsx index 4f8067a..c366b05 100644 --- a/src/Components/Footer.jsx +++ b/src/Components/Footer.jsx @@ -20,7 +20,7 @@ const Footer = () => { Shop {/* Podcast */} Cart - Admin + Admin {/* Lorem ipsum Lorem ipsum */}
From 8af51281abdcef756c0c205086fda3f30a8f2d4c Mon Sep 17 00:00:00 2001 From: Isaacc20 Date: Mon, 4 Mar 2024 05:41:38 +0100 Subject: [PATCH 7/7] Solved admin bug --- src/Components/OneOrder.jsx | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Components/OneOrder.jsx b/src/Components/OneOrder.jsx index 3a946ee..3f1a976 100644 --- a/src/Components/OneOrder.jsx +++ b/src/Components/OneOrder.jsx @@ -116,36 +116,36 @@ const OneOrder = () => {

User details

-
Name :      {currentOrder.data.data.name}
-
Email address :      {currentOrder.data.data.email}
-
Phone number :      {currentOrder.data.data.number1}
-
Alternative phone number :      {currentOrder.data.data.number2}
-
Location :      {currentOrder.data.data.location}
+
Name :      {currentOrder.data.name}
+
Email address :      {currentOrder.data.email}
+
Phone number :      {currentOrder.data.number1}
+
Alternative phone number :      {currentOrder.data.number2}
+
Location :      {currentOrder.data.location}

Products

{/* { currentOrder.data.products.map((el, i)=>( */}
- +
-
Name : {currentOrder.data.data.product.data.name || currentOrder.data.data.product.data.title}
- {currentOrder.data.data.product.data.author &&
Author : {currentOrder.data.data.product.data.author}
} -
Price per copy : ₦{currentOrder.data.data.product.data.price.toLocaleString()}
-
Copies : {currentOrder.data.data.product.copies}
-
Total price : ₦{currentOrder.data.data.price.toLocaleString()}
- {currentOrder.data.data.product.data.category &&
Category : {currentOrder.data.data.product.data.category}
} +
Name : {currentOrder.data.product.data.name || currentOrder.data.product.data.title}
+ {currentOrder.data.product.data.author &&
Author : {currentOrder.data.product.data.author}
} +
Price per copy : ₦{currentOrder.data.product.data.price.toLocaleString()}
+
Copies : {currentOrder.data.product.copies}
+
Total price : ₦{currentOrder.data.price.toLocaleString()}
+ {currentOrder.data.product.data.category &&
Category : {currentOrder.data.product.data.category}
}
- {/*
Location : {currentOrder.data.data.product.data.location}
*/} + {/*
Location : {currentOrder.data.product.data.location}
*/}
{/* )) } */} -
Total : ₦ {currentOrder.data.data.price.toLocaleString()}
+
Total : ₦ {currentOrder.data.price.toLocaleString()}

Status

{ - currentOrder.data.data.delivered ? + currentOrder.data.delivered ?
Delivered
: