feat: implement onboarding wizard and fix help page navigation

Core Features:
- Add Quick Setup Wizard for new users with multi-step flow
- Implement distraction-free onboarding layout (no sidebar/header)
- Create OnboardingController API endpoint for saving settings
- Redirect new users to /setup automatically on first admin access

Onboarding Components:
- StepMode: Select between full/minimal store modes
- StepHomepage: Choose or auto-create homepage
- StepAppearance: Configure container width and primary color
- StepProgress: Visual progress indicator

Navigation & Routing:
- Fix Help page links to use react-router navigation (prevent full reload)
- Update onboarding completion redirect to /appearance/pages
- Add manual onboarding access via Settings > Store Details

UI/UX Improvements:
- Enable dark mode support for Page Editor
- Fix page title rendering in onboarding dropdown
- Improve title fallback logic (title.rendered, title, post_title)

Type Safety:
- Unify PageItem interface across all components
- Add 'default' to containerWidth type definition
- Add missing properties (permalink_base, has_template, icon)

Files Modified:
- includes/Api/OnboardingController.php
- includes/Api/Routes.php
- includes/Admin/Assets.php
- admin-spa/src/App.tsx
- admin-spa/src/routes/Onboarding/*
- admin-spa/src/routes/Help/DocContent.tsx
- admin-spa/src/routes/Settings/Store.tsx
- admin-spa/src/routes/Appearance/Pages/*
This commit is contained in:
Dwindi Ramadhana
2026-02-06 00:30:38 +07:00
parent 7da4f0a167
commit 687a2318b0
15 changed files with 755 additions and 124 deletions

View File

@@ -1,4 +1,5 @@
<?php
namespace WooNooW\Api;
use WP_REST_Request;
@@ -37,148 +38,155 @@ use WooNooW\Api\Controllers\SettingsController;
use WooNooW\Api\Controllers\CartController as ApiCartController;
use WooNooW\Admin\AppearanceController;
use WooNooW\Api\PagesController;
use WooNooW\Api\OnboardingController;
class Routes {
public static function init() {
class Routes
{
public static function init()
{
// Initialize controllers (register action hooks)
OrdersController::init();
AppearanceController::init();
// Initialize CartController auth bypass (must be before rest_api_init)
FrontendCartController::init();
add_action('rest_api_init', function () {
$namespace = 'woonoow/v1';
// Auth endpoints (public - no permission check)
register_rest_route( $namespace, '/auth/login', [
register_rest_route($namespace, '/auth/login', [
'methods' => 'POST',
'callback' => [ AuthController::class, 'login' ],
'callback' => [AuthController::class, 'login'],
'permission_callback' => '__return_true',
] );
register_rest_route( $namespace, '/auth/logout', [
]);
register_rest_route($namespace, '/auth/logout', [
'methods' => 'POST',
'callback' => [ AuthController::class, 'logout' ],
'callback' => [AuthController::class, 'logout'],
'permission_callback' => '__return_true',
] );
register_rest_route( $namespace, '/auth/check', [
]);
register_rest_route($namespace, '/auth/check', [
'methods' => 'GET',
'callback' => [ AuthController::class, 'check' ],
'callback' => [AuthController::class, 'check'],
'permission_callback' => '__return_true',
] );
]);
// Customer login endpoint (no admin permission required)
register_rest_route( $namespace, '/auth/customer-login', [
register_rest_route($namespace, '/auth/customer-login', [
'methods' => 'POST',
'callback' => [ AuthController::class, 'customer_login' ],
'callback' => [AuthController::class, 'customer_login'],
'permission_callback' => '__return_true',
] );
]);
// Forgot password endpoint (public)
register_rest_route( $namespace, '/auth/forgot-password', [
register_rest_route($namespace, '/auth/forgot-password', [
'methods' => 'POST',
'callback' => [ AuthController::class, 'forgot_password' ],
'callback' => [AuthController::class, 'forgot_password'],
'permission_callback' => '__return_true',
] );
]);
// Validate password reset key (public)
register_rest_route( $namespace, '/auth/validate-reset-key', [
register_rest_route($namespace, '/auth/validate-reset-key', [
'methods' => 'POST',
'callback' => [ AuthController::class, 'validate_reset_key' ],
'callback' => [AuthController::class, 'validate_reset_key'],
'permission_callback' => '__return_true',
] );
]);
// Reset password with key (public)
register_rest_route( $namespace, '/auth/reset-password', [
register_rest_route($namespace, '/auth/reset-password', [
'methods' => 'POST',
'callback' => [ AuthController::class, 'reset_password' ],
'callback' => [AuthController::class, 'reset_password'],
'permission_callback' => '__return_true',
] );
]);
// Defer to controllers to register their endpoints
CheckoutController::register();
OrdersController::register();
AnalyticsController::register_routes();
// Settings controller
$settings_controller = new SettingsController();
$settings_controller->register_routes();
// Payments controller
$payments_controller = new PaymentsController();
$payments_controller->register_routes();
// Store controller
$store_controller = new StoreController();
$store_controller->register_routes();
// Shipping controller
$shipping_controller = new ShippingController();
$shipping_controller->register_routes();
// Tax controller
$tax_controller = new TaxController();
$tax_controller->register_routes();
// Pickup locations controller
$pickup_controller = new PickupLocationsController();
$pickup_controller->register_routes();
// Email controller
$email_controller = new EmailController();
$email_controller->register_routes();
// Developer controller
$developer_controller = new DeveloperController();
$developer_controller->register_routes();
// System controller
$system_controller = new SystemController();
$system_controller->register_routes();
// Notifications controller
$notifications_controller = new NotificationsController();
$notifications_controller->register_routes();
// Activity Log controller
$activity_log_controller = new ActivityLogController();
$activity_log_controller->register_routes();
// Products controller
ProductsController::register_routes();
// Coupons controller
CouponsController::register_routes();
// Customers controller
CustomersController::register_routes();
// Newsletter controller
NewsletterController::register_routes();
// Campaigns controller
CampaignsController::register_routes();
// Licenses controller (licensing module)
LicensesController::register_routes();
// Subscriptions controller (subscription module)
SubscriptionsController::register_routes();
// Modules controller
$modules_controller = new ModulesController();
$modules_controller->register_routes();
// Module Settings controller
$module_settings_controller = new ModuleSettingsController();
$module_settings_controller->register_routes();
// Documentation controller
$docs_controller = new DocsController();
$docs_controller->register_routes();
// Onboarding controller
$onboarding_controller = new OnboardingController();
$onboarding_controller->register_routes();
// Frontend controllers (customer-facing)
ShopController::register_routes();
FrontendCartController::register_routes();
@@ -186,7 +194,7 @@ class Routes {
AddressController::register_routes();
WishlistController::register_routes();
HookBridge::register_routes();
// Pages and templates controller
PagesController::register_routes();
});