Axon 911 Frontend DocsAxon 911 Frontend Docs
Axon 911 Frontend Docs
    Loading navigation…
U
User
Switch to light mode
  1. Code Quality
  2. Refactoring Guide

Refactoring Guide

Campsite Rule patterns for incremental tech debt reduction.

Quick Reference
Campsite Rule: Leave code a little better than you found it. Priority by risk:
  1. Low-risk (auto-apply): Default exports, magic strings, inline styles
  2. Medium-risk (cautiously): Type improvements, useEffect patterns, UI modernization
  3. High-risk (ask first): GraphQL co-location, hook extraction, file splitting
Guiding Principle
"Leave the code a little better than you found it."—Baden-Powell's Campsite Rule
Pragmatic over perfect:
  • Only refactor when direct replacement exists
  • Deprecation signals refactoring opportunity
  • Leave as-is when no replacement exists
  • Small improvements compound over time
Priority Matrix
PriorityPatternRiskAuto-apply?
1Default → Named exportsLOWYes
2Magic strings → EnumsLOWYes
3Inline styles → Box propsLOWYes
4any → Proper typesMEDIUMYes
5useEffect anti-patternsMEDIUMCautiously
6UI modernizationMEDIUMYes (when replacement exists)
7GraphQL co-locationMEDIUMAsk first
8Extract hooksHIGHAsk first
9Split large filesHIGHAsk first
Low-Risk Patterns
Default → Named Exports
Benefits: Better tree-shaking, consistent naming, easier refactoring
Magic Strings → Enums
Benefits: Type safety, exhaustiveness checking, autocomplete
Inline Styles → Box Props
Benefits: Design token consistency, no inline styles
Medium-Risk Patterns
any → Proper Types
useEffect Anti-patterns
UI Modernization
Only refactor when @prepared/ui-* replacement exists:
High-Risk Patterns
GraphQL Co-location
Move centralized GraphQL operations to component directories:
Ask first - moves files, affects imports
Extract Hooks
Ask first - creates new files, significant refactor
Split Large Files
Files >500 lines should be split:
Ask first - creates multiple files, affects imports
Decision Flowchart
Example: Applying Campsite Rule
Task: Add loading state to IncidentCard.tsx File contains:
  • Default export ❌
  • Inline styles ❌
  • MUI Button ❌
  • MUI Autocomplete ⚠️
Apply Campsite Rule:
  1. ✅ Convert default export → named export (low-risk)
  2. ✅ Replace inline styles → FlexBox props (low-risk)
  3. ✅ Replace MUI Button → @prepared911/ui Button (replacement exists)
  4. ⏸️ Leave MUI Autocomplete as-is (no @prepared replacement)
  5. ✅ Add loading state (primary task)
Result: File is incrementally better without perfect refactor.
Tech Debt Quantification
Current tech debt in dispatch app:
  • 590 files with default exports
  • 368 magic strings across 225 files
  • 301 inline styles across 173 files
  • 149 useEffect with empty deps across 109 files
  • 30+ files over 500 lines
  • 800 MUI imports across 472 files
  • 636 legacy UI imports across 574 files
Goal: Reduce incrementally through Campsite Rule.
Related Documentation
  • Component Patterns - Component organization
  • TypeScript Patterns - Type safety
  • UI Components - @prepared/ui-* packages
Reference Files
For more detailed technical guidance, see these reference files:
  • react-best-practices SKILL.md
  • patterns/*.md - 9 pattern files
Previous
Code quality / JavaScript Patterns
Next
Architecture / File Organization
On this page
Quick Reference
Guiding Principle
Priority Matrix
Low-Risk Patterns
Default → Named Exports
Magic Strings → Enums
Inline Styles → Box Props
Medium-Risk Patterns
any → Proper Types
useEffect Anti-patterns
UI Modernization
High-Risk Patterns
GraphQL Co-location
Extract Hooks
Split Large Files
Decision Flowchart
Example: Applying Campsite Rule
Tech Debt Quantification
Related Documentation
Reference Files