[offers][feat] show currency depending on country

pull/542/head
Yangshun Tay 2 years ago
parent 24e68ea74a
commit c99f57260d

@ -14,7 +14,7 @@ import {
YOE_CATEGORY_PARAM, YOE_CATEGORY_PARAM,
} from '~/components/offers/table/types'; } from '~/components/offers/table/types';
import { Currency } from '~/utils/offers/currency/CurrencyEnum'; import { getCurrencyForCountry } from '~/utils/offers/currency/CurrencyEnum';
import CurrencySelector from '~/utils/offers/currency/CurrencySelector'; import CurrencySelector from '~/utils/offers/currency/CurrencySelector';
import { useSearchParamSingle } from '~/utils/offers/useSearchParam'; import { useSearchParamSingle } from '~/utils/offers/useSearchParam';
import { trpc } from '~/utils/trpc'; import { trpc } from '~/utils/trpc';
@ -28,17 +28,21 @@ const NUMBER_OF_OFFERS_PER_PAGE = 20;
export type OffersTableProps = Readonly<{ export type OffersTableProps = Readonly<{
companyFilter: string; companyFilter: string;
companyName?: string; companyName?: string;
country: string | null;
countryFilter: string; countryFilter: string;
jobTitleFilter: string; jobTitleFilter: string;
}>; }>;
export default function OffersTable({ export default function OffersTable({
country,
countryFilter, countryFilter,
companyName, companyName,
companyFilter, companyFilter,
jobTitleFilter, jobTitleFilter,
}: OffersTableProps) { }: OffersTableProps) {
const [currency, setCurrency] = useState(Currency.SGD.toString()); // TODO: Detect location const [currency, setCurrency] = useState(
getCurrencyForCountry(country).toString(),
);
const [jobType, setJobType] = useState<JobType>(JobType.FULLTIME); const [jobType, setJobType] = useState<JobType>(JobType.FULLTIME);
const [pagination, setPagination] = useState<Paging>({ const [pagination, setPagination] = useState<Paging>({
currentPage: 0, currentPage: 0,

@ -0,0 +1,11 @@
import type { NextRequest } from 'next/server';
import { NextResponse } from 'next/server';
export function middleware(request: NextRequest) {
const country = request.geo?.country ?? null;
const response = NextResponse.next();
if (country != null) {
response.cookies.set('country', country);
}
return response;
}

@ -1,3 +1,4 @@
import type { GetServerSideProps, InferGetServerSidePropsType } from 'next';
import Head from 'next/head'; import Head from 'next/head';
import Link from 'next/link'; import Link from 'next/link';
import { useState } from 'react'; import { useState } from 'react';
@ -15,7 +16,17 @@ import JobTitlesTypeahead from '~/components/shared/JobTitlesTypeahead';
import { useSearchParamSingle } from '~/utils/offers/useSearchParam'; import { useSearchParamSingle } from '~/utils/offers/useSearchParam';
export default function OffersHomePage() { export const getServerSideProps: GetServerSideProps = async ({ req }) => {
return {
props: {
country: req.cookies.country ?? null,
},
};
};
export default function OffersHomePage({
country,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
const [countryFilter, setCountryFilter] = useState(''); const [countryFilter, setCountryFilter] = useState('');
const { event: gaEvent } = useGoogleAnalytics(); const { event: gaEvent } = useGoogleAnalytics();
@ -140,6 +151,7 @@ export default function OffersHomePage() {
<OffersTable <OffersTable
companyFilter={selectedCompanyId} companyFilter={selectedCompanyId}
companyName={selectedCompanyName} companyName={selectedCompanyName}
country={country}
countryFilter={countryFilter} countryFilter={countryFilter}
jobTitleFilter={selectedJobTitleId ?? ''} jobTitleFilter={selectedJobTitleId ?? ''}
/> />

@ -1,4 +1,3 @@
// eslint-disable-next-line no-shadow
export enum Currency { export enum Currency {
AED = 'AED', // 'UNITED ARAB EMIRATES DIRHAM' AED = 'AED', // 'UNITED ARAB EMIRATES DIRHAM'
AFN = 'AFN', // 'AFGHAN AFGHANI' AFN = 'AFN', // 'AFGHAN AFGHANI'
@ -172,3 +171,116 @@ export const CURRENCY_OPTIONS = Object.entries(Currency).map(
value, value,
}), }),
); );
export function getCurrencyForCountry(
countryCode: string | null = 'US',
): Currency {
// Source: https://github.com/srcagency/country-currencies/blob/master/data.json
switch (countryCode) {
case 'AU':
case 'CX':
case 'CC':
case 'HM':
case 'KI':
case 'NF':
case 'NR':
case 'TV':
return Currency.AUD;
case 'AD':
case 'AT':
case 'AX':
case 'BE':
case 'BL':
case 'CY':
case 'DE':
case 'EE':
case 'ES':
case 'FI':
case 'FR':
case 'GF':
case 'GP':
case 'GR':
case 'IE':
case 'IT':
case 'LT':
case 'LU':
case 'LV':
case 'MC':
case 'ME':
case 'MF':
case 'MQ':
case 'MT':
case 'NL':
case 'PM':
case 'PT':
case 'RE':
case 'SI':
case 'SK':
case 'SM':
case 'TF':
case 'VA':
case 'WS':
case 'YT':
return Currency.EUR;
case 'GS':
case 'GB':
case 'JE':
case 'IM':
return Currency.GBP;
case 'CA':
return Currency.CAD;
case 'SG':
return Currency.SGD;
case 'JP':
return Currency.JPY;
case 'BT':
case 'IN':
return Currency.INR;
case 'BV':
case 'NO':
case 'SJ':
return Currency.NOK;
case 'BR':
return Currency.BRL;
case 'CN':
return Currency.CNY;
case 'DK':
case 'FO':
case 'GL':
return Currency.DKK;
case 'TP':
case 'ID':
return Currency.IDR;
case 'KP':
return Currency.KPW;
case 'KR':
return Currency.KRW;
case 'CH':
return Currency.CHF;
case 'MY':
return Currency.MYR;
case 'MX':
return Currency.MXN;
case 'NG':
return Currency.NGN;
case 'PH':
return Currency.PHP;
case 'PL':
return Currency.PLN;
case 'RU':
return Currency.RUB;
case 'SA':
return Currency.SAR;
case 'TW':
return Currency.TWD;
case 'TH':
return Currency.THB;
case 'TR':
return Currency.TRY;
case 'VN':
return Currency.VND;
case 'US':
default:
return Currency.USD;
}
}

Loading…
Cancel
Save