diff --git a/packages/console/app/src/component/workspace/billing-section.tsx b/packages/console/app/src/component/workspace/billing-section.tsx index 7d297ed3..02cf8433 100644 --- a/packages/console/app/src/component/workspace/billing-section.tsx +++ b/packages/console/app/src/component/workspace/billing-section.tsx @@ -4,6 +4,8 @@ import { Billing } from "@opencode/console-core/billing.js" import { withActor } from "~/context/auth.withActor" import { IconCreditCard } from "~/component/icon" import styles from "./billing-section.module.css" +import { Database, eq } from "@opencode/console-core/drizzle/index.js" +import { BillingTable } from "@opencode/console-core/schema/billing.sql.js" const createCheckoutUrl = action(async (workspaceID: string, successUrl: string, cancelUrl: string) => { "use server" @@ -17,12 +19,23 @@ const reload = action(async (form: FormData) => { return json(await withActor(() => Billing.reload(), workspaceID), { revalidate: getBillingInfo.key }) }, "billing.reload") -const disableReload = action(async (form: FormData) => { +const setReload = action(async (form: FormData) => { "use server" const workspaceID = form.get("workspaceID")?.toString() if (!workspaceID) return { error: "Workspace ID is required" } - return json(await withActor(() => Billing.disableReload(), workspaceID), { revalidate: getBillingInfo.key }) -}, "billing.disableReload") + const reload = form.get("reload")?.toString() === "true" + return json( + await Database.use((tx) => + tx + .update(BillingTable) + .set({ + reload, + }) + .where(eq(BillingTable.workspaceID, workspaceID)), + ), + { revalidate: getBillingInfo.key }, + ) +}, "billing.setReload") const createSessionUrl = action(async (workspaceID: string, returnUrl: string) => { "use server" @@ -44,7 +57,7 @@ export function BillingSection() { const createCheckoutUrlSubmission = useSubmission(createCheckoutUrl) const createSessionUrlAction = useAction(createSessionUrl) const createSessionUrlSubmission = useSubmission(createSessionUrl) - const disableReloadSubmission = useSubmission(disableReload) + const setReloadSubmission = useSubmission(setReload) const reloadSubmission = useSubmission(reload) // DUMMY DATA FOR TESTING - UNCOMMENT ONE OF THE SCENARIOS BELOW @@ -89,6 +102,10 @@ export function BillingSection() { return ((balanceInfo()?.balance ?? 0) / 100000000).toFixed(2) }) + const hasBalance = createMemo(() => { + return (balanceInfo()?.balance ?? 0) > 0 && balanceAmount() !== "0.00" + }) + return (
@@ -136,19 +153,32 @@ export function BillingSection() { { - const baseUrl = window.location.href - const checkoutUrl = await createCheckoutUrlAction(params.id, baseUrl, baseUrl) - if (checkoutUrl) { - window.location.href = checkoutUrl - } - }} + { + const baseUrl = window.location.href + const checkoutUrl = await createCheckoutUrlAction(params.id, baseUrl, baseUrl) + if (checkoutUrl) { + window.location.href = checkoutUrl + } + }} + > + {createCheckoutUrlSubmission.pending ? "Loading..." : "Enable Billing"} + + } > - {createCheckoutUrlSubmission.pending ? "Loading..." : "Enable Billing"} - +
+ + + +
+
} > -
+ -
@@ -176,7 +207,7 @@ export function BillingSection() {
We'll load $20 (+$1.23 processing fee) and reload it when it reaches $5.