sahel-api / website /src /components /FileUpload.jsx
Mohamed-20's picture
Deploy: backend, website, dashboard
4d65452
import { useCallback } from 'react';
import { useDropzone } from 'react-dropzone';
import styled from 'styled-components';
import { API_URL } from '../config';
const DropzoneContainer = styled.div`
border: 2px dashed ${({ $isDragActive, $hasFile }) =>
$isDragActive ? '#007bff' : $hasFile ? '#4caf50' : '#ccc'};
border-radius: 8px;
padding: 20px;
text-align: center;
cursor: pointer;
background-color: ${({ $isDragActive }) =>
$isDragActive ? 'rgba(0, 123, 255, 0.05)' : 'transparent'};
transition: border-color 0.2s ease;
margin-bottom: 20px;
&:hover {
border-color: ${({ $hasFile }) => ($hasFile ? '#4caf50' : '#007bff')};
}
`;
const RemoveButton = styled.button`
margin-left: 10px;
border: 1px solid #cbd8cb;
border-radius: 6px;
min-height: 30px;
padding: 0 10px;
background: #ffffff;
cursor: pointer;
`;
const handleUpload = async (file, businessId, ownerToken, onUploadComplete) => {
if (!file) {
console.error('No file selected.');
return;
}
if (!businessId) {
console.error('Create or select a business first.');
return;
}
const formData = new FormData();
formData.append('file', file);
try {
const response = await fetch(`${API_URL}/businesses/${businessId}/documents`, {
method: 'POST',
headers: {
Authorization: `Bearer ${ownerToken}`,
},
body: formData,
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const result = await response.json();
console.log('Upload Success:', result);
onUploadComplete?.(result);
} catch (error) {
console.error('Upload Error:', error);
}
};
const FileUpload = ({ onFileUpload, currentFile, businessId, ownerToken, onUploadComplete }) => {
const onDrop = useCallback(
(acceptedFiles) => {
const file = acceptedFiles[0];
if (file) {
onFileUpload(file);
handleUpload(file, businessId, ownerToken, onUploadComplete);
}
},
[businessId, onFileUpload, onUploadComplete, ownerToken],
);
const removeFile = useCallback(
(event) => {
event.stopPropagation();
onFileUpload(null);
},
[onFileUpload],
);
const { getRootProps, getInputProps, isDragActive } = useDropzone({
accept: { 'application/pdf': ['.pdf'] },
maxFiles: 1,
onDrop,
disabled: !!currentFile || !businessId || !ownerToken,
});
return (
<DropzoneContainer
{...getRootProps()}
$isDragActive={isDragActive}
$hasFile={!!currentFile}
>
<input {...getInputProps()} />
{currentFile ? (
<div>
<span>PDF {currentFile.name}</span>
<RemoveButton type="button" onClick={removeFile}>
Remove
</RemoveButton>
</div>
) : (
<p>
{isDragActive
? 'Drop the PDF here...'
: businessId && ownerToken
? "Drag 'n' drop a PDF here, or click to select"
: 'Create a business first, then upload a PDF'}
</p>
)}
</DropzoneContainer>
);
};
export default FileUpload;