ccbd3b6c46
## 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.
25 lines
967 B
TypeScript
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>;
|