UNPKG

@health-ecosystem/file-upload

Version:

File upload library for Health Ecosystem applications with improved Next.js 15+ compatibility

365 lines (294 loc) 10.7 kB
# Health Ecosystem File Upload Library v1.0.5 A file upload library for Health Ecosystem applications with improved Next.js 15+ compatibility and new library management features. ## 🆕 What's New in v1.0.5 - **New FileUploadLibrary Component**: Complete file management solution with library display - **Backend API Integration**: Automatically loads files from `/api/files/files` endpoint - **Upload Flow Redesign**: Select file → Show upload button → Upload → Reload library - **File Actions**: Preview, select, and delete files with thumbnail support - **Improved UX**: Better visual feedback and state management ## 🆕 What's New in v1.0.4 - **Next.js 15+ Compatibility**: Updated to work with the latest Next.js versions - **React 19 Support**: Compatible with React 19 - **TypeScript Updates**: Improved type definitions and fixed type errors - **Bug Fixes**: Various bug fixes and performance improvements - **Better Error Handling**: More robust error handling for uploads ## Features - 📱 **Responsive Design** - Works on desktop and mobile - 🖼️ **File Gallery** - Browse and select from uploaded files with thumbnails - 🔗 **URL Upload** - Upload files directly from URLs - 📊 **Progress Tracking** - Real-time upload progress with visual feedback - 🔒 **Flexible Auth** - Supports both authenticated and public uploads - 🎨 **Customizable** - Extensive styling and configuration options - ⚡ **TypeScript** - Full TypeScript support with comprehensive types - 🗂️ **File Management** - Preview, select, and delete files - 🔄 **Auto Refresh** - Library automatically refreshes after uploads ## Installation ```bash npm install @health-ecosystem/file-upload@1.0.5 ``` ## Quick Start ### New FileUploadLibrary Component (Recommended) The new `FileUploadLibrary` component provides a complete file management solution that automatically integrates with your backend API. ```tsx import React, { useState } from 'react' import { FileUploadLibrary, initializeFileUploadLibrary, FileMetadata } from '@health-ecosystem/file-upload' function MyComponent() { const [selectedFile, setSelectedFile] = useState<FileMetadata | null>(null) // Initialize with your server endpoint and access token const { config, uploadOptions } = initializeFileUploadLibrary( 'https://api.yourdomain.com', // Your server endpoint 'your-jwt-access-token', // Your access token { category: 'document', isPublic: true, maxFileSize: 50 * 1024 * 1024, // 50MB allowedTypes: ['image/*', 'application/pdf'] } ) const handleFileSelect = (file: FileMetadata) => { console.log('File selected:', file) setSelectedFile(file) } return ( <div> <FileUploadLibrary config={config} options={uploadOptions} onFileSelect={handleFileSelect} accept="image/*,application/pdf" /> {selectedFile && ( <div> <h4>Selected: {selectedFile.originalFilename}</h4> <a href={`${config.baseUrl}${selectedFile.downloadUrl}`} target="_blank"> Download </a> </div> )} </div> ) } ``` ### How It Works 1. **Initialization**: Provide your server endpoint and access token 2. **Auto-Load**: Component automatically fetches files from `/files?skip=0&limit=100` (relative to baseUrl) 3. **File Selection**: User selects a file to upload 4. **Upload Interface**: File selection area is replaced with upload button and progress 5. **Upload & Refresh**: After successful upload, library refreshes to show new file 6. **File Actions**: Each file shows thumbnail with preview, select, and delete actions ### Backend API Requirements Your backend should implement these endpoints (relative to your baseUrl): ``` GET /files?skip=0&limit=100 - List files POST /upload - Upload file DELETE /files/{file_id} - Delete file GET /files/{file_id}/download - Download file GET /files/{file_id}/thumbnail - Get thumbnail GET /preview/{hash} - Preview with transformations ``` **Example with baseUrl `http://localhost:8000/api/files`:** - List files: `http://localhost:8000/api/files/files?skip=0&limit=100` - Upload: `http://localhost:8000/api/files/upload` - Download: `http://localhost:8000/api/files/files/{id}/download` Expected file object structure: ```json { "id": "c7b5667d-0a49-4896-a74e-004a7df40261", "original_filename": "images.png", "file_size": 1330, "mime_type": "image/png", "file_category": "other", "uploaded_by": "b93b6aad-183c-48c1-bf30-e4c54190619c", "associated_entity_type": "other", "associated_entity_id": null, "is_public": true, "created_at": "2025-07-16T06:59:14.983158", "download_url": "/files/c7b5667d-0a49-4896-a74e-004a7df40261/download", "thumbnail_url": "/files/c7b5667d-0a49-4896-a74e-004a7df40261/thumbnail", "preview_url": "/preview/CRgJ_ghHmJjGHi8PBCUPPKtYHXHZlDXN" } ``` ## Components ### FileUploadLibrary (NEW - Recommended) Complete file management solution with library display and upload functionality. ```tsx <FileUploadLibrary config={config} // FileUploadConfig options={uploadOptions} // UploadOptions onFileSelect={handleFileSelect} // Callback when file is selected multiple={false} // Allow multiple file selection accept="*/*" // Accepted file types className="custom-class" // Custom CSS class style={{ border: '1px solid #ddd' }} // Custom styles /> ``` ### FileUploadButton A trigger button that opens the file upload modal. ```tsx <FileUploadButton config={config} onFileSelect={(fileUrl, fileData) => console.log(fileUrl)} options={{ category: 'document', isPublic: true }} multiple={false} accept="*/*" title="Upload Files" variant="primary" // 'primary' | 'secondary' | 'outline' size="medium" // 'small' | 'medium' | 'large' > Upload Files </FileUploadButton> ``` ### FileUploadModal The main modal component with sidebar navigation and file gallery. ```tsx <FileUploadModal isOpen={isModalOpen} onClose={() => setIsModalOpen(false)} onFileSelect={(fileUrl, fileData) => handleSelect(fileUrl, fileData)} config={config} options={{ category: 'document', isPublic: true }} multiple={true} accept="*/*" title="File Manager" /> ``` ## Configuration ### FileUploadConfig ```typescript const config = createFileUploadConfig( 'https://api.yourdomain.com', // Base URL 'jwt-token', // Auth token { maxFileSize: 50 * 1024 * 1024, // 50MB allowedTypes: ['image/*', 'application/pdf'], timeout: 30000, enableRetry: true, maxRetries: 3 } ) ``` ### Upload Options ```typescript const options = { category: 'document', // File category entityType: 'patient', // Associated entity type entityId: 'patient-uuid', // Associated entity ID isPublic: true, // Public access (no auth required) metadata: '{"key": "value"}' // Additional metadata } ``` ### Library Initialization Helper ```typescript const { config, uploadOptions } = initializeFileUploadLibrary( 'https://api.yourdomain.com', // Server endpoint 'your-jwt-token', // Access token { category: 'document', isPublic: true, maxFileSize: 50 * 1024 * 1024, allowedTypes: ['image/*', 'application/pdf'] } ) ``` ## File Management Features ### Thumbnail Display - Automatic thumbnail generation for images - File type icons for non-image files - Responsive grid layout ### File Actions - **Select**: Choose file for use in your application - **Preview**: Open file in new tab with transformations - **Delete**: Remove file from library (with confirmation) ### Upload Flow 1. **File Selection Area**: Drag & drop or click to select 2. **Upload Confirmation**: Shows selected file with upload button 3. **Progress Tracking**: Real-time upload progress 4. **Library Refresh**: Automatically reloads to show new file ## Styling ### Custom Styles ```tsx <FileUploadLibrary config={config} options={uploadOptions} className="my-custom-library" style={{ border: '2px solid #007bff', borderRadius: '12px', padding: '24px' }} /> ``` ### CSS Classes The components include CSS classes for custom styling: - `.file-upload-library` - Main container - `.upload-section` - Upload area - `.file-select-area` - File selection zone - `.upload-confirmation` - Upload button area - `.file-library` - File grid container - `.file-item` - Individual file card - `.file-thumbnail` - Thumbnail container - `.file-actions` - Action buttons container ## Migration Guide ### From v1.0.4 to v1.0.5 **New Recommended Approach:** ```tsx // Old modal-based approach <FileUploadButton config={config} onFileSelect={handleSelect}> Upload Files </FileUploadButton> // New library approach const { config, uploadOptions } = initializeFileUploadLibrary( 'https://api.yourdomain.com', 'your-jwt-token' ) <FileUploadLibrary config={config} options={uploadOptions} onFileSelect={handleSelect} /> ``` **Key Changes:** - New `FileUploadLibrary` component for complete file management - `initializeFileUploadLibrary` helper for easy setup - Automatic integration with `/api/files/files` endpoint - Built-in file actions (preview, select, delete) - Improved upload flow with better UX ## Examples See `example-library-usage.tsx` for comprehensive examples including: - Basic file upload and library display - Medical image upload with thumbnails - Custom styling and theming - Form integration with file attachments ## Browser Support - Chrome 60+ - Firefox 60+ - Safari 12+ - Edge 79+ ## License MIT License - see LICENSE file for details. ## Changelog ### v1.0.5 - ✨ New `FileUploadLibrary` component with complete file management - ✨ Automatic backend API integration (`/api/files/files` endpoint) - ✨ Improved upload flow: select → upload → refresh library - ✨ File actions: preview, select, delete with thumbnails - ✨ `initializeFileUploadLibrary` helper function - 🔧 Better error handling and user feedback - 🔧 Responsive design improvements - 📦 Updated TypeScript definitions ### v1.0.4 - ✨ Next.js 15+ compatibility - ✨ React 19 support - 🔧 TypeScript improvements - 🔧 Bug fixes and performance improvements ### v1.0.3 - ✨ File Preview API with transformations - ✨ Thumbnail support for images - ✨ Public file preview without authentication - ✨ URL-based file access ### v1.0.0 - Initial release with basic file upload components