/******************************************************************************** * Copyright (c) 2019 TypeFox and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0. * * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ import { ChangeEvent, FunctionComponent, KeyboardEvent, useContext, useEffect, useState } from 'react'; import { Box, Paper, InputBase, Select, MenuItem, Container, SelectChangeEvent } from '@mui/material'; import { ExtensionCategory, SortBy, SortOrder } from '../../extension-registry-types'; import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; import ArrowDownwardIcon from '@mui/icons-material/ArrowDownward'; import { ExtensionListSearchfield } from './extension-list-searchfield'; import { MainContext } from '../../context'; export const ExtensionListHeader: FunctionComponent = props => { const [categories, setCategories] = useState([]); const [category, setCategory] = useState(''); const [sortBy, setSortBy] = useState('relevance'); const [sortOrder, setSortOrder] = useState('desc'); const context = useContext(MainContext); useEffect(() => { const categories = Array.from(context.service.getCategories()); categories.sort((a, b) => { if (a === b) return 0; if (a === 'Other') return 1; if (b === 'Other') return -1; return a.localeCompare(b); }); setCategories(categories); setCategory(props.category ?? ''); setSortBy(props.sortBy); setSortOrder(props.sortOrder); }, []); useEffect(() => { setCategory(props.category ?? ''); setSortBy(props.sortBy); setSortOrder(props.sortOrder); }, [props.category, props.sortBy, props.sortOrder]); const handleCategoryChange = (event: SelectChangeEvent) => { const category = event.target.value as ExtensionCategory ?? ''; setCategory(category); props.onCategoryChanged(category); }; const handleSearchChange = (value: string) => { props.onSearchChanged(value); }; const handleSearchSubmit = (value: string) => { props.onSearchSubmit(value); }; const handleSortByChange = (event: ChangeEvent) => { const sortBy = event.target.value as SortBy; setSortBy(sortBy); props.onSortByChanged(sortBy); }; const handleSortOrderChange = () => { const newSortOrder = sortOrder === 'asc' ? 'desc' : 'asc'; setSortOrder(newSortOrder); props.onSortOrderChanged(newSortOrder); }; const renderValue = (value: string) => { return value === '' ? All Categories : value; }; const SearchHeader = context.pageSettings.elements.searchHeader; return {SearchHeader ? : ''} {`${props.resultNumber} Result${props.resultNumber !== 1 ? 's' : ''}`} Sort by { if (e.key === 'Enter') { e.preventDefault(); handleSortOrderChange(); } }} onClick={handleSortOrderChange}> { sortOrder === 'asc' ? : } ; }; export interface ExtensionListHeaderProps { onSearchChanged: (s: string) => void; onSearchSubmit: (s: string) => void; onCategoryChanged: (c: ExtensionCategory) => void; onSortByChanged: (sb: SortBy) => void; onSortOrderChanged: (so: SortOrder) => void; searchQuery?: string; category?: ExtensionCategory | ''; sortBy: SortBy, sortOrder: SortOrder, resultNumber: number; }