Second frontend, written in Next.JS + Typescript.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.7 KiB

  1. import React, { useState, useCallback, useEffect, useContext } from "react";
  2. import { LogHeaderCharacter } from "../lib/rpdata/logs";
  3. import LogListContext from "./LogListContext";
  4. export interface LogFilterChoiceContextData {
  5. characters: LogHeaderCharacter[]
  6. channelNames: string[]
  7. eventNames: string[]
  8. }
  9. const LogFilterChoiceContext: React.Context<LogFilterChoiceContextData> = React.createContext({
  10. characters: [],
  11. channelNames: [],
  12. eventNames: [],
  13. });
  14. interface LogFilterChoiceContextProviderProps {
  15. children: JSX.Element | JSX.Element[]
  16. }
  17. export function LogFilterChoiceContextProvider(props: LogFilterChoiceContextProviderProps) {
  18. const {headers} = useContext(LogListContext);
  19. const [value, setValue] = useState<LogFilterChoiceContextData>({
  20. characters: [],
  21. channelNames: [],
  22. eventNames: [],
  23. });
  24. useEffect(() => {
  25. const characters = new Map<string, LogHeaderCharacter>();
  26. const channelNames = new Set<string>();
  27. const eventNames = new Set<string>();
  28. for (const header of headers) {
  29. for (const character of header.characters) {
  30. characters.set(character.id, character);
  31. }
  32. channelNames.add(header.channelName);
  33. if (header.eventName) {
  34. eventNames.add(header.eventName);
  35. }
  36. }
  37. setValue(c => c.characters.length < characters.size ? {
  38. channelNames: Array.from(channelNames.values()),
  39. eventNames: Array.from(eventNames.values()),
  40. characters: Array.from(characters.values()),
  41. } : c);
  42. }, [headers])
  43. return (
  44. <LogFilterChoiceContext.Provider value={value}>
  45. {props.children}
  46. </LogFilterChoiceContext.Provider>
  47. );
  48. }
  49. export default LogFilterChoiceContext