mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-15 15:24:52 +09:00
* .jsx to .tsx * controller: tsc --build before webpack-cli * Type Annotation * disabled move into the <Input/> and <Checkbox/> * cleanup debug left over * documentation * default ModPack * modPackUpdateHandlers no undefined * PluginInfo changes proposition * PluginInfo changes proposition miss * ModRecord & ModInfo feedback loop at const mods = [ ? * ["connect", "drop", "resume", "close"] as const * .tsx to .ts when possible
50 lines
1.1 KiB
TypeScript
50 lines
1.1 KiB
TypeScript
import { useContext, useEffect, useState } from "react";
|
|
|
|
import * as lib from "@clusterio/lib";
|
|
|
|
import ControlContext from "../components/ControlContext";
|
|
|
|
const { logger } = lib;
|
|
|
|
export function useModList() {
|
|
let control = useContext(ControlContext);
|
|
let [modList, setModList] = useState<lib.ModInfo[]>([]);
|
|
|
|
function updateModList() {
|
|
control.send(new lib.ModListRequest()).then(mods => {
|
|
setModList(mods);
|
|
}).catch(err => {
|
|
logger.error(`Failed to list mods:\n${err}`);
|
|
});
|
|
}
|
|
|
|
useEffect(() => {
|
|
updateModList();
|
|
|
|
function updateHandler(newMod: lib.ModInfo) {
|
|
setModList(oldList => {
|
|
let newList = oldList.concat();
|
|
let index = newList.findIndex(mod => mod.name === newMod.name && mod.version === newMod.version);
|
|
if (!newMod.isDeleted) {
|
|
if (index !== -1) {
|
|
newList[index] = newMod;
|
|
} else {
|
|
newList.push(newMod);
|
|
}
|
|
} else if (index !== -1) {
|
|
newList.splice(index, 1);
|
|
}
|
|
return newList;
|
|
});
|
|
}
|
|
|
|
control.onModUpdate(null, updateHandler);
|
|
return () => {
|
|
control.offModUpdate(null, updateHandler);
|
|
};
|
|
}, []);
|
|
|
|
return [modList];
|
|
}
|
|
|