|
import { useState, useRef } from "react"; |
|
import { API_CONFIG, apiService } from "../../../config/api"; |
|
|
|
|
|
|
|
|
|
|
|
export const useDocumentSelection = (onStartGeneration) => { |
|
const [isDragging, setIsDragging] = useState(false); |
|
const [uploadStatus, setUploadStatus] = useState(null); |
|
const [isLoading, setIsLoading] = useState(false); |
|
const [sessionId, setSessionId] = useState(null); |
|
const [selectedDocument, setSelectedDocument] = useState(null); |
|
const [isDefaultDocument, setIsDefaultDocument] = useState(false); |
|
const [urlInput, setUrlInput] = useState(""); |
|
const [urlSelected, setUrlSelected] = useState(false); |
|
const fileInputRef = useRef(null); |
|
|
|
const handleDragOver = (e) => { |
|
e.preventDefault(); |
|
setIsDragging(true); |
|
}; |
|
|
|
const handleDragLeave = () => { |
|
setIsDragging(false); |
|
}; |
|
|
|
const handleClick = () => { |
|
|
|
|
|
fileInputRef.current.click(); |
|
}; |
|
|
|
const handleFileChange = (e) => { |
|
const file = e.target.files[0]; |
|
if (!file) return; |
|
|
|
|
|
setUrlInput(""); |
|
setUrlSelected(false); |
|
setIsDefaultDocument(false); |
|
setSessionId(null); |
|
|
|
|
|
if ( |
|
!file.name.endsWith(".pdf") && |
|
!file.name.endsWith(".txt") && |
|
!file.name.endsWith(".html") && |
|
!file.name.endsWith(".md") |
|
) { |
|
setUploadStatus({ |
|
success: false, |
|
message: "Only PDF, TXT, HTML and MD files are accepted", |
|
}); |
|
return { success: false, error: "Invalid file format" }; |
|
} |
|
|
|
|
|
if (file.size > 1048576 * 2) { |
|
setUploadStatus({ |
|
success: false, |
|
message: "File size exceeds the 2MB limit", |
|
}); |
|
return { success: false, error: "File too large" }; |
|
} |
|
|
|
handleFileUpload(file); |
|
return { success: true }; |
|
}; |
|
|
|
const handleFileUpload = async (file) => { |
|
setIsLoading(true); |
|
setUploadStatus(null); |
|
|
|
|
|
setSelectedDocument(null); |
|
|
|
try { |
|
const result = await apiService.uploadFile(file); |
|
|
|
setUploadStatus({ |
|
success: true, |
|
message: "File uploaded successfully", |
|
}); |
|
setSessionId(result.session_id); |
|
setSelectedDocument({ name: file.name }); |
|
|
|
setIsDefaultDocument(false); |
|
setUrlSelected(false); |
|
return { success: true }; |
|
} catch (error) { |
|
setUploadStatus({ |
|
success: false, |
|
message: error.message || "Server connection error", |
|
}); |
|
return { |
|
success: false, |
|
error: error.message || "Server connection error", |
|
}; |
|
} finally { |
|
setIsLoading(false); |
|
} |
|
}; |
|
|
|
const handleDrop = async (e) => { |
|
e.preventDefault(); |
|
setIsDragging(false); |
|
|
|
|
|
setUrlInput(""); |
|
setUrlSelected(false); |
|
setIsDefaultDocument(false); |
|
fileInputRef.current.value = ""; |
|
setSessionId(null); |
|
|
|
const file = e.dataTransfer.files[0]; |
|
if (!file) { |
|
setUploadStatus({ |
|
success: false, |
|
message: "No file detected", |
|
}); |
|
return { success: false, error: "No file detected" }; |
|
} |
|
|
|
|
|
if ( |
|
!file.name.endsWith(".pdf") && |
|
!file.name.endsWith(".txt") && |
|
!file.name.endsWith(".html") && |
|
!file.name.endsWith(".md") |
|
) { |
|
setUploadStatus({ |
|
success: false, |
|
message: "Only PDF, TXT, HTML and MD files are accepted", |
|
}); |
|
return { success: false, error: "Invalid file format" }; |
|
} |
|
|
|
|
|
if (file.size > 1048576 * 3) { |
|
setUploadStatus({ |
|
success: false, |
|
message: "File size exceeds the 3MB limit", |
|
}); |
|
return { success: false, error: "File too large" }; |
|
} |
|
|
|
handleFileUpload(file); |
|
return { success: true }; |
|
}; |
|
|
|
const handleDefaultDocClick = (doc) => { |
|
|
|
setUrlInput(""); |
|
setUrlSelected(false); |
|
fileInputRef.current.value = ""; |
|
|
|
|
|
setSelectedDocument(doc); |
|
if (doc) { |
|
setSessionId(doc.id); |
|
setIsDefaultDocument(true); |
|
} else { |
|
|
|
setIsDefaultDocument(false); |
|
setSessionId(null); |
|
} |
|
}; |
|
|
|
const handleGenerateClick = () => { |
|
if (onStartGeneration && sessionId) { |
|
onStartGeneration(sessionId, isDefaultDocument); |
|
} else if (!sessionId) { |
|
setUploadStatus({ |
|
success: false, |
|
message: "Please select or upload a document first", |
|
}); |
|
} |
|
}; |
|
|
|
const handleUrlInputChange = async (e) => { |
|
const url = e.target.value; |
|
setUrlInput(url); |
|
|
|
|
|
|
|
const urlRegex = |
|
/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/; |
|
|
|
if (url && urlRegex.test(url)) { |
|
|
|
setIsDefaultDocument(false); |
|
fileInputRef.current.value = ""; |
|
|
|
setUrlSelected(true); |
|
|
|
|
|
if (url.length > 10) { |
|
await handleUrlUpload(url); |
|
} |
|
} else if (url && url.length > 5) { |
|
|
|
setUrlSelected(false); |
|
setUploadStatus({ |
|
success: false, |
|
message: "Please enter a valid URL", |
|
}); |
|
} else { |
|
|
|
setUrlSelected(false); |
|
|
|
|
|
|
|
if (urlSelected) { |
|
setSelectedDocument(null); |
|
setSessionId(null); |
|
} |
|
} |
|
}; |
|
|
|
const handleUrlUpload = async (url) => { |
|
setIsLoading(true); |
|
setUploadStatus(null); |
|
|
|
|
|
setSelectedDocument(null); |
|
setIsDefaultDocument(false); |
|
|
|
try { |
|
const result = await apiService.uploadUrl(url); |
|
|
|
setUploadStatus({ |
|
success: true, |
|
message: "Content from URL uploaded successfully", |
|
}); |
|
setSessionId(result.session_id); |
|
|
|
|
|
let domain = url; |
|
try { |
|
|
|
const urlObj = new URL(url.startsWith("http") ? url : `https://${url}`); |
|
domain = urlObj.hostname; |
|
} catch (e) { |
|
console.error("Error parsing URL:", e); |
|
} |
|
|
|
setSelectedDocument({ |
|
name: "URL Content", |
|
domain: domain, |
|
source_url: result.source_url || url, |
|
}); |
|
|
|
return { success: true }; |
|
} catch (error) { |
|
setUploadStatus({ |
|
success: false, |
|
message: error.message || "Error processing URL", |
|
}); |
|
return { success: false, error: error.message || "Error processing URL" }; |
|
} finally { |
|
setIsLoading(false); |
|
} |
|
}; |
|
|
|
return { |
|
|
|
isDragging, |
|
isLoading, |
|
sessionId, |
|
selectedDocument, |
|
isDefaultDocument, |
|
urlInput, |
|
urlSelected, |
|
uploadStatus, |
|
fileInputRef, |
|
|
|
|
|
handleDragOver, |
|
handleDragLeave, |
|
handleClick, |
|
handleFileChange, |
|
handleDrop, |
|
handleDefaultDocClick, |
|
handleGenerateClick, |
|
handleUrlInputChange, |
|
|
|
|
|
setUploadStatus, |
|
}; |
|
}; |
|
|