* Add payment option to schema * Add payment option to Stripe zod * Set payment option on event type * Create manual payment intent in Stripe * Set payment option from Stripe app * Add payment option to DB * Pass React.ReactNode to checkbox * Create uncaptured payment intent * WIP * Capture card in setup intent * Show charge card option * Charge card from booking page * Bug fixes * Clean up * Clean up app card * Add no-show fee messaging on booking page * Send payment email on payment & add price * Fix messaging * Create no show fee charged email * Send charge fee collected email * Disable submit on card failure * Clean up * Serverside prevent charging card again if already charged * Only confirm booking if paid for * Type fixes * More type fixes * More type fixes * Type fix * Type fixes * UI changes * Payment component rework * Update apps/web/public/static/locales/en/common.json Co-authored-by: Alex van Andel <me@alexvanandel.com> * Update apps/web/public/static/locales/en/common.json Co-authored-by: Alex van Andel <me@alexvanandel.com> * Update apps/web/components/dialog/ChargeCardDialog.tsx Co-authored-by: Alex van Andel <me@alexvanandel.com> * Update packages/trpc/server/routers/viewer/payments.tsx Co-authored-by: Alex van Andel <me@alexvanandel.com> * Revert GTM config * Adjust payment option dropdown * Show alert when seats are set * Small bug fixes * Create collect card method * clean up * Prevent seats & charge no-show fee to be enabled together * Do not charge no-show fee on unconfirmed bookings * Add check to collect card method * Webhook send request emails * Fix some dark mode colours * Change awaiting payment language * Type fixes * Set height of Select and TextField both to 38px to fix alignment * Fix message seats & payment error message * Type fix --------- Co-authored-by: Alex van Andel <me@alexvanandel.com>
37 lines
1.0 KiB
TypeScript
37 lines
1.0 KiB
TypeScript
import Stripe from "stripe";
|
|
import { z } from "zod";
|
|
|
|
export type StripePaymentData = Stripe.Response<Stripe.PaymentIntent> & {
|
|
stripe_publishable_key: string;
|
|
stripeAccount: string;
|
|
};
|
|
|
|
export type StripeSetupIntentData = {
|
|
setupIntent: Stripe.Response<Stripe.SetupIntent>;
|
|
paymentIntent?: StripePaymentData;
|
|
};
|
|
|
|
export const stripeOAuthTokenSchema = z.object({
|
|
access_token: z.string().optional(),
|
|
scope: z.string().optional(),
|
|
livemode: z.boolean().optional(),
|
|
token_type: z.literal("bearer").optional(),
|
|
refresh_token: z.string().optional(),
|
|
stripe_user_id: z.string().optional(),
|
|
stripe_publishable_key: z.string().optional(),
|
|
});
|
|
|
|
export const stripeDataSchema = stripeOAuthTokenSchema.extend({
|
|
default_currency: z.string(),
|
|
});
|
|
|
|
export type StripeData = z.infer<typeof stripeDataSchema>;
|
|
|
|
/** Figure out a way to get this from the DB without too much wreckage. */
|
|
const stripePrivateKey = process.env.STRIPE_PRIVATE_KEY!;
|
|
const stripe = new Stripe(stripePrivateKey, {
|
|
apiVersion: "2020-08-27",
|
|
});
|
|
|
|
export default stripe;
|