This commit is contained in:
ct
2025-07-03 01:23:15 +08:00
parent db892fc4f5
commit 2f9f34ebc7
3 changed files with 142 additions and 184 deletions

View File

@@ -12,179 +12,136 @@ post {
body:json {
{
"id": "evt_1Rg71IEEXQJo9EEOmxJtfwVm",
"id": "evt_1RgRPrEEXQJo9EEOWggvNEHe",
"object": "event",
"api_version": "2025-05-28.basil",
"created": 1751387215,
"created": 1751465619,
"data": {
"object": {
"id": "in_1Rg71FEEXQJo9EEOmxbGjtdH",
"object": "invoice",
"account_country": "MY",
"account_name": "MEMEAIGEN sandbox",
"account_tax_ids": null,
"amount_due": 400,
"amount_overpaid": 0,
"amount_paid": 400,
"amount_remaining": 0,
"amount_shipping": 0,
"application": null,
"attempt_count": 1,
"attempted": true,
"auto_advance": false,
"id": "cs_test_a1RMSyzQu5Mk2cZYoAYLOCV9hfoc5z9RuYdE4jLY2htoizGr1AJZeAcnDh",
"object": "checkout.session",
"adaptive_pricing": {
"enabled": true
},
"after_expiration": null,
"allow_promotion_codes": null,
"amount_subtotal": 400,
"amount_total": 400,
"automatic_tax": {
"disabled_reason": null,
"enabled": false,
"liability": null,
"provider": null,
"status": null
},
"automatically_finalizes_at": null,
"billing_reason": "subscription_create",
"collection_method": "charge_automatically",
"created": 1751387213,
"currency": "usd",
"custom_fields": null,
"customer": "cus_SbGYl34MpG4nv5",
"customer_address": null,
"customer_email": "memeaigen.com@gmail.com",
"customer_name": null,
"customer_phone": null,
"customer_shipping": null,
"customer_tax_exempt": "none",
"customer_tax_ids": [],
"default_payment_method": null,
"default_source": null,
"default_tax_rates": [],
"description": null,
"discounts": [],
"due_date": null,
"effective_at": 1751387213,
"ending_balance": 0,
"footer": null,
"from_invoice": null,
"hosted_invoice_url": "https://invoice.stripe.com/i/acct_1RfMzuEEXQJo9EEO/test_YWNjdF8xUmZNenVFRVhRSm85RUVPLF9TYkplU0VDWWdKSG53bDVZT2VuNjNGZFFaaFJsbFFkLDE0MTkyODAxNg0200EQHRg6hn?s=ap",
"invoice_pdf": "https://pay.stripe.com/invoice/acct_1RfMzuEEXQJo9EEO/test_YWNjdF8xUmZNenVFRVhRSm85RUVPLF9TYkplU0VDWWdKSG53bDVZT2VuNjNGZFFaaFJsbFFkLDE0MTkyODAxNg0200EQHRg6hn/pdf?s=ap",
"issuer": {
"type": "self"
"billing_address_collection": null,
"cancel_url": "https://memeaigen.test/subscribe/cancelled?session_id={CHECKOUT_SESSION_ID}",
"client_reference_id": null,
"client_secret": null,
"collected_information": {
"shipping_details": null
},
"last_finalization_error": null,
"latest_revision": null,
"lines": {
"object": "list",
"data": [
{
"id": "il_1Rg71FEEXQJo9EEOhVjRevMb",
"object": "line_item",
"amount": 400,
"currency": "usd",
"description": "1 × Personal Creator (at $4.00 / month)",
"discount_amounts": [],
"discountable": true,
"discounts": [],
"invoice": "in_1Rg71FEEXQJo9EEOmxbGjtdH",
"livemode": false,
"metadata": {
"is_on_session_checkout": "true"
},
"parent": {
"invoice_item_details": null,
"subscription_item_details": {
"invoice_item": null,
"proration": false,
"proration_details": {
"credited_items": null
},
"subscription": "sub_1Rg71FEEXQJo9EEO18sXSEho",
"subscription_item": "si_SbJesuW5WgGoZ7"
},
"type": "subscription_item_details"
},
"period": {
"end": 1754065613,
"start": 1751387213
},
"pretax_credit_amounts": [],
"pricing": {
"price_details": {
"price": "price_1RfN2VEEXQJo9EEOzjPI2HGt",
"product": "prod_SaY8TGjiPi5hWu"
},
"type": "price_details",
"unit_amount_decimal": "400"
},
"quantity": 1,
"taxes": []
}
],
"has_more": false,
"total_count": 1,
"url": "/v1/invoices/in_1Rg71FEEXQJo9EEOmxbGjtdH/lines"
"consent": null,
"consent_collection": null,
"created": 1751465613,
"currency": "usd",
"currency_conversion": null,
"custom_fields": [],
"custom_text": {
"after_submit": null,
"shipping_address": null,
"submit": null,
"terms_of_service_acceptance": null
},
"customer": "cus_SbGYl34MpG4nv5",
"customer_creation": null,
"customer_details": {
"address": {
"city": null,
"country": "MY",
"line1": null,
"line2": null,
"postal_code": null,
"state": null
},
"email": "memeaigen.com@gmail.com",
"name": "TEST NAME",
"phone": null,
"tax_exempt": "none",
"tax_ids": []
},
"customer_email": null,
"discounts": [],
"expires_at": 1751552013,
"invoice": null,
"invoice_creation": {
"enabled": false,
"invoice_data": {
"account_tax_ids": null,
"custom_fields": null,
"description": null,
"footer": null,
"issuer": null,
"metadata": {},
"rendering_options": null
}
},
"livemode": false,
"locale": null,
"metadata": {},
"next_payment_attempt": null,
"number": "IN7OJLTH-0001",
"on_behalf_of": null,
"parent": {
"quote_details": null,
"subscription_details": {
"metadata": {
"is_on_session_checkout": "true"
},
"subscription": "sub_1Rg71FEEXQJo9EEO18sXSEho"
},
"type": "subscription_details"
"mode": "payment",
"payment_intent": "pi_3RgRPqEEXQJo9EEO1a43uB5g",
"payment_link": null,
"payment_method_collection": "if_required",
"payment_method_configuration_details": {
"id": "pmc_1RfN0QEEXQJo9EEOzYHrN3LV",
"parent": null
},
"payment_settings": {
"default_mandate": null,
"payment_method_options": {
"acss_debit": null,
"bancontact": null,
"card": {
"request_three_d_secure": "automatic"
},
"customer_balance": null,
"konbini": null,
"sepa_debit": null,
"us_bank_account": null
},
"payment_method_types": null
"payment_method_options": {
"card": {
"request_three_d_secure": "automatic"
}
},
"period_end": 1751387213,
"period_start": 1751387213,
"post_payment_credit_notes_amount": 0,
"pre_payment_credit_notes_amount": 0,
"receipt_number": null,
"rendering": null,
"payment_method_types": [
"card",
"link"
],
"payment_status": "paid",
"permissions": null,
"phone_number_collection": {
"enabled": false
},
"recovered_from": null,
"saved_payment_method_options": {
"allow_redisplay_filters": [
"always"
],
"payment_method_remove": "disabled",
"payment_method_save": null
},
"setup_intent": null,
"shipping_address_collection": null,
"shipping_cost": null,
"shipping_details": null,
"starting_balance": 0,
"statement_descriptor": null,
"status": "paid",
"status_transitions": {
"finalized_at": 1751387213,
"marked_uncollectible_at": null,
"paid_at": 1751387215,
"voided_at": null
"shipping_options": [],
"status": "complete",
"submit_type": null,
"subscription": null,
"success_url": "https://memeaigen.test/subscribe/success?session_id={CHECKOUT_SESSION_ID}",
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"subtotal": 400,
"subtotal_excluding_tax": 400,
"test_clock": null,
"total": 400,
"total_discount_amounts": [],
"total_excluding_tax": 400,
"total_pretax_credit_amounts": [],
"total_taxes": [],
"webhooks_delivered_at": null
"ui_mode": "hosted",
"url": null,
"wallet_options": null
}
},
"livemode": false,
"pending_webhooks": 2,
"request": {
"id": null,
"idempotency_key": "e50baede-20b6-4a06-a2c4-15f43ca47dd4"
"idempotency_key": null
},
"type": "invoice.paid"
"type": "checkout.session.completed"
}
}

View File

@@ -12,7 +12,7 @@ const VideoDownloadModal = ({ isOpen, onClose, ffmpegCommand, handleDownloadButt
<Dialog open={isOpen} onOpenChange={onClose}>
<DialogContent>
<DialogHeader>
<DialogTitle>Download Video</DialogTitle>
<DialogTitle>Export Video</DialogTitle>
{exportStatus ||
(exportProgress > 0 && (
<DialogDescription>
@@ -39,7 +39,7 @@ const VideoDownloadModal = ({ isOpen, onClose, ffmpegCommand, handleDownloadButt
{showDebug && <Textarea value={ffmpegCommand} readOnly className="mb-4" />}
<Button onClick={handleDownloadButton}>{isExporting ? <Spinner className="text-secondary h-4 w-4" /> : 'Download'}</Button>
<Button onClick={handleDownloadButton}>{isExporting ? <Spinner className="text-secondary h-4 w-4" /> : 'Export Video'}</Button>
{/* Add your content here */}
</DialogContent>

View File

@@ -165,22 +165,7 @@ const UpgradeSheet = () => {
<>
{auth.user && plan.tier != 'free' ? (
<div className="mx-auto space-y-6 rounded-lg border p-4 text-center sm:p-7">
<SparklesText className="text-xl font-bold sm:text-2xl">You're now in the {plan?.name} plan!</SparklesText>
<Button
variant="outline"
onClick={() => {
handleRedirectBillingPortal();
}}
disabled={isRedirectingToBilling}
>
{isRedirectingToBilling ? <Spinner className="text-muted-foreground h-4 w-4" /> : 'Manage Subscription'}
</Button>
<div className="text-muted-foreground block rounded border p-3 text-center text-xs">
<ShieldIcon className="mr-1 mb-1 inline h-4 w-4" />
All our payments are securely processed by Stripe.
</div>
<SparklesText className="text-xl font-bold sm:text-xl">You're now in the {plan?.name} plan!</SparklesText>
</div>
) : (
<div id="plan-purchase" className="mx-auto space-y-6 rounded-lg border p-4 text-center sm:p-7">
@@ -210,11 +195,6 @@ const UpgradeSheet = () => {
)}
</Button>
<div className="text-muted-foreground text-xs">* Launch pricing limited to first 1000 users</div>
<div className="text-muted-foreground block rounded border p-3 text-center text-xs">
<ShieldIcon className="mr-1 mb-1 inline h-4 w-4" />
All our payments are securely processed by Stripe.
</div>
</div>
</div>
)}
@@ -269,19 +249,40 @@ const UpgradeSheet = () => {
</div>
</div>
<div id="faq" className="space-y-4 rounded-lg border p-4 sm:p-7">
<div className="text-center text-xl font-extrabold sm:text-2xl">Frequently Asked Questions</div>
<Accordion type="single" collapsible className="w-full" defaultValue="item-1">
{faqData.map((faq, index) => (
<AccordionItem key={index} value={`item-${index + 1}`}>
<AccordionTrigger className="text-left text-sm break-words sm:text-base">{faq.q}</AccordionTrigger>
<AccordionContent className="flex flex-col gap-4 text-balance">
<div className="overflow-wrap-anywhere text-sm break-words" dangerouslySetInnerHTML={{ __html: faq.a }} />
</AccordionContent>
</AccordionItem>
))}
</Accordion>
<div className="flex flex-col justify-center space-y-2 rounded border p-3">
<div className="mx-auto">
<Button
variant="outline"
onClick={() => {
handleRedirectBillingPortal();
}}
disabled={isRedirectingToBilling}
>
{isRedirectingToBilling ? <Spinner className="text-muted-foreground h-4 w-4" /> : 'Manage Billing'}
</Button>
</div>
<div className="text-muted-foreground text-center text-xs">
<ShieldIcon className="mr-1 mb-1 inline h-4 w-4" />
All our billing & payments are securely processed by Stripe.
</div>
</div>
{!(auth.user && plan.tier != 'free') && (
<div id="faq" className="space-y-4 rounded-lg border p-4 sm:p-7">
<div className="text-center text-xl font-extrabold sm:text-2xl">Frequently Asked Questions</div>
<Accordion type="single" collapsible className="w-full" defaultValue="item-1">
{faqData.map((faq, index) => (
<AccordionItem key={index} value={`item-${index + 1}`}>
<AccordionTrigger className="text-left text-sm break-words sm:text-base">{faq.q}</AccordionTrigger>
<AccordionContent className="flex flex-col gap-4 text-balance">
<div className="overflow-wrap-anywhere text-sm break-words" dangerouslySetInnerHTML={{ __html: faq.a }} />
</AccordionContent>
</AccordionItem>
))}
</Accordion>
</div>
)}
</div>
<SheetFooter>