This document describes the refactoring of the OurProjects component from a prop-based to a data-driven architecture, improving maintainability and scalability.
- Before: Data was passed as props from
src/database/projects/projects.tsx - After: Data is loaded directly from
src/data/projects.json
The new JSON structure includes additional fields for better project information:
{
"id": 1,
"title": "Project Name",
"description": "Detailed project description",
"image": "/img/blogs/project-image.png",
"projectUrl": "https://live-site-url.com",
"githubUrl": "https://github.com/recodehive/repo",
"tags": ["tag1", "tag2", "tag3"]
}- Added TypeScript interfaces in
src/data/types.ts - Maintained backward compatibility with legacy interfaces
- Enhanced type checking for project data
- Self-contained: Component now imports its own data
- Backward Compatible: Still accepts legacy props if needed
- Better Error Handling: Fallbacks for missing data
- Enhanced URLs: Dynamic URL resolution from JSON data
src/data/projects.json- Project data in JSON formatsrc/data/types.ts- TypeScript interfaces
src/components/ourProjects.tsx- Refactored to use JSON datasrc/pages/index.tsx- Removed dependency on old data file
src/database/projects/projects.tsx- No longer needed
- Easy to add/remove projects without touching code
- JSON format is more accessible for non-developers
- Clear separation of data and presentation
- Support for additional project metadata
- Easy to extend with new fields
- Better structure for future features
- Strong TypeScript typing
- Comprehensive documentation
- Backward compatibility for migration
import OurProjects from "../components/ourProjects";
// Component loads data automatically from JSON
<OurProjects />import OurProjects from "../components/ourProjects";
import legacyData from "../database/projects/projects";
// Backward compatible
<OurProjects OurProjectsData={legacyData} />To add a new project, simply edit src/data/projects.json:
{
"id": 6,
"title": "New Awesome Project",
"description": "Description of the new project",
"image": "/img/blogs/new-project.png",
"projectUrl": "https://new-project.com",
"githubUrl": "https://github.com/recodehive/new-project",
"tags": ["react", "typescript", "new"]
}- Immediate: The component works with both old and new data formats
- Recommended: Remove
src/database/projects/projects.tsxafter testing - Future: The legacy props interface will be removed in a future version
The refactoring maintains identical UI/UX behavior:
- ✅ All existing projects display correctly
- ✅ Interactive features work as before
- ✅ Responsive design is preserved
- ✅ Dark/light theme support maintained
- ✅ Live website previews function properly
- ✅ Hover effects and animations intact
- Minimal: JSON parsing is negligible
- Improved: Reduced bundle size (no longer importing React component for data)
- Better: Faster builds due to simpler dependency tree