From ff9cffa71595d62a6ced9dfa1c5db50e9227172e Mon Sep 17 00:00:00 2001
From: Su Yin <53945359+tnsyn@users.noreply.github.com>
Date: Fri, 14 Oct 2022 15:42:54 +0800
Subject: [PATCH] [resumes][fix] Fix browse page bugs (#377)
* [resumes][fix] Update job level labels
* [resumes][fix] Fix browse page misc UI
* [resumes][feat] Add coloured star if resume is starred
* [resumes][fix] Remove unnecessary import
---
.../resumes/browse/ResumeListItem.tsx | 43 ++++++++++++++++---
.../resumes/browse/resumeConstants.ts | 12 +++---
apps/portal/src/pages/resumes/browse.tsx | 18 +++++---
.../resumes/resumes-resume-user-router.ts | 14 ++++++
4 files changed, 68 insertions(+), 19 deletions(-)
diff --git a/apps/portal/src/components/resumes/browse/ResumeListItem.tsx b/apps/portal/src/components/resumes/browse/ResumeListItem.tsx
index c7f7677a..0d0a2756 100644
--- a/apps/portal/src/components/resumes/browse/ResumeListItem.tsx
+++ b/apps/portal/src/components/resumes/browse/ResumeListItem.tsx
@@ -1,9 +1,17 @@
import formatDistanceToNow from 'date-fns/formatDistanceToNow';
import Link from 'next/link';
+import { useSession } from 'next-auth/react';
import type { UrlObject } from 'url';
import { ChevronRightIcon } from '@heroicons/react/20/solid';
+import {
+ AcademicCapIcon,
+ BriefcaseIcon,
+ StarIcon as ColouredStarIcon,
+} from '@heroicons/react/20/solid';
import { ChatBubbleLeftIcon, StarIcon } from '@heroicons/react/24/outline';
+import { trpc } from '~/utils/trpc';
+
import type { Resume } from '~/types/resume';
type Props = Readonly<{
@@ -12,24 +20,47 @@ type Props = Readonly<{
}>;
export default function BrowseListItem({ href, resumeInfo }: Props) {
+ const { data: sessionData } = useSession();
+
+ // Find out if user has starred this particular resume
+ const resumeId = resumeInfo.id;
+ const isStarredQuery = trpc.useQuery([
+ 'resumes.resume.user.isResumeStarred',
+ { resumeId },
+ ]);
+
return (
-
+
{resumeInfo.title}
- {resumeInfo.role}
-
+
+
+ {resumeInfo.role}
+
+
+
{resumeInfo.experience}
-
-
+
+
{resumeInfo.numComments} comments
-
+ {isStarredQuery.data && sessionData?.user ? (
+
+ ) : (
+
+ )}
{resumeInfo.numStars} stars
diff --git a/apps/portal/src/components/resumes/browse/resumeConstants.ts b/apps/portal/src/components/resumes/browse/resumeConstants.ts
index 42d79249..9f0a2058 100644
--- a/apps/portal/src/components/resumes/browse/resumeConstants.ts
+++ b/apps/portal/src/components/resumes/browse/resumeConstants.ts
@@ -46,16 +46,16 @@ export const EXPERIENCE: Array
= [
{ label: 'Junior', value: 'Junior' },
{ label: 'Senior', value: 'Senior' },
{
- label: 'Fresh Grad (0-1 years)',
- value: 'Fresh Grad (0-1 years)',
+ label: 'Entry Level (0 - 2 years)',
+ value: 'Entry Level (0 - 2 years)',
},
{
- label: 'Mid-level (2 - 5 years)',
- value: 'Mid-level (2 - 5 years)',
+ label: 'Mid Level (3 - 5 years)',
+ value: 'Mid Level (3 - 5 years)',
},
{
- label: 'Senior (5+ years)',
- value: 'Senior (5+ years)',
+ label: 'Senior Level (5+ years)',
+ value: 'Senior Level (5+ years)',
},
];
diff --git a/apps/portal/src/pages/resumes/browse.tsx b/apps/portal/src/pages/resumes/browse.tsx
index d6631f4d..0331c720 100644
--- a/apps/portal/src/pages/resumes/browse.tsx
+++ b/apps/portal/src/pages/resumes/browse.tsx
@@ -144,7 +144,7 @@ export default function ResumeHomePage() {
},
);
- const onClickNew = () => {
+ const onSubmitResume = () => {
if (sessionData?.user?.id) {
router.push('/resumes/submit');
} else {
@@ -185,7 +185,9 @@ export default function ResumeHomePage() {
-
Filters
+
+ Shortcuts:
+
@@ -240,8 +242,8 @@ export default function ResumeHomePage() {
@@ -252,7 +254,7 @@ export default function ResumeHomePage() {
-
+
{renderSignInButton && (
)}
diff --git a/apps/portal/src/server/router/resumes/resumes-resume-user-router.ts b/apps/portal/src/server/router/resumes/resumes-resume-user-router.ts
index 3b0b5a0b..b443c3e2 100644
--- a/apps/portal/src/server/router/resumes/resumes-resume-user-router.ts
+++ b/apps/portal/src/server/router/resumes/resumes-resume-user-router.ts
@@ -112,4 +112,18 @@ export const resumesResumeUserRouter = createProtectedRouter()
return resume;
});
},
+ })
+ .query('isResumeStarred', {
+ input: z.object({
+ resumeId: z.string(),
+ }),
+ async resolve({ ctx, input }) {
+ const userId = ctx.session?.user?.id;
+ const { resumeId } = input;
+ return await ctx.prisma.resumesStar.findUnique({
+ where: {
+ userId_resumeId: { resumeId, userId },
+ },
+ });
+ },
});