import React, { useCallback, useContext, useEffect, useMemo } from "react"; import chroma from "chroma-js"; import Select, { createFilter, Styles } from "react-select"; import LogListContext from "../../hooks/LogListContext"; import LogFilterChoiceContext from "../../hooks/LogFilterChoiceContext"; import { Config } from "react-select/src/filters"; import cssStyles from "./LogFilterSelector.module.sass"; export default function LogFilterSelector(props: {}) { const {filter, updateFilter} = useContext(LogListContext); const {channelNames, eventNames, characters} = useContext(LogFilterChoiceContext); const options = useMemo(() => [ ...channelNames.map(n => ({type: 0, color: "#77BB77", value: n, label: n})), ...eventNames.map(n => ({type: 1, color: "#BB7777", value: n, label: n})), ...characters.map(c => ({type: 2, color: "#3377BB", value: c.id, label: c.name})), ], [channelNames, eventNames, characters]) const value = useMemo(() => { const value = []; if (filter.characters && filter.characters.length > 0) { value.push(...filter.characters.map(ch => options.find(c => c.type === 2 && c.value === ch))) } if (filter.events && filter.events.length > 0) { value.push(...filter.events.map(v => options.find(c => c.type === 1 && c.value === v))) } if (filter.channels && filter.channels.length > 0) { value.push(...filter.channels.map(v => options.find(c => c.type === 0 && c.value === v))) } return value }, [filter, options]) const setValue = useCallback((value: {type:number, value:string}[] ) => { if (value == null) { value = []; } updateFilter({ ...filter, channels: value.filter(v => v.type === 0).map(v => v.value), events: value.filter(v => v.type === 1).map(v => v.value), characters: value.filter(v => v.type === 2).map(v => v.value), }) }, [filter, updateFilter]); return (