* 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>
31 lines
1010 B
TypeScript
31 lines
1010 B
TypeScript
import { z } from "zod";
|
|
|
|
import { eventTypeAppCardZod } from "../eventTypeAppCardZod";
|
|
import { paymentOptions } from "./lib/constants";
|
|
|
|
// Extract the payment options enum from paymentOptions
|
|
// https://stackoverflow.com/a/73825370
|
|
type PaymentOption = (typeof paymentOptions)[number]["value"];
|
|
const VALUES: [PaymentOption, ...PaymentOption[]] = [
|
|
paymentOptions[0].value,
|
|
...paymentOptions.slice(1).map((option) => option.value),
|
|
];
|
|
export const paymentOptionEnum = z.enum(VALUES);
|
|
|
|
export const appDataSchema = eventTypeAppCardZod.merge(
|
|
z.object({
|
|
price: z.number(),
|
|
currency: z.string(),
|
|
paymentOption: paymentOptionEnum.optional(),
|
|
})
|
|
);
|
|
|
|
export const appKeysSchema = z.object({
|
|
client_id: z.string().startsWith("ca_").min(1),
|
|
client_secret: z.string().startsWith("sk_").min(1),
|
|
public_key: z.string().startsWith("pk_").min(1),
|
|
webhook_secret: z.string().startsWith("whsec_").min(1),
|
|
payment_fee_fixed: z.number().min(0),
|
|
payment_fee_percentage: z.number().min(0),
|
|
});
|