"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Card, CardContent } from "@/components/ui/card" import { FileText, Folder, Plus, Trash2, ArrowLeft } from "lucide-react" interface OneDrivePickerProps { onFileSelected: (files: OneDriveFile[]) => void selectedFiles?: OneDriveFile[] isAuthenticated: boolean accessToken?: string connectorType?: "onedrive" | "sharepoint" onPickerStateChange?: (isOpen: boolean) => void } interface OneDriveFile { id: string name: string mimeType?: string webUrl?: string driveItem?: { file?: { mimeType: string } folder?: unknown } } interface GraphResponse { value: OneDriveFile[] } export function OneDrivePicker({ onFileSelected, selectedFiles = [], isAuthenticated, accessToken, connectorType = "onedrive", onPickerStateChange }: OneDrivePickerProps) { const [isLoading, setIsLoading] = useState(false) const [files, setFiles] = useState([]) const [isPickerOpen, setIsPickerOpen] = useState(false) const [currentPath, setCurrentPath] = useState( connectorType === "sharepoint" ? 'sites?search=' : 'me/drive/root/children' ) const [breadcrumbs, setBreadcrumbs] = useState<{id: string, name: string}[]>([ {id: 'root', name: connectorType === "sharepoint" ? 'SharePoint' : 'OneDrive'} ]) const fetchFiles = async (path: string = currentPath) => { if (!accessToken) return setIsLoading(true) try { const response = await fetch(`https://graph.microsoft.com/v1.0/${path}`, { headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' } }) if (response.ok) { const data: GraphResponse = await response.json() setFiles(data.value || []) } else { console.error('Failed to fetch OneDrive files:', response.statusText) } } catch (error) { console.error('Error fetching OneDrive files:', error) } finally { setIsLoading(false) } } const openPicker = () => { if (!accessToken) return setIsPickerOpen(true) onPickerStateChange?.(true) fetchFiles() } const closePicker = () => { setIsPickerOpen(false) onPickerStateChange?.(false) setFiles([]) setCurrentPath( connectorType === "sharepoint" ? 'sites?search=' : 'me/drive/root/children' ) setBreadcrumbs([ {id: 'root', name: connectorType === "sharepoint" ? 'SharePoint' : 'OneDrive'} ]) } const handleFileClick = (file: OneDriveFile) => { if (file.driveItem?.folder) { // Navigate to folder const newPath = `me/drive/items/${file.id}/children` setCurrentPath(newPath) setBreadcrumbs([...breadcrumbs, {id: file.id, name: file.name}]) fetchFiles(newPath) } else { // Select file const isAlreadySelected = selectedFiles.some(f => f.id === file.id) if (!isAlreadySelected) { onFileSelected([...selectedFiles, file]) } } } const navigateBack = () => { if (breadcrumbs.length > 1) { const newBreadcrumbs = breadcrumbs.slice(0, -1) setBreadcrumbs(newBreadcrumbs) if (newBreadcrumbs.length === 1) { setCurrentPath('me/drive/root/children') fetchFiles('me/drive/root/children') } else { const parentCrumb = newBreadcrumbs[newBreadcrumbs.length - 1] const newPath = `me/drive/items/${parentCrumb.id}/children` setCurrentPath(newPath) fetchFiles(newPath) } } } const removeFile = (fileId: string) => { const updatedFiles = selectedFiles.filter(file => file.id !== fileId) onFileSelected(updatedFiles) } const getFileIcon = (file: OneDriveFile) => { if (file.driveItem?.folder) { return } return } const getMimeTypeLabel = (file: OneDriveFile) => { const mimeType = file.driveItem?.file?.mimeType || file.mimeType || '' const typeMap: { [key: string]: string } = { 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'Word Doc', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'Excel', 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'PowerPoint', 'application/pdf': 'PDF', 'text/plain': 'Text', 'image/jpeg': 'Image', 'image/png': 'Image', } if (file.driveItem?.folder) return 'Folder' return typeMap[mimeType] || 'Document' } const serviceName = connectorType === "sharepoint" ? "SharePoint" : "OneDrive" if (!isAuthenticated) { return (

Please connect to {serviceName} first to select specific files.

) } if (!accessToken) { return (

Access token unavailable

Try disconnecting and reconnecting your {serviceName} account.

) } return (
{!isPickerOpen ? (

Select files from {serviceName} to ingest.

) : (

Select Files from {serviceName}

{/* Navigation */}
{breadcrumbs.length > 1 && ( )}
{breadcrumbs.map((crumb, index) => ( {index > 0 && /} {crumb.name} ))}
{/* File List */}
{isLoading ? (
Loading...
) : files.length === 0 ? (
No files found
) : (
{files.map((file) => (
handleFileClick(file)} >
{getFileIcon(file)} {file.name} {getMimeTypeLabel(file)}
{selectedFiles.some(f => f.id === file.id) && ( Selected )}
))}
)}
)} {selectedFiles.length > 0 && (

Added files

{selectedFiles.map((file) => (
{getFileIcon(file)} {file.name} {getMimeTypeLabel(file)}
))}
)}
) }