From 507041c16515ee937e80e07a9c912fdfbd2d3834 Mon Sep 17 00:00:00 2001 From: sakutaarc Date: Wed, 15 Oct 2025 18:16:32 -0400 Subject: [PATCH 1/3] resume reupload --- src/app/(protected)/profile/page.tsx | 67 ++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/app/(protected)/profile/page.tsx b/src/app/(protected)/profile/page.tsx index 034e096d..e397b1c8 100644 --- a/src/app/(protected)/profile/page.tsx +++ b/src/app/(protected)/profile/page.tsx @@ -39,6 +39,7 @@ import { GraduationCap, HelpCircle, } from "lucide-react"; +import { useUploadResume } from "@/lib/api/resume/hook"; export default function Profile() { const { isAuthenticated, user, logout, isLoading } = useFirebase(); @@ -54,7 +55,12 @@ export default function Profile() { isPending: isCreatingAppleWallet, } = useCreateAppleWalletPass(); + // Mutation for resume upload + const { mutateAsync: uploadResume, isPending: isUploadingResume } = + useUploadResume(); + const [showQRCode, setShowQRCode] = useState(false); + const [resumeFile, setResumeFile] = useState(null); // Feature flag check for HelpDesk const { data: helpDeskFlag } = useFlagState("HelpDesk"); @@ -194,6 +200,23 @@ export default function Profile() { ); }; + const handleResumeUpload = async () => { + if (!resumeFile) { + return toast.error("Please select a file to upload"); + } + + try { + const formData = new FormData(); + formData.append("resume", resumeFile); + + await uploadResume(formData); + toast.success("Resume uploaded successfully!"); + } catch (error) { + console.error("Error uploading resume:", error); + toast.error("Failed to upload resume. Please try again."); + } + }; + if (isLoading) { return (
@@ -404,6 +427,50 @@ export default function Profile() { + {/* Resume Upload Section */} + + + + + Upload Resume + + + Upload your resume for review and feedback + + + +
+
+ + setResumeFile(e.target.files?.[0] || null) + } + className="file-input file-input-bordered w-full" + /> +
+ +
+ +

+ Supported formats: PDF, DOC, DOCX. Max size: 5MB. +

+
+
+ {/* Actions */} From 6e7e796528f13dc2bbb85207f1ff05c385d7a47c Mon Sep 17 00:00:00 2001 From: joeboppell Date: Thu, 23 Oct 2025 01:14:15 -0400 Subject: [PATCH 2/3] pretty sure this works but I'm too tired to fully test --- src/app/(protected)/profile/page.tsx | 40 ++++++++++++++++++---------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/app/(protected)/profile/page.tsx b/src/app/(protected)/profile/page.tsx index e397b1c8..b12f1939 100644 --- a/src/app/(protected)/profile/page.tsx +++ b/src/app/(protected)/profile/page.tsx @@ -39,7 +39,7 @@ import { GraduationCap, HelpCircle, } from "lucide-react"; -import { useUploadResume } from "@/lib/api/resume/hook"; +import { useUpdateUser } from "@/lib/api/user/hook"; export default function Profile() { const { isAuthenticated, user, logout, isLoading } = useFirebase(); @@ -57,7 +57,7 @@ export default function Profile() { // Mutation for resume upload const { mutateAsync: uploadResume, isPending: isUploadingResume } = - useUploadResume(); + useUpdateUser(); const [showQRCode, setShowQRCode] = useState(false); const [resumeFile, setResumeFile] = useState(null); @@ -205,12 +205,17 @@ export default function Profile() { return toast.error("Please select a file to upload"); } - try { - const formData = new FormData(); - formData.append("resume", resumeFile); + if (!userData?.id) { + return toast.error("User ID not found"); + } - await uploadResume(formData); + try { + await uploadResume({ + id: userData.id, + data: { resume: resumeFile } as any, + }); toast.success("Resume uploaded successfully!"); + setResumeFile(null); // Clear the file input after successful upload } catch (error) { console.error("Error uploading resume:", error); toast.error("Failed to upload resume. Please try again."); @@ -431,11 +436,11 @@ export default function Profile() { - - Upload Resume + + Resume Upload - Upload your resume for review and feedback + Upload or replace your resume for review and feedback @@ -444,9 +449,7 @@ export default function Profile() { - setResumeFile(e.target.files?.[0] || null) - } + onChange={(e) => setResumeFile(e.target.files?.[0] || null)} className="file-input file-input-bordered w-full" />
@@ -455,16 +458,23 @@ export default function Profile() { className="w-full md:w-auto" variant="default" size="lg" + disabled={!resumeFile || isUploadingResume} > {isUploadingResume ? ( ) : ( )} - Upload Resume + {resumeFile ? "Upload Resume" : "Select Resume"} + {resumeFile && ( +

+ Selected: {resumeFile.name} +

+ )} +

Supported formats: PDF, DOC, DOCX. Max size: 5MB.

@@ -520,7 +530,9 @@ export default function Profile() { {helpDeskFlag?.isEnabled && ( - - - {resumeFile && ( -

- Selected: {resumeFile.name} -

- )} - -

- Supported formats: PDF, DOC, DOCX. Max size: 5MB. -

- - {/* Actions */} @@ -617,6 +590,17 @@ export default function Profile() { Manage Extra Credit + + {helpDeskFlag?.isEnabled && ( + + {/* Resume Upload Modal */} + + + + Upload Resume + + Upload your resume in PDF format (max 5MB) + + +
+
+ + { + const file = e.target.files?.[0] || null; + if (file && file.type !== "application/pdf") { + toast.error("Only PDF files are accepted"); + e.target.value = ""; + setResumeFile(null); + return; + } + setResumeFile(file); + }} + className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50" + /> +
+ + {resumeFile && ( +
+

+ Selected: {resumeFile.name} +

+

+ Size: {(resumeFile.size / 1024).toFixed(1)} KB +

+
+ )} + +
+ + +
+
+
+
);