Skip to content

Commit 9c7f185

Browse files
committed
Upload preview page + augment notes button
1 parent 2171ae2 commit 9c7f185

File tree

7 files changed

+292
-58
lines changed

7 files changed

+292
-58
lines changed

app/api/document/[datasetId]/[documentId]/route.ts

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
"use client";
2+
import { useState, useRef } from "react";
3+
4+
import { Button } from "@shared/components/ui/button";
5+
import { toast } from "sonner";
6+
import { Input } from "@shared/components/ui/input";
7+
8+
import { FileText, Upload } from "lucide-react";
9+
10+
export default function AugmentComponent({
11+
// TODO: remove when actually implementing augments
12+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
13+
classroomId,
14+
}: {
15+
classroomId: string;
16+
}) {
17+
// TODO: remove when actually implementing augments
18+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
19+
const [isProcessing, setIsProcessing] = useState(false);
20+
const [file, setFile] = useState<File | null>(null);
21+
const inputFile = useRef<HTMLInputElement>(null);
22+
23+
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
24+
const selectedFile = event.target.files?.[0];
25+
if (!selectedFile) return;
26+
27+
// Check if file is markdown or pdf
28+
if (
29+
!selectedFile.name.endsWith(".md") &&
30+
!selectedFile.name.endsWith(".pdf")
31+
) {
32+
toast.error("Invalid file format", {
33+
description: "Please upload a Markdown (.md) or PDF (.pdf) file"
34+
});
35+
return;
36+
}
37+
38+
setFile(selectedFile);
39+
};
40+
41+
const handleUpload = async () => {
42+
// TODO
43+
};
44+
45+
return (
46+
<div className="flex flex-col items-center justify-center gap-4 p-8">
47+
<h1 className="text-3xl font-bold">Augment Notes</h1>
48+
<p className="text-muted-foreground">
49+
Upload your notes to get AI-powered enhancements and improvements
50+
</p>
51+
<div className="flex items-center gap-2">
52+
<Input
53+
type="file"
54+
onChange={handleFileChange}
55+
ref={inputFile}
56+
className="hidden"
57+
accept=".md,.pdf"
58+
/>
59+
<Button
60+
variant="outline"
61+
size="lg"
62+
className="cursor-pointer"
63+
disabled={isProcessing}
64+
onClick={() => inputFile.current?.click()}
65+
>
66+
{isProcessing ? (
67+
<Upload className="mr-2 h-4 w-4 animate-spin" />
68+
) : (
69+
<FileText className="mr-2 h-4 w-4" />
70+
)}
71+
Upload Notes
72+
</Button>
73+
{file && (
74+
<Button
75+
variant="default"
76+
size="lg"
77+
onClick={handleUpload}
78+
disabled={isProcessing}
79+
>
80+
Process Notes
81+
</Button>
82+
)}
83+
</div>
84+
</div>
85+
);
86+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import AugmentComponent from "./component";
2+
import { createClient } from "@shared/utils/supabase/server";
3+
4+
export default async function UploadPage({
5+
params,
6+
}: {
7+
params: Promise<{ classroomId: string }>;
8+
}) {
9+
const { classroomId } = await params;
10+
11+
const supabase = await createClient();
12+
const { data, error } = await supabase
13+
.from("Classrooms")
14+
.select("name")
15+
.eq("id", Number(classroomId))
16+
.single();
17+
18+
if (error || !data || !data.name) {
19+
console.error("Error fetching classroom or its name:", error);
20+
return <h1> Insert 404 page here</h1>;
21+
}
22+
23+
return (
24+
<>
25+
<h1>Classroom: {data.name}</h1>
26+
<AugmentComponent classroomId={classroomId} />
27+
</>
28+
);
29+
}
Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,53 @@
1+
import {
2+
createDatasetClient,
3+
downloadDocument,
4+
} from "@/shared/lib/ragflow/dataset-client";
5+
16
export default async function PreviewPage({
27
searchParams,
38
}: {
49
searchParams: Promise<{ documentId: string; datasetId: string }>;
510
}) {
611
const { documentId, datasetId } = await searchParams;
712

8-
return (
9-
<div className="h-screen w-screen">
10-
<embed
11-
src={`/api/document/${datasetId}/${documentId}`}
12-
width="100%"
13-
height="100%"
14-
/>
15-
</div>
13+
// Create a temporary client to access the dataset
14+
const datasetClientResult = await createDatasetClient(
15+
{
16+
classroomId: "0", // We don't need a real classroom ID for preview
17+
classroomName: "preview",
18+
},
19+
datasetId
1620
);
21+
22+
if (!datasetClientResult) {
23+
console.error("createDatasetClient() failed");
24+
return <div>Error loading document</div>;
25+
}
26+
27+
const { content, mimeType, fileName } = await downloadDocument(
28+
datasetClientResult.client,
29+
documentId
30+
);
31+
console.log(`Rendering file: ${fileName}, with MIME type: ${mimeType}`);
32+
33+
if (mimeType === "application/octet-stream") {
34+
// For text content, decode the ArrayBuffer using TextDecoder
35+
const text = new TextDecoder().decode(new Uint8Array(content));
36+
return (
37+
<div className="mx-auto h-screen w-4/5">
38+
<pre className="overflow-auto whitespace-pre-wrap p-4">{text}</pre>
39+
</div>
40+
);
41+
} else {
42+
const base64Content = Buffer.from(content).toString("base64");
43+
return (
44+
<div className="mx-auto h-screen w-4/5">
45+
<embed
46+
src={`data:${mimeType};base64,${base64Content}`}
47+
width="100%"
48+
height="100%"
49+
/>
50+
</div>
51+
);
52+
}
1753
}

app/classrooms/[classroomId]/upload/uploadComponent.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export default function UploadComponent({
4646
const inputFile = useRef<HTMLInputElement>(null);
4747

4848
useEffect(() => {
49-
async function fetchFiles() {
49+
const fetchFiles = async () => {
5050
let clientToUse = datasetClient;
5151
if (!clientToUse) {
5252
const result = await createDatasetClient({
@@ -66,20 +66,21 @@ export default function UploadComponent({
6666
return;
6767
}
6868
setUploadedFiles(retrieveResult.files);
69-
}
69+
};
7070

7171
fetchFiles();
7272
const interval = setInterval(fetchFiles, 5000);
7373
return () => clearInterval(interval);
7474
}, [classroomId, classroomName, datasetClient]);
7575

76-
const handleFileChange = (e: ChangeEvent<HTMLInputElement>) => {
77-
if (e.target.files && e.target.files.length > 0) {
78-
setFile(e.target.files[0]);
79-
}
76+
const handleFileChange = (event: ChangeEvent<HTMLInputElement>) => {
77+
const selectedFile = event.target.files?.[0];
78+
if (!selectedFile) return;
79+
80+
setFile(selectedFile);
8081
};
8182

82-
async function handleSubmit(e: FormEvent<HTMLFormElement>) {
83+
const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {
8384
e.preventDefault();
8485
if (!file) return;
8586

@@ -128,7 +129,7 @@ export default function UploadComponent({
128129
} else if (toastError) {
129130
(toastError as unknown as (value: unknown) => void)(null);
130131
}
131-
}
132+
};
132133

133134
return (
134135
<div className="flex min-h-screen flex-col items-center justify-center p-6">

app/classrooms/page.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
UserContext,
1212
UserContextType,
1313
} from "@shared/lib/userContext/userContext";
14-
import { Skeleton } from "@shared/components/ui/skeleton";
14+
import { Button } from "@shared/components/ui/button";
1515
import {
1616
Card,
1717
CardContent,
@@ -332,7 +332,7 @@ function ClassroomList({ userContext }: { userContext: UserContextType }) {
332332
variant={"ghost"}
333333
size={"iconLg"}
334334
asChild
335-
// className="me-2 rounded-lg border px-5 py-2.5 text-center text-sm font-medium hover:bg-green-800 hover:text-white focus:outline-none focus:ring-4 focus:ring-green-300 dark:border-green-500 dark:text-green-500 dark:hover:bg-green-600 dark:hover:text-white dark:focus:ring-green-900"
335+
// className="me-2 rounded-lg border px-5 py-2.5 text-center text-sm font-medium hover:bg-green-800 hover:text-white focus:outline-none focus:ring-4 focus:ring-green-300 dark:border-green-500 dark:text-green-500 dark:hover:bg-green-600 dark:hover:text-white dark:focus:ring-green-900"
336336
>
337337
<Link href={`/classrooms/${classroom.id}/manage`} passHref>
338338
<Edit className="scale-[200%]" />
@@ -367,6 +367,17 @@ function ClassroomList({ userContext }: { userContext: UserContextType }) {
367367
userId={userId}
368368
/>
369369
)}
370+
371+
<TooltipUtil
372+
trigger={
373+
<Button type="button" variant={"ghost"} size={"iconLg"} asChild>
374+
<Link href={`/classrooms/${classroom.id}/augment`} passHref>
375+
<FileText className="scale-[200%]" />
376+
</Link>
377+
</Button>
378+
}
379+
content={"Augment Notes"}
380+
/>
370381
</div>
371382
{!isAdmin && (
372383
<TooltipUtil

0 commit comments

Comments
 (0)