#5 - add modloader type filter

This commit is contained in:
Job Rapati 2023-09-22 16:12:32 +02:00
parent e1ec05a30d
commit 85d197a526
3 changed files with 83 additions and 18 deletions

View File

@ -5,6 +5,7 @@ namespace Pterodactyl\Http\Controllers\Api\Client\Servers\CurseForge;
use GuzzleHttp\Client; use GuzzleHttp\Client;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Nette\NotImplementedException; use Nette\NotImplementedException;
use Pterodactyl\Exceptions\DisplayException; use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController; use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
@ -38,7 +39,12 @@ class ModpackController extends ClientApiController {
$index = $request->get('pageindex'); $index = $request->get('pageindex');
} }
$result = $this->http_client->get("mods/search?gameid=$this->minecraft_game_id&classid=$this->modpack_class_id&sortField=2&sortorder=desc&index=$index"); $queryString = '';
if($request->has('modloader') && $request->get('modloader') !== '0') {
$queryString .= '&modloadertype=' . $request->get('modloader');
}
$result = $this->http_client->get("mods/search?gameid=$this->minecraft_game_id&classid=$this->modpack_class_id&sortField=2&sortorder=desc&index=$index$queryString");
if($result->getStatusCode() !== 200) { if($result->getStatusCode() !== 200) {
throw new DisplayException('Failed to fetch modpacks from CurseForge.'); throw new DisplayException('Failed to fetch modpacks from CurseForge.');

View File

@ -1,13 +1,21 @@
import http, { PaginationDataSet } from '@/api/http' import http, { PaginationDataSet } from '@/api/http'
import { Modpack } from './Modpack'; import { Modpack } from './Modpack';
import { ModpackSearchFilter } from '@/components/server/modpacks/ModpackContainer';
export default (uuid: string, pageIndex: number = 0): Promise<any> => { export default (uuid: string, pageIndex: number = 0, filters: ModpackSearchFilter): Promise<any> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
http.get(`/api/client/servers/${uuid}/modpacks?pageindex=${pageIndex}`) let filterQuery = '&';
.then((response) => { if(filters.modloaderType) {
filterQuery += `modloader=${filters.modloaderType}`;
} else {
filterQuery += `modloader=0`;
}
console.log(rawDataToModpackPaginationData(response.data.pagination), response.data.pagination); console.log(filterQuery);
resolve([(response.data.data || []).map((item: any) => rawDataToModpackData(item)), rawDataToModpackPaginationData(response.data.pagination)])
http.get(`/api/client/servers/${uuid}/modpacks?pageindex=${pageIndex}${filterQuery}`)
.then((response) => {
resolve([(response.data.data || []).map((item: any) => rawDataToModpackData(item)), rawDataToModpackPaginationData(response.data.pagination), {modloaderType: filters.modloaderType}])
}) })
.catch(reject); .catch(reject);
}); });
@ -18,7 +26,7 @@ export const rawDataToModpackPaginationData = (data: any): PaginationDataSet =>
count: data.resultCount, count: data.resultCount,
perPage: data.pageSize, perPage: data.pageSize,
currentPage: Math.ceil((data.index + data.pageSize) / data.pageSize) == 0 ? 1 : Math.ceil((data.index + data.pageSize) / data.pageSize), currentPage: Math.ceil((data.index + data.pageSize) / data.pageSize) == 0 ? 1 : Math.ceil((data.index + data.pageSize) / data.pageSize),
totalPages: Math.ceil(data.totalCount / data.pageSize) + 1 totalPages: Math.ceil(data.totalCount / data.pageSize)
}); });
export const rawDataToModpackData = (data: any): Modpack => ({ export const rawDataToModpackData = (data: any): Modpack => ({

View File

@ -1,24 +1,41 @@
import React, { useEffect, useState } from 'react'; import React, { useCallback, useEffect, useState } from 'react';
import ServerContentBlock from "@/components/elements/ServerContentBlock"; import ServerContentBlock from "@/components/elements/ServerContentBlock";
import GreyRowBox from '@/components/elements/GreyRowBox';
import ModpackItem from './ModpackItem'; import ModpackItem from './ModpackItem';
import { ServerContext } from '@/state/server'; import { ServerContext } from '@/state/server';
import { useDeepMemoize } from '@/plugins/useDeepMemoize';
import { use } from 'i18next';
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 databases from '@/state/server/databases';
import Spinner from '@/components/elements/Spinner'; import Spinner from '@/components/elements/Spinner';
import Fade from '@/components/elements/Fade'; 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 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 { Dropdown } from '@/components/elements/dropdown';
import Select from '@/components/elements/Select';
import { set } from 'date-fns';
export enum ModloaderType {
Any,
Forge,
Cauldron,
LiteLoader,
Fabric,
Quilt
}
export interface ModpackSearchFilter {
modloaderType: ModloaderType;
}
export default() => { export default() => {
const uuid = ServerContext.useStoreState((state) => state.server.data!.uuid); const uuid = ServerContext.useStoreState((state) => state.server.data!.uuid);
const serverData = ServerContext.useStoreState((state) => state.server.data);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [modloaderType, setModloaderType] = useState<ModloaderType>(ModloaderType.Any);
const [filters, setFilters] = useState<ModpackSearchFilter>({modloaderType: ModloaderType.Any});
const [modpacks, setModpacks] = useState<PaginatedResult<Modpack>>(); const [modpacks, setModpacks] = useState<PaginatedResult<Modpack>>();
@ -32,9 +49,10 @@ export default() => {
console.log(pageIndex, modpacks.pagination.perPage, newPage); console.log(pageIndex, modpacks.pagination.perPage, newPage);
} }
getModpacks(uuid, pageIndex) getModpacks(uuid, pageIndex, filters)
.then((modpacksResult) => { .then((modpacksResult) => {
setModpacks({items: modpacksResult[0], pagination: modpacksResult[1]}); setModpacks({items: modpacksResult[0], pagination: modpacksResult[1]});
setModloaderType(modpacksResult[2].modloaderType);
setLoading(false); setLoading(false);
}) })
} }
@ -42,11 +60,17 @@ export default() => {
useEffect(() => { useEffect(() => {
setLoading(!modpacks?.items.length); setLoading(!modpacks?.items.length);
getModpacks(uuid)
.then((modpacksResult) => { changePage(1);
setModpacks({items: modpacksResult[0], pagination: modpacksResult[1]}); }, [modloaderType]);
});
}, []); const updateFilterModloaderType = useCallback(
(e: React.ChangeEvent<HTMLSelectElement>) => {
setFilters({modloaderType: parseInt(e.target.value)});
setModloaderType(parseInt(e.target.value));
},
[modloaderType],
);
return ( return (
<ServerContentBlock title="Modpacks"> <ServerContentBlock title="Modpacks">
@ -56,6 +80,32 @@ export default() => {
) : ( ) : (
<Fade timeout={150}> <Fade timeout={150}>
<div className='grid grid-cols-3 gap-4'> <div className='grid grid-cols-3 gap-4'>
<TitledGreyBox title='Filters' className='col-span-3'>
<GreyRowBox>
<div className='grid grid-cols-3 gap-4'>
<Select defaultValue={modloaderType} onChange={updateFilterModloaderType}>
<option value={0}>
Any
</option>
<option value={1}>
Forge
</option>
<option value={2}>
Cauldron
</option>
<option value={3}>
LiteLoader
</option>
<option value={4}>
Fabric
</option>
<option value={5}>
Quilt
</option>
</Select>
</div>
</GreyRowBox>
</TitledGreyBox>
<Pagination data={modpacks as PaginatedResult<Modpack>} onPageSelect={changePage} paginationButtonsClassNames='col-span-3'> <Pagination data={modpacks as PaginatedResult<Modpack>} onPageSelect={changePage} paginationButtonsClassNames='col-span-3'>
{({ items }) => ( {({ items }) => (
items.length > 0 ? ( items.length > 0 ? (
@ -77,3 +127,4 @@ export default() => {
</ServerContentBlock> </ServerContentBlock>
); );
} }