import { useCallback, useMemo, useState } from 'react' import { ALL_KEYWORDS, Keyword, KEYWORDS } from '~/services/vacancies/vacancies.constants' import { VacancyData } from '~/services/vacancies/vacancies.types' import { AreaChart, MultiSelect, MultiSelectItem, Select, SelectItem } from '@tremor/react' import { useSearchParams } from '@remix-run/react' type Props = { data: VacancyData } const presets = { None: [], All: ALL_KEYWORDS, Backend: KEYWORDS.BACKEND, Databases: KEYWORDS.DATABASES, DevOps: KEYWORDS.DEVOPS, Frontend: KEYWORDS.FRONTEND, 'Frontend Frameworks': KEYWORDS.FRONTEND_FRAMEWORK, Mobile: KEYWORDS.MOBILE, ORM: KEYWORDS.ORM, Styles: KEYWORDS.STYLES, 'State Management': KEYWORDS.STATE_MANAGEMENT, Testing: KEYWORDS.TESTING, } const presetsForSelect = Object.entries(presets).map( ([label, value]) => ({ label, value, }) as const ) export function VacanciesChart({ data }: Props) { const [searchParams, setSearchParams] = useSearchParams() const [preset, setPreset] = useState('None' as keyof typeof presets) const selectedCategories = useMemo( () => searchParams.get('categories')?.split(',') || [], [searchParams] ) const setSelectedCategories = useCallback((value: Keyword[]) => { if (value.length === 0) { searchParams.delete('categories') } else { searchParams.set('categories', value.join(',')) } setSearchParams(searchParams) }, []) const sortedCategories = useMemo( () => sortCategoriesByVacancies(selectedCategories, data), [selectedCategories, data] ) const filteredData = useMemo( () => data.filter(row => { for (const category of selectedCategories) { // @ts-expect-error if (row[category] > 0) { return true } } }), [data, selectedCategories] ) return (
setSelectedCategories(value)} value={selectedCategories} > {ALL_KEYWORDS.map(category => ( ))}
) } const sortCategoriesByVacancies = (categories: string[], data: VacancyData) => { const entryToCompare = data.at(-1) return categories.sort((a, b) => { if (!entryToCompare) { return 0 } if (entryToCompare[a] === undefined && entryToCompare[b] === undefined) { return 0 } if (entryToCompare[a] > entryToCompare[b]) { return -1 } if (entryToCompare[a] < entryToCompare[b]) { return 1 } return 0 }) }