# Formipay — Vue to React Migration Strategy

**Date:** April 18, 2026
**Context:** Phase 2 — React Admin Foundation

---

## Overview

This document explains how to approach the existing Vue.js code in Formipay during the migration to React admin panels.

**Key Principle:** We are NOT doing a "rewrite everything at once" approach. Vue and React will coexist during Phase 2, with Vue being removed incrementally as React replacements are shipped.

---

## Current Vue.js Usage Inventory

| Type | Location | Purpose | Replacement Phase |
|------|----------|---------|-------------------|
| **WPCFTO Framework** | `vendor/` | Settings form builder (repeater, fields, etc.) | F2.8 (Global Settings) |
| **Custom Vue 2 App** | `admin/assets/js/admin-product-editor.js` | Product variation pricing table | F2.9 (Product Editor) |
| **Partial Vue Editor** | `admin/assets/vue/` (if exists) | Form builder canvas | F2.4 (Form Builder) |

---

## Migration Strategy

### Phase 1: Coexistence (Current State)

```
┌─────────────────────────────────────────────┐
│  Admin Pages                                  │
├─────────────────────────────────────────────┤
│  Forms     │ Products  │ Orders │ Settings    │
│  WPCFTO    │ WPCFTO    │ WPCFTO  │ WPCFTO       │
│  + Vue     │ + Vue     │ (none)  │ + Vue        │
│            │ (custom)  │         │              │
└─────────────────────────────────────────────┘
```

**Status:** All pages working. WPCFTO handles forms, custom Vue handles product variations.

---

### Phase 2: Incremental React Rollout

**Week 3:** Build pipeline + React infrastructure. Vue untouched.

**Week 4:** React Form Builder replaces WPCFTO form editor.
```
Forms: WPCFTO/Vue → React ✅
Products: WPCFTO + custom Vue → unchanged
Orders: (none) → React ✅
Settings: WPCFTO → unchanged
```

**Week 5:** React Order Management (no Vue to touch).
```
Orders → React ✅
```

**Week 6:** React Global Settings replaces WPCFTO.
```
Settings: WPCFTO → React ✅
Products: WPCFTO + custom Vue → unchanged
```

**After Week 6:** WPCFTO framework can be fully removed. Only custom Vue remains.

---

### Product Editor Migration (F2.9)

The custom Vue app in `admin-product-editor.js` is the last Vue piece to migrate.

#### Current Features (Must Recreate in React)

| Feature | Complexity | Notes |
|---------|-----------|-------|
| Multi-currency flat pricing | Medium | Show all currencies as columns when enabled |
| Multi-currency expanded mode | High | Inner tables per variation row |
| Dynamic rows from attribute repeater | High | Syncs with WPCFTO repeater in real-time |
| Decimal digits per currency | Medium | Step values calculated from currency config |
| Required field validation | Low | Default currency must have price |
| Real-time JSON update to hidden input | Medium | `product_variation_variables` hidden field |
| SweetAlert2 error dialogs | Low | Uses existing window.Swal or custom alert |

#### Implementation Approach

**Option A: Recreate from Scratch (Recommended)**

1. **Read current Vue code logic** — understand the data flow
2. **Build React component** — `VariationPricingTable.jsx`
   - Use `@tanstack/react-table` for the table
   - Use `@wordpress/components` for form inputs (TextControl, etc.)
   - State management via React hooks (useState, useEffect)
3. **Data sync layer** — same API endpoint `get_product_variables`
4. **Validation logic** — port `findFirstMissingDefault()` to React

**Pros:** Clean React code, modern patterns, better type safety  
**Cons:** Requires careful testing to match all edge cases

**Option B: Vue-in-React Wrapper (Not Recommended)**

Wrap the existing Vue app in a React component using a library like `vue-react-wrapper`.

**Pros:** Faster, less risky  
**Cons:** Technical debt, adds bundle size, mixing paradigms

**Recommendation:** Option A — rewrite in React. The logic is well-contained (~500 lines) and rewriting gives us clean, maintainable React code.

---

## Migration Checklist for F2.9

When implementing the React Product Editor:

- [ ] Read and document current Vue variation table behavior
- [ ] Create `src/admin/pages/Products/VariationPricingTable.jsx`
- [ ] Implement multi-currency flat pricing mode
- [ ] Implement multi-currency expanded mode (inner tables)
- [ ] Implement attribute repeater sync (MutationObserver or polling)
- [ ] Implement decimal digits per currency step calculation
- [ ] Implement required field validation (default currency)
- [ ] Implement real-time JSON update to hidden `product_variation_variables` input
- [ ] Add SweetAlert2 or equivalent for validation errors
- [ ] Test with various currency configurations
- [ ] Test with existing products (data migration)
- [ ] Remove old Vue script enqueuing from Product page
- [ ] Remove Vue dependency if no longer used elsewhere

---

## Data Compatibility

The React component must read/write the same data format as the Vue app:

**Hidden input format** (`product_variation_variables`):
```json
[
  {
    "key": "Red|||Large",
    "name": "Red - Large",
    "stock": "",
    "weight": 0,
    "active": true,
    "prices": [
      {
        "currency": "USD:::United States Dollar:::$",
        "regular_price": "29.99",
        "sale_price": "24.99",
        "currency_decimal_digits": 2
      }
    ]
  }
]
```

**API endpoint** (already exists):
```php
// Product.php - add this if not present
add_action('wp_ajax_get_product_variables', [$this, 'ajax_get_product_variables']);
```

---

## Testing Strategy

1. **Unit Tests:** Test variation price calculation logic in isolation
2. **Integration Tests:** Test loading/saving variations via AJAX
3. **Manual Tests:**
   - Create product with variations
   - Test multi-currency flat mode
   - Test multi-currency expanded mode
   - Test validation (missing default price)
   - Test attribute repeater sync
   - Test editing existing products (data compatibility)

---

## Rollback Plan

If React version has critical bugs:
1. Keep Vue version as fallback
2. Add feature flag in settings: "Use React Product Editor (beta)"
3. Default to Vue, allow opting into React
4. Fix React, then make it default

---

## Notes

- **No Vue Router used** — the Vue app is a simple mount, no routing to worry about
- **No Vuex** — state is local component state + hidden input sync
- **jQuery dependency** — the Vue app uses jQuery for DOM selection (`$('#product-variables-table')`. React version should eliminate this.
- **Timing:** WPCFTO removal happens after Global Settings (F2.8), but Product Editor Vue app is independent — can be migrated anytime after Week 3.

---

*End of Migration Strategy.*
