diff --git a/apps/portal/package.json b/apps/portal/package.json
index d57cdf43..9948c01e 100644
--- a/apps/portal/package.json
+++ b/apps/portal/package.json
@@ -22,6 +22,7 @@
"@trpc/react": "^9.27.2",
"@trpc/server": "^9.27.2",
"clsx": "^1.2.1",
+ "date-fns": "^2.29.3",
"next": "12.3.1",
"next-auth": "~4.10.3",
"react": "18.2.0",
diff --git a/apps/portal/src/components/resumes/ResumePdf.tsx b/apps/portal/src/components/resumes/ResumePdf.tsx
index 12debea4..82e26395 100644
--- a/apps/portal/src/components/resumes/ResumePdf.tsx
+++ b/apps/portal/src/components/resumes/ResumePdf.tsx
@@ -6,7 +6,11 @@ import { Button, Spinner } from '@tih/ui';
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.js`;
-export default function ResumePdf() {
+type Props = Readonly<{
+ url: string;
+}>;
+
+export default function ResumePdf({ url }: Props) {
const [numPages, setNumPages] = useState(0);
const [pageNumber] = useState(1);
@@ -18,7 +22,7 @@ export default function ResumePdf() {
}
onLoadSuccess={onPdfLoadSuccess}>
diff --git a/apps/portal/src/pages/resumes/[resumeId].tsx b/apps/portal/src/pages/resumes/[resumeId].tsx
new file mode 100644
index 00000000..41a40df4
--- /dev/null
+++ b/apps/portal/src/pages/resumes/[resumeId].tsx
@@ -0,0 +1,111 @@
+import formatDistanceToNow from 'date-fns/formatDistanceToNow';
+import Error from 'next/error';
+import { useRouter } from 'next/router';
+import {
+ AcademicCapIcon,
+ BriefcaseIcon,
+ CalendarIcon,
+ InformationCircleIcon,
+ MapPinIcon,
+ StarIcon,
+} from '@heroicons/react/20/solid';
+import { Spinner } from '@tih/ui';
+
+import CommentsSection from '~/components/resumes/comments/CommentsSection';
+import ResumePdf from '~/components/resumes/ResumePdf';
+
+import { trpc } from '~/utils/trpc';
+
+export default function ResumeReviewPage() {
+ const ErrorPage = (
+
+ );
+ const router = useRouter();
+ const { resumeId } = router.query;
+ // Safe to assert resumeId type as string because query is only sent if so
+ const detailsQuery = trpc.useQuery(
+ ['resumes.details.find', { resumeId: resumeId as string }],
+ { enabled: typeof resumeId === 'string' },
+ );
+
+ return (
+ <>
+ {detailsQuery.isError && ErrorPage}
+ {detailsQuery.isLoading &&
}
+ {detailsQuery.isFetched && detailsQuery.data && (
+
+
+
+ {detailsQuery.data.title}
+
+
+
+
+
+
+ {detailsQuery.data.role}
+
+
+
+ {detailsQuery.data.location}
+
+
+
+ {detailsQuery.data.experience}
+
+
+
+ {`Uploaded ${formatDistanceToNow(
+ new Date(detailsQuery.data.createdAt),
+ { addSuffix: true },
+ )} by ${detailsQuery.data.resumesProfile.user.name}`}
+
+
+ {detailsQuery.data.additionalInfo && (
+
+
+ {detailsQuery.data.additionalInfo}
+
+ )}
+
+
+
+
+
+ {/* TODO: Update resumeId */}
+
+
+
+
+ )}
+ >
+ );
+}
diff --git a/apps/portal/src/pages/resumes/review.tsx b/apps/portal/src/pages/resumes/review.tsx
deleted file mode 100644
index f75ae519..00000000
--- a/apps/portal/src/pages/resumes/review.tsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import {
- AcademicCapIcon,
- BriefcaseIcon,
- CalendarIcon,
- InformationCircleIcon,
- MapPinIcon,
- StarIcon,
-} from '@heroicons/react/20/solid';
-
-import CommentsSection from '~/components/resumes/comments/CommentsSection';
-import ResumePdf from '~/components/resumes/ResumePdf';
-
-export default function ResumeReviewPage() {
- return (
-
-
-
- Please help moi, applying for medtech startups in Singapore
-
-
-
-
-
-
- Software Engineer (Backend)
-
-
-
- Singapore
-
-
-
-
- Uploaded 2 days ago by Git Ji Ra
-
-
-
-
- Looking to break into SWE roles after doing engineering for the past 2
- years
-
-
-
-
-
-
- {/* TODO: Update resumeId */}
-
-
-
-
- );
-}
diff --git a/apps/portal/src/server/router/resumes-details-router.ts b/apps/portal/src/server/router/resumes-details-router.ts
index 1464cfad..d7c7529f 100644
--- a/apps/portal/src/server/router/resumes-details-router.ts
+++ b/apps/portal/src/server/router/resumes-details-router.ts
@@ -18,6 +18,15 @@ export const resumesDetailsRouter = createRouter().query('find', {
stars: true,
},
},
+ resumesProfile: {
+ select: {
+ user: {
+ select: {
+ name: true,
+ },
+ },
+ },
+ },
},
where: {
id: resumeId,
diff --git a/yarn.lock b/yarn.lock
index 8a87bd65..bd4ae44d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6049,7 +6049,7 @@ damerau-levenshtein@^1.0.8:
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
-date-fns@^2.29.1:
+date-fns@^2.29.1, date-fns@^2.29.3:
version "2.29.3"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==