React Native Clean Pattern
by @yahongie2014
Manages end-to-end React Native Expo app lifecycle with strict Controller-View separation, type safety, RTL support, and optimized performance in coder79 eco...
clawhub install react-native-clean-patternπ About This Skill
name: clawhub-mobile description: Clawhub master skill for Expo/React Native. Production-grade patterns: MVC-Lite, RTL-First, Centralized Hook Styles, Zero-Any TS, and Sentry-Integrated Logging.
π± Clawhub React Native (Expo) Master Skill
A unified, intelligent guide for building and maintaining high-performance mobile applications within the Clawhub ecosystem.
π₯ Installation
1. Register the Skill:
Add this directory to your agent's skill path.2. Environment Setup:
Ensure you have the following global dependencies installed:npm install -g expo-cli eas-cli react-native-clean-pattern
ORbun clawdhub install react-native-clean-pattern
β¨οΈ Usage
To start a new project:
/provision-app
To scaffold a new feature/screen:
/make-screen
To scaffold a new component:
/make-component
To setup API or Navigation infrastructure:
/setup-api
/setup-navigation
π Β§0 β Execution & Workflow Standards
Follow these steps for any task in the Clawhub ecosystem:
1. STRATEGIZE: Identify if the task is Provisioning (New App), Expansion (New Screen/Feature), or Diagnosis (Bug Fix).
2. AUDIT & CLEAN: Before adding new code, check for Duplicated Files or redundant logic. Reuse existing @shared components or @hooks.
3. SCAFFOLD: If expanding, always create the 4-file MVC-Lite structure.
4. STYLING: Initialize getStyles using the useAppStyle() hook for RTL-compliance. Use HSL tokens from @styles/common.
5. INTEGRATE: Connect UI logic to controller.ts, utilizing @hooks/useRedux and @services/apiClient.
6. SECURE & OPTIMIZE: Ensure mountedRef is used in all async controllers to prevent Memory Leaks.
7. VERIFY: Run npx tsc --noEmit and check RTL/LTR UI toggle.
ποΈ Β§1 β Project Architecture & Path Aliases
Standardized, strictly typed, and RTL-ready folder architecture. All files must be interconnected via aliases.
.
βββ app/ # Expo Router (routes & layouts)
βββ screens/ # Feature-specific implementations (MVC-Lite)
βββ components/ # Distributed Atom/Molecule components
β βββ [RegularComponent]/ # Regular/Feature components (e.g., DynamicIsland)
β βββ SharedComponent/ # Global blessed component library (@shared)
βββ services/ # Infrastructure (API, Auth, Firebase, Storage)
βββ store/ # State Management (Redux Power Slices)
βββ hooks/ # Custom logical hooks (@hooks)
βββ helpers/ # Shared pure logic & utilities (@helpers)
βββ enums/ # Global Constants & Types (@enums)
βββ styles/ # Design Token System (@styles)
βββ i18n/ # Localization assets (@i18n)
βββ assets/ # Media & Fonts (@assets)
β Path Alias Enforcement
Never use relative paths (../../). Always use:
@shared, @services, @hooks, @store, @helpers, @config, @styles, @enums.Β§1.1 β Standardized Enums (@enums)
Use these enums to ensure zero string-literal errors across the app.
| Enum | Key Values |
|:---|:---|
| AuthScreen | LOGIN, REGISTER, FORGOT_PASSWORD, OTP_VERIFY |
| ValidationRule | REQUIRED, EMAIL, MIN_LENGTH, MATCH |
| UserType | USER, VENDOR, ADMIN, DELIVERY_BOY |
| TokenKey | ACCESS_TOKEN, REFRESH_TOKEN, FCM_TOKEN |
Β§1.2 β Core Application Hooks (@hooks)
| Hook | Responsibility |
|:---|:---|
| useAppDispatch / useAppSelector | Strictly typed Redux access. |
| useRTL | Manages I18nManager force-flipping and app reloads. |
| useAppStyle | Dynamic UI pipe that merges base themes with remote config, resolves RTL directionality (rowDirection, textAlign), and provides centralized design tokens and localized font resolution. |
| useAppConfig | Reactive access to merged Local/Remote Config. |
| useColorScheme | Reactive system theme detection (Light/Dark mode). |
| useNotifications | Orchestrates FCM registration, Notifee channel management, and real-time state rehydration (Profile/Theme) upon receipt of push payloads. |
π¦ Β§2 β Core Modules (The Gold Standards)
2.1 Configuration System (@config)
Environment-driven, strictly typed central config:
.env variables via process.env.AppConfig interface.2.2 API Client (@services/apiClient)
Singleton wrapper with:
Accept-Language headers.JSON and FormData.2.3 Auth Service (@services/authService)
Orchestrator for Login, Register, OTP, and Profile management with:
EMAIL_PASSWORD, EMAIL_OTP, and PHONE_OTP.2.4 Firebase Service (@services/firebaseService)
Platform-aware initialization for Expo Go and Development Builds.2.5 Notification Service (@services/notificationService)
Management of paginated alert listing and "read" state synchronization.2.6 Security Storage (@services/tokenStorage)
Encrypted or AsyncStorage persistence for tokens and user metadata.2.7 Consolidated Logging (@helpers/logger)
Sensitized logging system with:
password, token, authorization, otp).request(), response(), and error() tracing with latency tracking.addBreadcrumb and captureException.__DEV__) with terminal icons (π, β
, β, π΄, βΉοΈ, β οΈ).2.8 Localization (@i18n)
RTL-First standard with:
i18next with compatibilityJSON: 'v3' for React Native safe pluralization.AsyncStorage usage to remember language selection across reloads.initializeI18n() async boot sequence required in _layout.tsx.I18nManager force-flip with expo-updates reload (try/catch protected).store directly into the i18n instance.expo-updates for mandatory UI rehydration on direction change.setupRTL() boot helper to maintain state consistency.2.9 Redux Toolkit Power Slices (@store)
Strictly typed state management with:
useAppDispatch and useAppSelector for type-safe state access.π§© Β§3 β Standard Component Library (@shared)
| Component | Purpose | Key Props |
|:---|:---|:---|
| AppText | Typography with RTL font scaling. | variant, weight, align |
| Button | Themed touchable with loading states. | title, loading, icon, variant |
| AppHeader | RTL-aware screen header with back/actions. | title, showBackButton, rightComp |
| AppInput | Validated text input with icons. | label, error, icon, secure |
| PriceTag | Currency-aware formatted price display. | price, originalPrice, discount |
| AppLoader | Lottie-powered full-screen or inline loading. | visible, variant, message |
| AppModal | Standardized bottom-sheet or center popup. | visible, onClose, title |
π οΈ Β§4 β Standard Feature Modules
Implemented as isolated folders under screens/ following MVC-Lite:
1. Auth Flow: Sign In, Sign Up, OTP, Password Recovery.
2. Catalog: Product List (FlashList optimized), Category Browse.
3. Cart & Checkout: Multi-step checkout, Order Summary, Payments.
4. Profile: User Details, Address Management, Order History.
π Β§5 β Approved Dependency Matrix
* Core: expo@~55.0.5, react@19.2.0, react-native@0.83.2.
* Navigation: @react-navigation/native, @react-navigation/native-stack, @react-navigation/bottom-tabs.
* Standards: Dynamic configuration-driven Bottom Tabs and Auth/Guest gating with Navigator-level key remounting.
* State & Logic: @reduxjs/toolkit@^2.11.2, react-redux@^9.2.0.
* Networking & Auth: @react-native-firebase/app, @react-native-firebase/messaging.
* Persistence: @react-native-async-storage/async-storage@^2.2.0.
* Internationalization: i18next@^25.8.16, react-i18next@^16.5.6, expo-localization.
* UI & Visuals: lottie-react-native@~7.3.4, react-native-reanimated@4.2.1, react-native-render-html.
* Maps & Location: react-native-maps, react-native-maps-directions, expo-location.
* Typography: @expo-google-fonts/cairo, @expo-google-fonts/outfit, @expo-google-fonts/roboto.
* Observability: @sentry/react-native@~7.11.0.
* Native Features: @notifee/react-native, expo-image-picker, expo-document-picker.
π§± Β§6 β Expansion Pattern (MVC-Lite)
Every new screen, feature, OR shared component MUST consist of exactly 4 files:
1. index.tsx (Skin): Pure JSX. Connects to controller.ts.
2. controller.ts (Brain): logic hook, utilizes @hooks/useRedux.
3. styles.ts (Nerves): Function-based styles consuming useAppStyle.
4. types.ts (Structure): Interface definitions. Zero any.
π‘οΈ Β§7 β Defensive Coding & Security
* Memory Safety: Always use isMounted ref in controllers. Abort all API calls in useEffect cleanup.
* Zero Duplication: Shared logic must stay in @hooks or @helpers. Don't copy-paste styles; use @styles/common. Hard Requirement: All sizes, spacing, and colors must be consumed via useAppStyle().tokens and useAppStyle().colors.
* Zero Hardcoding: Using literal hex codes (#FFFFFF) or RGBA strings in UI components is FORBIDDEN. All UI colors must be resolved from the colors object provided by the central styling hook.
* Zero Inline Styles: Using the style={{ ... }} prop in JSX is FORBIDDEN for layout and presentation. All styles MUST be defined in the accompanying styles.ts file and resolve via the screen/component controller to ensure theme and RTL reactivity.
* Branding Sync: Primary theme colors MUST be defined in src/config/index.ts and consumed via @constants/Colors.ts to support white-labeling and remote branding.
* RTL Enforcement: Use rowDirection and textAlign from useAppStyle.
* Sanitization: Never log raw bodies containing password or token.
* Absolute Paths: All imports MUST use standardized aliases. Relative paths (../../) are forbidden.
* Standard Aliases: @/, @components, @hooks, @constants, @store, @i18n, @assets, @config, @app-types, @enums, @utils, @helpers, @services, @screens, @styles.
β Β§8 β Verification Checklist
1. [ ] npx tsc --noEmit passes with zero errors.
2. [ ] i18n RTL/LTR layout flip verified.
3. [ ] No hardcoded colors/spacing outside of @styles/common.
4. [ ] No relative paths found in imports.
5. [ ] Async logic verified for mountedRef safety.
ποΈ Β§9 β Provisioning Guide (Training)
When starting a NEW application, you must follow this interactive training flow to ensure architectural integrity without merely copy-pasting old classes.
1. The Inquiry Phase
You MUST ask the user for authorization to implement:app/_layout.tsx: Master orchestrator (Sentry, Redux, RTL, Hydration).
- app/(auth): Auth flow group (Login, Register, OTP).
- app/(tabs): Main application navigation.
2. The Structural Blueprint
Instead of copying files, generate fresh implementations based on these patterns:Login, Register, OTP) gets its own Skin, Brain, Nerves, and Structure.apiClient.ts and authService.ts.3. The Activation Loop
1. Initialize: Generate thepackage.json, tsconfig.json, and app.json.
2. Install: Run npm install or bun install to pull the Approved Dependency Matrix.
3. Environment: Create the .env file from the .env.example template.
4. Launch: Execute npx expo start to verify the baseline.β¨οΈ Β§10 β Workflow & Slash Command Reference
Use these commands to automate common development tasks within the Clawhub ecosystem:
| Command | Purpose | When to Use |
| :--- | :--- | :--- |
| /provision-app | Initialize Project | Starting a new app from scratch. |
| /setup-api | API & Observability | Adding a production-grade apiClient.ts and logger.ts. |
| /setup-navigation | Router Setup | Scaffolding Root (Auth) and Main (Dynamic Tab) navigators. |
| /make-screen | Feature Scaffolding | Creating a new screen using the 4-file MVC-Lite pattern. |
| /make-component | UI Scaffolding | Creating a new Shared, Regular, or Local component. |