Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
38 lines
1,012 B
Text
38 lines
1,012 B
Text
import {StripeConstructor} from '../types';
|
|
import {loadScript, initStripe, LoadStripe} from './shared';
|
|
|
|
let stripePromise: Promise<StripeConstructor | null> | null;
|
|
let loadCalled = false;
|
|
|
|
const getStripePromise: () => Promise<StripeConstructor | null> = () => {
|
|
if (stripePromise) {
|
|
return stripePromise;
|
|
}
|
|
|
|
stripePromise = loadScript(null).catch((error) => {
|
|
// clear cache on error
|
|
stripePromise = null;
|
|
return Promise.reject(error);
|
|
});
|
|
return stripePromise;
|
|
};
|
|
|
|
// Execute our own script injection after a tick to give users time to do their
|
|
// own script injection.
|
|
Promise.resolve()
|
|
.then(() => getStripePromise())
|
|
.catch((error) => {
|
|
if (!loadCalled) {
|
|
console.warn(error);
|
|
}
|
|
});
|
|
|
|
export const loadStripe: LoadStripe = (...args) => {
|
|
loadCalled = true;
|
|
const startTime = Date.now();
|
|
|
|
// if previous attempts are unsuccessful, will re-load script
|
|
return getStripePromise().then((maybeStripe) =>
|
|
initStripe(maybeStripe, args, startTime)
|
|
);
|
|
};
|