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 (