From a7044a9dc7ec4186d3a61dc5d08ed9330107c229 Mon Sep 17 00:00:00 2001 From: AntoninoP Date: Thu, 26 Sep 2024 16:18:48 +0200 Subject: [PATCH] +stripe integration --- index.html | 2 +- src/App.jsx | 7 +- src/assets/logo.png | Bin 0 -> 43491 bytes src/components/navbar/Navbar.jsx | 4 +- src/pages/DashboardPage/DashboardPage.jsx | 45 ++++++- src/pages/Payement/Checkout.jsx | 51 +++++++ .../Payement/PaymentForm/PaymentForm.jsx | 124 ++++++++++++------ .../PaymentForm/PaymentForm.module.scss | 26 +--- src/pages/Payement/Pricing.jsx | 68 ---------- src/pages/Payement/Pricing/Pricing.jsx | 52 ++++++++ .../{ => Pricing}/Pricing.module.scss | 33 ++--- src/service/firebase.jsx | 14 +- 12 files changed, 274 insertions(+), 152 deletions(-) create mode 100644 src/assets/logo.png create mode 100644 src/pages/Payement/Checkout.jsx delete mode 100644 src/pages/Payement/Pricing.jsx create mode 100644 src/pages/Payement/Pricing/Pricing.jsx rename src/pages/Payement/{ => Pricing}/Pricing.module.scss (70%) diff --git a/index.html b/index.html index e1f3365..6878b75 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - + Servii - Hebergement facile diff --git a/src/App.jsx b/src/App.jsx index 824d4fb..a6212b3 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,7 +5,9 @@ import 'react-toastify/dist/ReactToastify.css'; import { auth } from './service/firebase'; import styles from './App.module.scss'; import Loading from './pages/Loading/loading'; -import Pricing from './pages/Payement/Pricing'; +import Pricing from './pages/Payement/Pricing/Pricing'; +import PaymentForm from './pages/Payement/PaymentForm/PaymentForm'; +import Checkout from './pages/Payement/Checkout'; const LoginPage = lazy(() => import('./pages/LoginPage/LoginPage')); const ServerDetails = lazy(() => import('./pages/ServerDetails/ServerDetails')); @@ -57,7 +59,8 @@ const App = () => { : } /> : } /> : } /> - + : } /> + : } /> } /> : } /> diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ffd49c4803355f3e1cbbee99db36fda2850a9d GIT binary patch literal 43491 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 literal 0 HcmV?d00001 diff --git a/src/components/navbar/Navbar.jsx b/src/components/navbar/Navbar.jsx index a301ae5..e5f27de 100644 --- a/src/components/navbar/Navbar.jsx +++ b/src/components/navbar/Navbar.jsx @@ -52,7 +52,7 @@ const Navbar = ({ )} - {Subsribebtn && ( // Updated: Conditional rendering for the subscribe button + {Subsribebtn && (
navigate('/Pricing')}> S'abonner @@ -101,7 +101,7 @@ Navbar.propTypes = { showBackButton: PropTypes.bool, onBackClick: PropTypes.func, backButtonText: PropTypes.string, - Subsribebtn: PropTypes.bool // Updated: Prop type corrected + Subsribebtn: PropTypes.bool }; export default Navbar; diff --git a/src/pages/DashboardPage/DashboardPage.jsx b/src/pages/DashboardPage/DashboardPage.jsx index bec1a02..2b030cc 100644 --- a/src/pages/DashboardPage/DashboardPage.jsx +++ b/src/pages/DashboardPage/DashboardPage.jsx @@ -3,7 +3,7 @@ import { useNavigate } from 'react-router-dom'; import ServerCard from '../../components/serverCards/DefaultServerCard'; import Navbar from '../../components/navbar/Navbar'; import Loading from '../Loading/loading'; -import { getUserSubdomain } from "../../service/firebase"; +import { getUserSubdomain, getUserSubscription } from "../../service/firebase"; import serviiApi from "../../service/api.tsx"; import PropTypes from "prop-types"; import styles from './DashboardPage.module.scss'; @@ -21,6 +21,7 @@ const DashboardPage = ({ user }) => { }); const [subdomain, setSubdomain] = useState(' '); + const [subscription, setSubscription] = useState(0); const [loading, setLoading] = useState(servers.length === 0); const [searchTerm, setSearchTerm] = useState(''); const [newSubdomain, setNewSubdomain] = useState(' '); @@ -33,6 +34,8 @@ const DashboardPage = ({ user }) => { if (user?.uid) { const userSubdomain = await getUserSubdomain(user.uid); setSubdomain(userSubdomain || null); + const userSubscription = await getUserSubscription(user.uid); + setSubscription(userSubscription || 0); } const ApiResponse = await serviiApi.fetchServers(); @@ -55,14 +58,44 @@ const DashboardPage = ({ user }) => { const handleCreateServer = () => navigate('/CreateServer'); - const handleRunServer = async (serverName) => { + const handleRunServer = async (serverName, framework) => { try { - await serviiApi.serverRun(serverName); - updateServersFromApi(); + if (subscription === 0) { + if (framework === "paper") { + navigate('/payement?package=Gratuit'); + } if (framework === "Bedrock") { + navigate('/payement?package=Standard'); + } + else { + navigate('/payement?package=Standard'); + } + } + + else if (subscription === 1) { + if (framework === "paper") { + await serviiApi.serverRun(serverName); + updateServersFromApi(); + } else { + navigate('/payement?package=Standard'); + } + } + else if (subscription === 2) { + if (framework === "paper" || framework === "Bedrock") { + await serviiApi.serverRun(serverName); + updateServersFromApi(); + } else { + navigate('/payement?package=Premium'); + } + } + else if (subscription === 3) { + await serviiApi.serverRun(serverName); + updateServersFromApi(); + } } catch (error) { console.error('Error starting server:', error); } }; + const handleStopServer = async (serverName) => { try { @@ -193,7 +226,7 @@ const DashboardPage = ({ user }) => { framework={favoriteServer.framework} maxPlayers={favoriteServer.maxPlayers} countPlayers={favoriteServer.onlinePlayers} - onRunClick={() => handleRunServer(favoriteServer.name)} + onRunClick={() => handleRunServer(favoriteServer.name , favoriteServer.framework)} onStopClick={() => handleStopServer(favoriteServer.name)} onDeleteClick={() => { setServerToDelete(favoriteServer.name); @@ -219,7 +252,7 @@ const DashboardPage = ({ user }) => { framework={server.framework} maxPlayers={server.maxPlayers} countPlayers={server.onlinePlayers} - onRunClick={() => handleRunServer(server.name)} + onRunClick={() => handleRunServer(server.name , server.framework)} onStopClick={() => handleStopServer(server.name)} onDeleteClick={() => { setServerToDelete(server.name); diff --git a/src/pages/Payement/Checkout.jsx b/src/pages/Payement/Checkout.jsx new file mode 100644 index 0000000..120c0a6 --- /dev/null +++ b/src/pages/Payement/Checkout.jsx @@ -0,0 +1,51 @@ +import { useState, useEffect } from 'react'; + +const Checkout = () => { + const [sessionStatus, setSessionStatus] = useState(null); + + useEffect(() => { + const params = new URLSearchParams(window.location.search); + const session_id = params.get('session_id'); + + console.log('session_id:', session_id); + + if (session_id) { + const fetchSessionStatus = async () => { + try { + const response = await fetch(`http://192.168.68.114:3000/get-session-status?session_id=${session_id}`); + const data = await response.json(); + setSessionStatus(data); + } catch (error) { + console.error('Error fetching session status:', error); + } + }; + + fetchSessionStatus(); + } else { + console.error('No session_id found in URL'); + } + }, []); + + if (!sessionStatus) { + return
Loading...
; + } + + return ( +
+ {sessionStatus.status === 'open' && ( +
+

Checkout is still open

+
+ )} + {sessionStatus.status === 'complete' && ( +
+

Success!

+

Payment Status: {sessionStatus.payment_status}

+

Customer Email: {sessionStatus.customer_email}

+
+ )} +
+ ); +}; + +export default Checkout; diff --git a/src/pages/Payement/PaymentForm/PaymentForm.jsx b/src/pages/Payement/PaymentForm/PaymentForm.jsx index 59231c4..628ba22 100644 --- a/src/pages/Payement/PaymentForm/PaymentForm.jsx +++ b/src/pages/Payement/PaymentForm/PaymentForm.jsx @@ -1,49 +1,97 @@ -import React, { useState } from 'react'; -import { CardElement, useStripe, useElements } from '@stripe/react-stripe-js'; +import { useCallback, useState, useEffect } from 'react'; +import { useLocation, useNavigate } from 'react-router-dom'; +import Navbar from '../../../components/navbar/Navbar'; +import PropTypes from 'prop-types'; +import { loadStripe } from '@stripe/stripe-js'; +import { EmbeddedCheckoutProvider, EmbeddedCheckout } from '@stripe/react-stripe-js'; import styles from './PaymentForm.module.scss'; -const PaymentForm = ({ groups, closeModal }) => { - const stripe = useStripe(); - const elements = useElements(); - const [errorMessage, setErrorMessage] = useState(null); - const [successMessage, setSuccessMessage] = useState(null); +const stripePromise = loadStripe("pk_test_51PyIYTP3VLLeb9GlXCKgD4ylbemZPx72I3HkEAu0bRtcsfK31nqb3WtUbXKXUcKmyfrxKLfuJzZCPyp7Ymtlq9zy00c7VmkL6G"); - const handleSubmit = async (event) => { - event.preventDefault(); +const PackageNumber = (selectedPackage) => { + switch (selectedPackage) { + case 'Gratuit': + return 1; + case 'Standard': + return 2; + case 'Premium': + return 3; + default: + return 1; + } +}; - if (!stripe || !elements) return; +const CheckoutForm = ({ email }) => { + const location = useLocation(); + const [clientSecret, setClientSecret] = useState(''); + const queryParams = new URLSearchParams(location.search); + const selectedPackage = queryParams.get('package'); + + const fetchClientSecret = useCallback(() => { + return fetch('http://192.168.68.114:3000/get-checkout-session', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'permission': PackageNumber(selectedPackage), + 'email': email, + }, + }) + .then((res) => res.json()) + .then((data) => { + if (data && data.clientSecret) { + setClientSecret(data.clientSecret); + } + }) + .catch((error) => { + console.error('Error fetching client secret:', error); + }); + }, [selectedPackage, email]); + + useEffect(() => { + fetchClientSecret(); + + + }, [fetchClientSecret]); + + + + return { clientSecret }; +}; + + + +const PaymentForm = ({ user }) => { + const navigate = useNavigate(); + const { clientSecret } = CheckoutForm({ email: user.email }); + + const options = { clientSecret }; - const cardElement = elements.getElement(CardElement); - const { error, paymentMethod } = await stripe.createPaymentMethod({ - type: 'card', - card: cardElement, - }); - if (error) { - setErrorMessage(error.message); - setSuccessMessage(null); - } else { - setSuccessMessage(`Paiement réussi! Méthode de paiement ID: ${paymentMethod.id}`); - setErrorMessage(null); - // Ici, vous devriez également envoyer paymentMethod.id à votre serveur - // Fermer la modal après un court délai ou après l'envoi à votre serveur - setTimeout(() => closeModal(), 2000); - } - }; return ( -
- - {errorMessage &&

{errorMessage}

} - {successMessage &&

{successMessage}

} - - - +
+ navigate('/Pricing')} + backButtonText="Retour" + /> +
+ + + +
+
); }; -export default PaymentForm; +PaymentForm.propTypes = { + user: PropTypes.shape({ + uid: PropTypes.string.isRequired, + email: PropTypes.string, + photoURL: PropTypes.string, + }).isRequired, +}; + +export default PaymentForm; \ No newline at end of file diff --git a/src/pages/Payement/PaymentForm/PaymentForm.module.scss b/src/pages/Payement/PaymentForm/PaymentForm.module.scss index 0bbf541..95748db 100644 --- a/src/pages/Payement/PaymentForm/PaymentForm.module.scss +++ b/src/pages/Payement/PaymentForm/PaymentForm.module.scss @@ -1,19 +1,7 @@ -.modal { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - } - - .modalContent { - background: #fff; - padding: 20px; - border-radius: 8px; - width: 300px; - } - \ No newline at end of file +.container{ + margin-top: 5.5rem; +} + +.Footer-PoweredBy-Text{ + display: none; +} \ No newline at end of file diff --git a/src/pages/Payement/Pricing.jsx b/src/pages/Payement/Pricing.jsx deleted file mode 100644 index f82b4df..0000000 --- a/src/pages/Payement/Pricing.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import React, { useState } from 'react'; -import styles from './Pricing.module.scss'; -import Navbar from '../../components/navbar/Navbar'; -import { useNavigate } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { loadStripe } from '@stripe/stripe-js'; -import { Elements } from '@stripe/react-stripe-js'; -import PaymentForm from './PaymentForm/PaymentForm'; - -const stripePromise = loadStripe('pk_test_51PyIYTP3VLLeb9GlXCKgD4ylbemZPx72I3HkEAu0bRtcsfK31nqb3WtUbXKXUcKmyfrxKLfuJzZCPyp7Ymtlq9zy00c7VmkL6G'); - -const Pricing = ({ user }) => { - const navigate = useNavigate(); - const [selectedPackage, setSelectedPackage] = useState(null); - const [isModalOpen, setIsModalOpen] = useState(false); - - const groups = [ - { title: 'Gratuit', price: '0 €', features: ['Accès limité', 'Support par e-mail'] }, - { title: 'Standard', price: '2 €', features: ['Accès complet', 'Support prioritaire'] }, - { title: 'Premium', price: '9 €', features: ['Accès illimité', 'Support 24/7'] }, - ]; - - const handleSubscribe = (pkg) => { - setSelectedPackage(pkg); - setIsModalOpen(true); - }; - - return ( -
- navigate('/Dashboard')} - /> - - {groups.map((pkg, index) => ( -
-

{pkg.title}

-

{pkg.price}

-
    - {pkg.features.map((feature, idx) => ( -
  • {feature}
  • - ))} -
- -
- ))} - - {isModalOpen && ( -
-
-

Paiement pour {selectedPackage.title}

- - setIsModalOpen(false)} /> - -
-
- )} -
- ); -}; - -Pricing.propTypes = { - user: PropTypes.object.isRequired, -}; - -export default Pricing; diff --git a/src/pages/Payement/Pricing/Pricing.jsx b/src/pages/Payement/Pricing/Pricing.jsx new file mode 100644 index 0000000..7f025c3 --- /dev/null +++ b/src/pages/Payement/Pricing/Pricing.jsx @@ -0,0 +1,52 @@ +import styles from './Pricing.module.scss'; +import Navbar from '../../../components/navbar/Navbar'; +import { useNavigate } from 'react-router-dom'; +import PropTypes from 'prop-types'; + +const Pricing = ({ user }) => { + const navigate = useNavigate(); + + const groups = [ + { title: 'Gratuit', price: '0 €', features: ['Accès limité', 'Support par e-mail'] }, + { title: 'Standard', price: '2 €', features: ['Accès complet', 'Support prioritaire'] }, + { title: 'Premium', price: '9 €', features: ['Accès illimité', 'Support 24/7'] }, + ]; + + const handleSubscribe = (pkg) => { + navigate(`/payement?package=${pkg.title}`); + }; + + return ( +
+ navigate('/Dashboard')} + /> + +
+ {groups.map((pkg, index) => ( +
+

{pkg.title}

+

{pkg.price}

+
    + {pkg.features.map((feature, idx) => ( +
  • {feature}
  • + ))} +
+ +
+ ))} +
+
+ ); +}; + +Pricing.propTypes = { + user: PropTypes.object.isRequired, +}; + +export default Pricing; diff --git a/src/pages/Payement/Pricing.module.scss b/src/pages/Payement/Pricing/Pricing.module.scss similarity index 70% rename from src/pages/Payement/Pricing.module.scss rename to src/pages/Payement/Pricing/Pricing.module.scss index b9d81a9..259d960 100644 --- a/src/pages/Payement/Pricing.module.scss +++ b/src/pages/Payement/Pricing/Pricing.module.scss @@ -2,35 +2,43 @@ $primary-color: #000; $secondary-color: #fff; .pricingContainer { + margin-top: 5rem; display: flex; justify-content: center; - gap: 20px; - padding: 40px; + flex-direction: row; + gap: 2rem; + padding: 4rem; background-color: $secondary-color; } +.packageList{ + display: flex; + flex-direction: row; + gap: 2rem; +} + .packageCard { background-color: $primary-color; color: $secondary-color; - border-radius: 8px; - padding: 20px; + border-radius: .8rem; + padding: 5rem; text-align: center; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); transition: transform 0.3s; &:hover { - transform: scale(1.05); + transform: scale(1.01); } } .title { - font-size: 24px; - margin-bottom: 10px; + font-size: 2rem; + margin-bottom: .6rem; } .price { - font-size: 32px; - margin: 10px 0; + font-size: 2.5rem; + margin: 1rem 0; } .features { @@ -52,9 +60,4 @@ $secondary-color: #fff; cursor: pointer; font-size: 16px; transition: background-color 0.3s; - - &:hover { - background-color: $primary-color; - color: $secondary-color; - } -} +} \ No newline at end of file diff --git a/src/service/firebase.jsx b/src/service/firebase.jsx index 5f84bdd..d8245a1 100644 --- a/src/service/firebase.jsx +++ b/src/service/firebase.jsx @@ -37,4 +37,16 @@ const getUserSubdomain = async (userId) => { } }; -export { auth, googleProvider, signInWithPopup, getUserSubdomain, app }; + +const getUserSubscription = async (userId) => { + const userDocRef = doc(db, 'users', userId); + const userDocSnap = await getDoc(userDocRef); + if (userDocSnap.exists()) { + const userData = userDocSnap.data(); + return userData.subscription; + } else { + throw new Error("No such document!"); + } +}; + +export { auth, googleProvider, signInWithPopup, getUserSubdomain, getUserSubscription, app };