# File Preview Component
## Overview
A comprehensive file preview component that provides inline viewing and downloading capabilities for various file types including images, PDFs, videos, audio files, and Office documents (PPTX, DOCX, XLSX).
## Component Location
`frontend/src/components/common/FilePreview.tsx`
## Features
### 1. **Supported File Types**
#### Full Preview Support (in modal)
- **Images**: JPG, JPEG, PNG, GIF, SVG, WebP, BMP
- Direct inline display
- Click to zoom in modal
- Error handling for failed loads
- **PDFs**:
- Embedded iframe viewer
- Native browser PDF viewer
- Maintains aspect ratio
- **Videos**: MP4, AVI, MOV, WebM
- HTML5 video player with controls
- 16:9 aspect ratio
- Support for multiple formats
- **Audio**: MP3, WAV, OGG
- HTML5 audio player with controls
- Icon display with player below
#### Online Preview Support
- **PowerPoint**: PPTX, PPT
- "Zobrazit online" button using Microsoft Office Online Viewer
- Download option
- File info display
- **Word**: DOCX, DOC
- Same online viewer support
- Icon and file metadata
- **Excel**: XLSX, XLS
- Online spreadsheet viewer
- Download and preview options
### 2. **Display Modes**
#### Compact Mode (default)
```tsx
```
- Shows file icon, name, and size
- Preview and Download buttons
- Responsive layout
#### Inline Mode (for images)
```tsx
```
- Displays image directly in the page
- Click to open full-size modal
- Max height: 400px
### 3. **User Interface Elements**
#### File Information
- Icon based on file type (color-coded)
- File name (truncated if too long)
- File size (displayed in KB or MB)
- MIME type indicator
#### Action Buttons
- **Náhled** (Preview): Opens modal with file preview
- **Stáhnout** (Download): Direct download link
- **Zobrazit online** (View Online): For Office documents
#### Modal Preview
- Full-screen modal (90vw × 90vh)
- Dark overlay background
- Close button
- Download button in footer
- Responsive content area
## Props
```typescript
interface FilePreviewProps {
url: string; // File URL (relative or absolute)
name?: string; // Display name (defaults to filename from URL)
mimeType?: string; // MIME type (e.g., 'image/jpeg', 'application/pdf')
size?: number; // File size in bytes
showInline?: boolean; // Show inline preview for images (default: false)
}
```
## Usage Examples
### Basic Usage (Event Attachments)
```tsx
import FilePreview from '../components/common/FilePreview';
// In your component
{attachments.map((att, idx) => (
))}
```
### Inline Image Gallery
```tsx
{images.map((img, idx) => (
))}
```
### PDF Document
```tsx
```
### PowerPoint Presentation
```tsx
```
## File Type Detection
The component automatically detects file types based on MIME type:
| MIME Type Pattern | Icon | Color | Preview Available |
|------------------|------|-------|-------------------|
| `image/*` | FiImage | Purple | ✅ Yes (inline) |
| `application/pdf` | FiFileText | Red | ✅ Yes (iframe) |
| `video/*` | FiVideo | Pink | ✅ Yes (player) |
| `audio/*` | FiMusic | Green | ✅ Yes (player) |
| `*word*`, `*document*` | FiFileText | Blue | ⚠️ Online only |
| `*sheet*`, `*excel*` | FiFile | Green | ⚠️ Online only |
| `*presentation*`, `*powerpoint*` | FiFile | Orange | ⚠️ Online only |
| Other | FiFile | Gray | ❌ Download only |
## Microsoft Office Online Viewer
For Office documents (PPTX, DOCX, XLSX), the component offers a "Zobrazit online" button that opens the file in Microsoft Office Online Viewer:
```
https://view.officeapps.live.com/op/view.aspx?src=[ENCODED_FILE_URL]
```
**Requirements:**
- File must be publicly accessible
- Supported formats: DOCX, XLSX, PPTX
- Internet connection required
## Integration with ActivityDetailPage
The FilePreview component has been integrated into `ActivityDetailPage.tsx`:
**Before:**
- Simple download button
- No preview functionality
- Minimal file information
**After:**
- Full preview support for all file types
- Inline image display
- Modal viewer for PDFs, videos, audio
- Office document online viewer
- Better file metadata display
## Styling & Theming
The component uses Chakra UI's color mode values:
```tsx
const borderColor = useColorModeValue('gray.200', 'gray.700');
const cardBg = useColorModeValue('white', 'gray.800');
const mutedText = useColorModeValue('gray.600', 'gray.300');
const linkColor = useColorModeValue('blue.600', 'blue.300');
```
This ensures proper display in both light and dark modes.
## Error Handling
### Image Loading Errors
- Catches `onError` event
- Displays fallback message
- Provides download option
### Video/Audio Playback Errors
- Shows browser's native error message
- Falls back to download option
### PDF Loading Issues
- Browser's native PDF viewer handles errors
- Users can download if preview fails
## Accessibility
- Proper ARIA labels
- Keyboard navigation support (modal)
- Screen reader friendly
- High contrast icons
- Responsive design
## Browser Compatibility
| Browser | Images | PDFs | Video | Audio | Office Docs |
|---------|--------|------|-------|-------|-------------|
| Chrome 90+ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Firefox 88+ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Safari 14+ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Edge 90+ | ✅ | ✅ | ✅ | ✅ | ✅ |
**Note:** Office document online viewing requires an internet connection and works on all modern browsers.
## Performance Considerations
1. **Lazy Loading**: Images are loaded only when visible
2. **Modal Loading**: Preview content loads only when modal opens
3. **External Links**: Downloads don't trigger component re-renders
4. **Error Boundaries**: Failed loads don't crash the component
## Future Enhancements
Potential improvements:
1. **Caching**: Cache preview content
2. **Thumbnails**: Generate thumbnails for large files
3. **Full-screen mode**: Add full-screen toggle for videos
4. **Download progress**: Show progress bar for large files
5. **Zoom controls**: Add zoom in/out for images and PDFs
6. **Print option**: Add print button for documents
7. **Share functionality**: Social sharing buttons
8. **Multi-page PDF navigation**: Add page controls for PDFs
## Dependencies
- `@chakra-ui/react`: UI components
- `react-icons/fi`: Feather icons
- `assetUrl` utility: URL resolution helper
## Testing Checklist
- [ ] Image preview opens in modal
- [ ] PDF displays in iframe
- [ ] Video plays with controls
- [ ] Audio plays correctly
- [ ] Office docs show "View Online" button
- [ ] Download button works
- [ ] Error states display properly
- [ ] Responsive on mobile
- [ ] Dark mode looks correct
- [ ] File sizes format correctly (KB/MB)
- [ ] Modal closes properly
- [ ] External links open in new tab