Files
webklar.com-v2-beta/src/lib/stripe.ts
2026-01-07 18:08:21 +01:00

99 lines
2.2 KiB
TypeScript

import { loadStripe } from '@stripe/stripe-js';
// Stripe Configuration
export const STRIPE_CONFIG = {
publishableKey: import.meta.env.VITE_STRIPE_PUBLISHABLE_KEY || '',
apiUrl: import.meta.env.VITE_API_URL || 'http://localhost:3001',
};
// Stripe instance (lazy loaded)
let stripePromise: ReturnType<typeof loadStripe> | null = null;
export function getStripe() {
if (!stripePromise && STRIPE_CONFIG.publishableKey) {
stripePromise = loadStripe(STRIPE_CONFIG.publishableKey);
}
return stripePromise;
}
// Types
export interface OrderData {
websiteType: string;
style: string;
theme: string;
colors: {
primary: string;
secondary: string;
accent: string;
};
customInput?: {
referenceUrl: string;
description: string;
};
contact: {
name: string;
email: string;
company?: string;
phone?: string;
};
}
export interface CheckoutResponse {
sessionId: string;
url: string;
}
export interface SessionData {
id: string;
status: string;
customerEmail: string;
amountTotal: number;
metadata: Record<string, string>;
}
/**
* Create a Stripe Checkout Session via backend API
*/
export async function createCheckoutSession(orderData: OrderData): Promise<CheckoutResponse> {
const response = await fetch(`${STRIPE_CONFIG.apiUrl}/api/checkout`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ orderData }),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.details || error.error || 'Failed to create checkout session');
}
return response.json();
}
/**
* Redirect to Stripe Checkout
*/
export async function redirectToCheckout(orderData: OrderData): Promise<void> {
const { url } = await createCheckoutSession(orderData);
if (url) {
window.location.href = url;
} else {
throw new Error('No checkout URL returned');
}
}
/**
* Verify a checkout session (for success page)
*/
export async function verifySession(sessionId: string): Promise<SessionData> {
const response = await fetch(`${STRIPE_CONFIG.apiUrl}/api/session/${sessionId}`);
if (!response.ok) {
throw new Error('Session not found');
}
return response.json();
}