Skip to content

Commit

Permalink
feat(extension): make sort optional
Browse files Browse the repository at this point in the history
  • Loading branch information
vetalcore committed May 8, 2024
1 parent a219665 commit 1cac164
Show file tree
Hide file tree
Showing 11 changed files with 52 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export const getQueryStakePoolsFilters = ({
startAt: skip,
limit: limit - skip + 1
},
sort
...(sort && { sort })
};
};

Expand Down
2 changes: 1 addition & 1 deletion packages/staking/src/features/BrowsePools/BrowsePools.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export const BrowsePools = () => {
showSkeleton={fetching}
loadMoreData={paginatePools}
scrollableTargetId={LACE_APP_ID}
sortField={sort.field}
sortField={sort?.field}
/>
) : (
<StakePoolsList
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { FilterOption, SelectOption, SortAndFilterTab } from './types';

export interface SortAndFilterProps {
activeTab: SortAndFilterTab;
sort: StakePoolSortOptions;
sort?: StakePoolSortOptions;
filter: QueryStakePoolsFilters;
onSortChange: (value: StakePoolSortOptions) => void;
onFilterChange: (filters: QueryStakePoolsFilters) => void;
Expand Down Expand Up @@ -60,7 +60,7 @@ export const BrowsePoolsPreferencesCard = ({
const { t } = useTranslation();
const { analytics } = useOutsideHandles();
const [localFilters, setLocalFilters] = useState<QueryStakePoolsFilters>(filter);
const { field: sortBy, order: direction } = sort;
const { field: sortBy, order: direction } = sort || {};

const debouncedFilterChange = useMemo(() => debounce(onFilterChange, ON_CHANGE_DEBOUNCE), [onFilterChange]);
const handleFilterChange = useCallback(
Expand All @@ -75,13 +75,16 @@ export const BrowsePoolsPreferencesCard = ({
[debouncedFilterChange, localFilters]
);

const handleIconClick = useCallback(() => {
const newSort: StakePoolSortOptions = {
field: sortBy,
order: direction === 'desc' ? 'asc' : 'desc',
};
onSortChange(newSort);
}, [direction, onSortChange, sortBy]);
const handleIconClick = useCallback(
(_sortBy) => {
const newSort: StakePoolSortOptions = {
field: _sortBy,
order: direction === 'desc' ? 'asc' : 'desc',
};
onSortChange(newSort);
},
[direction, onSortChange]
);

const handleSortChange = useCallback(
(field: string) => {
Expand Down Expand Up @@ -157,7 +160,7 @@ export const BrowsePoolsPreferencesCard = ({
text={t('browsePools.preferencesCard.sort.ticker')}
/>
),
onIconClick: handleIconClick,
onIconClick: () => handleIconClick('ticker'),
value: 'ticker',
},
{
Expand All @@ -168,7 +171,7 @@ export const BrowsePoolsPreferencesCard = ({
text={t('browsePools.preferencesCard.sort.saturation')}
/>
),
onIconClick: handleIconClick,
onIconClick: () => handleIconClick('saturation'),
value: 'saturation',
},
USE_ROS_STAKING_COLUMN && {
Expand All @@ -179,7 +182,7 @@ export const BrowsePoolsPreferencesCard = ({
text={t('browsePools.preferencesCard.sort.ros')}
/>
),
onIconClick: handleIconClick,
onIconClick: () => handleIconClick('ros'),
value: 'ros',
},
{
Expand All @@ -190,7 +193,7 @@ export const BrowsePoolsPreferencesCard = ({
text={t('browsePools.preferencesCard.sort.cost')}
/>
),
onIconClick: handleIconClick,
onIconClick: () => handleIconClick('cost'),
value: 'cost',
},
{
Expand All @@ -201,7 +204,7 @@ export const BrowsePoolsPreferencesCard = ({
text={t('browsePools.preferencesCard.sort.margin')}
/>
),
onIconClick: handleIconClick,
onIconClick: () => handleIconClick('margin'),
value: 'margin',
},
{
Expand All @@ -212,7 +215,7 @@ export const BrowsePoolsPreferencesCard = ({
text={t('browsePools.preferencesCard.sort.blocks')}
/>
),
onIconClick: handleIconClick,
onIconClick: () => handleIconClick('blocks'),
value: 'blocks',
},
{
Expand All @@ -223,7 +226,7 @@ export const BrowsePoolsPreferencesCard = ({
text={t('browsePools.preferencesCard.sort.pledge')}
/>
),
onIconClick: handleIconClick,
onIconClick: () => handleIconClick('pledge'),
value: 'pledge',
},
{
Expand All @@ -234,7 +237,7 @@ export const BrowsePoolsPreferencesCard = ({
text={t('browsePools.preferencesCard.sort.liveStake')}
/>
),
onIconClick: handleIconClick,
onIconClick: () => handleIconClick('liveStake'),
value: 'liveStake',
},
].filter(Boolean) as RadioButtonGroupOption[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export type StakePoolsGridProps = {
loadMoreData: (range: ListRange) => void;
emptyPlaceholder: () => ReactElement;
showSkeleton?: boolean;
sortField: SortField;
sortField?: SortField;
};

export const StakePoolsGrid = ({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ import { getFormattedStakePoolProp } from '../formatters';
import { SortField } from '../types';

type StakePoolsGridItemProps = StakePoolDetails & {
sortField: SortField;
sortField?: SortField;
};

export const StakePoolsGridItem = ({
stakePool,
hexId,
id,
sortField,
sortField = 'ticker',
...data
}: StakePoolsGridItemProps): React.ReactElement => {
const { analytics } = useOutsideHandles();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export type StakePoolsListProps = {
selectedPools: StakePoolDetails[];
loadMoreData: (range: ListRange) => void;
setActiveSort: (props: StakePoolSortOptions) => void;
activeSort: StakePoolSortOptions;
activeSort?: StakePoolSortOptions;
emptyPlaceholder: () => ReactElement;
showSkeleton?: boolean;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export interface TableHeaders {

export type StakePoolsListHeaderProps = {
setActiveSort: (props: StakePoolSortOptions) => void;
activeSort: StakePoolSortOptions;
activeSort?: StakePoolSortOptions;
};

export const StakePoolsListHeader = ({ setActiveSort, activeSort }: StakePoolsListHeaderProps) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
/* eslint-disable no-console */
import { PostHogAction } from '@lace/common';
import { StateStatus, useOutsideHandles } from 'features/outside-handles-provider';
import { StakePoolDetails, mapStakePoolToDisplayData, useDelegationPortfolioStore } from 'features/store';
import debounce from 'lodash/debounce';
import isEqual from 'lodash/isEqual';
import { useCallback, useMemo, useRef } from 'react';
import { ListRange } from 'react-virtuoso';
import { DEFAULT_SORT_OPTIONS, SEARCH_DEBOUNCE_IN_MS } from '../constants';
import { SEARCH_DEBOUNCE_IN_MS } from '../constants';
import { StakePoolSortOptions } from '../types';

type QueryStatus = 'idle' | 'fetching' | 'paginating';
Expand All @@ -17,7 +18,7 @@ type UseQueryStakePoolsResult = {
searchQuery: string;
setSearchQuery: (searchString: string) => void;
setSort: (sortOptions: StakePoolSortOptions) => void;
sort: StakePoolSortOptions;
sort?: StakePoolSortOptions;
totalPoolsCount: number;
};

Expand All @@ -32,10 +33,11 @@ export const useQueryStakePools = () => {

const { searchQuery, sortField, sortOrder } = useDelegationPortfolioStore((store) => ({
searchQuery: store.searchQuery || '',
sortField: store.sortField ?? DEFAULT_SORT_OPTIONS.field,
sortOrder: store.sortOrder ?? DEFAULT_SORT_OPTIONS.order,
sortField: store.sortField,
sortOrder: store.sortOrder,
}));
const previousRequest = useRef<{ searchQuery: string; sortField: string; sortOrder: string } | null>(null);

const previousRequest = useRef<{ searchQuery: string; sortField?: string; sortOrder?: string } | null>(null);
const status = useMemo(() => {
const nextRequest = { searchQuery, sortField, sortOrder };
const requestChanged = !isEqual(previousRequest.current, nextRequest);
Expand All @@ -48,12 +50,12 @@ export const useQueryStakePools = () => {

const debouncedSearch = useMemo(
() =>
debounce(async (params: Required<Parameters<typeof fetchStakePools>[0]>) => {
debounce(async (params: Parameters<typeof fetchStakePools>[0]) => {
await fetchStakePools(params);
previousRequest.current = {
searchQuery: params.searchString,
sortField: params.sort.field,
sortOrder: params.sort.order,
sortField: params.sort?.field,
sortOrder: params.sort?.order,
};
}, SEARCH_DEBOUNCE_IN_MS),
[fetchStakePools]
Expand All @@ -67,7 +69,7 @@ export const useQueryStakePools = () => {
limit: endIndex,
searchString: searchQuery ?? '',
skip: startIndex,
sort: { field: sortField, order: sortOrder },
...(sortField && sortOrder && { sort: { field: sortField, order: sortOrder } }),
});
},
[debouncedSearch, searchQuery, sortField, sortOrder]
Expand Down Expand Up @@ -108,10 +110,13 @@ export const useQueryStakePools = () => {
searchQuery,
setSearchQuery,
setSort,
sort: {
field: sortField,
order: sortOrder,
},
...(sortField &&
sortOrder && {
sort: {
field: sortField,
order: sortOrder,
},
}),
status,
totalPoolsCount,
}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,8 @@ export const processExpandedViewCases: Handler = (params) =>
({ state, command: { data } }) => ({
...state,
searchQuery: data,
sortField: undefined,
sortOrder: undefined,
})
),
SetSort: handler<SetSort, StateBrowsePools, StateBrowsePools>(({ state, command: { data } }) => ({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Wallet } from '@lace/cardano';
import { DEFAULT_SORT_OPTIONS } from 'features/BrowsePools/constants';
import { create } from 'zustand';
import { immer } from 'zustand/middleware/immer';
import { CARDANO_COIN_SYMBOL_BY_NETWORK, LAST_STABLE_EPOCH, PERCENTAGE_SCALE_MAX } from './constants';
Expand All @@ -24,6 +25,8 @@ const defaultState: DelegationPortfolioState = {
draftPortfolio: undefined,
pendingSelectedPortfolio: undefined,
selectedPortfolio: [],
sortField: DEFAULT_SORT_OPTIONS.field,
sortOrder: DEFAULT_SORT_OPTIONS.order,
view: undefined,
viewedStakePool: undefined,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export interface HeaderProps<T> {
isActiveSortItem: (value: string) => boolean;
isSortingAvailable?: (value: string) => boolean;
onSortChange: (field: T) => void;
order: 'asc' | 'desc';
order?: 'asc' | 'desc';
withSelection?: boolean;
dataTestId?: string;
headers: Headers<T>[];
Expand Down Expand Up @@ -58,7 +58,7 @@ export const Header = <T extends string>({
{label}
</Tooltip>
</span>
{isSortingAvailable(value) && isActiveSortItem(value) && (
{order && isSortingAvailable(value) && isActiveSortItem(value) && (
<IconButton.Caret
direction={order}
data-testid={`${dataTestId}-sort-order-${order}`}
Expand Down

0 comments on commit 1cac164

Please sign in to comment.