Skip to content

Instantly share code, notes, and snippets.

@ryanbelke
Last active May 3, 2020 20:31
Show Gist options
  • Save ryanbelke/bcd5768c30551068b8e94e295cd85221 to your computer and use it in GitHub Desktop.
Save ryanbelke/bcd5768c30551068b8e94e295cd85221 to your computer and use it in GitHub Desktop.
/* /components/Checkout/CheckoutForm.js */
import React, { useState, useContext } from "react";
import { FormGroup, Label, Input } from "reactstrap";
import fetch from "isomorphic-fetch";
import Cookies from "js-cookie";
import { CardElement, useStripe, useElements } from "@stripe/react-stripe-js";
import CardSection from "./CardSection";
import AppContext from "../../context/appContext";
/* components/Checkout/CheckoutForm.js */
function CheckoutForm() {
const [data, setData] = useState({
address: "",
city: "",
state: "",
stripe_id: "",
});
const [error, setError] = useState("");
const stripe = useStripe();
const elements = useElements();
const appContext = useContext(AppContext);
function onChange(e) {
// set the key = to the name property equal to the value typed
const updateItem = (data[e.target.name] = e.target.value);
// update the state data object
setData({ ...data, updateItem });
}
async function submitOrder() {
// event.preventDefault();
// // Use elements.getElement to get a reference to the mounted Element.
const cardElement = elements.getElement(CardElement);
// // Pass the Element directly to other Stripe.js methods:
// // e.g. createToken - https://stripe.com/docs/js/tokens_sources/create_token?type=cardElement
// get token back from stripe to process credit card
const token = await stripe.createToken(cardElement);
const userToken = Cookies.get("token");
const response = await fetch("http://localhost:1337/orders", {
method: "POST",
headers: userToken && { Authorization: `Bearer ${userToken}` },
body: JSON.stringify({
amount: appContext.cart.total,
dishes: appContext.cart.items,
address: data.address,
city: data.city,
state: data.state,
token: token.token.id,
}),
});
if (!response.ok) {
setError(response.statusText);
}
// OTHER stripe methods you can use depending on app
// // or createPaymentMethod - https://stripe.com/docs/js/payment_intents/create_payment_method
// stripe.createPaymentMethod({
// type: "card",
// card: cardElement,
// });
// // or confirmCardPayment - https://stripe.com/docs/js/payment_intents/confirm_card_payment
// stripe.confirmCardPayment(paymentIntentClientSecret, {
// payment_method: {
// card: cardElement,
// },
// });
}
return (
<div className="paper">
<h5>Your information:</h5>
<hr />
<FormGroup style={{ display: "flex" }}>
<div style={{ flex: "0.90", marginRight: 10 }}>
<Label>Address</Label>
<Input name="address" onChange={onChange} />
</div>
</FormGroup>
<FormGroup style={{ display: "flex" }}>
<div style={{ flex: "0.65", marginRight: "6%" }}>
<Label>City</Label>
<Input name="city" onChange={onChange} />
</div>
<div style={{ flex: "0.25", marginRight: 0 }}>
<Label>State</Label>
<Input name="state" onChange={onChange} />
</div>
</FormGroup>
<CardSection data={data} stripeError={error} submitOrder={submitOrder} />
<style jsx global>
{`
.paper {
border: 1px solid lightgray;
box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.2),
0px 1px 1px 0px rgba(0, 0, 0, 0.14),
0px 2px 1px -1px rgba(0, 0, 0, 0.12);
height: 550px;
padding: 30px;
background: #fff;
border-radius: 6px;
margin-top: 90px;
}
.form-half {
flex: 0.5;
}
* {
box-sizing: border-box;
}
body,
html {
background-color: #f6f9fc;
font-size: 18px;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
}
h1 {
color: #32325d;
font-weight: 400;
line-height: 50px;
font-size: 40px;
margin: 20px 0;
padding: 0;
}
.Checkout {
margin: 0 auto;
max-width: 800px;
box-sizing: border-box;
padding: 0 5px;
}
label {
color: #6b7c93;
font-weight: 300;
letter-spacing: 0.025em;
}
button {
white-space: nowrap;
border: 0;
outline: 0;
display: inline-block;
height: 40px;
line-height: 40px;
padding: 0 14px;
box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11),
0 1px 3px rgba(0, 0, 0, 0.08);
color: #fff;
border-radius: 4px;
font-size: 15px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.025em;
background-color: #6772e5;
text-decoration: none;
-webkit-transition: all 150ms ease;
transition: all 150ms ease;
margin-top: 10px;
}
form {
margin-bottom: 40px;
padding-bottom: 40px;
border-bottom: 3px solid #e6ebf1;
}
button:hover {
color: #fff;
cursor: pointer;
background-color: #7795f8;
transform: translateY(-1px);
box-shadow: 0 7px 14px rgba(50, 50, 93, 0.1),
0 3px 6px rgba(0, 0, 0, 0.08);
}
input,
.StripeElement {
display: block;
background-color: #f8f9fa !important;
margin: 10px 0 20px 0;
max-width: 500px;
padding: 10px 14px;
font-size: 1em;
font-family: "Source Code Pro", monospace;
box-shadow: rgba(50, 50, 93, 0.14902) 0px 1px 3px,
rgba(0, 0, 0, 0.0196078) 0px 1px 0px;
border: 0;
outline: 0;
border-radius: 4px;
background: white;
}
input::placeholder {
color: #aab7c4;
}
input:focus,
.StripeElement--focus {
box-shadow: rgba(50, 50, 93, 0.109804) 0px 4px 6px,
rgba(0, 0, 0, 0.0784314) 0px 1px 3px;
-webkit-transition: all 150ms ease;
transition: all 150ms ease;
}
.StripeElement.IdealBankElement,
.StripeElement.PaymentRequestButton {
padding: 0;
}
`}
</style>
</div>
);
}
export default CheckoutForm;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment