mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 22:34:56 +00:00
277 lines
7.1 KiB
Markdown
277 lines
7.1 KiB
Markdown
# 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? 🚀
|