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 { body:json {
{ {
"id": "evt_1Rg71IEEXQJo9EEOmxJtfwVm", "id": "evt_1RgRPrEEXQJo9EEOWggvNEHe",
"object": "event", "object": "event",
"api_version": "2025-05-28.basil", "api_version": "2025-05-28.basil",
"created": 1751387215, "created": 1751465619,
"data": { "data": {
"object": { "object": {
"id": "in_1Rg71FEEXQJo9EEOmxbGjtdH", "id": "cs_test_a1RMSyzQu5Mk2cZYoAYLOCV9hfoc5z9RuYdE4jLY2htoizGr1AJZeAcnDh",
"object": "invoice", "object": "checkout.session",
"account_country": "MY", "adaptive_pricing": {
"account_name": "MEMEAIGEN sandbox", "enabled": true
"account_tax_ids": null, },
"amount_due": 400, "after_expiration": null,
"amount_overpaid": 0, "allow_promotion_codes": null,
"amount_paid": 400, "amount_subtotal": 400,
"amount_remaining": 0, "amount_total": 400,
"amount_shipping": 0,
"application": null,
"attempt_count": 1,
"attempted": true,
"auto_advance": false,
"automatic_tax": { "automatic_tax": {
"disabled_reason": null,
"enabled": false, "enabled": false,
"liability": null, "liability": null,
"provider": null, "provider": null,
"status": null "status": null
}, },
"automatically_finalizes_at": null, "billing_address_collection": null,
"billing_reason": "subscription_create", "cancel_url": "https://memeaigen.test/subscribe/cancelled?session_id={CHECKOUT_SESSION_ID}",
"collection_method": "charge_automatically", "client_reference_id": null,
"created": 1751387213, "client_secret": null,
"currency": "usd", "collected_information": {
"custom_fields": null, "shipping_details": 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"
}, },
"last_finalization_error": null, "consent": null,
"latest_revision": null, "consent_collection": null,
"lines": { "created": 1751465613,
"object": "list", "currency": "usd",
"data": [ "currency_conversion": null,
{ "custom_fields": [],
"id": "il_1Rg71FEEXQJo9EEOhVjRevMb", "custom_text": {
"object": "line_item", "after_submit": null,
"amount": 400, "shipping_address": null,
"currency": "usd", "submit": null,
"description": "1 × Personal Creator (at $4.00 / month)", "terms_of_service_acceptance": null
"discount_amounts": [], },
"discountable": true, "customer": "cus_SbGYl34MpG4nv5",
"discounts": [], "customer_creation": null,
"invoice": "in_1Rg71FEEXQJo9EEOmxbGjtdH", "customer_details": {
"livemode": false, "address": {
"metadata": { "city": null,
"is_on_session_checkout": "true" "country": "MY",
}, "line1": null,
"parent": { "line2": null,
"invoice_item_details": null, "postal_code": null,
"subscription_item_details": { "state": null
"invoice_item": null, },
"proration": false, "email": "memeaigen.com@gmail.com",
"proration_details": { "name": "TEST NAME",
"credited_items": null "phone": null,
}, "tax_exempt": "none",
"subscription": "sub_1Rg71FEEXQJo9EEO18sXSEho", "tax_ids": []
"subscription_item": "si_SbJesuW5WgGoZ7" },
}, "customer_email": null,
"type": "subscription_item_details" "discounts": [],
}, "expires_at": 1751552013,
"period": { "invoice": null,
"end": 1754065613, "invoice_creation": {
"start": 1751387213 "enabled": false,
}, "invoice_data": {
"pretax_credit_amounts": [], "account_tax_ids": null,
"pricing": { "custom_fields": null,
"price_details": { "description": null,
"price": "price_1RfN2VEEXQJo9EEOzjPI2HGt", "footer": null,
"product": "prod_SaY8TGjiPi5hWu" "issuer": null,
}, "metadata": {},
"type": "price_details", "rendering_options": null
"unit_amount_decimal": "400" }
},
"quantity": 1,
"taxes": []
}
],
"has_more": false,
"total_count": 1,
"url": "/v1/invoices/in_1Rg71FEEXQJo9EEOmxbGjtdH/lines"
}, },
"livemode": false, "livemode": false,
"locale": null,
"metadata": {}, "metadata": {},
"next_payment_attempt": null, "mode": "payment",
"number": "IN7OJLTH-0001", "payment_intent": "pi_3RgRPqEEXQJo9EEO1a43uB5g",
"on_behalf_of": null, "payment_link": null,
"parent": { "payment_method_collection": "if_required",
"quote_details": null, "payment_method_configuration_details": {
"subscription_details": { "id": "pmc_1RfN0QEEXQJo9EEOzYHrN3LV",
"metadata": { "parent": null
"is_on_session_checkout": "true"
},
"subscription": "sub_1Rg71FEEXQJo9EEO18sXSEho"
},
"type": "subscription_details"
}, },
"payment_settings": { "payment_method_options": {
"default_mandate": null, "card": {
"payment_method_options": { "request_three_d_secure": "automatic"
"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
}, },
"period_end": 1751387213, "payment_method_types": [
"period_start": 1751387213, "card",
"post_payment_credit_notes_amount": 0, "link"
"pre_payment_credit_notes_amount": 0, ],
"receipt_number": null, "payment_status": "paid",
"rendering": null, "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_cost": null,
"shipping_details": null, "shipping_options": [],
"starting_balance": 0, "status": "complete",
"statement_descriptor": null, "submit_type": null,
"status": "paid", "subscription": null,
"status_transitions": { "success_url": "https://memeaigen.test/subscribe/success?session_id={CHECKOUT_SESSION_ID}",
"finalized_at": 1751387213, "total_details": {
"marked_uncollectible_at": null, "amount_discount": 0,
"paid_at": 1751387215, "amount_shipping": 0,
"voided_at": null "amount_tax": 0
}, },
"subtotal": 400, "ui_mode": "hosted",
"subtotal_excluding_tax": 400, "url": null,
"test_clock": null, "wallet_options": null
"total": 400,
"total_discount_amounts": [],
"total_excluding_tax": 400,
"total_pretax_credit_amounts": [],
"total_taxes": [],
"webhooks_delivered_at": null
} }
}, },
"livemode": false, "livemode": false,
"pending_webhooks": 2, "pending_webhooks": 2,
"request": { "request": {
"id": null, "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}> <Dialog open={isOpen} onOpenChange={onClose}>
<DialogContent> <DialogContent>
<DialogHeader> <DialogHeader>
<DialogTitle>Download Video</DialogTitle> <DialogTitle>Export Video</DialogTitle>
{exportStatus || {exportStatus ||
(exportProgress > 0 && ( (exportProgress > 0 && (
<DialogDescription> <DialogDescription>
@@ -39,7 +39,7 @@ const VideoDownloadModal = ({ isOpen, onClose, ffmpegCommand, handleDownloadButt
{showDebug && <Textarea value={ffmpegCommand} readOnly className="mb-4" />} {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 */} {/* Add your content here */}
</DialogContent> </DialogContent>

View File

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