mirror of https://github.com/Duxez/PteroPack.git
#5 - add modloader type filter
This commit is contained in:
parent
e1ec05a30d
commit
85d197a526
|
|
@ -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.');
|
||||||
|
|
|
||||||
|
|
@ -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 => ({
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue