Files
twenty/packages/twenty-website/src/client-brief/client-brief-request-schema.ts
T
Rashad Karanouh ccbd3b6c46 Client brief wizard — /partners/brief (#22291)
## Brief — website (Release ① of the brief + glowup rollout)

Public client-brief wizard at `/partners/brief`, plus the marketplace
entry points (match-me card, brief prompt/link, brief CTAs across
partner surfaces).

**Backend already shipped:** the `submit-client-brief` logic function
merged in #22290 (v1.2.0) and is live in prod, so this PR is
**website-only** and needs no app deploy.

Rebased onto current `main` (was ~341 commits behind); lint + format
pass locally, typecheck/tests via CI.

### Release sequence (do not break)
1. **① Brief website — THIS PR.** Independent; backend already live in
prod. → merge → website deploy.
2. **② Glowup app → prod** (#22470). Rebase onto `main` (SDK 2.21),
apply deterministic-id handling, bump 1.2.10 → 1.3.0, `deploy` +
`install` on `partner-twenty-com`, set new app variables, refresh
partners-doc. **This is the gate for ③.**
3. **③ Glowup website** (#22471) — only **after ② is LIVE on prod** (it
reads the new partner links / services / case-study objects). → merge →
website deploy.
4. Reconcile #22637 (partners-traffic-web) with ③ — both touch
`partners-marketplace/*`.

Draft — do not merge until vetted.
2026-07-17 17:13:16 +00:00

25 lines
967 B
TypeScript

import { z } from 'zod';
import { emailFieldSchema } from '@/partner-application/email-field-schema';
import { CLIENT_BRIEF_HOSTING_TYPES } from './data/hosting-type-values';
const optionalNonEmptyString = z.string().trim().min(1).optional();
export const clientBriefRequestSchema = z.strictObject({
firstName: z.string().trim().min(1, { error: 'First name is required.' }),
lastName: z.string(),
email: emailFieldSchema,
companyName: z.string().trim().min(1, { error: 'Company name is required.' }),
need: z.string().trim().min(1, { error: 'Need is required.' }),
requirements: optionalNonEmptyString,
hostingType: z.enum(CLIENT_BRIEF_HOSTING_TYPES).optional(),
country: optionalNonEmptyString,
languages: z.array(z.string().trim().min(1)).optional(),
seatCount: optionalNonEmptyString,
timeline: optionalNonEmptyString,
budgetRange: optionalNonEmptyString,
});
export type ClientBriefRequest = z.infer<typeof clientBriefRequestSchema>;