diff --git a/apps/portal/src/components/resumes/badgeIcons/reviewer/BronzeReviewerBadgeIcon.tsx b/apps/portal/src/components/resumes/badgeIcons/reviewer/BronzeReviewerBadgeIcon.tsx index 16871299..bd5ae146 100644 --- a/apps/portal/src/components/resumes/badgeIcons/reviewer/BronzeReviewerBadgeIcon.tsx +++ b/apps/portal/src/components/resumes/badgeIcons/reviewer/BronzeReviewerBadgeIcon.tsx @@ -1,7 +1,12 @@ -export default function BronzeReviewerBadgeIcon() { +type Props = Readonly<{ + className: string; +}>; + +export default function BronzeReviewerBadgeIcon({ className }: Props) { return (
+
+ +

{toolTip}

+

{description}

+
+ +
+ ); +} diff --git a/apps/portal/src/components/resumes/badges/ResumeUserBadges.tsx b/apps/portal/src/components/resumes/badges/ResumeUserBadges.tsx new file mode 100644 index 00000000..8c772d8f --- /dev/null +++ b/apps/portal/src/components/resumes/badges/ResumeUserBadges.tsx @@ -0,0 +1,36 @@ +import { trpc } from '~/utils/trpc'; + +import type { BadgePayload } from './resumeBadgeConstants'; +import { RESUME_USER_BADGES } from './resumeBadgeConstants'; +import ResumeUserBadge from './ResumeUserBadge'; + +type Props = Readonly<{ + userId: string; +}>; + +export default function ResumeUserBadges({ userId }: Props) { + const userReviewedResumesCountQuery = trpc.useQuery([ + 'resumes.resume.findUserReviewedResumeCount', + { userId }, + ]); + + // TODO: Add other badges in + const payload: BadgePayload = { + reviewedResumesCount: userReviewedResumesCountQuery.data ?? 0, + }; + + return ( + <> + {RESUME_USER_BADGES.filter((badge) => badge.isValid(payload)).map( + (badge) => ( + + ), + )} + + ); +} diff --git a/apps/portal/src/components/resumes/badges/resumeBadgeConstants.ts b/apps/portal/src/components/resumes/badges/resumeBadgeConstants.ts new file mode 100644 index 00000000..92086204 --- /dev/null +++ b/apps/portal/src/components/resumes/badges/resumeBadgeConstants.ts @@ -0,0 +1,57 @@ +import BronzeReviewerBadgeIcon from '../badgeIcons/reviewer/BronzeReviewerBadgeIcon'; +import GoldReviewerBadgeIcon from '../badgeIcons/reviewer/GoldReviewerBadgeIcon'; +import SilverReviewerBadgeIcon from '../badgeIcons/reviewer/SilverReviewerBadgeIcon'; + +export type BadgeIcon = ( + props: React.ComponentProps< + | typeof BronzeReviewerBadgeIcon + | typeof GoldReviewerBadgeIcon + | typeof SilverReviewerBadgeIcon + >, +) => JSX.Element; + +export type BadgeInfo = { + description: string; + icon: BadgeIcon; + id: string; + isValid: (payload: BadgePayload) => boolean; + toolTip: string; +}; + +// TODO: Add other badges in +export type BadgePayload = { + reviewedResumesCount: number; +}; + +const GOLD_TIER = 20; +const SILVER_TIER = 10; +const BRONZE_TIER = 5; + +export const RESUME_USER_BADGES: Array = [ + { + description: `User has reviewed over ${GOLD_TIER} resumes`, + icon: GoldReviewerBadgeIcon, + id: 'Superhero', + isValid: (payload: BadgePayload) => + payload.reviewedResumesCount >= GOLD_TIER, + toolTip: 'True saviour of the people', + }, + { + description: `User has reviewed over ${SILVER_TIER} resumes`, + icon: SilverReviewerBadgeIcon, + id: 'Detective', + isValid: (payload: BadgePayload) => + payload.reviewedResumesCount >= SILVER_TIER && + payload.reviewedResumesCount < GOLD_TIER, + toolTip: 'Keen eye for details like a private eye', + }, + { + description: `User has reviewed over ${BRONZE_TIER} resumes`, + icon: BronzeReviewerBadgeIcon, + id: 'Eagle', + isValid: (payload: BadgePayload) => + payload.reviewedResumesCount >= BRONZE_TIER && + payload.reviewedResumesCount < SILVER_TIER, + toolTip: 'As sharp as an eagle', + }, +]; diff --git a/apps/portal/src/components/resumes/comments/ResumeCommentListItem.tsx b/apps/portal/src/components/resumes/comments/ResumeCommentListItem.tsx index d5890ac6..833c53c2 100644 --- a/apps/portal/src/components/resumes/comments/ResumeCommentListItem.tsx +++ b/apps/portal/src/components/resumes/comments/ResumeCommentListItem.tsx @@ -13,7 +13,7 @@ import { Button, TextArea } from '@tih/ui'; import { trpc } from '~/utils/trpc'; -import ResumeUserBadges from './ResumeUserBadges'; +import ResumeUserBadges from '../badges/ResumeUserBadges'; import ResumeExpandableText from '../shared/ResumeExpandableText'; import type { ResumeComment } from '~/types/resume-comments'; diff --git a/apps/portal/src/components/resumes/comments/ResumeUserBadges.tsx b/apps/portal/src/components/resumes/comments/ResumeUserBadges.tsx deleted file mode 100644 index 9a7de7f8..00000000 --- a/apps/portal/src/components/resumes/comments/ResumeUserBadges.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Badge } from '@tih/ui'; - -import { trpc } from '~/utils/trpc'; - -type Props = { - userId: string; -}; - -type BadgeInfo = { - description: string; - id: string; - isValid: (userId: string) => boolean; - label: string; -}; - -const badges: Array = [ - { - description: 'User has reviewed over 50 resumes', - id: 'VeteranReviewer', - isValid: (userId: string) => { - const userReviewedResumesCountQuery = trpc.useQuery([ - 'resumes.resume.findUserReviewedResumeCount', - { userId }, - ]); - - return ( - userReviewedResumesCountQuery.data != null && - userReviewedResumesCountQuery.data >= 5 - ); - }, - label: 'Veteran', - }, - { - description: 'User has reviewed over 50 resumes', - id: 'NoviceReviewer', - isValid: (userId: string) => { - const userReviewedResumesCountQuery = trpc.useQuery([ - 'resumes.resume.findUserReviewedResumeCount', - { userId }, - ]); - - return ( - userReviewedResumesCountQuery.data != null && - userReviewedResumesCountQuery.data >= 2 - ); - }, - label: 'Veteran', - }, -]; - -export default function ResumeUserBadges({ userId }: Props) { - return ( - <> - {badges - .filter((badge) => badge.isValid(userId)) - .map((badge) => ( - - ))} - - ); -}