barsa d5e22f14f5 feat: add address reconciliation queue service for Salesforce integration
- Implement AddressReconcileQueueService to handle address reconciliation jobs between WHMCS and Salesforce.
- Define job data structure and queue configuration for retries and error handling.
- Add methods for enqueueing reconciliation jobs and retrieving queue health metrics.

feat: create loading components for various services in the portal

- Add loading skeletons for Internet, SIM, VPN, and public services configuration.
- Implement loading states for account-related views including account details, services, and verification settings.
- Introduce loading states for support case details and subscription actions.

feat: implement OTP input component for user verification

- Create OtpInput component to handle 6-digit OTP input with auto-focus and navigation.
- Add LoginOtpStep component for OTP verification during login, including countdown timer and error handling.

feat: define address domain constants for validation

- Establish constants for address field length limits to ensure compliance with WHMCS API constraints.
- Include maximum lengths for address fields and user input fields to maintain data integrity.
2026-02-03 11:48:49 +09:00
..
2025-08-22 17:02:49 +09:00

Portal Structure Overview

This app follows a feature-first architecture with a consolidated lib for shared utilities.

Structure:

src/
  app/           # Next.js App Router
  components/    # Design system (ui, layout, common)
  features/      # Feature modules (auth, billing, subscriptions, ...)
  lib/           # Core utils and services (api, query, env, utils, types)
  providers/     # App-wide providers (e.g., QueryProvider)
  styles/        # Global styles

Key changes:

  • Merged former core/ and shared/ into lib/.
  • Moved components/providers/query-provider.tsx to providers/query-provider.tsx.
  • Introduced path aliases: @/lib/*, @/providers/*.

Migration tips:

  • Prefer importing from @/lib/... going forward.
  • All @/shared/* or @/core/* imports have been removed; use @/lib/*.