Merge pull request #14 from Duxez/game-type-check

#13 checks server type (mc) to make sure pteropack supports it
This commit is contained in:
Job Rapati 2023-09-29 08:50:13 +02:00 committed by GitHub
commit 9d9836eba2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 100 additions and 57 deletions

View File

@ -60,6 +60,10 @@ class ModpackController extends ClientApiController {
return $result->getBody()->getContents(); return $result->getBody()->getContents();
} }
public function getInstalledGame(Request $request, $server) {
return $server->egg->nest->name;
}
public function description(Request $request, $server, $modpack) { public function description(Request $request, $server, $modpack) {
$result = $this->http_client->get("mods/$modpack/description"); $result = $this->http_client->get("mods/$modpack/description");

View File

@ -0,0 +1,8 @@
import http from "@/api/http";
export default (uuid: string): Promise<string> => {
return new Promise((resolve, reject) => {
http.get(`/api/client/servers/${uuid}/modpacks/installedgame`)
.then((response) => resolve(response.data) )
});
}

View File

@ -1,19 +1,20 @@
import React, { useCallback, useEffect, useState } from 'react'; import React, { useCallback, useEffect, useState } from 'react';
import ServerContentBlock from "@/components/elements/ServerContentBlock"; import ServerContentBlock from "@/components/elements/ServerContentBlock";
import ModpackItem from './ModpackItem';
import { ServerContext } from '@/state/server'; import { ServerContext } from '@/state/server';
import getModpacks from '@/api/server/modpacks/getModpacks'; import getModpacks from '@/api/server/modpacks/getModpacks';
import FlashMessageRender from '@/components/FlashMessageRender'; import FlashMessageRender from '@/components/FlashMessageRender';
import tw from 'twin.macro'; import tw from 'twin.macro';
import Spinner from '@/components/elements/Spinner'; import Spinner from '@/components/elements/Spinner';
import Fade from '@/components/elements/Fade';
import { Modpack } from '@/api/server/modpacks/Modpack'; import { Modpack } from '@/api/server/modpacks/Modpack';
import Pagination from '@/components/elements/Pagination';
import { PaginatedResult } from '@/api/http'; import { PaginatedResult } from '@/api/http';
import GreyRowBox from '@/components/elements/GreyRowBox';
import TitledGreyBox from '@/components/elements/TitledGreyBox'; 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 Select from '@/components/elements/Select';
import ModpackItem from './ModpackItem';
import { set } from 'date-fns'; import { set } from 'date-fns';
export enum ModloaderType { export enum ModloaderType {
@ -36,8 +37,9 @@ export default() => {
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [modloaderType, setModloaderType] = useState<ModloaderType>(ModloaderType.Any); const [modloaderType, setModloaderType] = useState<ModloaderType>(ModloaderType.Any);
const [filters, setFilters] = useState<ModpackSearchFilter>({modloaderType: ModloaderType.Any}); const [filters, setFilters] = useState<ModpackSearchFilter>({modloaderType: ModloaderType.Any});
const [isMinecraft, setIsMinecraft] = useState<boolean>(false);
const [modpacks, setModpacks] = useState<PaginatedResult<Modpack>>(); const [modpacks, setModpacks] = useState<PaginatedResult<Modpack>>();
const [checkedInstalledGame, setCheckedInstalledGame] = useState<boolean>(false);
const changePage = (newPage: number) => { const changePage = (newPage: number) => {
setPage(newPage); setPage(newPage);
@ -58,10 +60,20 @@ export default() => {
} }
useEffect(() => { 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);
}
setCheckedInstalledGame(true);
changePage(1); });
}
}, [modloaderType]); }, [modloaderType]);
const updateFilterModloaderType = useCallback( const updateFilterModloaderType = useCallback(
@ -72,57 +84,75 @@ export default() => {
[modloaderType], [modloaderType],
); );
const showModpacks = () => {
setIsMinecraft(true);
setLoading(!modpacks?.items.length);
changePage(1);
}
return ( return (
<ServerContentBlock title="Modpacks"> <ServerContentBlock title="Modpacks">
<FlashMessageRender byKey={'modpacks'} css={tw`mb-4`} /> <FlashMessageRender byKey={'modpacks'} css={tw`mb-4`} />
{(modpacks == undefined || !modpacks?.items.length) && loading ? ( {!isMinecraft ? (
<Spinner size={'large'} centered /> <TitledGreyBox title="Server isn't a Minecraft server, currently Pteropack only supports Minecraft!">
<p css={tw`text-sm`}>
You can still install modpacks, but you will have to install them manually.
</p>
<Button.Danger onClick={showModpacks}>Show modpacks anyways</Button.Danger>
</TitledGreyBox>
) : ( ) : (
<Fade timeout={150}> <>
<div className='grid grid-cols-3 gap-4'> {(modpacks == undefined || !modpacks?.items.length) && loading ? (
<TitledGreyBox title='Filters' className='col-span-3'> <Spinner size={'large'} centered />
<GreyRowBox> ) : (
<div className='grid grid-cols-3 gap-4'> <Fade timeout={150}>
<Select defaultValue={modloaderType} onChange={updateFilterModloaderType}> <div className='grid grid-cols-3 gap-4'>
<option value={0}> <TitledGreyBox title='Filters' className='col-span-3'>
Any <GreyRowBox>
</option> <div className='grid grid-cols-3 gap-4'>
<option value={1}> <Select defaultValue={modloaderType} onChange={updateFilterModloaderType}>
Forge <option value={0}>
</option> Any
<option value={2}> </option>
Cauldron <option value={1}>
</option> Forge
<option value={3}> </option>
LiteLoader <option value={2}>
</option> Cauldron
<option value={4}> </option>
Fabric <option value={3}>
</option> LiteLoader
<option value={5}> </option>
Quilt <option value={4}>
</option> Fabric
</Select> </option>
</div> <option value={5}>
</GreyRowBox> Quilt
</TitledGreyBox> </option>
<Pagination data={modpacks as PaginatedResult<Modpack>} onPageSelect={changePage} paginationButtonsClassNames='col-span-3'> </Select>
{({ items }) => ( </div>
items.length > 0 ? ( </GreyRowBox>
modpacks?.items.map((modpack, index) => ( </TitledGreyBox>
<ModpackItem <Pagination data={modpacks as PaginatedResult<Modpack>} onPageSelect={changePage} paginationButtonsClassNames='col-span-3'>
key={modpack.id} {({ items }) => (
modpack={modpack} items.length > 0 ? (
/> modpacks?.items.map((modpack, index) => (
)) <ModpackItem
) : ( key={modpack.id}
<p css={tw`text-center text-sm text-neutral-300`}> modpack={modpack}
Couldn't fetch modpacks. />
</p> ))
))} ) : (
</Pagination> <p css={tw`text-center text-sm text-neutral-300`}>
</div> Couldn't fetch modpacks.
</Fade> </p>
))}
</Pagination>
</div>
</Fade>
)}
</>
)} )}
</ServerContentBlock> </ServerContentBlock>
); );

View File

@ -69,8 +69,9 @@ Route::group([
Route::group(['prefix' => '/modpacks'], function () { Route::group(['prefix' => '/modpacks'], function () {
Route::get('/', [Client\Servers\CurseForge\ModpackController::class, 'index']); 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}', [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']); Route::get('/{modpack}/description', [Client\Servers\CurseForge\ModpackController::class, 'description']);
}); });