import {FC, useMemo} from "react"; import {FactorySelect} from "../FactorySelect/FactorySelect"; import {useDetails} from "../../../src/hooks/useDetails"; import {Entity, Group} from "../../../src/types"; import styles from "./Group.module.css" import {EntitySpan} from "../EntitySpan/EntitySpan"; import {useGroups} from "../../contexts/GroupProvider"; interface Props { index: number } export const GroupBox: FC = ({ index }) => { const details = useDetails() const { getGroup, doNotSuggest, setFactories, ignoredFactories, setIgnoredFactories, renameGroup, removeGroup, getInputType } = useGroups() const { name, inputs, intermediates, exports, malls } = getGroup(index) const calculatedInputs = useMemo(() => { const allProducingFactories = [...intermediates, ...exports, ...malls] const newData: string[] = details .filter(detail => allProducingFactories.includes(detail.href)) .flatMap(detail => Object.keys(detail.recipe?.prerequisites ?? {})) const uniqueInputs = Array.from(new Set(newData)) return uniqueInputs .filter(input => !allProducingFactories.includes(input)) }, [details, intermediates, exports, malls]) const suggestions = useMemo(() => { const selectedValues = Array.from(new Set([...inputs, ...intermediates, ...exports, ...malls])) const availableIngredients = Array.from(new Set([...selectedValues, ...calculatedInputs])) return details .filter(detail => { if (!detail.recipe) return false if (selectedValues.includes(detail.href)) return false if (doNotSuggest.has(detail.href)) return false const prerequisites = Object.keys(detail.recipe?.prerequisites ?? {}) return prerequisites.every(pre => availableIngredients.includes(pre)) }) }, [doNotSuggest, details, calculatedInputs, inputs, intermediates, exports, malls]) const addFactory = (uid: string, type: Parameters[2]) => { setFactories(index, [...intermediates, uid], 'intermediates') } return

{ event.currentTarget.innerText = event.currentTarget.innerText.trim() renameGroup(index, event.currentTarget.innerText); }} > {name}

setFactories(index, factories, 'inputs')} /> setFactories(index, factories, 'intermediates')} /> setFactories(index, factories, 'exports')} /> setFactories(index, factories, 'malls')} />

Inputs

    { calculatedInputs.map(input =>
  • addFactory(input, 'intermediates')} style={{color: {base: 'darkgreen', produced: 'orange', unknown: undefined}[getInputType(input)]}} leftClickText={"Add to intermediate factories"} />
  • ) }

Suggestions

    {suggestions.map(suggestion =>
  • addFactory(suggestion.href, 'exports')} onContextMenu={event => { event.preventDefault() setIgnoredFactories([...ignoredFactories, suggestion.href]) }} leftClickText={"Add to exported factories"} rightClickText={"Exclude this recipe from suggestions"} />
  • )}
}