Files
metabuilder/frontends/workflowui/docs/FILES_TO_REFACTOR.md
2026-03-09 22:30:41 +00:00

277 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WorkflowUI - Files Over 300 LOC (Refactoring Targets)
## Overview
Found 6 files that are larger than ideal and could be refactored into smaller modules.
---
## 1. **db/schema.ts** (538 LOC) ✅ ACCEPTABLE
**Status**: Keep as-is
**Why**: This is a database schema file, best kept together
- Type definitions (Workspace, Project, ProjectCanvasItem, etc.)
- Dexie database initialization
- CRUD helper methods organized by entity
**Structure**:
```
- Workspace type + CRUD methods (50 LOC)
- Project type + CRUD methods (50 LOC)
- ProjectCanvasItem type + CRUD methods (80 LOC)
- SyncQueueItem type + CRUD methods (60 LOC)
- Database instance (20 LOC)
- Export/helpers (50 LOC)
```
**Keep together** because it's a cohesive schema unit.
---
## 2. **app/project/[id]/page.tsx** (487 LOC) ⚠️ TOO LARGE
**Status**: Just refactored, now 220 LOC with Fakemui
This was recently refactored to use Fakemui and is now much smaller. ✅
---
## 3. **components/Settings/sections/CanvasSettings.tsx** (343 LOC) ⚠️ NEEDS SPLIT
**Problem**: Too many settings in one component
**Suggested Refactoring**:
```
CanvasSettings.tsx (100 LOC)
├── /GridSettings.tsx (60 LOC)
├── /ZoomSettings.tsx (60 LOC)
├── /SnapSettings.tsx (50 LOC)
└── /LayoutSettings.tsx (50 LOC)
```
**Current structure**: 343 lines of form controls
**Refactored structure**:
- Main component just composes 4 smaller components
- Each handles its own setting group
- Easy to test and reuse
---
## 4. **store/slices/projectSlice.ts** (335 LOC) ⚠️ NEEDS SPLIT
**Problem**: Too many Redux reducers in one file
**Suggested Refactoring**:
```
projectSlice.ts
├── /projectSlice.ts (80 LOC) - Project CRUD only
├── /canvasSlice.ts (120 LOC) - Canvas zoom/pan/items
└── /collaborationSlice.ts (100 LOC) - Real-time collab
```
**Why split**:
- Project operations (create, update, delete)
- Canvas state (zoom, pan, selected items)
- Collaboration (connected users, locks)
These are three different concerns bundled together.
---
## 5. **hooks/useProjectCanvas.ts** (322 LOC) ⚠️ NEEDS SPLIT
**Problem**: Too many canvas-related functions in one hook
**Suggested Refactoring**:
```
useProjectCanvas.ts
├── useCanvasZoom.ts (60 LOC)
├── useCanvasPan.ts (60 LOC)
├── useCanvasSelection.ts (80 LOC)
└── useCanvasItems.ts (100 LOC)
```
Then compose in useProjectCanvas:
```typescript
export function useProjectCanvas() {
const zoom = useCanvasZoom()
const pan = useCanvasPan()
const selection = useCanvasSelection()
const items = useCanvasItems()
return { zoom, pan, selection, items }
}
```
**Benefits**:
- Each hook does one thing
- Easier to test each piece
- Reusable in other contexts
---
## 6. **components/ProjectCanvas/WorkflowCard.tsx** (320 LOC) ⚠️ NEEDS SPLIT
**Problem**: Card component + preview + actions all bundled
**Suggested Refactoring**:
```
WorkflowCard.tsx (120 LOC) - Main card wrapper
├── /WorkflowCardHeader.tsx (50 LOC) - Title + status badge
├── /WorkflowCardPreview.tsx (70 LOC) - Mini node preview
├── /WorkflowCardFooter.tsx (40 LOC) - Metadata + date
└── /WorkflowCardActions.tsx (40 LOC) - Action buttons
```
**Current nesting**:
```tsx
<Card>
<Header>
<Title />
<StatusBadge />
</Header>
<Preview>
<MiniNodeGrid />
</Preview>
<Footer>
<NodeCount />
<LastModified />
</Footer>
<Actions>
<EditButton />
<FavoriteButton />
</Actions>
</Card>
```
**Refactored**:
```tsx
<WorkflowCard
workflow={workflow}
onEdit={handleEdit}
onFavorite={handleFavorite}
/>
```
---
## Refactoring Plan
### Phase 1 (Immediate)
- ✅ db/schema.ts - Keep as-is (works well)
- ✅ project/[id]/page.tsx - Already done (220 LOC)
### Phase 2 (This Week)
- **components/Settings/sections/CanvasSettings.tsx** → Split into 4 components
- **components/ProjectCanvas/WorkflowCard.tsx** → Split into 5 components
### Phase 3 (Next Week)
- **store/slices/projectSlice.ts** → Split into 3 slices
- **hooks/useProjectCanvas.ts** → Split into 4 hooks
---
## Guidelines for Refactoring
### ✅ Keep Together
- Database schema files (type definitions + CRUD)
- Tightly coupled state (Redux slices with related actions)
- Small hooks under 150 LOC
### ❌ Split When
- Component has multiple JSX sections (use sub-components)
- Hook has 3+ independent concerns (split into smaller hooks)
- Redux slice mixes unrelated state (split into separate slices)
- Settings/form has 20+ controls (group into sections)
### 📏 Target Sizes
- **Components**: 80-150 LOC max
- **Hooks**: 80-150 LOC max
- **Redux slices**: 100-150 LOC max
- **Exceptions**: Schema files, API clients (can be 300-500 LOC)
---
## Refactoring Commands
### Split CanvasSettings into 4 components
```bash
# Create component directory
mkdir -p src/components/Settings/CanvasSettings
# Create sub-components
touch src/components/Settings/CanvasSettings/GridSettings.tsx
touch src/components/Settings/CanvasSettings/ZoomSettings.tsx
touch src/components/Settings/CanvasSettings/SnapSettings.tsx
touch src/components/Settings/CanvasSettings/LayoutSettings.tsx
touch src/components/Settings/CanvasSettings/index.ts
```
### Split WorkflowCard into 5 components
```bash
# Create component directory
mkdir -p src/components/ProjectCanvas/WorkflowCard
# Create sub-components
touch src/components/ProjectCanvas/WorkflowCard/WorkflowCardHeader.tsx
touch src/components/ProjectCanvas/WorkflowCard/WorkflowCardPreview.tsx
touch src/components/ProjectCanvas/WorkflowCard/WorkflowCardFooter.tsx
touch src/components/ProjectCanvas/WorkflowCard/WorkflowCardActions.tsx
touch src/components/ProjectCanvas/WorkflowCard/index.ts
```
### Split useProjectCanvas into 4 hooks
```bash
# Create hooks directory structure
mkdir -p src/hooks/canvas
# Create sub-hooks
touch src/hooks/canvas/useCanvasZoom.ts
touch src/hooks/canvas/useCanvasPan.ts
touch src/hooks/canvas/useCanvasSelection.ts
touch src/hooks/canvas/useCanvasItems.ts
touch src/hooks/canvas/index.ts
```
---
## Benefits of Refactoring
**Testability**: Each component/hook is independently testable
**Reusability**: Sub-components can be used elsewhere
**Maintainability**: Smaller files are easier to understand
**Performance**: Sub-components can be memoized separately
**Composability**: Easy to compose smaller pieces into larger features
---
## Estimated Effort
| File | Current | Effort | Timeline |
|------|---------|--------|----------|
| CanvasSettings.tsx | 343 → 100 + 4×50 | 2 hours | Today |
| WorkflowCard.tsx | 320 → 120 + 4×50 | 2 hours | Today |
| projectSlice.ts | 335 → 3×100 | 3 hours | Tomorrow |
| useProjectCanvas.ts | 322 → 4×80 | 2 hours | Tomorrow |
**Total**: ~9 hours to refactor all large files to <150 LOC each
---
## Summary
**Current State**:
- 6 files over 300 LOC
- 2 files already optimized (✅ db/schema.ts, ✅ project page)
- 4 files need refactoring (2-3 days of work)
**Target State**:
- All components <150 LOC
- All hooks <150 LOC
- All Redux slices <150 LOC
- Clean, composable, testable codebase
---
Want me to start refactoring any of these? Start with CanvasSettings? 🚀