import { cx } from 'flairup'; import * as React from 'react'; import { useState } from 'react'; import { stylesheet } from '../../Stylesheet/stylesheet'; import { categoryFromCategoryConfig } from '../../config/categoryConfig'; import { useCategoriesConfig, useCategoryIconsConfig, } from '../../config/useConfig'; import { useActiveCategoryScrollDetection } from '../../hooks/useActiveCategoryScrollDetection'; import useIsSearchMode from '../../hooks/useIsSearchMode'; import { useScrollCategoryIntoView } from '../../hooks/useScrollCategoryIntoView'; import { useShouldHideCustomEmojis } from '../../hooks/useShouldHideCustomEmojis'; import { isCustomCategory } from '../../typeRefinements/typeRefinements'; import { Categories } from '../../types/exposedTypes'; import { useCategoryNavigationRef } from '../context/ElementRefContext'; import { useVisibleCategoriesState } from '../context/PickerContext'; import { CategoryButton } from './CategoryButton'; export function CategoryNavigation() { const [activeCategory, setActiveCategory] = useState(null); const [, setVisibleCategories] = useVisibleCategoriesState(); const scrollCategoryIntoView = useScrollCategoryIntoView(); useActiveCategoryScrollDetection({ setActiveCategory, setVisibleCategories }); const isSearchMode = useIsSearchMode(); const categoriesConfig = useCategoriesConfig(); const categoryIcons = useCategoryIconsConfig(); const CategoryNavigationRef = useCategoryNavigationRef(); const hideCustomCategory = useShouldHideCustomEmojis(); return (
{categoriesConfig.map((categoryConfig) => { const category = categoryFromCategoryConfig(categoryConfig); const isActiveCategory = category === activeCategory; if (isCustomCategory(categoryConfig) && hideCustomCategory) { return null; } const allowNavigation = !isSearchMode && !isActiveCategory; return ( { scrollCategoryIntoView(category); setTimeout(() => { setActiveCategory(category); }, 10); }} /> ); })}
); } const styles = stylesheet.create({ nav: { '.': 'epr-category-nav', display: 'flex', flexDirection: 'row', justifyContent: 'space-around', padding: 'var(--epr-header-padding)', }, '.epr-search-active': { nav: { opacity: '0.3', cursor: 'default', pointerEvents: 'none', }, }, '.epr-main:has(input:not(:placeholder-shown))': { nav: { opacity: '0.3', cursor: 'default', pointerEvents: 'none', }, }, });