diff --git a/apps/web/src/pages/mods.tsx b/apps/web/src/pages/mods.tsx
index 692cfc0..7e6c58d 100644
--- a/apps/web/src/pages/mods.tsx
+++ b/apps/web/src/pages/mods.tsx
@@ -45,6 +45,7 @@ function ModsBody({ slug, user }: { slug: string; user: CurrentUser }) {
const save = useSetServerMods(slug);
const [draft, setDraft] = useState(null);
const [message, setMessage] = useState(null);
+ const [selectedModId, setSelectedModId] = useState(null);
const serverMods = data?.mods ?? [];
const mods = draft ?? serverMods;
@@ -135,11 +136,14 @@ function ModsBody({ slug, user }: { slug: string; user: CurrentUser }) {
{mod.version ? ` · v${mod.version}` : ' · latest version'}
- {canManage && (
-
- )}
+
+
+ {canManage && (
+
+ )}
+
))}
@@ -151,7 +155,13 @@ function ModsBody({ slug, user }: { slug: string; user: CurrentUser }) {
-
+
);
}
@@ -160,17 +170,20 @@ function WorkshopBrowser({
canManage,
installedIds,
onAdd,
+ selectedModId,
+ setSelectedModId,
}: {
canManage: boolean;
installedIds: Set;
onAdd: (mod: ReforgerConfigMod) => void;
+ selectedModId: string | null;
+ setSelectedModId: (id: string | null) => void;
}) {
const [input, setInput] = useState('');
const [query, setQuery] = useState('');
const [activeTag, setActiveTag] = useState(null);
const [sort, setSort] = useState<(typeof WORKSHOP_SORTS)[number]['value']>('popularity');
const [page, setPage] = useState(1);
- const [selectedModId, setSelectedModId] = useState(null);
const [addingId, setAddingId] = useState(null);
const effectiveQuery = [query, activeTag].filter(Boolean).join(' ');
const { data, isFetching, error } = useWorkshopSearch(effectiveQuery, page, sort);
@@ -352,6 +365,24 @@ function ModDetailPanel({
onTagSelect: (tag: string) => void;
}) {
const { data: mod, isLoading } = useWorkshopMod(modId);
+ const [addingDepId, setAddingDepId] = useState(null);
+
+ const addDep = async (depId: string, depName: string) => {
+ setAddingDepId(depId);
+ try {
+ const detail = await api.get(`/api/workshop/mods/${depId}`);
+ onAdd({
+ modId: detail.id,
+ name: detail.name || depName,
+ ...(detail.version ? { version: detail.version } : {}),
+ });
+ } catch {
+ onAdd({ modId: depId, name: depName });
+ } finally {
+ setAddingDepId(null);
+ }
+ };
+
if (!modId) {
return (
@@ -393,13 +424,33 @@ function ModDetailPanel({
)}
{mod.dependencies.length > 0 && (
-
- Dependencies (add these too)
-
-
- {mod.dependencies.map((dep) => (
- - {dep.name}
- ))}
+ Dependencies
+
+ {mod.dependencies.map((dep) => {
+ const depInstalled = dep.id ? installedIds.has(dep.id.toUpperCase()) : false;
+ return (
+ -
+
+ {dep.name}
+ {depInstalled && (
+ Installed
+ )}
+
+ {canManage && dep.id && !depInstalled && (
+
+ )}
+
+ );
+ })}
)}