detectAI / frontend /src /components /InputSection.jsx
vivek1192's picture
Setup CI/CD for Hugging Face
171eb01
import React, { useState, useCallback } from 'react';
import { useDropzone } from 'react-dropzone';
import { Upload, FileText, X } from 'lucide-react';
import { motion } from 'framer-motion';
const InputSection = ({ onAnalyze }) => {
const [text, setText] = useState('');
const [activeTab, setActiveTab] = useState('text');
const [file, setFile] = useState(null);
const onDrop = useCallback((acceptedFiles) => {
if (acceptedFiles?.length > 0) {
setFile(acceptedFiles[0]);
}
}, []);
const { getRootProps, getInputProps, isDragActive } = useDropzone({
onDrop,
accept: { 'text/plain': ['.txt'], 'application/pdf': ['.pdf'] },
maxFiles: 1
});
const handleAnalyze = () => {
if (activeTab === 'text' && text.trim()) {
onAnalyze({ type: 'text', content: text });
} else if (activeTab === 'file' && file) {
onAnalyze({ type: 'file', content: file });
}
};
return (
<div
// Forced styling to ensure width works even if Tailwind has issues
style={{ width: '90vw', maxWidth: '1200px', margin: '0 auto', display: 'flex', flexDirection: 'column' }}
className="neu-panel p-8 md:p-12 mb-12"
>
<div className="flex justify-center gap-8 mb-8" style={{ display: 'flex', justifyContent: 'center', gap: '2rem', marginBottom: '3rem' }}>
<button
onClick={() => setActiveTab('text')}
className={`px-16 py-6 rounded-2xl font-bold tracking-wider transition-all duration-200 text-2xl ${activeTab === 'text'
? 'neu-tab-active'
: 'neu-btn text-gray-400 hover:text-white'
}`}
style={activeTab === 'text' ? { color: '#f0f0f0' } : {}}
>
TEXT INPUT
</button>
<button
onClick={() => setActiveTab('file')}
className={`px-16 py-6 rounded-2xl font-bold tracking-wider transition-all duration-200 text-2xl ${activeTab === 'file'
? 'neu-tab-active'
: 'neu-btn text-gray-400 hover:text-white'
}`}
style={activeTab === 'file' ? { color: '#f0f0f0' } : {}}
>
FILE UPLOAD
</button>
</div>
<div className="flex flex-col flex-grow relative" style={{ minHeight: '500px' }}>
{activeTab === 'text' ? (
<div className="w-full h-full relative group">
<textarea
className="w-full neu-input p-8 text-xl font-normal leading-relaxed resize-none text-gray-200 placeholder-gray-600 font-mono"
style={{ width: '100%', height: '500px', resize: 'none' }}
placeholder="Paste your content here..."
value={text}
onChange={(e) => setText(e.target.value)}
spellCheck="false"
/>
<div className="absolute bottom-6 right-8 text-sm text-gray-500 font-mono">
{text.length} chars
</div>
</div>
) : (
<div
{...getRootProps()}
className={`w-full neu-input flex flex-col items-center justify-center cursor-pointer transition-all duration-300
${isDragActive ? 'box-shadow-none border border-blue-500/50' : ''}
`}
style={{ width: '100%', height: '500px' }}
>
<input {...getInputProps()} />
{file ? (
<div className="flex flex-col items-center animate-in fade-in zoom-in duration-300">
<div className="neu-panel p-6 rounded-full mb-6">
<FileText size={64} className="text-blue-500" />
</div>
<p className="text-2xl font-bold text-gray-200 mb-2">{file.name}</p>
<p className="text-gray-500 mb-8 font-mono">{(file.size / 1024).toFixed(2)} KB</p>
<button
onClick={(e) => { e.stopPropagation(); setFile(null); }}
className="neu-btn px-8 py-3 text-red-400 hover:text-red-500 flex items-center gap-2"
>
<X size={20} /> Remove
</button>
</div>
) : (
<div className="text-center group">
<div className="mb-6 opacity-60 group-hover:opacity-100 transition-opacity duration-300">
<Upload size={80} className="text-gray-600 mx-auto" />
</div>
<p className="text-3xl text-gray-300 font-thin mb-3">Drag & Drop file</p>
<p className="text-gray-500 text-lg uppercase tracking-widest">.txt .pdf</p>
</div>
)}
</div>
)}
<div className="flex justify-center mt-10" style={{ display: 'flex', justifyContent: 'center', marginTop: '2.5rem' }}>
<button
onClick={handleAnalyze}
disabled={(!text.trim() && !file)}
className="neu-btn-primary px-16 py-5 rounded-2xl text-xl font-bold tracking-widest shadow-blue-500/10 disabled:opacity-50 disabled:cursor-not-allowed"
>
ANALYZE CONTENT
</button>
</div>
</div>
</div>
);
};
export default InputSection;