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 && ( + + )} +
    • + ); + })}
)}