Sort the games

This commit is contained in:
Mosh Hamedani 2023-03-03 09:00:14 -08:00
parent d62ca49e21
commit e2941cfba3
4 changed files with 32 additions and 13 deletions

View file

@ -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>

View file

@ -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;

View file

@ -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]

View file

@ -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);