# Reference: RepairOrders.tsx Extraction (2026-07-07)

Concrete example of the full extraction pattern on a 1,698-line file.

## Source File

`src/pages/RepairOrders.tsx` — 1,698 lines, 12 inline component definitions,
12 pure helper functions, 5 type aliases, 3 localStorage helpers.

## Created Files (15 + 1 barrel)

| File | Contents |
|------|----------|
| `src/lib/repairOrders.ts` | `calcDueTime`, `formatTimeRemaining`, `getUrgencyClass`, `formatDueDateTime`, `getCompletedMetricDate`, `isWithinCompletedRange`, `sortCompletedOrders`, `ratingLabel`, `displayCustomerName`, `sortOrders`, `normalizeRO`, `getStatusChips` |
| `src/components/repairOrders/types.ts` | `TabId`, `CompletedRangeFilter`, `CompletedStatusFilter`, `CompletedRatingFilter`, `SavedView`, `TABS`, `SAVED_VIEWS_KEY`, `loadSavedViews`, `persistSavedViews` |
| `src/components/repairOrders/StatusBadge.tsx` | Inline badge + `StatusBadgeAuto` convenience wrapper |
| `src/components/repairOrders/RowProgressBar.tsx` | Inline progress bar (depended on `roProgress` from status lib) |
| `src/components/repairOrders/TechNames.tsx` | Tech name pills display |
| `src/components/repairOrders/CustomerTypeBadge.tsx` | Waiter/drop-off toggle badge (calls `useSettings` + `getCustomerTypeLabels`) |
| `src/components/repairOrders/TimeRemainingCell.tsx` | Countdown with urgency coloring, `AlertTriangle` icon |
| `src/components/repairOrders/LoadingSkeleton.tsx` | Animated placeholder skeleton |
| `src/components/repairOrders/EmptyState.tsx` | Per-tab empty state with `Wrench` icon, conditional "Create RO" button |
| `src/components/repairOrders/ErrorState.tsx` | Delegates to shared `ListError` component |
| `src/components/repairOrders/TabButton.tsx` | Tab with active/inactive styling and optional count badge |
| `src/components/repairOrders/ROModal.tsx` | Create/edit modal wrapping shared `ROForm` |
| `src/components/repairOrders/FragmentRow.tsx` | Already `memo()`'d — active/in-progress table row, 11 columns |
| `src/components/repairOrders/CompletedRow.tsx` | Already `memo()`'d — completed table row, 9 columns |
| `src/components/repairOrders/index.ts` | Barrel: all types + all components re-exported |

## Result

- Main file: 1,698 → 923 lines (45.6% reduction)
- Build: 0 errors (382ms)
- Lint: 0 errors, 0 new warnings (18 pre-existing)
- Tests: 86 passed, 12 files (unchanged)

## Issues Encountered & Fixes

1. **`isVoided` not re-exported from lib** — `FragmentRow` and `CompletedRow`
   imported `isVoided` from `../../lib/repairOrders` but `isVoided` belongs to
   `roEvents`, not the new lib helpers. **Fix:** import `isVoided` directly from
   `../../lib/roEvents` in the component files.

2. **Unused imports in main file** — `ShopSettings` type, `TechNames` component,
   and several lucide icons (`Wrench`, `AlertTriangle`, `ChevronRight`, `UserX`,
   `CheckSquare`, `Square`) were only used by now-extracted components.
   **Fix:** removed them from the main file's imports.

3. **Duplicate dependency in useEffect** — `fetchTechAssignments` appeared twice
   in the dependency array after the rewrite (the original had it once; the
   rewrite accidentally duplicated it). **Fix:** removed the duplicate.

4. **Missing dependency in useCallback** — `handleToggleCustomerType` used
   `setOrders` in its closure via `setOrders` but had an empty dependency array.
   **Fix:** added `[setOrders]`.

## Timeline

- Read source file: ~2 minutes
- Create lib + types: ~1 minute
- Create 12 component files: ~4 minutes
- Create barrel: ~30 seconds
- Rewrite main file: ~5 minutes
- Fix lint errors + verify: ~2 minutes
- Total: ~15 minutes (including context gathering)
