zen: cancel waitlist
This commit is contained in:
@@ -219,8 +219,6 @@ 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
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
.root {
|
||||||
|
[data-slot="title-row"] {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--space-4);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import { action, useParams, useAction, useSubmission, json, createAsync } from "@solidjs/router"
|
||||||
|
import { createStore } from "solid-js/store"
|
||||||
|
import { Database, eq } from "@opencode-ai/console-core/drizzle/index.js"
|
||||||
|
import { BillingTable } from "@opencode-ai/console-core/schema/billing.sql.js"
|
||||||
|
import { withActor } from "~/context/auth.withActor"
|
||||||
|
import { queryBillingInfo } from "../../common"
|
||||||
|
import styles from "./black-waitlist-section.module.css"
|
||||||
|
|
||||||
|
const cancelWaitlist = action(async (workspaceID: string) => {
|
||||||
|
"use server"
|
||||||
|
return json(
|
||||||
|
await withActor(async () => {
|
||||||
|
await Database.use((tx) =>
|
||||||
|
tx
|
||||||
|
.update(BillingTable)
|
||||||
|
.set({
|
||||||
|
subscriptionPlan: null,
|
||||||
|
timeSubscriptionBooked: null,
|
||||||
|
})
|
||||||
|
.where(eq(BillingTable.workspaceID, workspaceID)),
|
||||||
|
)
|
||||||
|
return { error: undefined }
|
||||||
|
}, workspaceID).catch((e) => ({ error: e.message as string })),
|
||||||
|
{ revalidate: queryBillingInfo.key },
|
||||||
|
)
|
||||||
|
}, "cancelWaitlist")
|
||||||
|
|
||||||
|
export function BlackWaitlistSection() {
|
||||||
|
const params = useParams()
|
||||||
|
const billingInfo = createAsync(() => queryBillingInfo(params.id!))
|
||||||
|
const cancelAction = useAction(cancelWaitlist)
|
||||||
|
const cancelSubmission = useSubmission(cancelWaitlist)
|
||||||
|
const [store, setStore] = createStore({
|
||||||
|
cancelled: false,
|
||||||
|
})
|
||||||
|
|
||||||
|
async function onClickCancel() {
|
||||||
|
const result = await cancelAction(params.id!)
|
||||||
|
if (!result.error) {
|
||||||
|
setStore("cancelled", true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section class={styles.root}>
|
||||||
|
<div data-slot="section-title">
|
||||||
|
<h2>Waitlist</h2>
|
||||||
|
<div data-slot="title-row">
|
||||||
|
<p>You are on the waitlist for the ${billingInfo()?.subscriptionPlan} per month OpenCode Black plan.</p>
|
||||||
|
<button data-color="danger" disabled={cancelSubmission.pending || store.cancelled} onClick={onClickCancel}>
|
||||||
|
{cancelSubmission.pending ? "Leaving..." : store.cancelled ? "Left" : "Leave Waitlist"}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ import { BillingSection } from "./billing-section"
|
|||||||
import { ReloadSection } from "./reload-section"
|
import { ReloadSection } from "./reload-section"
|
||||||
import { PaymentSection } from "./payment-section"
|
import { PaymentSection } from "./payment-section"
|
||||||
import { BlackSection } from "./black-section"
|
import { BlackSection } from "./black-section"
|
||||||
|
import { BlackWaitlistSection } from "./black-waitlist-section"
|
||||||
import { Show } from "solid-js"
|
import { Show } from "solid-js"
|
||||||
import { createAsync, useParams } from "@solidjs/router"
|
import { createAsync, useParams } from "@solidjs/router"
|
||||||
import { queryBillingInfo, querySessionInfo } from "../../common"
|
import { queryBillingInfo, querySessionInfo } from "../../common"
|
||||||
@@ -16,9 +17,12 @@ export default function () {
|
|||||||
<div data-page="workspace-[id]">
|
<div data-page="workspace-[id]">
|
||||||
<div data-slot="sections">
|
<div data-slot="sections">
|
||||||
<Show when={sessionInfo()?.isAdmin}>
|
<Show when={sessionInfo()?.isAdmin}>
|
||||||
<Show when={billingInfo()?.subscriptionID || billingInfo()?.timeSubscriptionBooked}>
|
<Show when={billingInfo()?.subscriptionID}>
|
||||||
<BlackSection />
|
<BlackSection />
|
||||||
</Show>
|
</Show>
|
||||||
|
<Show when={billingInfo()?.timeSubscriptionBooked}>
|
||||||
|
<BlackWaitlistSection />
|
||||||
|
</Show>
|
||||||
<BillingSection />
|
<BillingSection />
|
||||||
<Show when={billingInfo()?.customerID}>
|
<Show when={billingInfo()?.customerID}>
|
||||||
<ReloadSection />
|
<ReloadSection />
|
||||||
|
|||||||
Reference in New Issue
Block a user