Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
179 changes: 2 additions & 177 deletions frontend/src/components/DriveFolderSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,187 +98,12 @@ export default function DriveFolderSelector({ onSelect }: DriveFolderSelectorPro
useEffect(() => {
let active = true;

const interval = setInterval(() => {
const interval = clearInterval(window.__iv); window.__iv = setInterval(() => {
setSyncProgress((prev) => {
if (prev >= 90) return prev;
return prev + 10;
});
}, 150);

void getDriveFolders().then((data) => {
if (!active) return;

clearInterval(interval);

setSyncProgress(100);
setFolders(data);

setTimeout(() => {
setLoading(false);
}, 300);
});

return () => {
active = false;
clearInterval(interval);
};
}, []);

const selectedFolder = useMemo(
() => folders.flatMap((folder) => collectFolders(folder)).find((folder) => folder.id === selectedId) ?? null,
[folders, selectedId]
);

const handleToggle = (id: string) => {
setExpandedIds((current) => ({
...current,
[id]: !current[id],
}));
};

const handleSelect = (folder: DriveFolder) => {
setSelectedId(folder.id);

const path =
findFolderPath(folders, folder.id) ?? [];

setFolderPath(path);

onSelect?.(folder);
};

return (
<div className="space-y-6">
<div className="rounded-3xl border border-border/70 bg-card/80 p-4 shadow-sm backdrop-blur-xl">
<div className="mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
<div>
<p className="text-sm uppercase tracking-[0.2em] text-muted-foreground">Google Drive</p>
<h2 className="text-xl font-semibold">Select a folder</h2>
</div>
<div className="text-sm text-muted-foreground">
Pick exactly one folder from the tree.
</div>
</div>

{loading && (
<div className="mt-3 space-y-2">
<div className="flex justify-between text-xs text-muted-foreground">
<span>Syncing Drive folders...</span>
<span>{syncProgress}%</span>
</div>
<Progress value={syncProgress} />
</div>
)}

{folderPath.length > 0 && (
<div className="mb-4 flex flex-wrap items-center gap-2 text-sm">
{folderPath.map((folder, index) => (
<div
key={folder.id}
className="flex items-center gap-2"
>
<button
type="button"
onClick={() => handleSelect(folder)}
className="text-primary hover:underline"
>
{folder.name}
</button>

{index < folderPath.length - 1 && (
<span className="text-muted-foreground">
/
</span>
)}
</div>
))}
</div>
)}

{loading ? (
<div className="space-y-2">
{[1, 2, 3].map((item) => (
<div key={item} className="h-11 rounded-lg bg-muted/50 animate-pulse" />
))}
</div>
) : (
<div className="space-y-1">
{folders.map((folder) => (
<FolderItem
key={folder.id}
folder={folder}
depth={0}
expandedIds={expandedIds}
onToggle={handleToggle}
selectedId={selectedId}
onSelect={handleSelect}
/>
))}
</div>
)}
</div>

<div className="rounded-3xl border border-border/70 bg-card/80 p-4 text-sm text-muted-foreground">
<div className="mb-3 flex items-center justify-between gap-3">
<span className="font-semibold text-foreground">Selected folder</span>
<span className="rounded-full bg-muted px-3 py-1 text-xs uppercase tracking-[0.18em] text-muted-foreground">
{selectedFolder ? "Ready" : "None"}
</span>
</div>

{selectedFolder ? (
<div className="space-y-1 rounded-2xl border border-border/50 bg-background/80 p-4">
<div className="flex items-center gap-2 text-sm font-medium text-foreground">
<Folder className="h-4 w-4 text-primary" />
<span>{selectedFolder.name}</span>
</div>
<p className="text-xs text-muted-foreground">
Folder ID: {selectedFolder.id}
</p>
</div>
) : (
<p>Please select a folder to continue.</p>
)}
</div>

<div className="flex justify-end">
<Button
type="button"
variant="secondary"
onClick={() => void (selectedFolder && window.alert(`Selected folder: ${selectedFolder.name}`))}
disabled={!selectedFolder}
>
Confirm selection
</Button>
</div>
</div>
);
}

function findFolderPath(
folders: DriveFolder[],
targetId: string
): DriveFolder[] | null {
for (const folder of folders) {
if (folder.id === targetId) {
return [folder];
}

if (folder.children) {
const childPath = findFolderPath(
folder.children,
targetId
);

if (childPath) {
return [folder, ...childPath];
}
}
}

return null;
}

function collectFolders(folder: DriveFolder): DriveFolder[] {
return [folder, ...(folder.children ?? []).flatMap(collectFolders)];
}
.catch(err => console.error(err))
4 changes: 2 additions & 2 deletions frontend/src/components/document/PDFViewer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ export default function PDFViewer({
const searchHighlights = useMemo(() => {
if (!matches[currentIndex] || matches[currentIndex].page !== currentPage)
return [];
return matches[currentIndex].rects.map((r: SearchRect) => ({
return matches[currentIndex].(rects ?? []).map((r: SearchRect) => ({
left: `${r.left}px`,
top: `${r.top}px`,
width: `${r.width}px`,
Expand All @@ -182,7 +182,7 @@ export default function PDFViewer({
}, [matches, currentIndex, currentPage]);

const handlePageJump = (value: string) => {
const pageNumber = parseInt(value.trim(), 10);
const pageNumber = parseInt(value.trim(, 10), 10);
if (
!Number.isNaN(pageNumber) &&
pageNumber >= 1 &&
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/components/graph/KnowledgeGraph.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ function Legend({ labels }: { labels: string[] }) {
if (labels.length === 0) return null;
return (
<div className="flex flex-wrap gap-1.5">
{labels.map((label) => {
{(labels ?? []).map((label) => {
const c = colourFor(label);
return (
<span
Expand Down Expand Up @@ -343,7 +343,7 @@ export default function KnowledgeGraph({

// Distinct NER labels present in this graph
const presentLabels = useMemo(
() => [...new Set((graphData?.nodes ?? []).map((n) => n.label))].sort(),
() => [...new Set((graphData?.nodes ?? []).map((n) => n.label))].sort((a, b) => a - b),
[graphData],
);

Expand Down