[offers][feat] add yoe query param and display all by default

pull/495/head
Zhang Ziqing 3 years ago
parent 07b814464e
commit 07ad322bac

@ -1,4 +1,5 @@
import clsx from 'clsx'; import clsx from 'clsx';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { DropdownMenu, Spinner } from '@tih/ui'; import { DropdownMenu, Spinner } from '@tih/ui';
@ -9,6 +10,7 @@ import {
OfferTableSortBy, OfferTableSortBy,
OfferTableYoeOptions, OfferTableYoeOptions,
YOE_CATEGORY, YOE_CATEGORY,
YOE_CATEGORY_PARAM,
} from '~/components/offers/table/types'; } from '~/components/offers/table/types';
import { Currency } from '~/utils/offers/currency/CurrencyEnum'; import { Currency } from '~/utils/offers/currency/CurrencyEnum';
@ -31,7 +33,7 @@ export default function OffersTable({
jobTitleFilter, jobTitleFilter,
}: OffersTableProps) { }: OffersTableProps) {
const [currency, setCurrency] = useState(Currency.SGD.toString()); // TODO: Detect location const [currency, setCurrency] = useState(Currency.SGD.toString()); // TODO: Detect location
const [selectedYoe, setSelectedYoe] = useState(YOE_CATEGORY.ENTRY); const [selectedYoe, setSelectedYoe] = useState('');
const [pagination, setPagination] = useState<Paging>({ const [pagination, setPagination] = useState<Paging>({
currentPage: 0, currentPage: 0,
numOfItems: 0, numOfItems: 0,
@ -43,6 +45,9 @@ export default function OffersTable({
OfferTableFilterOptions[0].value, OfferTableFilterOptions[0].value,
); );
const { event: gaEvent } = useGoogleAnalytics(); const { event: gaEvent } = useGoogleAnalytics();
const router = useRouter();
const { yoeCategory = '' } = router.query;
useEffect(() => { useEffect(() => {
setPagination({ setPagination({
currentPage: 0, currentPage: 0,
@ -51,6 +56,11 @@ export default function OffersTable({
totalItems: 0, totalItems: 0,
}); });
}, [selectedYoe, currency]); }, [selectedYoe, currency]);
useEffect(() => {
setSelectedYoe(yoeCategory as YOE_CATEGORY);
}, [yoeCategory]);
const offersQuery = trpc.useQuery( const offersQuery = trpc.useQuery(
[ [
'offers.list', 'offers.list',
@ -63,7 +73,7 @@ export default function OffersTable({
offset: pagination.currentPage, offset: pagination.currentPage,
sortBy: OfferTableSortBy[selectedFilter] ?? '-monthYearReceived', sortBy: OfferTableSortBy[selectedFilter] ?? '-monthYearReceived',
title: jobTitleFilter, title: jobTitleFilter,
yoeCategory: selectedYoe, yoeCategory: YOE_CATEGORY_PARAM[yoeCategory as string] ?? undefined,
}, },
], ],
{ {
@ -80,14 +90,39 @@ export default function OffersTable({
function renderFilters() { function renderFilters() {
return ( return (
<div className="flex items-center justify-between p-4 text-sm sm:grid-cols-4 md:text-base"> <div className="flex items-center justify-between p-4 text-sm sm:grid-cols-4 md:text-base">
<DropdownMenu align="start" label="Filters" size="inherit"> <DropdownMenu
align="start"
label={
OfferTableYoeOptions.filter(
({ value: itemValue }) => itemValue === selectedYoe,
)[0].label
}
size="inherit">
{OfferTableYoeOptions.map(({ label: itemLabel, value }) => ( {OfferTableYoeOptions.map(({ label: itemLabel, value }) => (
<DropdownMenu.Item <DropdownMenu.Item
key={value} key={value}
isSelected={value === selectedYoe} isSelected={value === selectedYoe}
label={itemLabel} label={itemLabel}
onClick={() => { onClick={() => {
setSelectedYoe(value); if (value === '') {
router.replace(
{
pathname: router.pathname,
query: undefined,
},
undefined,
// Do not refresh the page
{ shallow: true },
);
} else {
const params = new URLSearchParams({
['yoeCategory']: value,
});
router.replace({
pathname: location.pathname,
search: params.toString(),
});
}
gaEvent({ gaEvent({
action: `offers.table_filter_yoe_category_${value}`, action: `offers.table_filter_yoe_category_${value}`,
category: 'engagement', category: 'engagement',

@ -1,12 +1,20 @@
// eslint-disable-next-line no-shadow // eslint-disable-next-line no-shadow
export enum YOE_CATEGORY { export enum YOE_CATEGORY {
INTERN = 0, ENTRY = 'entry',
ENTRY = 1, INTERN = 'intern',
MID = 2, MID = 'mid',
SENIOR = 3, SENIOR = 'senior',
} }
export const YOE_CATEGORY_PARAM: Record<string, number> = {
entry: 1,
intern: 0,
mid: 2,
senior: 3,
};
export const OfferTableYoeOptions = [ export const OfferTableYoeOptions = [
{ label: 'All Full Time YOE', value: '' },
{ {
label: 'Fresh Grad (0-2 YOE)', label: 'Fresh Grad (0-2 YOE)',
value: YOE_CATEGORY.ENTRY, value: YOE_CATEGORY.ENTRY,

@ -12,9 +12,7 @@ import type { JobTitleType } from '~/components/shared/JobTitles';
import JobTitlesTypeahead from '~/components/shared/JobTitlesTypahead'; import JobTitlesTypeahead from '~/components/shared/JobTitlesTypahead';
export default function OffersHomePage() { export default function OffersHomePage() {
const [jobTitleFilter, setJobTitleFilter] = useState<JobTitleType | ''>( const [jobTitleFilter, setJobTitleFilter] = useState<JobTitleType | ''>('');
'software-engineer',
);
const [companyFilter, setCompanyFilter] = useState(''); const [companyFilter, setCompanyFilter] = useState('');
const [cityFilter, setCityFilter] = useState(''); const [cityFilter, setCityFilter] = useState('');
const { event: gaEvent } = useGoogleAnalytics(); const { event: gaEvent } = useGoogleAnalytics();
@ -64,7 +62,7 @@ export default function OffersHomePage() {
<div className="flex items-center space-x-4"> <div className="flex items-center space-x-4">
<JobTitlesTypeahead <JobTitlesTypeahead
isLabelHidden={true} isLabelHidden={true}
placeholder="Software Engineer" placeholder="All Job Titles"
textSize="inherit" textSize="inherit"
onSelect={(option) => { onSelect={(option) => {
if (option) { if (option) {

Loading…
Cancel
Save