Skip to content

Commit da0ce27

Browse files
xyspgchenxin-yan
andauthored
feat(web): add dnd upload report (#51)
Co-authored-by: Chenxin Yan <yanchenxin2004@gmail.com>
1 parent e52027a commit da0ce27

File tree

13 files changed

+1097
-243
lines changed

13 files changed

+1097
-243
lines changed

apps/web/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,12 @@
3030
"convex": "^1.28.0",
3131
"lucide-react": "^0.548.0",
3232
"next": "^15.5.6",
33+
"next-themes": "^0.4.6",
3334
"pdfjs-dist": "^5.4.296",
35+
"radix-ui": "^1.4.3",
3436
"react": "^19.2.0",
3537
"react-dom": "^19.2.0",
38+
"sonner": "^2.0.7",
3639
"tailwind-merge": "^3.3.1",
3740
"zod": "^4.1.12"
3841
},
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import FileUploadButton from "@/modules/report-parsing/components/file-upload-button";
1+
import DegreeProgreeUpload from "@/modules/report-parsing/components/degree-progress-upload";
22

33
const HomePage = () => {
4-
return <FileUploadButton />;
4+
return <DegreeProgreeUpload />;
55
};
66

77
export default HomePage;

apps/web/src/app/layout.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { Metadata } from "next";
33
import { Geist, Geist_Mono } from "next/font/google";
44
import "./globals.css";
55
import ConvexClientProvider from "@/components/ConvexClientProvider";
6+
import { Toaster } from "@/components/ui/sonner";
67

78
const geistSans = Geist({
89
variable: "--font-geist-sans",
@@ -32,6 +33,7 @@ export default function RootLayout({
3233
<ClerkProvider>
3334
<ConvexClientProvider>{children}</ConvexClientProvider>
3435
</ClerkProvider>
36+
<Toaster position="top-center" richColors />
3537
</body>
3638
</html>
3739
);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"use client"
2+
3+
import {
4+
CircleCheckIcon,
5+
InfoIcon,
6+
Loader2Icon,
7+
OctagonXIcon,
8+
TriangleAlertIcon,
9+
} from "lucide-react"
10+
import { useTheme } from "next-themes"
11+
import { Toaster as Sonner, type ToasterProps } from "sonner"
12+
13+
const Toaster = ({ ...props }: ToasterProps) => {
14+
const { theme = "system" } = useTheme()
15+
16+
return (
17+
<Sonner
18+
theme={theme as ToasterProps["theme"]}
19+
className="toaster group"
20+
icons={{
21+
success: <CircleCheckIcon className="size-4" />,
22+
info: <InfoIcon className="size-4" />,
23+
warning: <TriangleAlertIcon className="size-4" />,
24+
error: <OctagonXIcon className="size-4" />,
25+
loading: <Loader2Icon className="size-4 animate-spin" />,
26+
}}
27+
style={
28+
{
29+
"--normal-bg": "var(--popover)",
30+
"--normal-text": "var(--popover-foreground)",
31+
"--normal-border": "var(--border)",
32+
"--border-radius": "var(--radius)",
33+
} as React.CSSProperties
34+
}
35+
{...props}
36+
/>
37+
)
38+
}
39+
40+
export { Toaster }

0 commit comments

Comments
 (0)