/**
* 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 && (

)}
{viewMode === 'processed' && processedUrl && (

)}
{viewMode === 'mask' && maskUrl && (

)}
);
};
/**
* Progress Bar Component
*/
const ProgressBar = ({ progress }) => {
return (
);
};
/**
* 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:
- Select quality and model settings
- Drag and drop an image or click to browse
- Wait for processing to complete
- Preview and download your results
Integration:
{`npm install axios
import BackgroundRemover from './BackgroundRemover';
`}
);
};
export default BackgroundRemover;
export { useBackgroundFX, DropZone, ImagePreview, ProgressBar };