wip: black

This commit is contained in:
Frank
2026-01-13 19:46:14 -05:00
parent 45fa4eda15
commit 82319bbd83

View File

@@ -1,4 +1,4 @@
import { A, action, createAsync, json, query, redirect, useParams } from "@solidjs/router" import { A, createAsync, query, redirect, useParams } from "@solidjs/router"
import { Title } from "@solidjs/meta" import { Title } from "@solidjs/meta"
import { createEffect, createSignal, For, Match, Show, Switch } from "solid-js" import { createEffect, createSignal, For, Match, Show, Switch } from "solid-js"
import { type Stripe, type PaymentMethod, loadStripe } from "@stripe/stripe-js" import { type Stripe, type PaymentMethod, loadStripe } from "@stripe/stripe-js"
@@ -35,6 +35,7 @@ const getWorkspaces = query(async () => {
paymentMethodType: BillingTable.paymentMethodType, paymentMethodType: BillingTable.paymentMethodType,
paymentMethodLast4: BillingTable.paymentMethodLast4, paymentMethodLast4: BillingTable.paymentMethodLast4,
subscriptionID: BillingTable.subscriptionID, subscriptionID: BillingTable.subscriptionID,
timeSubscriptionBooked: BillingTable.timeSubscriptionBooked,
}, },
}) })
.from(UserTable) .from(UserTable)
@@ -86,6 +87,14 @@ const createSetupIntent = async (input: { plan: string; workspaceID: string }) =
}, },
}) })
customerID = customer.id customerID = customer.id
await Database.use((tx) =>
tx
.update(BillingTable)
.set({
customerID,
})
.where(eq(BillingTable.workspaceID, workspaceID)),
)
} }
const intent = await Billing.stripe().setupIntents.create({ const intent = await Billing.stripe().setupIntents.create({
@@ -135,8 +144,7 @@ interface SuccessData {
function Failure(props: { message: string }) { function Failure(props: { message: string }) {
return ( return (
<div data-slot="failure"> <div data-slot="failure">
<p data-slot="title">Uh oh, something went wrong</p> <p data-slot="message">Uh oh! {props.message}</p>
<p data-slot="message">{props.message}</p>
</div> </div>
) )
} }
@@ -197,7 +205,7 @@ function IntentForm(props: { plan: PlanID; workspaceID: string; onSuccess: (data
const { error: confirmError, setupIntent } = await stripe()!.confirmSetup({ const { error: confirmError, setupIntent } = await stripe()!.confirmSetup({
elements: elements()!, elements: elements()!,
confirmParams: { confirmParams: {
expand: ["setup_intent.payment_method"], expand: ["payment_method"],
payment_method_data: { payment_method_data: {
allow_redisplay: "always", allow_redisplay: "always",
}, },
@@ -211,6 +219,8 @@ function IntentForm(props: { plan: PlanID; workspaceID: string; onSuccess: (data
return return
} }
// TODO
console.log(setupIntent)
if (setupIntent?.status === "succeeded") { if (setupIntent?.status === "succeeded") {
const pm = setupIntent.payment_method as PaymentMethod const pm = setupIntent.payment_method as PaymentMethod
@@ -274,7 +284,7 @@ export default function BlackSubscribe() {
}) })
// Fetch setup intent when workspace is selected (unless workspace already has payment method) // Fetch setup intent when workspace is selected (unless workspace already has payment method)
createEffect(() => { createEffect(async () => {
const id = selectedWorkspace() const id = selectedWorkspace()
if (!id) return if (!id) return
@@ -284,6 +294,15 @@ export default function BlackSubscribe() {
return return
} }
if (ws?.billing?.paymentMethodID) { if (ws?.billing?.paymentMethodID) {
if (!ws?.billing?.timeSubscriptionBooked) {
await bookSubscription({
workspaceID: id,
plan: planData.id,
paymentMethodID: ws.billing.paymentMethodID!,
paymentMethodType: ws.billing.paymentMethodType!,
paymentMethodLast4: ws.billing.paymentMethodLast4 ?? undefined,
})
}
setSuccess({ setSuccess({
plan: planData.id, plan: planData.id,
paymentMethodType: ws.billing.paymentMethodType!, paymentMethodType: ws.billing.paymentMethodType!,
@@ -292,15 +311,12 @@ export default function BlackSubscribe() {
return return
} }
createSetupIntent({ plan, workspaceID: id }) const result = await createSetupIntent({ plan, workspaceID: id })
.then((data) => { if (result.error) {
if (data.error) { setFailure(result.error)
setFailure(data.error) } else if ("clientSecret" in result) {
} else if ("clientSecret" in data) { setClientSecret(result.clientSecret)
setClientSecret(data.clientSecret) }
}
})
.catch(() => setFailure("Failed to initialize payment"))
}) })
// Keyboard navigation for workspace picker // Keyboard navigation for workspace picker