import { useCallback, useMemo } from 'react' import { KeywordsResponse, 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 keywords?: KeywordsResponse } export function VacanciesChart({ data, keywords }: Props) { const [searchParams, setSearchParams] = useSearchParams() const presetsForSelect = useMemo( () => Object.entries(keywords?.presets ?? {}).map( ([label, value]) => ({ label, value, }) as const ), [keywords?.presets] ) const selectedCategories = useMemo( () => searchParams.get('categories')?.split(',') || [], [searchParams] ) const preset = useMemo(() => { return searchParams.get('preset') ?? 'None' }, [searchParams]) const setPreset = useCallback( (value: string | null) => { if (!value || value === 'None') { searchParams.delete('preset') } else { searchParams.set('preset', value) } setSearchParams(searchParams) }, [searchParams, setSearchParams] ) const categoriesForChart = useMemo(() => { return data?.categories.filter(category => selectedCategories.includes(category)) ?? [] }, [selectedCategories, data?.categories]) const setSelectedCategories = useCallback( (value: string[]) => { if (value.length === 0) { searchParams.delete('categories') } else { searchParams.set('categories', value.join(',')) } setSearchParams(searchParams) }, [searchParams, setSearchParams] ) const filteredData = useMemo( () => data?.data?.filter(row => { for (const category of selectedCategories) { const value = row[category] if (typeof value === 'number' && value > 0) { return true } } }) ?? [], [data?.data, selectedCategories] ) const handlePresetChange = useCallback( (value: string) => { setPreset(value) setSelectedCategories(keywords?.presets[value] ?? []) }, [keywords?.presets, setSelectedCategories, setPreset] ) const handleKeywordsChange = useCallback( (value: string[]) => { setSelectedCategories(value ?? []) setPreset(null) }, [setSelectedCategories, setPreset] ) const multiSelectItems = useMemo(() => { return keywords?.allKeywords.map(category => ( )) }, [keywords?.allKeywords]) const presetSelectItems = useMemo(() => { return presetsForSelect.map(category => ( )) }, [presetsForSelect]) return ( <>
{multiSelectItems}
) }