Compare commits

..

1 Commits

Author SHA1 Message Date
Jack b1710249f2 fix(console): remove email signup action
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
2026-06-29 11:33:01 +00:00
7 changed files with 24 additions and 110 deletions
@@ -1,10 +1,11 @@
import { Match, Show, Switch, createEffect, createMemo } from "solid-js"
import { Match, Show, Switch, createMemo } from "solid-js"
import { Tooltip, type TooltipProps } from "@opencode-ai/ui/tooltip"
import { ProgressCircle } from "@opencode-ai/ui/progress-circle"
import { ProgressCircleV2 } from "@opencode-ai/ui/v2/progress-circle-v2"
import { Button } from "@opencode-ai/ui/button"
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
import { useFile } from "@/context/file"
import { useLayout } from "@/context/layout"
import { useSync } from "@/context/sync"
import { useLanguage } from "@/context/language"
@@ -12,6 +13,7 @@ import { useProviders } from "@/hooks/use-providers"
import { useSDK } from "@/context/sdk"
import { getSessionContext, getSessionTokenTotal } from "@/components/session/session-context-metrics"
import { useSessionLayout } from "@/pages/session/session-layout"
import { createSessionTabs } from "@/pages/session/helpers"
interface SessionContextUsageProps {
variant?: "button" | "indicator"
@@ -32,6 +34,7 @@ function openSessionContext(args: {
export function SessionContextUsage(props: SessionContextUsageProps) {
const sync = useSync()
const file = useFile()
const layout = useLayout()
const language = useLanguage()
const sdk = useSDK()
@@ -40,6 +43,11 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
const variant = createMemo(() => props.variant ?? "button")
const buttonAppearance = createMemo(() => props.buttonAppearance ?? "default")
const tabState = createSessionTabs({
tabs,
pathFromTab: file.pathFromTab,
normalizeTab: (tab) => (tab.startsWith("file://") ? file.tab(tab) : tab),
})
const messages = createMemo(() => (params.id ? (sync().data.message[params.id] ?? []) : []))
const info = createMemo(() => (params.id ? sync().session.get(params.id) : undefined))
@@ -57,27 +65,15 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
return usd().format(info()?.cost ?? 0)
})
let openedPanelWithContext = false
createEffect(() => {
if (!view().reviewPanel.opened()) openedPanelWithContext = false
})
const openContext = () => {
if (!params.id) return
const sessionView = view()
if (sessionView.reviewPanel.opened() && tabs().active() === "context") {
const hasOtherTabs = tabs().all().some((tab) => tab !== "context" && tab !== "review")
if (tabState.activeTab() === "context") {
tabs().close("context")
if (openedPanelWithContext && !hasOtherTabs) sessionView.reviewPanel.close()
openedPanelWithContext = false
return
}
openedPanelWithContext = !sessionView.reviewPanel.opened()
openSessionContext({
view: sessionView,
view: view(),
layout,
tabs: tabs(),
})
@@ -85,20 +81,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
const circle = () => (
<div class="flex items-center justify-center">
<ProgressCircle
size={16}
strokeWidth={2}
percentage={context()?.usage ?? 0}
style={
variant() === "indicator"
? {
"--progress-circle-background": "var(--v2-background-bg-layer-04, var(--border-weak-base))",
"--progress-circle-background-overlay": "var(--v2-overlay-simple-overlay-pressed, transparent)",
"--progress-circle-progress": "var(--v2-icon-icon-base, var(--icon-base))",
}
: undefined
}
/>
<ProgressCircle size={16} strokeWidth={2} percentage={context()?.usage ?? 0} />
</div>
)
const circleV2 = () => (
@@ -136,10 +119,10 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
return (
<Show when={params.id}>
<Switch>
<Match when={variant() === "indicator"}>{circle()}</Match>
<Match when={buttonAppearance() === "v2"}>
<Tooltip value={tooltipValue()} placement={props.placement ?? "top"}>
<Tooltip value={tooltipValue()} placement={props.placement ?? "top"}>
<Switch>
<Match when={variant() === "indicator"}>{circle()}</Match>
<Match when={buttonAppearance() === "v2"}>
<IconButtonV2
type="button"
variant="ghost-muted"
@@ -148,10 +131,8 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
onClick={openContext}
aria-label={language.t("context.usage.view")}
/>
</Tooltip>
</Match>
<Match when={true}>
<Tooltip value={tooltipValue()} placement={props.placement ?? "top"}>
</Match>
<Match when={true}>
<Button
type="button"
variant="ghost"
@@ -161,9 +142,9 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
>
{circle()}
</Button>
</Tooltip>
</Match>
</Switch>
</Match>
</Switch>
</Tooltip>
</Show>
)
}
@@ -1,47 +0,0 @@
import { action, useSubmission } from "@solidjs/router"
import { Resource } from "@opencode-ai/console-resource"
import { Show } from "solid-js"
import { useI18n } from "~/context/i18n"
const emailSignup = action(async (formData: FormData) => {
"use server"
const emailAddress = formData.get("email")!
const listId = "8b9bb82c-9d5f-11f0-975f-0df6fd1e4945"
const response = await fetch(`https://api.emailoctopus.com/lists/${listId}/contacts`, {
method: "PUT",
headers: {
Authorization: `Bearer ${Resource.EMAILOCTOPUS_API_KEY.value}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
email_address: emailAddress,
}),
})
console.log(response)
return true
})
export function EmailSignup() {
const submission = useSubmission(emailSignup)
const i18n = useI18n()
return (
<section data-component="email">
<div data-slot="section-title">
<h3>{i18n.t("email.title")}</h3>
<p>{i18n.t("email.subtitle")}</p>
</div>
<form data-slot="form" action={emailSignup} method="post">
<input type="email" name="email" placeholder={i18n.t("email.placeholder")} required />
<button type="submit" disabled={submission.pending}>
{i18n.t("email.subscribe")}
</button>
</form>
<Show when={submission.result}>
<div style="color: #03B000; margin-top: 24px;">{i18n.t("email.success")}</div>
</Show>
<Show when={submission.error}>
<div style="color: #FF408F; margin-top: 24px;">{submission.error}</div>
</Show>
</section>
)
}
@@ -5,7 +5,6 @@ import { For, createMemo, createSignal, onCleanup, onMount } from "solid-js"
//import { HttpHeader } from "@solidjs/start"
import goLogoLight from "../../asset/go-ornate-light.svg"
import goLogoDark from "../../asset/go-ornate-dark.svg"
import { EmailSignup } from "~/component/email-signup"
import { Faq } from "~/component/faq"
import { Legal } from "~/component/legal"
import { Footer } from "~/component/footer"
@@ -516,8 +515,6 @@ export default function Home() {
</ul>
</section>
<EmailSignup />
<Footer />
</div>
</div>
@@ -5,7 +5,6 @@ import video from "../asset/lander/opencode-min.mp4"
import videoPoster from "../asset/lander/opencode-poster.png"
import { IconCopy, IconCheck } from "../component/icon"
import { A, createAsync } from "@solidjs/router"
import { EmailSignup } from "~/component/email-signup"
import { Tabs } from "@kobalte/core/tabs"
import { Faq } from "~/component/faq"
import { Header } from "~/component/header"
@@ -826,8 +825,6 @@ export default function Home() {
</div>
</section>
<EmailSignup />
<Footer />
</div>
</div>
@@ -11,7 +11,6 @@ import avatarJay from "../../asset/lander/avatar-jay.png"
import avatarFrank from "../../asset/lander/avatar-frank.png"
import avatarAdam from "../../asset/lander/avatar-adam.png"
import avatarDavid from "../../asset/lander/avatar-david.png"
import { EmailSignup } from "~/component/email-signup"
import { Faq } from "~/component/faq"
import { Legal } from "~/component/legal"
import { Footer } from "~/component/footer"
@@ -324,8 +323,6 @@ export default function Home() {
</ul>
</section>
<EmailSignup />
<Footer />
</div>
</div>
@@ -2,15 +2,11 @@
transform: rotate(-90deg);
[data-slot="progress-circle-background"] {
stroke: var(--progress-circle-background, var(--border-weak-base));
}
[data-slot="progress-circle-background-overlay"] {
stroke: var(--progress-circle-background-overlay, transparent);
stroke: var(--border-weak-base);
}
[data-slot="progress-circle-progress"] {
stroke: var(--progress-circle-progress, var(--border-active));
stroke: var(--border-active);
transition: stroke-dashoffset 0.35s cubic-bezier(0.65, 0, 0.35, 1);
}
}
@@ -1,6 +1,6 @@
import { type ComponentProps, createMemo, splitProps } from "solid-js"
export interface ProgressCircleProps extends Pick<ComponentProps<"svg">, "class" | "classList" | "style"> {
export interface ProgressCircleProps extends Pick<ComponentProps<"svg">, "class" | "classList"> {
percentage: number
size?: number
strokeWidth?: number
@@ -43,13 +43,6 @@ export function ProgressCircle(props: ProgressCircleProps) {
data-slot="progress-circle-background"
stroke-width={strokeWidth()}
/>
<circle
cx={center}
cy={center}
r={radius()}
data-slot="progress-circle-background-overlay"
stroke-width={strokeWidth()}
/>
<circle
cx={center}
cy={center}