diff --git a/.eslintrc b/.eslintrc index 9326901..fbd9556 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,6 +1,6 @@ { "extends": "next", "rules": { - "@next/next/no-img-element": "off" + "@next/next/no-img-element": "off", } } diff --git a/components/UI/CountrySelect.tsx b/components/UI/CountrySelect.tsx new file mode 100644 index 0000000..f17f046 --- /dev/null +++ b/components/UI/CountrySelect.tsx @@ -0,0 +1,63 @@ +import { forwardRef } from 'react'; +import { MultiSelect, MultiSelectProps, Box, CloseButton, SelectItemProps, MultiSelectValueProps } from '@mantine/core'; +import CountriesData from 'data/Countries'; +import countryFlag from 'data/CountryFlag'; + +function Value({ value, label, onRemove, classNames, ...others }: MultiSelectValueProps & { value: string }) { + const Flag = countryFlag[value]; + return ( +
+ ({ + display: 'flex', + cursor: 'default', + alignItems: 'center', + backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.white, + border: `1px solid ${theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[4]}`, + paddingLeft: 10, + borderRadius: 4, + })} + > + + + + {label} + + +
+ ); +} + +const Item = forwardRef(({ label, value, ...others }, ref) => { + const Flag = countryFlag[value]; + return ( +
+ + + + +
{label}
+
+
+ ); +}); + +Item.displayName = 'SelectItem'; + +const CountrySelect = (props: Partial) => { + return ( + + ); +}; + +export default CountrySelect; diff --git a/components/UI/pagination/Pagination.tsx b/components/UI/pagination/Pagination.tsx index 6365f81..2e100a9 100644 --- a/components/UI/pagination/Pagination.tsx +++ b/components/UI/pagination/Pagination.tsx @@ -5,7 +5,9 @@ import Config from 'lib/config'; const Pagination = ({ total }) => { const router = useRouter(); - if (total >= Config.ItemsPerPage) return null; + if (total == 0) return null; + + if (total <= Config.ItemsPerPage) return null; return (
diff --git a/data/Countries.ts b/data/Countries.ts new file mode 100644 index 0000000..2916227 --- /dev/null +++ b/data/Countries.ts @@ -0,0 +1,253 @@ +const CountriesData = [ + { value: 'AF', label: 'Afghanistan' }, + { value: 'AL', label: 'Albania' }, + { value: 'DZ', label: 'Algeria' }, + { value: 'AS', label: 'American Samoa' }, + { value: 'AD', label: 'Andorra' }, + { value: 'AO', label: 'Angola' }, + { value: 'AI', label: 'Anguilla' }, + { value: 'AQ', label: 'Antarctica' }, + { value: 'AG', label: 'Antigua and Barbuda' }, + { value: 'AR', label: 'Argentina' }, + { value: 'AM', label: 'Armenia' }, + { value: 'AW', label: 'Aruba' }, + { value: 'AU', label: 'Australia' }, + { value: 'AT', label: 'Austria' }, + { value: 'AZ', label: 'Azerbaijan' }, + { value: 'BS', label: 'Bahamas (the)' }, + { value: 'BH', label: 'Bahrain' }, + { value: 'BD', label: 'Bangladesh' }, + { value: 'BB', label: 'Barbados' }, + { value: 'BY', label: 'Belarus' }, + { value: 'BE', label: 'Belgium' }, + { value: 'BZ', label: 'Belize' }, + { value: 'BJ', label: 'Benin' }, + { value: 'BM', label: 'Bermuda' }, + { value: 'BT', label: 'Bhutan' }, + { value: 'BO', label: 'Bolivia (Plurinational State of)' }, + { value: 'BQ', label: 'Bonaire, Sint Eustatius and Saba' }, + { value: 'BA', label: 'Bosnia and Herzegovina' }, + { value: 'BW', label: 'Botswana' }, + { value: 'BV', label: 'Bouvet Island' }, + { value: 'BR', label: 'Brazil' }, + { value: 'IO', label: 'British Indian Ocean Territory (the)' }, + { value: 'BN', label: 'Brunei Darussalam' }, + { value: 'BG', label: 'Bulgaria' }, + { value: 'BF', label: 'Burkina Faso' }, + { value: 'BI', label: 'Burundi' }, + { value: 'CV', label: 'Cabo Verde' }, + { value: 'KH', label: 'Cambodia' }, + { value: 'CM', label: 'Cameroon' }, + { value: 'CA', label: 'Canada' }, + { value: 'KY', label: 'Cayman Islands (the)' }, + { value: 'CF', label: 'Central African Republic (the)' }, + { value: 'TD', label: 'Chad' }, + { value: 'CL', label: 'Chile' }, + { value: 'CN', label: 'China' }, + { value: 'CX', label: 'Christmas Island' }, + { value: 'CC', label: 'Cocos (Keeling) Islands (the)' }, + { value: 'CO', label: 'Colombia' }, + { value: 'KM', label: 'Comoros (the)' }, + { value: 'CD', label: 'Congo (the Democratic Republic of the)' }, + { value: 'CG', label: 'Congo (the)' }, + { value: 'CK', label: 'Cook Islands (the)' }, + { value: 'CR', label: 'Costa Rica' }, + { value: 'HR', label: 'Croatia' }, + { value: 'CU', label: 'Cuba' }, + { value: 'CW', label: 'Curaçao' }, + { value: 'CY', label: 'Cyprus' }, + { value: 'CZ', label: 'Czechia' }, + { value: 'CI', label: "Côte d'Ivoire" }, + { value: 'DK', label: 'Denmark' }, + { value: 'DJ', label: 'Djibouti' }, + { value: 'DM', label: 'Dominica' }, + { value: 'DO', label: 'Dominican Republic (the)' }, + { value: 'EC', label: 'Ecuador' }, + { value: 'EG', label: 'Egypt' }, + { value: 'SV', label: 'El Salvador' }, + { value: 'GQ', label: 'Equatorial Guinea' }, + { value: 'ER', label: 'Eritrea' }, + { value: 'EE', label: 'Estonia' }, + { value: 'SZ', label: 'Eswatini' }, + { value: 'ET', label: 'Ethiopia' }, + { value: 'FK', label: 'Falkland Islands (the) [Malvinas]' }, + { value: 'FO', label: 'Faroe Islands (the)' }, + { value: 'FJ', label: 'Fiji' }, + { value: 'FI', label: 'Finland' }, + { value: 'FR', label: 'France' }, + { value: 'GF', label: 'French Guiana' }, + { value: 'PF', label: 'French Polynesia' }, + { value: 'TF', label: 'French Southern Territories (the)' }, + { value: 'GA', label: 'Gabon' }, + { value: 'GM', label: 'Gambia (the)' }, + { value: 'GE', label: 'Georgia' }, + { value: 'DE', label: 'Germany' }, + { value: 'GH', label: 'Ghana' }, + { value: 'GI', label: 'Gibraltar' }, + { value: 'GR', label: 'Greece' }, + { value: 'GL', label: 'Greenland' }, + { value: 'GD', label: 'Grenada' }, + { value: 'GP', label: 'Guadeloupe' }, + { value: 'GU', label: 'Guam' }, + { value: 'GT', label: 'Guatemala' }, + { value: 'GG', label: 'Guernsey' }, + { value: 'GN', label: 'Guinea' }, + { value: 'GW', label: 'Guinea-Bissau' }, + { value: 'GY', label: 'Guyana' }, + { value: 'HT', label: 'Haiti' }, + { value: 'HM', label: 'Heard Island and McDonald Islands' }, + { value: 'VA', label: 'Holy See (the)' }, + { value: 'HN', label: 'Honduras' }, + { value: 'HK', label: 'Hong Kong' }, + { value: 'HU', label: 'Hungary' }, + { value: 'IS', label: 'Iceland' }, + { value: 'IN', label: 'India' }, + { value: 'ID', label: 'Indonesia' }, + { value: 'IR', label: 'Iran (Islamic Republic of)' }, + { value: 'IQ', label: 'Iraq' }, + { value: 'IE', label: 'Ireland' }, + { value: 'IM', label: 'Isle of Man' }, + { value: 'IL', label: 'Israel' }, + { value: 'IT', label: 'Italy' }, + { value: 'JM', label: 'Jamaica' }, + { value: 'JP', label: 'Japan' }, + { value: 'JE', label: 'Jersey' }, + { value: 'JO', label: 'Jordan' }, + { value: 'KZ', label: 'Kazakhstan' }, + { value: 'KE', label: 'Kenya' }, + { value: 'KI', label: 'Kiribati' }, + { value: 'KP', label: "Korea (the Democratic People's Republic of)" }, + { value: 'KR', label: 'Korea (the Republic of)' }, + { value: 'KW', label: 'Kuwait' }, + { value: 'KG', label: 'Kyrgyzstan' }, + { value: 'LA', label: "Lao People's Democratic Republic (the)" }, + { value: 'LV', label: 'Latvia' }, + { value: 'LB', label: 'Lebanon' }, + { value: 'LS', label: 'Lesotho' }, + { value: 'LR', label: 'Liberia' }, + { value: 'LY', label: 'Libya' }, + { value: 'LI', label: 'Liechtenstein' }, + { value: 'LT', label: 'Lithuania' }, + { value: 'LU', label: 'Luxembourg' }, + { value: 'MO', label: 'Macao' }, + { value: 'MG', label: 'Madagascar' }, + { value: 'MW', label: 'Malawi' }, + { value: 'MY', label: 'Malaysia' }, + { value: 'MV', label: 'Maldives' }, + { value: 'ML', label: 'Mali' }, + { value: 'MT', label: 'Malta' }, + { value: 'MH', label: 'Marshall Islands (the)' }, + { value: 'MQ', label: 'Martinique' }, + { value: 'MR', label: 'Mauritania' }, + { value: 'MU', label: 'Mauritius' }, + { value: 'YT', label: 'Mayotte' }, + { value: 'MX', label: 'Mexico' }, + { value: 'FM', label: 'Micronesia (Federated States of)' }, + { value: 'MD', label: 'Moldova (the Republic of)' }, + { value: 'MC', label: 'Monaco' }, + { value: 'MN', label: 'Mongolia' }, + { value: 'ME', label: 'Montenegro' }, + { value: 'MS', label: 'Montserrat' }, + { value: 'MA', label: 'Morocco' }, + { value: 'MZ', label: 'Mozambique' }, + { value: 'MM', label: 'Myanmar' }, + { value: 'NA', label: 'Namibia' }, + { value: 'NR', label: 'Nauru' }, + { value: 'NP', label: 'Nepal' }, + { value: 'NL', label: 'Netherlands (the)' }, + { value: 'NC', label: 'New Caledonia' }, + { value: 'NZ', label: 'New Zealand' }, + { value: 'NI', label: 'Nicaragua' }, + { value: 'NE', label: 'Niger (the)' }, + { value: 'NG', label: 'Nigeria' }, + { value: 'NU', label: 'Niue' }, + { value: 'NF', label: 'Norfolk Island' }, + { value: 'MP', label: 'Northern Mariana Islands (the)' }, + { value: 'NO', label: 'Norway' }, + { value: 'OM', label: 'Oman' }, + { value: 'PK', label: 'Pakistan' }, + { value: 'PW', label: 'Palau' }, + { value: 'PS', label: 'Palestine, State of' }, + { value: 'PA', label: 'Panama' }, + { value: 'PG', label: 'Papua New Guinea' }, + { value: 'PY', label: 'Paraguay' }, + { value: 'PE', label: 'Peru' }, + { value: 'PH', label: 'Philippines (the)' }, + { value: 'PN', label: 'Pitcairn' }, + { value: 'PL', label: 'Poland' }, + { value: 'PT', label: 'Portugal' }, + { value: 'PR', label: 'Puerto Rico' }, + { value: 'QA', label: 'Qatar' }, + { value: 'MK', label: 'Republic of North Macedonia' }, + { value: 'RO', label: 'Romania' }, + { value: 'RU', label: 'Russian Federation (the)' }, + { value: 'RW', label: 'Rwanda' }, + { value: 'RE', label: 'Réunion' }, + { value: 'BL', label: 'Saint Barthélemy' }, + { value: 'SH', label: 'Saint Helena, Ascension and Tristan da Cunha' }, + { value: 'KN', label: 'Saint Kitts and Nevis' }, + { value: 'LC', label: 'Saint Lucia' }, + { value: 'MF', label: 'Saint Martin (French part)' }, + { value: 'PM', label: 'Saint Pierre and Miquelon' }, + { value: 'VC', label: 'Saint Vincent and the Grenadines' }, + { value: 'WS', label: 'Samoa' }, + { value: 'SM', label: 'San Marino' }, + { value: 'ST', label: 'Sao Tome and Principe' }, + { value: 'SA', label: 'Saudi Arabia' }, + { value: 'SN', label: 'Senegal' }, + { value: 'RS', label: 'Serbia' }, + { value: 'SC', label: 'Seychelles' }, + { value: 'SL', label: 'Sierra Leone' }, + { value: 'SG', label: 'Singapore' }, + { value: 'SX', label: 'Sint Maarten (Dutch part)' }, + { value: 'SK', label: 'Slovakia' }, + { value: 'SI', label: 'Slovenia' }, + { value: 'SB', label: 'Solomon Islands' }, + { value: 'SO', label: 'Somalia' }, + { value: 'ZA', label: 'South Africa' }, + { value: 'GS', label: 'South Georgia and the South Sandwich Islands' }, + { value: 'SS', label: 'South Sudan' }, + { value: 'ES', label: 'Spain' }, + { value: 'LK', label: 'Sri Lanka' }, + { value: 'SD', label: 'Sudan (the)' }, + { value: 'SR', label: 'Suriname' }, + { value: 'SJ', label: 'Svalbard and Jan Mayen' }, + { value: 'SE', label: 'Sweden' }, + { value: 'CH', label: 'Switzerland' }, + { value: 'SY', label: 'Syrian Arab Republic' }, + { value: 'TW', label: 'Taiwan' }, + { value: 'TJ', label: 'Tajikistan' }, + { value: 'TZ', label: 'Tanzania, United Republic of' }, + { value: 'TH', label: 'Thailand' }, + { value: 'TL', label: 'Timor-Leste' }, + { value: 'TG', label: 'Togo' }, + { value: 'TK', label: 'Tokelau' }, + { value: 'TO', label: 'Tonga' }, + { value: 'TT', label: 'Trinidad and Tobago' }, + { value: 'TN', label: 'Tunisia' }, + { value: 'TR', label: 'Turkey' }, + { value: 'TM', label: 'Turkmenistan' }, + { value: 'TC', label: 'Turks and Caicos Islands (the)' }, + { value: 'TV', label: 'Tuvalu' }, + { value: 'UG', label: 'Uganda' }, + { value: 'UA', label: 'Ukraine' }, + { value: 'AE', label: 'United Arab Emirates (the)' }, + { value: 'GB', label: 'United Kingdom of Great Britain and Northern Ireland (the)' }, + { value: 'UM', label: 'United States Minor Outlying Islands (the)' }, + { value: 'US', label: 'United States of America (the)' }, + { value: 'UY', label: 'Uruguay' }, + { value: 'UZ', label: 'Uzbekistan' }, + { value: 'VU', label: 'Vanuatu' }, + { value: 'VE', label: 'Venezuela (Bolivarian Republic of)' }, + { value: 'VN', label: 'Viet Nam' }, + { value: 'VG', label: 'Virgin Islands (British)' }, + { value: 'VI', label: 'Virgin Islands (U.S.)' }, + { value: 'WF', label: 'Wallis and Futuna' }, + { value: 'EH', label: 'Western Sahara' }, + { value: 'YE', label: 'Yemen' }, + { value: 'ZM', label: 'Zambia' }, + { value: 'ZW', label: 'Zimbabwe' }, + { value: 'AX', label: 'Åland Islands' } +]; + +export default CountriesData; diff --git a/data/CountryFlag.ts b/data/CountryFlag.ts new file mode 100644 index 0000000..9a8c5cb --- /dev/null +++ b/data/CountryFlag.ts @@ -0,0 +1,259 @@ +const countryFlag = { + AC: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1e8.svg', + AD: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f4.svg', + AE: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1ea.svg', + AF: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1eb.svg', + AG: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1ec.svg', + AI: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1ee.svg', + AL: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f1.svg', + AM: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f2.svg', + AQ: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f6.svg', + AR: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f7.svg', + AS: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f8.svg', + AT: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f9.svg', + AU: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1fa.svg', + AW: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1fc.svg', + AX: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1fd.svg', + AZ: 'https://twemoji.maxcdn.com/2/svg/1f1e6-1f1ff.svg', + BA: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1e6.svg', + BB: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1e7.svg', + BD: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1e9.svg', + BE: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ea.svg', + BF: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1eb.svg', + BG: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ec.svg', + BH: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ed.svg', + BI: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ee.svg', + BJ: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ef.svg', + BL: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f1.svg', + BM: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f2.svg', + BN: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f3.svg', + BO: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f4.svg', + BR: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f7.svg', + BS: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f8.svg', + BT: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f9.svg', + BV: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1fb.svg', + BW: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1fc.svg', + BY: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1fe.svg', + BZ: 'https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ff.svg', + CA: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1e6.svg', + CC: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1e8.svg', + CD: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1ec.svg', + CF: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1eb.svg', + CG: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1e9.svg', + CH: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1ed.svg', + CI: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1ee.svg', + CK: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f0.svg', + CL: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f1.svg', + CM: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f2.svg', + CN: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f3.svg', + CO: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f4.svg', + CP: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f5.svg', + CR: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f7.svg', + CU: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fa.svg', + CV: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fb.svg', + CW: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fc.svg', + CX: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fd.svg', + CY: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fe.svg', + CZ: 'https://twemoji.maxcdn.com/2/svg/1f1e8-1f1ff.svg', + DE: 'https://twemoji.maxcdn.com/2/svg/1f1e9-1f1ea.svg', + DG: 'https://twemoji.maxcdn.com/2/svg/1f1e9-1f1ec.svg', + DJ: 'https://twemoji.maxcdn.com/2/svg/1f1e9-1f1ef.svg', + DK: 'https://twemoji.maxcdn.com/2/svg/1f1e9-1f1f0.svg', + DM: 'https://twemoji.maxcdn.com/2/svg/1f1e9-1f1f2.svg', + DO: 'https://twemoji.maxcdn.com/2/svg/1f1e9-1f1f4.svg', + DZ: 'https://twemoji.maxcdn.com/2/svg/1f1e9-1f1ff.svg', + EA: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1e6.svg', + EC: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1e8.svg', + EE: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1ea.svg', + EG: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1ec.svg', + EH: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1ed.svg', + ER: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1f7.svg', + ES: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1f8.svg', + ET: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1f9.svg', + EU: 'https://twemoji.maxcdn.com/2/svg/1f1ea-1f1fa.svg', + FI: 'https://twemoji.maxcdn.com/2/svg/1f1eb-1f1ee.svg', + FJ: 'https://twemoji.maxcdn.com/2/svg/1f1eb-1f1ef.svg', + FK: 'https://twemoji.maxcdn.com/2/svg/1f1eb-1f1f0.svg', + FM: 'https://twemoji.maxcdn.com/2/svg/1f1eb-1f1f2.svg', + FO: 'https://twemoji.maxcdn.com/2/svg/1f1eb-1f1f4.svg', + FR: 'https://twemoji.maxcdn.com/2/svg/1f1eb-1f1f7.svg', + GA: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1e6.svg', + GB: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1e7.svg', + GD: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1e9.svg', + GE: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1ea.svg', + GF: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1eb.svg', + GG: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1ec.svg', + GH: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1ed.svg', + GI: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1ee.svg', + GL: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f1.svg', + GM: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f2.svg', + GN: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f3.svg', + GP: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f5.svg', + GQ: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f6.svg', + GR: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f7.svg', + GS: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f8.svg', + GT: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f9.svg', + GU: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1fa.svg', + GW: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1fc.svg', + GY: 'https://twemoji.maxcdn.com/2/svg/1f1ec-1f1fe.svg', + HK: 'https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f0.svg', + HM: 'https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f2.svg', + HN: 'https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f3.svg', + HR: 'https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f7.svg', + HT: 'https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f9.svg', + HU: 'https://twemoji.maxcdn.com/2/svg/1f1ed-1f1fa.svg', + IC: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1e8.svg', + ID: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1e9.svg', + IE: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1ea.svg', + IL: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f1.svg', + IM: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f2.svg', + IN: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f3.svg', + IO: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f4.svg', + IQ: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f6.svg', + IS: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f8.svg', + IT: 'https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f9.svg', + JE: 'https://twemoji.maxcdn.com/2/svg/1f1ef-1f1ea.svg', + JM: 'https://twemoji.maxcdn.com/2/svg/1f1ef-1f1f2.svg', + JO: 'https://twemoji.maxcdn.com/2/svg/1f1ef-1f1f4.svg', + JP: 'https://twemoji.maxcdn.com/2/svg/1f1ef-1f1f5.svg', + KE: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ea.svg', + KG: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ec.svg', + KH: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ed.svg', + KI: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ee.svg', + KM: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1f2.svg', + KN: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1f3.svg', + KP: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1f5.svg', + KR: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1f7.svg', + KW: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1fc.svg', + KY: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1fe.svg', + KZ: 'https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ff.svg', + LA: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1e6.svg', + LB: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1e7.svg', + LC: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1e8.svg', + LI: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1ee.svg', + LK: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1f0.svg', + LR: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1f7.svg', + LS: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1f8.svg', + LT: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1f9.svg', + LU: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1fa.svg', + LV: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1fb.svg', + LY: 'https://twemoji.maxcdn.com/2/svg/1f1f1-1f1fe.svg', + MA: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1e6.svg', + MC: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1e8.svg', + MD: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1e9.svg', + ME: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1ea.svg', + MF: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1eb.svg', + MG: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1ec.svg', + MH: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1ed.svg', + MK: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f0.svg', + ML: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f1.svg', + MM: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f2.svg', + MN: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f3.svg', + MO: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f4.svg', + MP: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f5.svg', + MQ: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f6.svg', + MR: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f7.svg', + MS: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f8.svg', + MT: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f9.svg', + MU: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fa.svg', + MV: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fb.svg', + MW: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fc.svg', + MX: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fd.svg', + MY: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fe.svg', + MZ: 'https://twemoji.maxcdn.com/2/svg/1f1f2-1f1ff.svg', + NA: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1e6.svg', + NC: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1e8.svg', + NE: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1ea.svg', + NF: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1eb.svg', + NG: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1ec.svg', + NI: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1ee.svg', + NL: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1f1.svg', + NO: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1f4.svg', + NP: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1f5.svg', + NR: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1f7.svg', + NU: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1fa.svg', + NZ: 'https://twemoji.maxcdn.com/2/svg/1f1f3-1f1ff.svg', + OM: 'https://twemoji.maxcdn.com/2/svg/1f1f4-1f1f2.svg', + PA: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1e6.svg', + PE: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1ea.svg', + PF: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1eb.svg', + PG: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1ec.svg', + PH: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1ed.svg', + PK: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f0.svg', + PL: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f1.svg', + PN: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f3.svg', + PR: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f7.svg', + PS: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f8.svg', + PT: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f9.svg', + PW: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1fc.svg', + PY: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1fe.svg', + QA: 'https://twemoji.maxcdn.com/2/svg/1f1f6-1f1e6.svg', + RE: 'https://twemoji.maxcdn.com/2/svg/1f1f7-1f1ea.svg', + RO: 'https://twemoji.maxcdn.com/2/svg/1f1f7-1f1f4.svg', + RU: 'https://twemoji.maxcdn.com/2/svg/1f1f7-1f1fa.svg', + RW: 'https://twemoji.maxcdn.com/2/svg/1f1f7-1f1fc.svg', + SA: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1e6.svg', + SB: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1e7.svg', + SC: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1e8.svg', + SD: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1e9.svg', + SE: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ea.svg', + SG: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ec.svg', + SH: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1e6.svg', + SI: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ee.svg', + SJ: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ef.svg', + SK: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f0.svg', + SL: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f1.svg', + SM: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f2.svg', + SN: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f3.svg', + SO: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f4.svg', + SR: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f7.svg', + SS: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f8.svg', + ST: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f9.svg', + SV: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1fb.svg', + SX: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1fd.svg', + SY: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1fe.svg', + SZ: 'https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ff.svg', + TC: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1e8.svg', + TD: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1e9.svg', + TF: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1eb.svg', + TG: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1ec.svg', + TH: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1ed.svg', + TJ: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1ef.svg', + TK: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f0.svg', + TL: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f1.svg', + TM: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f2.svg', + TN: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f3.svg', + TO: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f4.svg', + TR: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f7.svg', + TT: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f9.svg', + TV: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1fb.svg', + TW: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1fc.svg', + TZ: 'https://twemoji.maxcdn.com/2/svg/1f1f9-1f1ff.svg', + UA: 'https://twemoji.maxcdn.com/2/svg/1f1fa-1f1e6.svg', + UG: 'https://twemoji.maxcdn.com/2/svg/1f1fa-1f1ec.svg', + UK: 'https://twemoji.maxcdn.com/2/svg/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg', + UM: 'https://twemoji.maxcdn.com/2/svg/1f1fa-1f1f2.svg', + UN: 'https://twemoji.maxcdn.com/2/svg/1f1fa-1f1f3.svg', + PM: 'https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f2.svg', + US: 'https://twemoji.maxcdn.com/2/svg/1f1fa-1f1f8.svg', + UY: 'https://twemoji.maxcdn.com/2/svg/1f1fa-1f1fe.svg', + UZ: 'https://twemoji.maxcdn.com/2/svg/1f1fa-1f1ff.svg', + VA: 'https://twemoji.maxcdn.com/2/svg/1f1fb-1f1e6.svg', + VC: 'https://twemoji.maxcdn.com/2/svg/1f1fb-1f1e8.svg', + VE: 'https://twemoji.maxcdn.com/2/svg/1f1fb-1f1ea.svg', + VG: 'https://twemoji.maxcdn.com/2/svg/1f1fb-1f1ec.svg', + VI: 'https://twemoji.maxcdn.com/2/svg/1f1fb-1f1ee.svg', + VN: 'https://twemoji.maxcdn.com/2/svg/1f1fb-1f1f3.svg', + VU: 'https://twemoji.maxcdn.com/2/svg/1f1fb-1f1fa.svg', + WF: 'https://twemoji.maxcdn.com/2/svg/1f1fc-1f1eb.svg', + WS: 'https://twemoji.maxcdn.com/2/svg/1f1fc-1f1f8.svg', + XK: 'https://twemoji.maxcdn.com/2/svg/1f1fd-1f1f0.svg', + YE: 'https://twemoji.maxcdn.com/2/svg/1f1fe-1f1ea.svg', + YT: 'https://twemoji.maxcdn.com/2/svg/1f1fe-1f1f9.svg', + YU: 'https://twemoji.maxcdn.com/2/svg/1f1f7-1f1f8.svg', + ZA: 'https://twemoji.maxcdn.com/2/svg/1f1ff-1f1e6.svg', + ZM: 'https://twemoji.maxcdn.com/2/svg/1f1ff-1f1f2.svg', + ZW: 'https://twemoji.maxcdn.com/2/svg/1f1ff-1f1fc.svg' +}; + +export default countryFlag; diff --git a/lib/token.ts b/lib/token.ts index a464e88..61f6585 100644 --- a/lib/token.ts +++ b/lib/token.ts @@ -21,8 +21,8 @@ export const getToken = async (user, customClaims = {}, admin = false) => { } }) - // loop? - const customClaim = JSON.parse(settings.value.replaceAll("[USER_ID]", user.id).replaceAll("[USER_EMAIL]", user.email).replaceAll("[USER_NAME]", user.name).replaceAll("[USER_KYC_STATUS]", user.kyc_verified).replaceAll("[USER_KYC_PROCESS_ID]", user.kyc_processed_id)) + + const customClaim = admin ? {} : JSON.parse(settings.value.replaceAll("[USER_ID]", user.id).replaceAll("[USER_EMAIL]", user.email).replaceAll("[USER_NAME]", user.name).replaceAll("[USER_KYC_STATUS]", user.kyc_verified).replaceAll("[USER_KYC_PROCESS_ID]", user.kyc_processed_id)) const token = jwt.sign( diff --git a/pages/_app.tsx b/pages/_app.tsx index e33b0db..ad6e184 100755 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -24,10 +24,6 @@ function MyApp({ Component, pageProps }) { - +
diff --git a/pages/api/auth/logout.ts b/pages/api/auth/logout.ts index b3f8688..999250e 100644 --- a/pages/api/auth/logout.ts +++ b/pages/api/auth/logout.ts @@ -6,7 +6,7 @@ import { ok, oops, response } from "lib/response"; import { NextApiRequest, NextApiResponse } from "next"; -export default async function Logouthandler(req: NextApiRequest, res: NextApiResponse) { +export default async function LogoutHandler(req: NextApiRequest, res: NextApiResponse) { if (req.method === "OPTIONS") { return res.status(200).send("ok") diff --git a/pages/api/auth/nonce.ts b/pages/api/auth/nonce.ts index 836b58a..3fdada0 100644 --- a/pages/api/auth/nonce.ts +++ b/pages/api/auth/nonce.ts @@ -16,7 +16,7 @@ import { corsMiddleware } from "lib/cors"; import { NextApiRequest, NextApiResponse } from "next"; -export default async function noncehandler(req: NextApiRequest, res: NextApiResponse) { +export default async function nonceHandler(req: NextApiRequest, res: NextApiResponse) { await corsMiddleware(req, res); diff --git a/pages/api/console/middlerware/checkAuth.ts b/pages/api/console/middlerware/checkAuth.ts index f4350e0..303259a 100644 --- a/pages/api/console/middlerware/checkAuth.ts +++ b/pages/api/console/middlerware/checkAuth.ts @@ -1,5 +1,7 @@ import { verify } from 'jsonwebtoken' +// Admin Authentication + const checkAuth = (handler) => { return async (req, res) => { try { @@ -9,7 +11,7 @@ const checkAuth = (handler) => { const token = authorization.split(" ")[1] - verify(token, process.env.JWT_SECRET); + verify(token, process.env.ADMIN_JWT_SECRET); handler(req, res) } catch (e) { diff --git a/pages/api/console/middlerware/checkUserAuth.ts b/pages/api/console/middlerware/checkUserAuth.ts new file mode 100644 index 0000000..9354852 --- /dev/null +++ b/pages/api/console/middlerware/checkUserAuth.ts @@ -0,0 +1,23 @@ +import { verify } from 'jsonwebtoken' + +// User Authentication + +const checkUserAuth = (handler) => { + return async (req, res) => { + try { + const authorization = req.headers["authorization"] + + if (!authorization) throw new Error("not authenticated") + const token = authorization.split(" ")[1] + + + verify(token, process.env.JWT_SECRET); + + handler(req, res) + } catch (e) { + res.status(401).send() + } + } +} + +export default checkUserAuth diff --git a/pages/api/user/profile.ts b/pages/api/user/profile.ts index 3ebc341..e74c0c8 100644 --- a/pages/api/user/profile.ts +++ b/pages/api/user/profile.ts @@ -1,10 +1,10 @@ import prisma from "lib/prisma"; import { ok } from "lib/response"; -import checkAuth from "../console/middlerware/checkAuth"; +import checkUserAuth from "../console/middlerware/checkUserAuth"; import jwt_decode from "jwt-decode"; import { corsMiddleware } from "lib/cors"; -export default checkAuth(async function updateProfileHandler(req, res) { +export default checkUserAuth(async function updateProfileHandler(req, res) { await corsMiddleware(req, res); const authorization = req.headers["authorization"]; diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index 9be3e48..b6e1aaa 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -96,8 +96,8 @@ export default function Dashboard({ newUsers, userCount, todaysUsers, lastLoginU )} - {user.name} - {user.email} + {user.name ?? '-'} + {user.email ?? '-'} - {user.name} - {user.email} + {user.name ?? '-'} + {user.email ?? '-'} -
+
{auth.token == '' ? ( <> diff --git a/pages/settings.tsx b/pages/settings.tsx index 237fd3b..78ef1f4 100644 --- a/pages/settings.tsx +++ b/pages/settings.tsx @@ -10,6 +10,7 @@ import useRequest from 'hooks/useRequests'; import { useEffect } from 'react'; import toast from 'react-hot-toast'; import { validateCookie } from 'lib/cookie'; +import CountrySelect from 'components/UI/CountrySelect'; export const getServerSideProps: GetStaticProps = async (context: any) => { return validateCookie(context, async () => { @@ -49,7 +50,7 @@ const SettingsPage = ({ records }) => { const form = useForm({ initialValues: { - country_blocklist: settings.country_blocklist, + country_blocklist: settings.country_blocklist.split(','), custom_jwt_claim: settings.custom_jwt_claim, log_user_logins: settings.log_user_logins, access_allowlist_only: settings.access_allowlist_only, @@ -75,7 +76,10 @@ const SettingsPage = ({ records }) => { e.preventDefault(); post({ - settings: form.values, + settings: { + ...form.values, + country_blocklist: form.values.country_blocklist.join(','), + }, }); }} > @@ -107,8 +111,7 @@ const SettingsPage = ({ records }) => { onChange={() => form.setFieldValue('log_user_logins', !form.values.log_user_logins)} /> -