feat: sorting on explore view (#220)

* chore: add orderBy params on query

* feat: add sorting on explore view
This commit is contained in:
Camila Sosa Morales 2023-04-12 12:56:38 -03:00 committed by GitHub
parent 361855946a
commit c4ced2ff93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 14 deletions

View File

@ -1,9 +1,15 @@
query lastNFAsPaginated($pageSize: Int, $skip: Int, $searchValue: String) { query lastNFAsPaginated(
$pageSize: Int
$skip: Int
$orderBy: Token_orderBy
$orderDirection: OrderDirection
$searchValue: String
) {
tokens( tokens(
first: $pageSize first: $pageSize
skip: $skip skip: $skip
orderDirection: desc orderDirection: $orderDirection
orderBy: tokenId orderBy: $orderBy
where: { name_contains_nocase: $searchValue } where: { name_contains_nocase: $searchValue }
) { ) {
id id

View File

@ -43,7 +43,7 @@ const client = new ApolloClient({
Query: { Query: {
fields: { fields: {
tokens: { tokens: {
keyArgs: ['where'], keyArgs: ['where', 'orderBy', 'orderDirection'],
merge: mergeByKey('id'), merge: mergeByKey('id'),
}, },
}, },

View File

@ -19,8 +19,15 @@ const LoadingSkeletons: React.FC = () => (
); );
export const NFAListFragment: React.FC = () => { export const NFAListFragment: React.FC = () => {
const { endReached, pageNumber, search, setEndReached, setPageNumber } = const {
Explore.useContext(); endReached,
orderBy,
orderDirection,
pageNumber,
search,
setEndReached,
setPageNumber,
} = Explore.useContext();
const { const {
data: { tokens } = { tokens: [] }, data: { tokens } = { tokens: [] },
@ -31,6 +38,8 @@ export const NFAListFragment: React.FC = () => {
variables: { variables: {
pageSize, pageSize,
searchValue: search, searchValue: search,
orderBy,
orderDirection,
skip: pageNumber * pageSize, //skip is for the pagination skip: pageNumber * pageSize, //skip is for the pagination
}, },
onCompleted: (data) => { onCompleted: (data) => {

View File

@ -7,15 +7,50 @@ import { Explore } from '../explore.context';
import { ResultsContainer, ResultsNumber, ResultsText } from './results.styles'; import { ResultsContainer, ResultsNumber, ResultsText } from './results.styles';
const orderResults: DropdownItem[] = [ const orderResults: DropdownItem[] = [
{ value: 'a-z', label: 'Sort A-Z' }, { value: 'newest', label: 'Newest' },
{ value: 'z-a', label: 'Sort Z-A' }, { value: 'oldest', label: 'Oldest' },
{ value: 'a-z', label: 'Name A-Z' },
{ value: 'z-a', label: 'Name Z-A' },
]; ];
export const NFASearchFragment: React.FC = () => { export const NFASearchFragment: React.FC = () => {
const { setSearch } = Explore.useContext(); const {
setEndReached,
setOrderBy,
setOrderDirection,
setSearch,
setPageNumber,
} = Explore.useContext();
const [selectedValue, setSelectedValue] = useState<DropdownItem>( const [selectedValue, setSelectedValue] = useState<DropdownItem>(
orderResults[0] orderResults[0]
); //TODO replace for context );
const handleSortChange = (item: DropdownItem): void => {
setSelectedValue(item);
setPageNumber(0);
setEndReached(false);
switch (item.value) {
case 'newest':
setOrderBy('tokenId');
setOrderDirection('desc');
break;
case 'oldest':
setOrderBy('tokenId');
setOrderDirection('asc');
break;
case 'a-z':
setOrderBy('name');
setOrderDirection('asc');
break;
case 'z-a':
setOrderBy('name');
setOrderDirection('desc');
break;
default:
break;
}
};
const handleSearch = useDebounce( const handleSearch = useDebounce(
(searchValue: string) => setSearch(searchValue), (searchValue: string) => setSearch(searchValue),
@ -42,7 +77,7 @@ export const NFASearchFragment: React.FC = () => {
<Dropdown <Dropdown
items={orderResults} items={orderResults}
selectedValue={selectedValue} selectedValue={selectedValue}
onChange={setSelectedValue} onChange={handleSortChange}
backgroundColor="slate4" backgroundColor="slate4"
textColor="slate11" textColor="slate11"
optionsWidth="40" optionsWidth="40"

View File

@ -1,11 +1,11 @@
import { useState } from 'react'; import { useState } from 'react';
import { OrderDirection } from '@/../.graphclient'; import { OrderDirection, Token_orderBy } from '@/graphclient';
import { createContext } from '@/utils'; import { createContext } from '@/utils';
export type ExploreContext = { export type ExploreContext = {
search: string; search: string;
orderBy: string; orderBy: Token_orderBy;
orderDirection: OrderDirection; orderDirection: OrderDirection;
pageNumber: number; pageNumber: number;
endReached: boolean; endReached: boolean;
@ -29,7 +29,7 @@ export abstract class Explore {
children, children,
}: Explore.ProviderProps) => { }: Explore.ProviderProps) => {
const [search, setSearch] = useState(''); const [search, setSearch] = useState('');
const [orderBy, setOrderBy] = useState(''); const [orderBy, setOrderBy] = useState('tokenId');
const [orderDirection, setOrderDirection] = const [orderDirection, setOrderDirection] =
useState<OrderDirection>('desc'); useState<OrderDirection>('desc');
const [pageNumber, setPageNumber] = useState(0); const [pageNumber, setPageNumber] = useState(0);