Skip to content

Commit 44803e3

Browse files
feat: download all deps in parallel and fix missing dep btn
1 parent 5c50889 commit 44803e3

File tree

6 files changed

+265
-119
lines changed

6 files changed

+265
-119
lines changed

resources/dist.rc

756 Bytes
Binary file not shown.

src/celemod-ui/locales/en-US.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,5 +228,6 @@
228228
"(已禁用)": "(已禁用)",
229229
"将要删除:": "将要删除:",
230230
"以下 Mod 将不再被任何 Mod 引用,是否一并删除?": "以下 Mod 将不再被任何 Mod 引用,是否一并删除?",
231-
"确认删除": "确认删除"
231+
"确认删除": "确认删除",
232+
"补全缺失依赖 ({count})": "Fix Missing Deps ({count})"
232233
}

src/celemod-ui/locales/zh-CN.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,5 +228,6 @@
228228
"(已禁用)": "(已禁用)",
229229
"将要删除:": "将要删除:",
230230
"以下 Mod 将不再被任何 Mod 引用,是否一并删除?": "以下 Mod 将不再被任何 Mod 引用,是否一并删除?",
231-
"确认删除": "确认删除"
231+
"确认删除": "确认删除",
232+
"补全缺失依赖 ({count})": "补全缺失依赖 ({count})"
232233
}

src/celemod-ui/src/components/DownloadList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const Task = ({ task }: { task: Download.TaskInfo }) => {
3434
{task.subtasks
3535
.filter((v) => v.state !== 'Finished')
3636
.map((subtask) => (
37-
<div class="subTask">
37+
<div class="subTask" key={subtask.name}>
3838
<div class="name">{subtask.name}</div>
3939
<div className="progressLine">
4040
<div class="progress">

src/celemod-ui/src/routes/Manage.tsx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,24 @@ export const Manage = () => {
10081008

10091009
const { download } = useGlobalContext();
10101010

1011+
// Collect all unique missing dependencies across all installed mods
1012+
const missingDeps = useMemo(() => {
1013+
const missing = new Map<string, string>(); // name -> version
1014+
for (const mod of installedModMap.values()) {
1015+
for (const dep of mod._deps) {
1016+
if (excludeList.includes(dep.name)) continue;
1017+
if (!installedModMap.has(dep.name)) {
1018+
if (!missing.has(dep.name)) {
1019+
missing.set(dep.name, dep.version);
1020+
}
1021+
}
1022+
}
1023+
}
1024+
return [...missing.entries()].map(([name, version]) => ({ name, version }));
1025+
}, [installedModMap]);
1026+
1027+
const [fixDepsState, setFixDepsState] = useState<'idle' | 'downloading'>('idle');
1028+
10111029
return (
10121030
<div className="manage">
10131031
<modListContext.Provider value={manageCtx}>
@@ -1181,6 +1199,48 @@ export const Manage = () => {
11811199
{hasUpdateBtnState}
11821200
</button>
11831201
)}
1202+
{missingDeps.length > 0 && (
1203+
<button
1204+
onClick={() => {
1205+
if (fixDepsState === 'downloading') return;
1206+
setFixDepsState('downloading');
1207+
const remaining = new Set(missingDeps.map((d) => d.name));
1208+
for (const dep of missingDeps) {
1209+
callRemote('get_mod_update', dep.name, (data: string) => {
1210+
if (!data) {
1211+
remaining.delete(dep.name);
1212+
if (remaining.size === 0) {
1213+
setFixDepsState('idle');
1214+
manageCtx.reloadMods();
1215+
}
1216+
return;
1217+
}
1218+
const [gbFileId] = JSON.parse(data);
1219+
download.downloadMod(dep.name, gbFileId, {
1220+
autoDisableNewMods: manageCtx.autoDisableNewMods,
1221+
onFinished: () => {
1222+
remaining.delete(dep.name);
1223+
if (remaining.size === 0) {
1224+
setFixDepsState('idle');
1225+
manageCtx.reloadMods();
1226+
}
1227+
},
1228+
onFailed: () => {
1229+
remaining.delete(dep.name);
1230+
if (remaining.size === 0) {
1231+
setFixDepsState('idle');
1232+
}
1233+
},
1234+
});
1235+
});
1236+
}
1237+
}}
1238+
>
1239+
{fixDepsState === 'downloading'
1240+
? _i18n.t('下载中')
1241+
: _i18n.t('补全缺失依赖 ({count})', { count: missingDeps.length })}
1242+
</button>
1243+
)}
11841244
</div>
11851245
<div className="list" ref={modsTreeRef}>
11861246
{installedModsTree.map((v) => (

0 commit comments

Comments
 (0)