import {FC, memo, useCallback, useMemo, useState} from "react"; import {FactorySelect} from "../FactorySelect/FactorySelect"; import {useFactories} from "../../../src/hooks/useFactories"; import {EnrichedEntity, Group} from "../../../src/types"; import styles from "./GroupBox.module.css" import {EntitySpan} from "../EntitySpan/EntitySpan"; import {useGroups} from "../../contexts/GroupProvider"; import {calculateInputs} from "../../../src/calculateInputs"; interface Props { group: Group } const GroupBoxBase: FC = ({ group }) => { const {factories, findFactory} = useFactories() const { doNotSuggest, setFactories, baseFactories, exportedFactories, ignoredFactories, setIgnoredFactories, renameGroup, removeGroup, getInputType } = useGroups() const { name, exports, malls } = group const [isDeleteConfirm, setDeleteConfirm] = useState(false) const [inputs, intermediates] = useMemo(() => { const allProducingFactories = [...exports, ...malls] return calculateInputs( allProducingFactories, ignoredFactories, baseFactories, exportedFactories, findFactory ) }, [exports, malls, ignoredFactories, baseFactories, findFactory, exportedFactories]) const [suggestionsExport, suggestionMall] = useMemo<[EnrichedEntity[], EnrichedEntity[]]>(() => { const selectedValues = Array.from(new Set([...exports, ...malls])) const availableIngredients = Array.from(new Set([...selectedValues, ...intermediates, ...inputs])) return factories .filter(factory => { if (!factory.recipe) return false if (selectedValues.includes(factory.href)) return false if (doNotSuggest.has(factory.href)) return false const prerequisites = Object.keys(factory.recipe.prerequisites ?? {}) return prerequisites.every(pre => availableIngredients.includes(pre)) }) .reduce((acc, factory) => (factory.usedBy?.length ?? 0) >= 3 ? [[...acc[0], factory], acc[1]] : [acc[0], [...acc[1], factory]], [[], []] as [EnrichedEntity[], EnrichedEntity[]] ) }, [exports, malls, intermediates, inputs, factories, doNotSuggest]) const addFactory = useCallback((uid: string, type: Parameters[2]) => { setFactories(name, [...group[type], uid], type) }, [group, name, setFactories]) const setExportFactories = useCallback((factories: string[]) => setFactories(name, factories, 'exports'), [setFactories, name]) const setMallFactories = useCallback((factories: string[]) => setFactories(name, factories, 'malls'), [setFactories, name]) return

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

Exported Factories

Mall Factories

{ inputs.length ? <>

Input Factories ({inputs.length})

{ inputs.map(input => { event.preventDefault() setIgnoredFactories([...ignoredFactories, input]) }} rightClickText={"Exclude this recipe from suggestions"} />) }
: null } { intermediates.length ? <>

Intermediate Factories ({intermediates.length})

{ intermediates.map(intermediate => ) }
: null } { suggestionsExport.length ? <>

Suggestions (Export)

{ suggestionsExport.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"} />) }
: null } { suggestionMall.length ? <>

Suggestions (Mall)

{ suggestionMall.map(suggestion => addFactory(suggestion.href, 'malls')} onContextMenu={event => { event.preventDefault() setIgnoredFactories([...ignoredFactories, suggestion.href]) }} leftClickText={"Add to mall factories"} rightClickText={"Exclude this recipe from suggestions"} />) }
: null }
} export const GroupBox = memo(GroupBoxBase)