import {FC, memo, useCallback, useEffect, useMemo} from "react"; import {FactorySelect} from "../FactorySelect/FactorySelect"; import {useFactories} from "../../../src/hooks/useFactories"; import {EnrichedEntity, Entity, Group} from "../../../src/types"; import styles from "./Group.module.css" import {EntitySpan} from "../EntitySpan/EntitySpan"; import {useGroups} from "../../contexts/GroupProvider"; interface Props { group: Group } const GroupBoxBase: FC = ({ group }) => { const {factories, findFactory} = useFactories() console.log("group") const { doNotSuggest, setFactories, baseFactories, exportedFactories, ignoredFactories, setIgnoredFactories, renameGroup, removeGroup, getInputType } = useGroups() const { name, exports, malls } = group const [inputs, intermediates] = useMemo<[string[], string[]]>(() => { const allProducingFactories = [...exports, ...malls] const prducingSet = new Set(allProducingFactories) const ignored = new Set(ignoredFactories) const base = new Set(baseFactories) const inputs = new Set() const intermediates = new Set() let next: string|undefined while (next = allProducingFactories.pop()) { const pres = Object.keys(findFactory(next)?.recipe?.prerequisites ?? {}) for (const pre of pres) { if (exportedFactories.has(pre) || base.has(pre)) { if (!prducingSet.has(pre)) inputs.add(pre) } else if (!intermediates.has(pre)) { if (!prducingSet.has(pre)) intermediates.add(pre) allProducingFactories.push(pre) } } } return [ Array.from(inputs).sort((a, b) => a.localeCompare(b)), Array.from(intermediates).sort((a, b) => a.localeCompare(b)) ] }, [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 = (uid: string, type: Parameters[2]) => { setFactories(name, [...group[type], uid], type) } 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)