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 */}
+
+
+
+
+
+
+
+
+
+
+ {TEST_RESUMES.map((resumeObj) => (
+ -
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
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 (
-
-