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 9ec5e47
Show file tree
Hide file tree
Showing 10 changed files with 51 additions and 38 deletions.
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 9ec5e47

Please sign in to comment.