PlugSnatcher/PlugSnatcher Frontend Refactoring Plan.md

211 lines
8.2 KiB
Markdown

# PlugSnatcher Frontend Refactoring Plan
## Overview
This document outlines a comprehensive plan to refactor the PlugSnatcher frontend from a monolithic structure into a well-organized, modular React application. The refactoring will focus on component separation, state management optimization, and establishing a scalable architecture.
## Current Issues
- All React components are in a single 1300+ line file (`App.tsx`)
- State management is centralized and lacks separation of concerns
- No clear component hierarchy or organization
- Complex UI logic mixed with event handling and API calls
- Poor testability due to tightly coupled components
- Difficulty maintaining and extending the codebase
## Refactoring Goals
- Separate components into individual files with clear responsibilities
- Implement a logical folder structure
- Improve state management using React context or other solutions
- Extract common functionality into hooks and utilities
- Make components more reusable
- Improve code maintainability and readability
- Establish patterns for future development
## Project Structure
```
src/
├── assets/ # Images, icons, and other static files
├── components/ # UI components
│ ├── common/ # Reusable UI components
│ │ ├── Button/
│ │ ├── Modal/
│ │ ├── ProgressBar/
│ │ └── ...
│ ├── layout/ # Layout components
│ │ ├── Header/
│ │ ├── Footer/
│ │ └── ...
│ ├── plugins/ # Plugin-related components
│ │ ├── PluginList/
│ │ ├── PluginItem/
│ │ ├── PluginDetails/
│ │ └── ...
│ ├── server/ # Server-related components
│ │ ├── ServerSelector/
│ │ ├── ServerInfo/
│ │ └── ...
│ └── updates/ # Update-related components
│ ├── UpdateControls/
│ ├── CompatibilityCheck/
│ └── ...
├── context/ # React context providers
│ ├── ServerContext/
│ ├── PluginContext/
│ └── ...
├── hooks/ # Custom React hooks
│ ├── usePluginActions.ts
│ ├── useServerActions.ts
│ ├── useEventListeners.ts
│ └── ...
├── services/ # API and service functions
│ ├── tauriInvoke.ts
│ ├── eventListeners.ts
│ └── ...
├── types/ # TypeScript type definitions
│ ├── plugin.types.ts
│ ├── server.types.ts
│ └── ...
├── utils/ # Utility functions
│ ├── formatters.ts
│ ├── validators.ts
│ └── ...
├── App.tsx # Main App component (refactored)
└── main.tsx # Entry point
```
## Implementation Checklist
### Phase 1: Setup Project Structure and Types ✅
- [x] Create folder structure as outlined above
- [x] Extract TypeScript interfaces to separate files
- [x] Create `types/plugin.types.ts` for Plugin interfaces
- [x] Create `types/server.types.ts` for Server interfaces
- [x] Create `types/events.types.ts` for Event payloads
### Phase 2: Extract Utility Functions ✅
- [x] Create utility files
- [x] `utils/serverUtils.ts` - Server type icons and helpers
- [x] `utils/formatters.ts` - Text formatting functions
- [x] `utils/validators.ts` - Data validation functions
### Phase 3: Extract Common UI Components ✅
- [x] Create common UI components
- [x] `components/common/Modal/Modal.tsx` - Base modal component
- [x] `components/common/ProgressBar/ProgressBar.tsx` - Progress indicator
- [x] `components/common/Button/Button.tsx` - Styled button component
- [x] `components/common/Badge/Badge.tsx` - For platform compatibility badges
### Phase 4: Implement Context for State Management ✅
- [x] Create server context
- [x] `context/ServerContext/ServerContext.tsx` - Server state provider
- [x] `context/ServerContext/useServerContext.ts` - Server context hook
- [x] Create plugin context
- [x] `context/PluginContext/PluginContext.tsx` - Plugin state provider
- [x] `context/PluginContext/usePluginContext.ts` - Plugin context hook
- [x] Create UI context
- [x] `context/UIContext/UIContext.tsx` - UI state provider (modals, errors)
- [x] `context/UIContext/useUIContext.ts` - UI context hook
### Phase 5: Create Custom Hooks ✅
- [x] Create event listener hooks
- [x] `hooks/useEventListeners.ts` - Tauri event listener setup
- [x] Create server action hooks
- [x] `hooks/useServerActions.ts` - Server-related actions
- [x] Create plugin action hooks
- [x] `hooks/usePluginActions.ts` - Plugin-related actions
- [x] `hooks/useUpdateActions.ts` - Update-related actions
### Phase 6: Implement UI Components
#### Layout Components:
- ✅ Footer - Display application version and GitHub link
- ✅ MainContent - Main application content container
- ✅ ServerSelector - For selecting and managing server paths
- ✅ ServerInfo - Display information about the selected server
- ✅ ScanProgress - Show progress during server scanning
#### Plugin Components:
- ✅ PluginList - Container for listing all plugins
- ✅ PluginItem - Individual plugin display with actions
- ✅ PluginDetails - Detailed view of a plugin
- ✅ NoPluginsMessage - Message shown when no plugins are found
#### Update Components:
- ✅ UpdateControls - Controls for managing plugin updates
- ✅ BulkUpdateProgress - Shows progress during bulk updates
- ✅ CompatibilityCheckDialog - Confirms compatibility before update
- ✅ PremiumPluginModal - Info for premium plugins
- ✅ DownloadProgressIndicator - Shows download progress
- ✅ PluginMatchSelector - For selecting from potential plugin matches
- ✅ WarningModal - For displaying important warnings to users
#### Additional Steps:
- ✅ Fixed linter errors related to Tauri API imports
- ✅ Added TypeScript declarations for Tauri API modules
### Phase 7: Refactor Main App Component ✅
- ✅ Streamline App.tsx to use new components and contexts
- ✅ Remove direct state management from App.tsx
- ✅ Implement provider wrapping in the component tree
- ✅ Verify all functionality works as before
### Phase 8: Performance Optimizations
- [x] Add React.memo() to prevent unnecessary renders
- [ ] Optimize context usage to prevent unnecessary re-renders
- [x] Use callback and memoization for expensive operations
- [ ] Review and optimize state update patterns
### Phase 9: Testing and Documentation
- [ ] Add component documentation
- [ ] Add JSDoc comments for functions and hooks
- [ ] Set up unit testing framework
- [ ] Write tests for critical components
### Phase 10: Final Review and Cleanup
- [ ] Remove unused code and comments
- [ ] Ensure consistent naming conventions
- [ ] Verify all features work correctly
- [ ] Review for any performance issues
- [ ] Finalize documentation
## Implementation Strategy
### Approach
1. **Incremental Migration**: Refactor incrementally, keeping the app functional at each step
2. **Component by Component**: Start with smaller, leaf components and work upward
3. **Test Frequently**: Verify functionality after each significant change
4. **State Migration**: Move state management to context providers gradually
### Best Practices
- Keep components focused on a single responsibility
- Use TypeScript interfaces for all component props
- Maintain clear separation between UI components and business logic
- Follow consistent naming conventions
- Use React's composition pattern for component reuse
- Document complex logic with comments
## Future Enhancements
- Consider adding a state management library if complexity increases (Redux, Zustand, etc.)
- Implement React Router for potential multi-page navigation
- Add i18n for internationalization
- Implement error boundary components for better error handling
- Set up automated testing workflows
## Conclusion
This refactoring plan provides a comprehensive roadmap for transforming the PlugSnatcher frontend into a maintainable, modular React application. By following this plan, we will address the current issues and establish patterns that support future development and scaling of the application.