diff --git a/apps/portal/src/components/resumes/ResumeReviewsTitle.tsx b/apps/portal/src/components/resumes/ResumeReviewsTitle.tsx index 13565a24..5e9cfda7 100644 --- a/apps/portal/src/components/resumes/ResumeReviewsTitle.tsx +++ b/apps/portal/src/components/resumes/ResumeReviewsTitle.tsx @@ -1,3 +1,13 @@ +import { Badge } from '@tih/ui'; + export default function ResumeReviewsTitle() { - return

Resume Reviews

; + return ( +
+

Resume Reviews

+ +
+ ); } diff --git a/apps/portal/src/components/resumes/browse/BrowseListItem.tsx b/apps/portal/src/components/resumes/browse/BrowseListItem.tsx new file mode 100644 index 00000000..a9d9c438 --- /dev/null +++ b/apps/portal/src/components/resumes/browse/BrowseListItem.tsx @@ -0,0 +1,51 @@ +import Link from 'next/link'; +import type { UrlObject } from 'url'; +import { ChevronRightIcon } from '@heroicons/react/20/solid'; +import { ChatBubbleLeftIcon, StarIcon } from '@heroicons/react/24/outline'; + +type ResumeInfo = Readonly<{ + createdAt: Date; + experience: string; + numComments: number; + numStars: number; + role: string; + title: string; + user: string; +}>; + +type Props = Readonly<{ + href: UrlObject | string; + resumeInfo: ResumeInfo; +}>; + +export default function BrowseListItem({ href, resumeInfo }: Props) { + return ( + +
+
+ {resumeInfo.title} +
+ {resumeInfo.role} +
+ {resumeInfo.experience} +
+
+
+
+ + {resumeInfo.numComments} comments +
+
+ + {resumeInfo.numStars} stars +
+
+
+
+ Uploaded 2 days ago by {resumeInfo.user} +
+ +
+ + ); +} diff --git a/apps/portal/src/components/resumes/browse/BrowsePageBody.tsx b/apps/portal/src/components/resumes/browse/BrowsePageBody.tsx new file mode 100644 index 00000000..3fa7054f --- /dev/null +++ b/apps/portal/src/components/resumes/browse/BrowsePageBody.tsx @@ -0,0 +1,326 @@ +import { Fragment, useState } from 'react'; +import { Dialog, Disclosure, Menu, Transition } from '@headlessui/react'; +import { + ChevronDownIcon, + FunnelIcon, + MinusIcon, + PlusIcon, +} from '@heroicons/react/20/solid'; +import { XMarkIcon } from '@heroicons/react/24/outline'; +import { Tabs } from '@tih/ui'; + +import BrowseListItem from './BrowseListItem'; +import { + EXPERIENCE, + LOCATION, + ROLES, + SORT_OPTIONS, + TEST_RESUMES, + TOP_HITS, +} from './constants'; +import FilterPill from './FilterPill'; + +const filters = [ + { + id: 'roles', + name: 'Roles', + options: ROLES, + }, + { + id: 'experience', + name: 'Experience', + options: EXPERIENCE, + }, + { + id: 'location', + name: 'Location', + options: LOCATION, + }, +]; + +function classNames(...classes: Array) { + return classes.filter(Boolean).join(' '); +} + +export default function BrowsePageBody() { + const [mobileFiltersOpen, setMobileFiltersOpen] = useState(false); + const [tabsValue, setTabsValue] = useState('all'); + return ( +
+
+ {/* Mobile filter dialog */} + + + +
+ + +
+ + +
+

+ Filters +

+ +
+ + {/* Filters */} +
+

Categories

+ + + {filters.map((section) => ( + + {({ open }) => ( + <> +

+ + + {section.name} + + + {open ? ( + + +

+ +
+ {section.options.map((option, optionIdx) => ( +
+ + +
+ ))} +
+
+ + )} +
+ ))} +
+
+
+
+
+
+ +
+
+
+ {/* Filters */} +
+

Categories

+

Filters

+
    + {TOP_HITS.map((category) => ( +
  • + {/* TODO: Replace onSelect with filtering function */} + true} /> +
  • + ))} +
+ + {filters.map((section) => ( + + {({ open }) => ( + <> +

+ + + {section.name} + + + {open ? ( + + +

+ +
+ {section.options.map((option, optionIdx) => ( +
+ + +
+ ))} +
+
+ + )} +
+ ))} +
+
+
+ +
    + {TEST_RESUMES.map((resumeObj) => ( +
  • + +
  • + ))} +
+
+ + +
+ + Sort + +
+ + + +
+ {SORT_OPTIONS.map((option) => ( + + {({ active }) => ( + + {option.name} + + )} + + ))} +
+
+
+
+
+ +
+
+
+
+
+ ); +} diff --git a/apps/portal/src/components/resumes/browse/FilterPill.tsx b/apps/portal/src/components/resumes/browse/FilterPill.tsx new file mode 100644 index 00000000..c34f4763 --- /dev/null +++ b/apps/portal/src/components/resumes/browse/FilterPill.tsx @@ -0,0 +1,15 @@ +type Props = Readonly<{ + onClick?: (event: React.MouseEvent) => void; + title: string; +}>; + +export default function FilterPill({ title, onClick }: Props) { + return ( + + ); +} diff --git a/apps/portal/src/components/resumes/browse/constants.ts b/apps/portal/src/components/resumes/browse/constants.ts new file mode 100644 index 00000000..6a52fc7f --- /dev/null +++ b/apps/portal/src/components/resumes/browse/constants.ts @@ -0,0 +1,69 @@ +export const SORT_OPTIONS = [ + { current: true, href: '#', name: 'Latest' }, + { current: false, href: '#', name: 'Popular' }, + { current: false, href: '#', name: 'Top Comments' }, +]; + +export const TOP_HITS = [ + { href: '#', name: 'Unreviewed' }, + { href: '#', name: 'Fresh Grad' }, + { href: '#', name: 'GOATs' }, + { href: '#', name: 'US Only' }, +]; + +export const ROLES = [ + { + checked: false, + label: 'Full-Stack Engineer', + value: 'Full-Stack Engineer', + }, + { checked: false, label: 'Frontend Engineer', value: 'frontend-engineer' }, + { checked: false, label: 'Backend Engineer', value: 'backend-engineer' }, + { checked: false, label: 'DevOps Engineer', value: 'devops-engineer' }, + { checked: false, label: 'iOS Engineer', value: 'ios-engineer' }, + { checked: false, label: 'Android Engineer', value: 'android-engineer' }, +]; + +export const EXPERIENCE = [ + { checked: false, label: 'Freshman', value: 'freshman' }, + { checked: false, label: 'Sophomore', value: 'sophomore' }, + { checked: false, label: 'Junior', value: 'junior' }, + { checked: false, label: 'Senior', value: 'senior' }, + { checked: false, label: 'Fresh Grad (0-1 years)', value: 'freshgrad' }, +]; + +export const LOCATION = [ + { checked: false, label: 'Singapore', value: 'singapore' }, + { checked: false, label: 'United States', value: 'usa' }, + { checked: false, label: 'India', value: 'india' }, +]; + +export const TEST_RESUMES = [ + { + createdAt: new Date(), + experience: 'Fresh Grad (0-1 years)', + numComments: 9, + numStars: 1, + role: 'Backend Engineer', + title: 'Rejected from multiple companies, please help...:(', + user: 'Git Ji Ra', + }, + { + createdAt: new Date(), + experience: 'Fresh Grad (0-1 years)', + numComments: 9, + numStars: 1, + role: 'Backend Engineer', + title: 'Rejected from multiple companies, please help...:(', + user: 'Git Ji Ra', + }, + { + createdAt: new Date(), + experience: 'Fresh Grad (0-1 years)', + numComments: 9, + numStars: 1, + role: 'Backend Engineer', + title: 'Rejected from multiple companies, please help...:(', + user: 'Git Ji Ra', + }, +]; diff --git a/apps/portal/src/pages/resumes/index.tsx b/apps/portal/src/pages/resumes/index.tsx index fbc48f49..f0f9bad1 100644 --- a/apps/portal/src/pages/resumes/index.tsx +++ b/apps/portal/src/pages/resumes/index.tsx @@ -1,11 +1,15 @@ +import BrowsePageBody from '~/components/resumes/browse/BrowsePageBody'; import ResumeReviewsTitle from '~/components/resumes/ResumeReviewsTitle'; export default function ResumeHomePage() { return ( -
-
+
+
+
+ +
); }