/** * BackgroundFX Pro - React Component Example * * A complete React component for background removal with drag-and-drop, * progress tracking, and result preview. */ import React, { useState, useCallback, useRef } from 'react'; import axios from 'axios'; // Configuration const API_BASE_URL = process.env.REACT_APP_BACKGROUNDFX_API_URL || 'https://api.backgroundfx.pro/v1'; const API_KEY = process.env.REACT_APP_BACKGROUNDFX_API_KEY; /** * BackgroundFX API Client Hook */ const useBackgroundFX = (apiKey) => { const [isProcessing, setIsProcessing] = useState(false); const [progress, setProgress] = useState(0); const [error, setError] = useState(null); const client = useRef( axios.create({ baseURL: API_BASE_URL, headers: { 'Authorization': `Bearer ${apiKey}`, }, }) ); const removeBackground = useCallback(async (file, options = {}) => { setIsProcessing(true); setError(null); setProgress(0); const formData = new FormData(); formData.append('file', file); Object.keys(options).forEach(key => { formData.append(key, options[key]); }); try { const response = await client.current.post('/process/remove-background', formData, { onUploadProgress: (progressEvent) => { const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total); setProgress(percentCompleted); }, }); setIsProcessing(false); setProgress(100); return response.data; } catch (err) { setError(err.response?.data?.message || err.message); setIsProcessing(false); throw err; } }, []); return { removeBackground, isProcessing, progress, error, }; }; /** * Drag and Drop Zone Component */ const DropZone = ({ onDrop, disabled }) => { const [isDragging, setIsDragging] = useState(false); const fileInputRef = useRef(null); const handleDragEnter = useCallback((e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); }, []); const handleDragLeave = useCallback((e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); }, []); const handleDragOver = useCallback((e) => { e.preventDefault(); e.stopPropagation(); }, []); const handleDrop = useCallback((e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); const files = e.dataTransfer.files; if (files && files[0]) { onDrop(files[0]); } }, [onDrop]); const handleFileSelect = useCallback((e) => { const files = e.target.files; if (files && files[0]) { onDrop(files[0]); } }, [onDrop]); return (
!disabled && fileInputRef.current?.click()} style={{ border: '2px dashed #ccc', borderRadius: '8px', padding: '40px', textAlign: 'center', cursor: disabled ? 'not-allowed' : 'pointer', backgroundColor: isDragging ? '#f0f0f0' : 'white', transition: 'all 0.3s ease', }} >

{disabled ? 'Processing...' : 'Drop image here or click to browse'}

Supports PNG, JPG, WebP (max 50MB)

); }; /** * Image Preview Component */ const ImagePreview = ({ originalUrl, processedUrl, maskUrl }) => { const [viewMode, setViewMode] = useState('processed'); return (
{maskUrl && ( )}
{viewMode === 'original' && originalUrl && ( Original )} {viewMode === 'processed' && processedUrl && ( Processed )} {viewMode === 'mask' && maskUrl && ( Mask )}
); }; /** * Progress Bar Component */ const ProgressBar = ({ progress }) => { return (

{progress}% Complete

); }; /** * Main BackgroundRemover Component */ const BackgroundRemover = ({ apiKey = API_KEY }) => { const [originalImage, setOriginalImage] = useState(null); const [processedImage, setProcessedImage] = useState(null); const [maskImage, setMaskImage] = useState(null); const [selectedQuality, setSelectedQuality] = useState('high'); const [selectedModel, setSelectedModel] = useState('auto'); const [returnMask, setReturnMask] = useState(false); const { removeBackground, isProcessing, progress, error } = useBackgroundFX(apiKey); const handleFileDrop = useCallback(async (file) => { // Validate file if (!file.type.startsWith('image/')) { alert('Please upload an image file'); return; } if (file.size > 50 * 1024 * 1024) { alert('File size must be less than 50MB'); return; } // Create preview const reader = new FileReader(); reader.onload = (e) => { setOriginalImage(e.target.result); }; reader.readAsDataURL(file); // Process image try { const result = await removeBackground(file, { quality: selectedQuality, model: selectedModel, return_mask: returnMask, }); setProcessedImage(result.image); if (result.mask) { setMaskImage(result.mask); } } catch (err) { console.error('Processing failed:', err); } }, [removeBackground, selectedQuality, selectedModel, returnMask]); const handleDownload = useCallback((url, filename) => { const link = document.createElement('a'); link.href = url; link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); }, []); const handleReset = useCallback(() => { setOriginalImage(null); setProcessedImage(null); setMaskImage(null); }, []); return (

BackgroundFX Pro - React Example

{/* Settings */}
{/* Drop Zone */} {!originalImage && ( )} {/* Progress Bar */} {isProcessing && } {/* Error Message */} {error && (
Error: {error}
)} {/* Image Preview */} {(originalImage || processedImage) && ( )} {/* Action Buttons */} {processedImage && (
{maskImage && ( )}
)} {/* Instructions */}

How to use:

  1. Select quality and model settings
  2. Drag and drop an image or click to browse
  3. Wait for processing to complete
  4. Preview and download your results

Integration:

{`npm install axios
import BackgroundRemover from './BackgroundRemover';

`}
        
); }; export default BackgroundRemover; export { useBackgroundFX, DropZone, ImagePreview, ProgressBar };