diff --git a/apps/portal/prisma/migrations/20221027052436_resumes_add_is_resolved_status/migration.sql b/apps/portal/prisma/migrations/20221027052436_resumes_add_is_resolved_status/migration.sql new file mode 100644 index 00000000..5716b7a2 --- /dev/null +++ b/apps/portal/prisma/migrations/20221027052436_resumes_add_is_resolved_status/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "ResumesResume" ADD COLUMN "isResolved" BOOLEAN NOT NULL DEFAULT false; diff --git a/apps/portal/prisma/schema.prisma b/apps/portal/prisma/schema.prisma index bf57a55d..ec549a84 100644 --- a/apps/portal/prisma/schema.prisma +++ b/apps/portal/prisma/schema.prisma @@ -120,6 +120,7 @@ model ResumesResume { location String @db.Text url String additionalInfo String? @db.Text + isResolved Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) diff --git a/apps/portal/src/pages/resumes/[resumeId].tsx b/apps/portal/src/pages/resumes/[resumeId].tsx index 15d50e83..bd1d4066 100644 --- a/apps/portal/src/pages/resumes/[resumeId].tsx +++ b/apps/portal/src/pages/resumes/[resumeId].tsx @@ -9,6 +9,7 @@ import { AcademicCapIcon, BriefcaseIcon, CalendarIcon, + CheckCircleIcon, InformationCircleIcon, MapPinIcon, PencilSquareIcon, @@ -57,24 +58,33 @@ export default function ResumeReviewPage() { ); const starMutation = trpc.useMutation('resumes.resume.star', { onSuccess() { - utils.invalidateQueries(['resumes.resume.findOne']); - utils.invalidateQueries(['resumes.resume.findAll']); - utils.invalidateQueries(['resumes.resume.user.findUserStarred']); - utils.invalidateQueries(['resumes.resume.user.findUserCreated']); + invalidateResumeQueries(); }, }); const unstarMutation = trpc.useMutation('resumes.resume.unstar', { onSuccess() { - utils.invalidateQueries(['resumes.resume.findOne']); - utils.invalidateQueries(['resumes.resume.findAll']); - utils.invalidateQueries(['resumes.resume.user.findUserStarred']); - utils.invalidateQueries(['resumes.resume.user.findUserCreated']); + invalidateResumeQueries(); }, }); + const resolveMutation = trpc.useMutation('resumes.resume.user.resolve', { + onSuccess() { + invalidateResumeQueries(); + }, + }); + + const invalidateResumeQueries = () => { + utils.invalidateQueries(['resumes.resume.findOne']); + utils.invalidateQueries(['resumes.resume.findAll']); + utils.invalidateQueries(['resumes.resume.user.findUserStarred']); + utils.invalidateQueries(['resumes.resume.user.findUserCreated']); + }; + const userIsOwner = session?.user?.id !== undefined && session.user.id === detailsQuery.data?.userId; + const isResumeResolved = detailsQuery.data?.isResolved; + const [isEditMode, setIsEditMode] = useState(false); const [showCommentsForm, setShowCommentsForm] = useState(false); @@ -139,6 +149,13 @@ export default function ResumeReviewPage() { setIsEditMode(true); }; + const onResolveButtonClick = () => { + resolveMutation.mutate({ + id: resumeId as string, + val: !isResumeResolved, + }); + }; + const renderReviewButton = () => { if (session === null) { return ( @@ -175,10 +192,7 @@ export default function ResumeReviewPage() { url: detailsQuery.data.url, }} onClose={() => { - utils.invalidateQueries(['resumes.resume.findOne']); - utils.invalidateQueries(['resumes.resume.findAll']); - utils.invalidateQueries(['resumes.resume.user.findUserStarred']); - utils.invalidateQueries(['resumes.resume.user.findUserCreated']); + invalidateResumeQueries(); setIsEditMode(false); }} /> @@ -206,17 +220,36 @@ export default function ResumeReviewPage() {
{userIsOwner && ( - + )}