[resumes][feat] add resolve functionality

pull/442/head
Keane Chan 3 years ago
parent 11e02e736c
commit b3df50b7a4
No known key found for this signature in database
GPG Key ID: 32718398E1E9F87C

@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "ResumesResume" ADD COLUMN "isResolved" BOOLEAN NOT NULL DEFAULT false;

@ -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)

@ -9,6 +9,7 @@ import {
AcademicCapIcon,
BriefcaseIcon,
CalendarIcon,
CheckCircleIcon,
InformationCircleIcon,
MapPinIcon,
PencilSquareIcon,
@ -71,10 +72,21 @@ export default function ResumeReviewPage() {
utils.invalidateQueries(['resumes.resume.user.findUserCreated']);
},
});
const resolveMutation = trpc.useMutation('resumes.resume.user.resolve', {
onSuccess() {
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 +151,13 @@ export default function ResumeReviewPage() {
setIsEditMode(true);
};
const onResolveButtonClick = () => {
resolveMutation.mutate({
id: resumeId as string,
val: !isResumeResolved,
});
};
const renderReviewButton = () => {
if (session === null) {
return (
@ -206,17 +225,36 @@ export default function ResumeReviewPage() {
</h1>
<div className="flex gap-3 xl:pr-4">
{userIsOwner && (
<Button
addonPosition="start"
className="h-10 shadow-md"
icon={PencilSquareIcon}
label="Edit"
variant="tertiary"
onClick={onEditButtonClick}
/>
<>
<Button
addonPosition="start"
className="h-10 shadow-md"
icon={PencilSquareIcon}
label="Edit"
variant="tertiary"
onClick={onEditButtonClick}
/>
<button
className="isolate inline-flex h-10 items-center space-x-4 rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 shadow-md hover:bg-slate-50 focus:ring-slate-600 disabled:hover:bg-white"
disabled={resolveMutation.isLoading}
type="button"
onClick={onResolveButtonClick}>
<div className="-ml-1 mr-2 h-5 w-5">
{resolveMutation.isLoading ? (
<Spinner className="mt-0.5" size="xs" />
) : (
<CheckCircleIcon
aria-hidden="true"
className={isResumeResolved ? '' : 'text-slate-400'}
/>
)}
</div>
{isResumeResolved ? 'Resolved' : 'Resolve'}
</button>
</>
)}
<button
className="isolate inline-flex h-10 items-center space-x-4 rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 shadow-md hover:bg-slate-50 disabled:hover:bg-white"
className="isolate inline-flex h-10 items-center space-x-4 rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 shadow-md hover:bg-slate-50 focus:ring-slate-600 disabled:hover:bg-white"
disabled={starMutation.isLoading || unstarMutation.isLoading}
type="button"
onClick={onStarButtonClick}>

@ -44,6 +44,23 @@ export const resumesResumeUserRouter = createProtectedRouter()
});
},
})
.mutation('resolve', {
input: z.object({
id: z.string(),
val: z.boolean(),
}),
async resolve({ ctx, input }) {
const resume = await ctx.prisma.resumesResume.update({
data: {
isResolved: input.val,
},
where: {
id: input.id,
},
});
return resume.isResolved;
},
})
.query('findUserStarred', {
input: z.object({
experienceFilters: z.string().array(),

@ -133,7 +133,7 @@ export const SHORTCUTS: Array<Shortcut> = [
},
{
filters: INITIAL_FILTER_STATE,
name: 'GOATs',
name: 'Top 10',
sortOrder: 'popular',
},
{

Loading…
Cancel
Save