After users pick their persona (role), they now land on a new Brand step that collects the same fields available in Settings → Workspace → Brand: website, description, tone, voice notes, and content language. When they continue, every AI-generated post for this workspace already has sensible defaults — before the user's first post is ever drafted. Flow: Role (persona) → Brand (new) → Connections → Subscription → Completed. A 'Skip for now' button on the brand step advances to Connections without touching the workspace (defaults stay at their seed values). Backend: - Setup enum gets a new Brand case slotted between Role and Connections with matching stepNumber updates. - OnboardingController::brand() renders the form pre-filled from the current workspace. storeBrand() validates via a new StoreBrandRequest form request and writes the fields onto the workspace, then advances setup. skipBrand() just advances. - storeRole() redirects to brand instead of account. enforceStep() knows how to redirect users whose setup is Brand. - Three new routes: GET /onboarding/brand, POST /onboarding/brand, POST /onboarding/brand/skip. Frontend: - New Brand.vue page mirrors the Settings brand form but inside the onboarding AuthLayout. Tone + language sit side by side, both selects take full width. Translations added to en, pt-BR, and es. - Wayfinder regenerated so the page can import storeBrand / skipBrand. Tests: - Renamed 'redirects to step2' → 'redirects to brand step' and assert new setup. - Added six new tests covering brand step auth, redirects, render, successful store, validation of tone and content_language, and skip. - Updated UserSetupTest for the new enum case + reshuffled step numbers.
39 lines
957 B
PHP
39 lines
957 B
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Enums\User;
|
|
|
|
enum Setup: string
|
|
{
|
|
case Registering = 'registering';
|
|
case Role = 'role';
|
|
case Brand = 'brand';
|
|
case Connections = 'connections';
|
|
case Subscription = 'subscription';
|
|
case Completed = 'completed';
|
|
|
|
public function label(): string
|
|
{
|
|
return match ($this) {
|
|
self::Registering => 'Registering',
|
|
self::Role => 'Select Role',
|
|
self::Brand => 'Configure Brand',
|
|
self::Connections => 'Connect Accounts',
|
|
self::Subscription => 'Start Subscription',
|
|
self::Completed => 'Completed',
|
|
};
|
|
}
|
|
|
|
public function stepNumber(): int
|
|
{
|
|
return match ($this) {
|
|
self::Registering => 0,
|
|
self::Role => 1,
|
|
self::Brand => 2,
|
|
self::Connections => 3,
|
|
self::Subscription => 4,
|
|
self::Completed => 5,
|
|
};
|
|
}
|
|
}
|