mirror of
https://github.com/mosh-hamedani/game-hub.git
synced 2026-05-21 12:14:32 +02:00
Sort the games
This commit is contained in:
parent
d62ca49e21
commit
e2941cfba3
|
|
@ -12,6 +12,7 @@ import { Genre } from "./hooks/useGenres";
|
||||||
export interface GameQuery {
|
export interface GameQuery {
|
||||||
genre: Genre | null;
|
genre: Genre | null;
|
||||||
platform: Platform | null;
|
platform: Platform | null;
|
||||||
|
sortOrder: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
|
|
@ -39,7 +40,7 @@ function App() {
|
||||||
<GridItem area="main">
|
<GridItem area="main">
|
||||||
<HStack spacing={5} paddingLeft={2} marginBottom={5}>
|
<HStack spacing={5} paddingLeft={2} marginBottom={5}>
|
||||||
<PlatformSelector selectedPlatform={gameQuery.platform} onSelectPlatform={(platform) => setGameQuery({ ...gameQuery, platform}) } />
|
<PlatformSelector selectedPlatform={gameQuery.platform} onSelectPlatform={(platform) => setGameQuery({ ...gameQuery, platform}) } />
|
||||||
<SortSelector />
|
<SortSelector sortOrder={gameQuery.sortOrder} onSelectSortOrder={(sortOrder) => setGameQuery({ ...gameQuery, sortOrder })} />
|
||||||
</HStack>
|
</HStack>
|
||||||
<GameGrid gameQuery={gameQuery} />
|
<GameGrid gameQuery={gameQuery} />
|
||||||
</GridItem>
|
</GridItem>
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,37 @@
|
||||||
import { Button, Menu, MenuButton, MenuItem, MenuList } from '@chakra-ui/react';
|
import { Button, Menu, MenuButton, MenuItem, MenuList } from "@chakra-ui/react";
|
||||||
import { BsChevronDown } from 'react-icons/bs';
|
import { BsChevronDown } from "react-icons/bs";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
onSelectSortOrder: (sortOrder: string) => void;
|
||||||
|
sortOrder: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SortSelector = ({ onSelectSortOrder, sortOrder }: Props) => {
|
||||||
|
const sortOrders = [
|
||||||
|
{ value: "", label: "Relevance" },
|
||||||
|
{ value: "-added", label: "Date added" },
|
||||||
|
{ value: "name", label: "Name" },
|
||||||
|
{ value: "-released", label: "Release date" },
|
||||||
|
{ value: "-metacritic", label: "Popularity" },
|
||||||
|
{ value: "-rating", label: "Average rating" },
|
||||||
|
];
|
||||||
|
|
||||||
|
const currentSortOrder = sortOrders.find(order => order.value === sortOrder);
|
||||||
|
|
||||||
const SortSelector = () => {
|
|
||||||
return (
|
return (
|
||||||
<Menu>
|
<Menu>
|
||||||
<MenuButton as={Button} rightIcon={<BsChevronDown />}>
|
<MenuButton as={Button} rightIcon={<BsChevronDown />}>
|
||||||
Order by: Relevance
|
Order by: {currentSortOrder?.label || 'Relevance'}
|
||||||
</MenuButton>
|
</MenuButton>
|
||||||
<MenuList>
|
<MenuList>
|
||||||
<MenuItem>Relevance</MenuItem>
|
{sortOrders.map((order) => (
|
||||||
<MenuItem>Date added</MenuItem>
|
<MenuItem onClick={() => onSelectSortOrder(order.value)} key={order.value} value={order.value}>
|
||||||
<MenuItem>Name</MenuItem>
|
{order.label}
|
||||||
<MenuItem>Release date</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem>Popularity</MenuItem>
|
))}
|
||||||
<MenuItem>Average rating</MenuItem>
|
|
||||||
</MenuList>
|
</MenuList>
|
||||||
</Menu>
|
</Menu>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
export default SortSelector
|
export default SortSelector;
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ const useGames = (gameQuery: GameQuery) =>
|
||||||
params: {
|
params: {
|
||||||
genres: gameQuery.genre?.id,
|
genres: gameQuery.genre?.id,
|
||||||
platforms: gameQuery.platform?.id,
|
platforms: gameQuery.platform?.id,
|
||||||
|
ordering: gameQuery.sortOrder
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
[gameQuery]
|
[gameQuery]
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
|
|
||||||
const getCroppedImageUrl = (url: string) => {
|
const getCroppedImageUrl = (url: string) => {
|
||||||
|
if (!url) return '';
|
||||||
|
|
||||||
const target = 'media/';
|
const target = 'media/';
|
||||||
const index = url.indexOf(target) + target.length;
|
const index = url.indexOf(target) + target.length;
|
||||||
return url.slice(0, index) + 'crop/600/400/' + url.slice(index);
|
return url.slice(0, index) + 'crop/600/400/' + url.slice(index);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue