diff --git a/app/Http/Controllers/Client/Servers/CurseForge/ModpackController.php b/app/Http/Controllers/Client/Servers/CurseForge/ModpackController.php index 9230f3c..e04b58d 100644 --- a/app/Http/Controllers/Client/Servers/CurseForge/ModpackController.php +++ b/app/Http/Controllers/Client/Servers/CurseForge/ModpackController.php @@ -60,6 +60,10 @@ class ModpackController extends ClientApiController { return $result->getBody()->getContents(); } + public function getInstalledGame(Request $request, $server) { + return $server->egg->nest->name; + } + public function description(Request $request, $server, $modpack) { $result = $this->http_client->get("mods/$modpack/description"); diff --git a/resources/scripts/api/server/modpacks/getInstalledGame.ts b/resources/scripts/api/server/modpacks/getInstalledGame.ts new file mode 100644 index 0000000..3b3e4ee --- /dev/null +++ b/resources/scripts/api/server/modpacks/getInstalledGame.ts @@ -0,0 +1,8 @@ +import http from "@/api/http"; + +export default (uuid: string): Promise => { + return new Promise((resolve, reject) => { + http.get(`/api/client/servers/${uuid}/modpacks/installedgame`) + .then((response) => resolve(response.data) ) + }); +} diff --git a/resources/scripts/components/server/modpacks/ModpackContainer.tsx b/resources/scripts/components/server/modpacks/ModpackContainer.tsx index 8fc83f6..c27e944 100644 --- a/resources/scripts/components/server/modpacks/ModpackContainer.tsx +++ b/resources/scripts/components/server/modpacks/ModpackContainer.tsx @@ -1,19 +1,20 @@ import React, { useCallback, useEffect, useState } from 'react'; import ServerContentBlock from "@/components/elements/ServerContentBlock"; -import ModpackItem from './ModpackItem'; import { ServerContext } from '@/state/server'; import getModpacks from '@/api/server/modpacks/getModpacks'; import FlashMessageRender from '@/components/FlashMessageRender'; import tw from 'twin.macro'; import Spinner from '@/components/elements/Spinner'; -import Fade from '@/components/elements/Fade'; import { Modpack } from '@/api/server/modpacks/Modpack'; -import Pagination from '@/components/elements/Pagination'; import { PaginatedResult } from '@/api/http'; -import GreyRowBox from '@/components/elements/GreyRowBox'; import TitledGreyBox from '@/components/elements/TitledGreyBox'; -import { Dropdown } from '@/components/elements/dropdown'; +import getInstalledGame from '@/api/server/modpacks/getInstalledGame'; +import { Button } from '@/components/elements/button/index'; +import Fade from '@/components/elements/Fade'; +import GreyRowBox from '@/components/elements/GreyRowBox'; +import Pagination from '@/components/elements/Pagination'; import Select from '@/components/elements/Select'; +import ModpackItem from './ModpackItem'; import { set } from 'date-fns'; export enum ModloaderType { @@ -36,8 +37,9 @@ export default() => { const [page, setPage] = useState(1); const [modloaderType, setModloaderType] = useState(ModloaderType.Any); const [filters, setFilters] = useState({modloaderType: ModloaderType.Any}); - + const [isMinecraft, setIsMinecraft] = useState(false); const [modpacks, setModpacks] = useState>(); + const [checkedInstalledGame, setCheckedInstalledGame] = useState(false); const changePage = (newPage: number) => { setPage(newPage); @@ -58,10 +60,20 @@ export default() => { } useEffect(() => { - setLoading(!modpacks?.items.length); + if(!checkedInstalledGame) { + getInstalledGame(uuid) + .then((installedGame) => { + if(installedGame == 'Minecraft') { + setIsMinecraft(true); + setLoading(!modpacks?.items.length); + changePage(1); + } else { + setIsMinecraft(false); + } - - changePage(1); + setCheckedInstalledGame(true); + }); + } }, [modloaderType]); const updateFilterModloaderType = useCallback( @@ -72,57 +84,75 @@ export default() => { [modloaderType], ); + const showModpacks = () => { + setIsMinecraft(true); + setLoading(!modpacks?.items.length); + changePage(1); + } + return ( - {(modpacks == undefined || !modpacks?.items.length) && loading ? ( - + {!isMinecraft ? ( + +

+ You can still install modpacks, but you will have to install them manually. +

+ Show modpacks anyways +
+ ) : ( - -
- - -
- -
-
-
- } onPageSelect={changePage} paginationButtonsClassNames='col-span-3'> - {({ items }) => ( - items.length > 0 ? ( - modpacks?.items.map((modpack, index) => ( - - )) - ) : ( -

- Couldn't fetch modpacks. -

- ))} -
-
-
+ <> + {(modpacks == undefined || !modpacks?.items.length) && loading ? ( + + ) : ( + +
+ + +
+ +
+
+
+ } onPageSelect={changePage} paginationButtonsClassNames='col-span-3'> + {({ items }) => ( + items.length > 0 ? ( + modpacks?.items.map((modpack, index) => ( + + )) + ) : ( +

+ Couldn't fetch modpacks. +

+ ))} +
+
+
+ )} + )}
); diff --git a/routes/api-client.php b/routes/api-client.php index 5de80cd..802aa29 100644 --- a/routes/api-client.php +++ b/routes/api-client.php @@ -69,8 +69,9 @@ Route::group([ Route::group(['prefix' => '/modpacks'], function () { Route::get('/', [Client\Servers\CurseForge\ModpackController::class, 'index']); + Route::get('/installedgame', [Client\Servers\CurseForge\ModpackController::class, 'getInstalledGame']); Route::get('/{modpack}', [Client\Servers\CurseForge\ModpackController::class, 'show']); - Route::get('/{modpack}/install', [Client\Servers\CurseForge\ModpackController::class, 'install']); + Route::get('/{modpack}/install/{file}', [Client\Servers\CurseForge\ModpackController::class, 'install']); Route::get('/{modpack}/description', [Client\Servers\CurseForge\ModpackController::class, 'description']); });