diff --git a/infra/console.ts b/infra/console.ts index c7889c587..7b6f21001 100644 --- a/infra/console.ts +++ b/infra/console.ts @@ -201,6 +201,10 @@ const bucketNew = new sst.cloudflare.Bucket("ZenDataNew") const AWS_SES_ACCESS_KEY_ID = new sst.Secret("AWS_SES_ACCESS_KEY_ID") const AWS_SES_SECRET_ACCESS_KEY = new sst.Secret("AWS_SES_SECRET_ACCESS_KEY") +const SALESFORCE_CLIENT_ID = new sst.Secret("SALESFORCE_CLIENT_ID") +const SALESFORCE_CLIENT_SECRET = new sst.Secret("SALESFORCE_CLIENT_SECRET") +const SALESFORCE_INSTANCE_URL = new sst.Secret("SALESFORCE_INSTANCE_URL") + const logProcessor = new sst.cloudflare.Worker("LogProcessor", { handler: "packages/console/function/src/log-processor.ts", link: [new sst.Secret("HONEYCOMB_API_KEY")], @@ -219,6 +223,9 @@ new sst.cloudflare.x.SolidStart("Console", { EMAILOCTOPUS_API_KEY, AWS_SES_ACCESS_KEY_ID, AWS_SES_SECRET_ACCESS_KEY, + SALESFORCE_CLIENT_ID, + SALESFORCE_CLIENT_SECRET, + SALESFORCE_INSTANCE_URL, ZEN_BLACK_PRICE, ZEN_LITE_PRICE, new sst.Secret("ZEN_LIMITS"), diff --git a/package.json b/package.json index 97087c0e7..00e251f50 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:desktop": "bun --cwd packages/desktop tauri dev", "dev:web": "bun --cwd packages/app dev", + "dev:console": "ulimit -n 10240 2>/dev/null; bun run --cwd packages/console/app dev", "dev:storybook": "bun --cwd packages/storybook storybook", "typecheck": "bun turbo typecheck", "prepare": "husky", diff --git a/packages/console/app/src/i18n/ar.ts b/packages/console/app/src/i18n/ar.ts index b59315aef..9c6ba326d 100644 --- a/packages/console/app/src/i18n/ar.ts +++ b/packages/console/app/src/i18n/ar.ts @@ -688,8 +688,12 @@ export const dict = { "enterprise.form.name.placeholder": "جيف بيزوس", "enterprise.form.role.label": "المنصب", "enterprise.form.role.placeholder": "رئيس مجلس الإدارة التنفيذي", + "enterprise.form.company.label": "الشركة", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "البريد الإلكتروني للشركة", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "رقم الهاتف", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "ما المشكلة التي تحاول حلها؟", "enterprise.form.message.placeholder": "نحتاج مساعدة في...", "enterprise.form.send": "إرسال", diff --git a/packages/console/app/src/i18n/br.ts b/packages/console/app/src/i18n/br.ts index a18f3e401..e654bdade 100644 --- a/packages/console/app/src/i18n/br.ts +++ b/packages/console/app/src/i18n/br.ts @@ -700,8 +700,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Cargo", "enterprise.form.role.placeholder": "Presidente Executivo", + "enterprise.form.company.label": "Empresa", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "E-mail corporativo", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Telefone", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Qual problema você está tentando resolver?", "enterprise.form.message.placeholder": "Precisamos de ajuda com...", "enterprise.form.send": "Enviar", diff --git a/packages/console/app/src/i18n/da.ts b/packages/console/app/src/i18n/da.ts index ca3231648..99bc7ec14 100644 --- a/packages/console/app/src/i18n/da.ts +++ b/packages/console/app/src/i18n/da.ts @@ -694,8 +694,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Rolle", "enterprise.form.role.placeholder": "Bestyrelsesformand", + "enterprise.form.company.label": "Virksomhed", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "Firma-e-mail", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Telefonnummer", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Hvilket problem prøver du at løse?", "enterprise.form.message.placeholder": "Vi har brug for hjælp med...", "enterprise.form.send": "Send", diff --git a/packages/console/app/src/i18n/de.ts b/packages/console/app/src/i18n/de.ts index d7ed88e36..c366411c3 100644 --- a/packages/console/app/src/i18n/de.ts +++ b/packages/console/app/src/i18n/de.ts @@ -699,8 +699,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Rolle", "enterprise.form.role.placeholder": "Executive Chairman", + "enterprise.form.company.label": "Unternehmen", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "Firmen-E-Mail", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Telefonnummer", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Welches Problem versuchen Sie zu lösen?", "enterprise.form.message.placeholder": "Wir brauchen Hilfe bei...", "enterprise.form.send": "Senden", diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts index 8b410bb61..fec02f15c 100644 --- a/packages/console/app/src/i18n/en.ts +++ b/packages/console/app/src/i18n/en.ts @@ -689,8 +689,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Role", "enterprise.form.role.placeholder": "Executive Chairman", + "enterprise.form.company.label": "Company", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "Company email", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Phone number", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "What problem are you trying to solve?", "enterprise.form.message.placeholder": "We need help with...", "enterprise.form.send": "Send", diff --git a/packages/console/app/src/i18n/es.ts b/packages/console/app/src/i18n/es.ts index bb466568e..2c811a2d3 100644 --- a/packages/console/app/src/i18n/es.ts +++ b/packages/console/app/src/i18n/es.ts @@ -699,8 +699,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Rol", "enterprise.form.role.placeholder": "Presidente Ejecutivo", + "enterprise.form.company.label": "Empresa", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "Correo de empresa", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Teléfono", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "¿Qué problema estás intentando resolver?", "enterprise.form.message.placeholder": "Necesitamos ayuda con...", "enterprise.form.send": "Enviar", diff --git a/packages/console/app/src/i18n/fr.ts b/packages/console/app/src/i18n/fr.ts index 8ac20c47c..49a418caf 100644 --- a/packages/console/app/src/i18n/fr.ts +++ b/packages/console/app/src/i18n/fr.ts @@ -706,8 +706,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Poste", "enterprise.form.role.placeholder": "Président exécutif", + "enterprise.form.company.label": "Entreprise", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "E-mail professionnel", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Téléphone", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Quel problème essayez-vous de résoudre ?", "enterprise.form.message.placeholder": "Nous avons besoin d'aide pour...", "enterprise.form.send": "Envoyer", diff --git a/packages/console/app/src/i18n/it.ts b/packages/console/app/src/i18n/it.ts index bd8e17a5f..7f6a109e4 100644 --- a/packages/console/app/src/i18n/it.ts +++ b/packages/console/app/src/i18n/it.ts @@ -696,8 +696,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Ruolo", "enterprise.form.role.placeholder": "Presidente Esecutivo", + "enterprise.form.company.label": "Azienda", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "Email aziendale", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Numero di telefono", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Quale problema stai cercando di risolvere?", "enterprise.form.message.placeholder": "Abbiamo bisogno di aiuto con...", "enterprise.form.send": "Invia", diff --git a/packages/console/app/src/i18n/ja.ts b/packages/console/app/src/i18n/ja.ts index e1979041c..d54af67bf 100644 --- a/packages/console/app/src/i18n/ja.ts +++ b/packages/console/app/src/i18n/ja.ts @@ -697,8 +697,12 @@ export const dict = { "enterprise.form.name.placeholder": "ジェフ・ベゾス", "enterprise.form.role.label": "役職", "enterprise.form.role.placeholder": "会長", + "enterprise.form.company.label": "会社名", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "会社メールアドレス", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "電話番号", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "どのような課題を解決したいですか?", "enterprise.form.message.placeholder": "これについて支援が必要です...", "enterprise.form.send": "送信", diff --git a/packages/console/app/src/i18n/ko.ts b/packages/console/app/src/i18n/ko.ts index bf90e9c4e..9434150d5 100644 --- a/packages/console/app/src/i18n/ko.ts +++ b/packages/console/app/src/i18n/ko.ts @@ -688,8 +688,12 @@ export const dict = { "enterprise.form.name.placeholder": "홍길동", "enterprise.form.role.label": "직책", "enterprise.form.role.placeholder": "CTO / 개발 팀장", + "enterprise.form.company.label": "회사", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "회사 이메일", "enterprise.form.email.placeholder": "name@company.com", + "enterprise.form.phone.label": "전화번호", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "어떤 문제를 해결하고 싶으신가요?", "enterprise.form.message.placeholder": "도움이 필요한 부분은...", "enterprise.form.send": "전송", diff --git a/packages/console/app/src/i18n/no.ts b/packages/console/app/src/i18n/no.ts index 0aef49f0d..d31ec1aee 100644 --- a/packages/console/app/src/i18n/no.ts +++ b/packages/console/app/src/i18n/no.ts @@ -695,8 +695,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Rolle", "enterprise.form.role.placeholder": "Styreleder", + "enterprise.form.company.label": "Selskap", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "Bedrifts-e-post", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Telefonnummer", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Hvilket problem prøver dere å løse?", "enterprise.form.message.placeholder": "Vi trenger hjelp med...", "enterprise.form.send": "Send", diff --git a/packages/console/app/src/i18n/pl.ts b/packages/console/app/src/i18n/pl.ts index 19aa503df..5c7005459 100644 --- a/packages/console/app/src/i18n/pl.ts +++ b/packages/console/app/src/i18n/pl.ts @@ -698,8 +698,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Rola", "enterprise.form.role.placeholder": "Prezes Zarządu", + "enterprise.form.company.label": "Firma", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "E-mail firmowy", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Numer telefonu", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Jaki problem próbujesz rozwiązać?", "enterprise.form.message.placeholder": "Potrzebujemy pomocy z...", "enterprise.form.send": "Wyślij", diff --git a/packages/console/app/src/i18n/ru.ts b/packages/console/app/src/i18n/ru.ts index e5dee8303..779b4c9ac 100644 --- a/packages/console/app/src/i18n/ru.ts +++ b/packages/console/app/src/i18n/ru.ts @@ -703,8 +703,12 @@ export const dict = { "enterprise.form.name.placeholder": "Джефф Безос", "enterprise.form.role.label": "Роль", "enterprise.form.role.placeholder": "Исполнительный председатель", + "enterprise.form.company.label": "Компания", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "Корпоративная почта", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Номер телефона", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Какую проблему вы пытаетесь решить?", "enterprise.form.message.placeholder": "Нам нужна помощь с...", "enterprise.form.send": "Отправить", diff --git a/packages/console/app/src/i18n/th.ts b/packages/console/app/src/i18n/th.ts index c765a1813..7b69e5736 100644 --- a/packages/console/app/src/i18n/th.ts +++ b/packages/console/app/src/i18n/th.ts @@ -691,8 +691,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "ตำแหน่ง", "enterprise.form.role.placeholder": "ประธานกรรมการบริหาร", + "enterprise.form.company.label": "บริษัท", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "อีเมลบริษัท", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "หมายเลขโทรศัพท์", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "คุณกำลังพยายามแก้ปัญหาอะไร?", "enterprise.form.message.placeholder": "เราต้องการความช่วยเหลือเรื่อง...", "enterprise.form.send": "ส่ง", diff --git a/packages/console/app/src/i18n/tr.ts b/packages/console/app/src/i18n/tr.ts index 561153755..f700d90dd 100644 --- a/packages/console/app/src/i18n/tr.ts +++ b/packages/console/app/src/i18n/tr.ts @@ -700,8 +700,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "Rol", "enterprise.form.role.placeholder": "Yönetim Kurulu Başkanı", + "enterprise.form.company.label": "Şirket", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "Şirket e-postası", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "Telefon numarası", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "Hangi problemi çözmeye çalışıyorsunuz?", "enterprise.form.message.placeholder": "Şu konuda yardıma ihtiyacımız var...", "enterprise.form.send": "Gönder", diff --git a/packages/console/app/src/i18n/zh.ts b/packages/console/app/src/i18n/zh.ts index 1a5fb0ff2..27fd28480 100644 --- a/packages/console/app/src/i18n/zh.ts +++ b/packages/console/app/src/i18n/zh.ts @@ -669,8 +669,12 @@ export const dict = { "enterprise.form.name.placeholder": "Jeff Bezos", "enterprise.form.role.label": "角色", "enterprise.form.role.placeholder": "执行主席", + "enterprise.form.company.label": "公司", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "公司邮箱", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "电话号码", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "您想解决什么问题?", "enterprise.form.message.placeholder": "我们需要帮助...", "enterprise.form.send": "发送", diff --git a/packages/console/app/src/i18n/zht.ts b/packages/console/app/src/i18n/zht.ts index 44f3ebee0..55895747f 100644 --- a/packages/console/app/src/i18n/zht.ts +++ b/packages/console/app/src/i18n/zht.ts @@ -668,8 +668,12 @@ export const dict = { "enterprise.form.name.placeholder": "傑夫·貝佐斯", "enterprise.form.role.label": "職稱", "enterprise.form.role.placeholder": "執行董事長", + "enterprise.form.company.label": "公司", + "enterprise.form.company.placeholder": "Acme Inc", "enterprise.form.email.label": "公司 Email", "enterprise.form.email.placeholder": "jeff@amazon.com", + "enterprise.form.phone.label": "電話號碼", + "enterprise.form.phone.placeholder": "+1 234 567 8900", "enterprise.form.message.label": "你想解決什麼問題?", "enterprise.form.message.placeholder": "我們需要幫助來...", "enterprise.form.send": "傳送", diff --git a/packages/console/app/src/lib/salesforce.ts b/packages/console/app/src/lib/salesforce.ts new file mode 100644 index 000000000..48e0caee7 --- /dev/null +++ b/packages/console/app/src/lib/salesforce.ts @@ -0,0 +1,81 @@ +import { Resource } from "@opencode-ai/console-resource" + +async function login() { + const url = Resource.SALESFORCE_INSTANCE_URL.value.replace(/\/$/, "") + const clientId = Resource.SALESFORCE_CLIENT_ID.value + const clientSecret = Resource.SALESFORCE_CLIENT_SECRET.value + + const params = new URLSearchParams({ + grant_type: "client_credentials", + client_id: clientId, + client_secret: clientSecret, + }) + + const res = await fetch(`${url}/services/oauth2/token`, { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: params.toString(), + }).catch((err) => { + console.error("Failed to fetch Salesforce access token:", err) + }) + + if (!res) return + + if (!res.ok) { + console.error("Failed to fetch Salesforce access token:", res.status, await res.text()) + return + } + + const data = (await res.json()) as { access_token?: string; instance_url?: string } + if (!data.access_token) { + console.error("Salesforce auth response did not include an access token") + return + } + + return { + token: data.access_token, + url: data.instance_url ?? url, + } +} + +export interface SalesforceLeadInput { + name: string + role: string + company?: string + email: string + phone?: string + message: string +} + +export async function createLead(input: SalesforceLeadInput): Promise { + const auth = await login() + if (!auth) return false + + const res = await fetch(`${auth.url}/services/data/v59.0/sobjects/Lead`, { + method: "POST", + headers: { + Authorization: `Bearer ${auth.token}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + LastName: input.name, + Company: input.company?.trim() || "Website", + Email: input.email, + Phone: input.phone ?? null, + Title: input.role, + Description: input.message, + LeadSource: "Website", + }), + }).catch((err) => { + console.error("Failed to create Salesforce lead:", err) + }) + + if (!res) return false + + if (!res.ok) { + console.error("Failed to create Salesforce lead:", res.status, await res.text()) + return false + } + + return true +} diff --git a/packages/console/app/src/routes/api/enterprise.ts b/packages/console/app/src/routes/api/enterprise.ts index 27e2dc493..1bc4d0eb2 100644 --- a/packages/console/app/src/routes/api/enterprise.ts +++ b/packages/console/app/src/routes/api/enterprise.ts @@ -2,11 +2,15 @@ import type { APIEvent } from "@solidjs/start/server" import { AWS } from "@opencode-ai/console-core/aws.js" import { i18n } from "~/i18n" import { localeFromRequest } from "~/lib/language" +import { createLead } from "~/lib/salesforce" interface EnterpriseFormData { name: string role: string + company?: string email: string + phone?: string + alias?: string message: string } @@ -14,33 +18,56 @@ export async function POST(event: APIEvent) { const dict = i18n(localeFromRequest(event.request)) try { const body = (await event.request.json()) as EnterpriseFormData + const trap = typeof body.alias === "string" ? body.alias.trim() : "" + + if (trap) { + return Response.json({ success: true, message: dict["enterprise.form.success.submitted"] }, { status: 200 }) + } - // Validate required fields if (!body.name || !body.role || !body.email || !body.message) { return Response.json({ error: dict["enterprise.form.error.allFieldsRequired"] }, { status: 400 }) } - // Validate email format const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ if (!emailRegex.test(body.email)) { return Response.json({ error: dict["enterprise.form.error.invalidEmailFormat"] }, { status: 400 }) } - // Create email content const emailContent = ` ${body.message}

--
${body.name}
${body.role}
-${body.email}`.trim() +${body.company ? `${body.company}
` : ""}${body.email}
+${body.phone ? `${body.phone}
` : ""}`.trim() - // Send email using AWS SES - await AWS.sendEmail({ - to: "contact@anoma.ly", - subject: `Enterprise Inquiry from ${body.name}`, - body: emailContent, - replyTo: body.email, - }) + const [lead, mail] = await Promise.all([ + createLead({ + name: body.name, + role: body.role, + company: body.company, + email: body.email, + phone: body.phone, + message: body.message, + }), + AWS.sendEmail({ + to: "contact@anoma.ly", + subject: `Enterprise Inquiry from ${body.name}`, + body: emailContent, + replyTo: body.email, + }).then( + () => true, + (err) => { + console.error("Failed to send enterprise email:", err) + return false + }, + ), + ]) + + if (!lead && !mail) { + console.error("Enterprise inquiry delivery failed", { email: body.email }) + return Response.json({ error: dict["enterprise.form.error.internalServer"] }, { status: 500 }) + } return Response.json({ success: true, message: dict["enterprise.form.success.submitted"] }, { status: 200 }) } catch (error) { diff --git a/packages/console/app/src/routes/enterprise/index.css b/packages/console/app/src/routes/enterprise/index.css index 584c94fa5..5c594bb51 100644 --- a/packages/console/app/src/routes/enterprise/index.css +++ b/packages/console/app/src/routes/enterprise/index.css @@ -23,6 +23,7 @@ --color-text-strong: hsl(0, 5%, 12%); --color-text-inverted: hsl(0, 20%, 99%); --color-text-success: hsl(119, 100%, 35%); + --color-text-error: hsl(4, 72%, 45%); --color-border: hsl(30, 2%, 81%); --color-border-weak: hsl(0, 1%, 85%); @@ -50,6 +51,7 @@ --color-text-strong: hsl(0, 15%, 94%); --color-text-inverted: hsl(0, 9%, 7%); --color-text-success: hsl(119, 60%, 72%); + --color-text-error: hsl(4, 76%, 72%); --color-border: hsl(0, 3%, 28%); --color-border-weak: hsl(0, 4%, 23%); @@ -454,6 +456,13 @@ color: var(--color-text-success); text-align: left; } + + [data-component="error-message"] { + margin-top: 1rem; + padding: 1rem 0; + color: var(--color-text-error); + text-align: left; + } } } diff --git a/packages/console/app/src/routes/enterprise/index.tsx b/packages/console/app/src/routes/enterprise/index.tsx index ee323ff82..9e3d03473 100644 --- a/packages/console/app/src/routes/enterprise/index.tsx +++ b/packages/console/app/src/routes/enterprise/index.tsx @@ -13,11 +13,15 @@ export default function Enterprise() { const [formData, setFormData] = createSignal({ name: "", role: "", + company: "", email: "", + phone: "", + alias: "", message: "", }) const [isSubmitting, setIsSubmitting] = createSignal(false) const [showSuccess, setShowSuccess] = createSignal(false) + const [error, setError] = createSignal("") const handleInputChange = (field: string) => (e: Event) => { const target = e.target as HTMLInputElement | HTMLTextAreaElement @@ -26,6 +30,8 @@ export default function Enterprise() { const handleSubmit = async (e: Event) => { e.preventDefault() + setError("") + setShowSuccess(false) setIsSubmitting(true) try { @@ -42,13 +48,21 @@ export default function Enterprise() { setFormData({ name: "", role: "", + company: "", email: "", + phone: "", + alias: "", message: "", }) setTimeout(() => setShowSuccess(false), 5000) + return } + + const data = (await response.json().catch(() => null)) as { error?: string } | null + setError(data?.error ?? i18n.t("enterprise.form.error.internalServer")) } catch (error) { console.error("Failed to submit form:", error) + setError(i18n.t("enterprise.form.error.internalServer")) } finally { setIsSubmitting(false) } @@ -147,6 +161,19 @@ export default function Enterprise() {
+ +
+
+ + +
+
+
+ + +
+