mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 02:32:57 +00:00
311 lines
8.7 KiB
Markdown
311 lines
8.7 KiB
Markdown
# Article System Fixes Summary
|
|
|
|
## Overview
|
|
Comprehensive fixes for the article management system addressing critical React errors, missing functionality, and UX improvements.
|
|
|
|
## Issues Fixed
|
|
|
|
### 1. **Critical React Error #310 - Infinite Loops** ✅
|
|
**Problem:** Application crashed after publishing articles with "Minified React error #310"
|
|
|
|
**Root Cause:**
|
|
- `useCallback` hook in `ArticleDetailPage.tsx` with `toAbsoluteUploads` created infinite re-render loop
|
|
- `fetchYouTubeVideos` in `ArticlesAdminPage.tsx` had unstable dependencies causing loop
|
|
|
|
**Solution:**
|
|
- Changed `useCallback` to `useMemo` for `toAbsoluteUploads` transformation function
|
|
- Removed dependencies array issues and added proper memoization
|
|
- Removed `toast` from `fetchYouTubeVideos` dependencies with eslint-disable comment
|
|
|
|
**Files Modified:**
|
|
- `frontend/src/pages/ArticleDetailPage.tsx` (lines 165-190)
|
|
- `frontend/src/pages/admin/ArticlesAdminPage.tsx` (lines 372-391)
|
|
|
|
---
|
|
|
|
### 2. **Missing YouTube Video Picker Modal** ✅
|
|
**Problem:** "Vybrat z kanálu" button did nothing - modal component didn't exist
|
|
|
|
**Solution:**
|
|
- Created full YouTube video picker modal with:
|
|
- Search functionality for videos
|
|
- Grid display of video thumbnails
|
|
- Click to select and attach to article
|
|
- Empty state handling
|
|
- Loading states
|
|
- Refresh functionality
|
|
|
|
**Features:**
|
|
- Searchable video list
|
|
- Visual thumbnail preview
|
|
- Published date display
|
|
- Responsive grid layout (1-3 columns)
|
|
- Integration with existing YouTube cache
|
|
|
|
**Files Modified:**
|
|
- `frontend/src/pages/admin/ArticlesAdminPage.tsx` (lines 1710-1810)
|
|
|
|
---
|
|
|
|
### 3. **Zonerama Album API Response Parsing** ✅
|
|
**Problem:** "Album nenalezeno" error despite API returning correct data with photos
|
|
|
|
**Root Cause:**
|
|
- API response structure has two formats:
|
|
- `{ albums: [{ photos: [...] }] }` (new format)
|
|
- `{ album: {...}, photos: [...] }` (direct format)
|
|
- Code only handled one format
|
|
|
|
**Solution:**
|
|
- Added dual format parsing with fallbacks
|
|
- Enhanced error messages
|
|
- Added photo count validation
|
|
- Improved user feedback
|
|
|
|
**Files Modified:**
|
|
- `frontend/src/pages/admin/ArticlesAdminPage.tsx` (lines 520-558)
|
|
|
|
---
|
|
|
|
### 4. **Media Tab Reorganization** ✅
|
|
**Problem:** Poor UX flow - users had to upload images before seeing Zonerama options
|
|
|
|
**Solution:**
|
|
Reorganized Media tab in this optimal order:
|
|
1. **Zonerama výběr** (photo selection from albums)
|
|
2. **Titulní obrázek** (cover image with upload option)
|
|
3. **YouTube video** (video attachment)
|
|
4. **OG obrázek** (social sharing image)
|
|
5. **Poll Linker** (if article exists)
|
|
|
|
**Benefits:**
|
|
- Users see Zonerama photos first
|
|
- Logical flow: select from existing → upload new → add extras
|
|
- Better visual hierarchy with improved labels and help text
|
|
|
|
**Files Modified:**
|
|
- `frontend/src/pages/admin/ArticlesAdminPage.tsx` (lines 1431-1607)
|
|
|
|
---
|
|
|
|
### 5. **Image Cropping Performance Optimization** ✅
|
|
**Problem:** Image cropping was laggy and slow
|
|
|
|
**Solution:**
|
|
- Added max width constraint (default 1500px) with automatic scaling
|
|
- Configurable JPEG quality (default 85%)
|
|
- Canvas optimization with image smoothing
|
|
- Better memory management
|
|
- User-friendly controls
|
|
|
|
**New Features:**
|
|
- Max width input (100-3000px)
|
|
- Quality slider (1-100%)
|
|
- Smart image downscaling
|
|
- High-quality smoothing algorithm
|
|
- Clear user guidance
|
|
|
|
**Files Modified:**
|
|
- `frontend/src/pages/admin/ArticlesAdminPage.tsx` (lines 162-323, 1686-1781)
|
|
|
|
---
|
|
|
|
### 6. **Editable Images in Blog Editor** ✅
|
|
**Problem:** Images inserted in articles weren't adjustable or resizable
|
|
|
|
**Solution:**
|
|
- Added click handlers to images in Quill editor
|
|
- Visual feedback on hover and selection
|
|
- Width adjustment via prompt dialog
|
|
- Support for percentages, pixels, and "auto" sizing
|
|
- CSS styling for better image presentation
|
|
|
|
**Features:**
|
|
- Hover effect with blue border
|
|
- Click to adjust width
|
|
- Support formats: "50%", "300px", "auto", "full"
|
|
- Max-width constraints prevent overflow
|
|
- Selection visual feedback
|
|
|
|
**Files Modified:**
|
|
- `frontend/src/pages/admin/ArticlesAdminPage.tsx` (lines 373-416, 1421-1477)
|
|
|
|
---
|
|
|
|
### 7. **Match Link Data Validation** ✅
|
|
**Problem:** Match info not visible after article creation
|
|
|
|
**Solution:**
|
|
- Enhanced query invalidation after save
|
|
- Better success messages with match ID
|
|
- Proper cache invalidation for match links
|
|
- Improved feedback for linked vs non-linked articles
|
|
|
|
**Improvements:**
|
|
- Specific match link query invalidation
|
|
- Article detail query invalidation
|
|
- Clearer success messages showing match connection
|
|
- Better error handling
|
|
|
|
**Files Modified:**
|
|
- `frontend/src/pages/admin/ArticlesAdminPage.tsx` (lines 771-849)
|
|
|
|
---
|
|
|
|
## Testing Checklist
|
|
|
|
### Critical Functionality
|
|
- [x] Article creation works without crashes
|
|
- [x] Article detail pages load without React errors
|
|
- [x] Admin articles list loads after publishing
|
|
- [x] YouTube modal opens and allows video selection
|
|
- [x] Zonerama album photos display correctly
|
|
- [x] Image cropping is smooth and responsive
|
|
- [x] Images in editor are clickable and resizable
|
|
- [x] Match links save and display properly
|
|
|
|
### User Experience
|
|
- [x] Zonerama appears first in Media tab
|
|
- [x] Image quality controls work
|
|
- [x] Video selection from channel works
|
|
- [x] Manual video input works
|
|
- [x] Match picker filters by category
|
|
- [x] Success messages are clear and informative
|
|
|
|
### Performance
|
|
- [x] Image cropping no longer laggy
|
|
- [x] No infinite render loops
|
|
- [x] Proper query invalidation
|
|
- [x] Optimized canvas rendering
|
|
|
|
---
|
|
|
|
## Usage Guide
|
|
|
|
### Adding YouTube Video to Article
|
|
1. Go to **Média** tab in article editor
|
|
2. Click "Vybrat z kanálu" button
|
|
3. Search or browse videos
|
|
4. Click video thumbnail to select
|
|
5. OR use manual input: paste URL or video ID
|
|
6. Video appears with thumbnail preview
|
|
|
|
### Selecting Zonerama Photos
|
|
1. Open **Média** tab (Zonerama is now first)
|
|
2. Use "Z cache" for quick selection from prefetched photos
|
|
3. OR use "Album odkaz" to load specific album
|
|
4. Click photo to set as cover image
|
|
5. Photos visible with thumbnails
|
|
|
|
### Cropping Images
|
|
1. Click image button in article editor
|
|
2. Select image file
|
|
3. Adjust crop area by dragging corners/edges
|
|
4. Set max width (default 1500px)
|
|
5. Set JPEG quality (default 85%)
|
|
6. Click "Oříznout a vložit"
|
|
|
|
### Resizing Images in Editor
|
|
1. Click on any image in article content
|
|
2. Image highlights with blue border
|
|
3. Enter desired width in prompt:
|
|
- "50%" for half width
|
|
- "300px" for fixed pixels
|
|
- "auto" or "full" for 100% width
|
|
4. Image updates immediately
|
|
|
|
### Linking Match to Article
|
|
1. Select **category/competition** first (required)
|
|
2. Go to match linking section in **Základní** tab
|
|
3. Use search or date filter to find match
|
|
4. Click match card to link
|
|
5. Linked matches show with green badge
|
|
6. Match info displays in article admin list
|
|
|
|
---
|
|
|
|
## Technical Details
|
|
|
|
### React Hook Dependencies Fixed
|
|
```typescript
|
|
// Before (caused infinite loop)
|
|
const toAbsoluteUploads = React.useCallback((html) => { ... }, []);
|
|
|
|
// After (stable reference)
|
|
const toAbsoluteUploads = React.useMemo(() => {
|
|
return (html?: string) => { ... };
|
|
}, []);
|
|
```
|
|
|
|
### Zonerama API Response Handling
|
|
```typescript
|
|
// Handles both response formats
|
|
if (Array.isArray(data?.albums) && data.albums.length > 0) {
|
|
photos = data.albums[0]?.photos || [];
|
|
} else if (Array.isArray(data?.photos)) {
|
|
photos = data.photos;
|
|
}
|
|
```
|
|
|
|
### Image Cropping Optimization
|
|
```typescript
|
|
// Smart downscaling
|
|
if (outputWidth > cropMaxWidth) {
|
|
const scale = cropMaxWidth / outputWidth;
|
|
outputWidth = cropMaxWidth;
|
|
outputHeight = Math.round(outputHeight * scale);
|
|
}
|
|
|
|
// High-quality rendering
|
|
ctx.imageSmoothingEnabled = true;
|
|
ctx.imageSmoothingQuality = 'high';
|
|
```
|
|
|
|
---
|
|
|
|
## Known Limitations
|
|
|
|
1. **Image Resizing**: Uses browser prompt for width input (could be improved with inline UI)
|
|
2. **Zonerama Cache**: Requires prefetch to be configured in settings
|
|
3. **YouTube Videos**: Requires channel ID configuration in settings
|
|
4. **Match Linking**: Only works for competitions in club's FACR data
|
|
|
|
---
|
|
|
|
## Future Enhancements
|
|
|
|
- [ ] Inline image resize handles (drag to resize)
|
|
- [ ] Image alignment controls (left, center, right)
|
|
- [ ] Image caption support
|
|
- [ ] Bulk image operations
|
|
- [ ] Advanced crop presets (16:9, 4:3, 1:1, etc.)
|
|
- [ ] Image compression preview
|
|
- [ ] Drag-and-drop image reordering
|
|
- [ ] Image galleries within articles
|
|
|
|
---
|
|
|
|
## Compatibility
|
|
|
|
- **React**: 18.x
|
|
- **React Query**: 4.x
|
|
- **Chakra UI**: 2.x
|
|
- **React Quill**: 2.x
|
|
- **React Image Crop**: 11.x
|
|
|
|
---
|
|
|
|
## Deployment Notes
|
|
|
|
1. Clear browser cache after deployment
|
|
2. Test article creation/editing in production
|
|
3. Verify Zonerama cache is populated
|
|
4. Confirm YouTube API credentials are set
|
|
5. Check FACR match data is loading
|
|
|
|
---
|
|
|
|
**Status**: ✅ All fixes completed and tested
|
|
**Date**: 2025-01-12
|
|
**Version**: 2.1.0
|