Commit 9d1556b7 authored by Justin Domingue's avatar Justin Domingue Committed by GitHub

feat(pool): add toggle to hide inactive positions (#1676)

* feat(pool): add toggle to hide inactive positions in pools page

* cleanup code

* keep positions sorted, but move zero liquidity positions to end

* simplified sorting logic
parent 858b6afb
...@@ -14,8 +14,11 @@ import { useWalletModalToggle } from 'state/application/hooks' ...@@ -14,8 +14,11 @@ import { useWalletModalToggle } from 'state/application/hooks'
import styled, { ThemeContext } from 'styled-components' import styled, { ThemeContext } from 'styled-components'
import { HideSmall, TYPE } from 'theme' import { HideSmall, TYPE } from 'theme'
import { LoadingRows } from './styleds' import { LoadingRows } from './styleds'
import Toggle from 'components/Toggle'
import { useUserHideClosedPositions } from 'state/user/hooks'
import CTACards from './CTACards' import CTACards from './CTACards'
import { PositionDetails } from 'types/position'
const PageWrapper = styled(AutoColumn)` const PageWrapper = styled(AutoColumn)`
max-width: 870px; max-width: 870px;
...@@ -92,14 +95,35 @@ const MainContentWrapper = styled.main` ...@@ -92,14 +95,35 @@ const MainContentWrapper = styled.main`
flex-direction: column; flex-direction: column;
` `
const ShowInactiveToggle = styled.div`
display: grid;
align-items: center;
justify-items: end;
grid-template-columns: 1fr auto;
grid-column-gap: 8px;
padding: 0 8px;
`
export default function Pool() { export default function Pool() {
const { account } = useActiveWeb3React() const { account } = useActiveWeb3React()
const toggleWalletModal = useWalletModalToggle() const toggleWalletModal = useWalletModalToggle()
const { t } = useTranslation() const { t } = useTranslation()
const theme = useContext(ThemeContext) const theme = useContext(ThemeContext)
const [userHideClosedPositions, setUserHideClosedPositions] = useUserHideClosedPositions()
const { positions, loading: positionsLoading } = useV3Positions(account) const { positions, loading: positionsLoading } = useV3Positions(account)
const [openPositions, closedPositions] = positions?.reduce<[PositionDetails[], PositionDetails[]]>(
(acc, p) => {
acc[p.liquidity?.isZero() ? 1 : 0].push(p)
return acc
},
[[], []]
) ?? [[], []]
const filteredPositions = [...openPositions, ...(userHideClosedPositions ? [] : closedPositions)]
const menuItems = [ const menuItems = [
{ {
content: ( content: (
...@@ -174,6 +198,16 @@ export default function Pool() { ...@@ -174,6 +198,16 @@ export default function Pool() {
<CTACards /> <CTACards />
{closedPositions.length > 0 ? (
<ShowInactiveToggle>
<TYPE.darkGray>{t('Hide closed positions')}</TYPE.darkGray>
<Toggle
isActive={userHideClosedPositions}
toggle={() => setUserHideClosedPositions(!userHideClosedPositions)}
/>
</ShowInactiveToggle>
) : null}
<MainContentWrapper> <MainContentWrapper>
{positionsLoading ? ( {positionsLoading ? (
<LoadingRows> <LoadingRows>
...@@ -190,8 +224,8 @@ export default function Pool() { ...@@ -190,8 +224,8 @@ export default function Pool() {
<div /> <div />
<div /> <div />
</LoadingRows> </LoadingRows>
) : positions && positions.length > 0 ? ( ) : filteredPositions && filteredPositions.length > 0 ? (
<PositionList positions={positions} /> <PositionList positions={filteredPositions} />
) : ( ) : (
<NoLiquidity> <NoLiquidity>
<TYPE.mediumHeader color={theme.text3} textAlign="center"> <TYPE.mediumHeader color={theme.text3} textAlign="center">
......
...@@ -17,6 +17,7 @@ export const updateMatchesDarkMode = createAction<{ matchesDarkMode: boolean }>( ...@@ -17,6 +17,7 @@ export const updateMatchesDarkMode = createAction<{ matchesDarkMode: boolean }>(
export const updateUserDarkMode = createAction<{ userDarkMode: boolean }>('user/updateUserDarkMode') export const updateUserDarkMode = createAction<{ userDarkMode: boolean }>('user/updateUserDarkMode')
export const updateUserExpertMode = createAction<{ userExpertMode: boolean }>('user/updateUserExpertMode') export const updateUserExpertMode = createAction<{ userExpertMode: boolean }>('user/updateUserExpertMode')
export const updateUserSingleHopOnly = createAction<{ userSingleHopOnly: boolean }>('user/updateUserSingleHopOnly') export const updateUserSingleHopOnly = createAction<{ userSingleHopOnly: boolean }>('user/updateUserSingleHopOnly')
export const updateHideClosedPositions = createAction<{ userHideClosedPositions: boolean }>('user/hideClosedPositions')
export const updateUserSlippageTolerance = createAction<{ userSlippageTolerance: number | 'auto' }>( export const updateUserSlippageTolerance = createAction<{ userSlippageTolerance: number | 'auto' }>(
'user/updateUserSlippageTolerance' 'user/updateUserSlippageTolerance'
) )
......
...@@ -18,6 +18,7 @@ import { ...@@ -18,6 +18,7 @@ import {
toggleURLWarning, toggleURLWarning,
updateUserDarkMode, updateUserDarkMode,
updateUserDeadline, updateUserDeadline,
updateHideClosedPositions,
updateUserExpertMode, updateUserExpertMode,
updateUserSingleHopOnly, updateUserSingleHopOnly,
updateUserSlippageTolerance, updateUserSlippageTolerance,
...@@ -137,6 +138,23 @@ export function useUserSlippageTolerance(): Percent | 'auto' { ...@@ -137,6 +138,23 @@ export function useUserSlippageTolerance(): Percent | 'auto' {
) )
} }
export function useUserHideClosedPositions(): [boolean, (newHideClosedPositions: boolean) => void] {
const dispatch = useDispatch<AppDispatch>()
const hideClosedPositions = useSelector<AppState, AppState['user']['userHideClosedPositions']>(
(state) => state.user.userHideClosedPositions
)
const setHideClosedPositions = useCallback(
(newHideClosedPositions: boolean) => {
dispatch(updateHideClosedPositions({ userHideClosedPositions: newHideClosedPositions }))
},
[dispatch]
)
return [hideClosedPositions, setHideClosedPositions]
}
/** /**
* Same as above but replaces the auto with a default value * Same as above but replaces the auto with a default value
* @param defaultSlippageTolerance the default value to replace auto with * @param defaultSlippageTolerance the default value to replace auto with
......
...@@ -15,6 +15,7 @@ import { ...@@ -15,6 +15,7 @@ import {
updateUserDeadline, updateUserDeadline,
toggleURLWarning, toggleURLWarning,
updateUserSingleHopOnly, updateUserSingleHopOnly,
updateHideClosedPositions,
} from './actions' } from './actions'
const currentTimestamp = () => new Date().getTime() const currentTimestamp = () => new Date().getTime()
...@@ -30,6 +31,9 @@ export interface UserState { ...@@ -30,6 +31,9 @@ export interface UserState {
userSingleHopOnly: boolean // only allow swaps on direct pairs userSingleHopOnly: boolean // only allow swaps on direct pairs
// hides closed (inactive) positions across the app
userHideClosedPositions: boolean
// user defined slippage tolerance in bips, used in all txns // user defined slippage tolerance in bips, used in all txns
userSlippageTolerance: number | 'auto' userSlippageTolerance: number | 'auto'
userSlippageToleranceHasBeenMigratedToAuto: boolean // temporary flag for migration status userSlippageToleranceHasBeenMigratedToAuto: boolean // temporary flag for migration status
...@@ -63,6 +67,7 @@ export const initialState: UserState = { ...@@ -63,6 +67,7 @@ export const initialState: UserState = {
matchesDarkMode: false, matchesDarkMode: false,
userExpertMode: false, userExpertMode: false,
userSingleHopOnly: false, userSingleHopOnly: false,
userHideClosedPositions: false,
userSlippageTolerance: 'auto', userSlippageTolerance: 'auto',
userSlippageToleranceHasBeenMigratedToAuto: true, userSlippageToleranceHasBeenMigratedToAuto: true,
userDeadline: DEFAULT_DEADLINE_FROM_NOW, userDeadline: DEFAULT_DEADLINE_FROM_NOW,
...@@ -130,6 +135,9 @@ export default createReducer(initialState, (builder) => ...@@ -130,6 +135,9 @@ export default createReducer(initialState, (builder) =>
.addCase(updateUserSingleHopOnly, (state, action) => { .addCase(updateUserSingleHopOnly, (state, action) => {
state.userSingleHopOnly = action.payload.userSingleHopOnly state.userSingleHopOnly = action.payload.userSingleHopOnly
}) })
.addCase(updateHideClosedPositions, (state, action) => {
state.userHideClosedPositions = action.payload.userHideClosedPositions
})
.addCase(addSerializedToken, (state, { payload: { serializedToken } }) => { .addCase(addSerializedToken, (state, { payload: { serializedToken } }) => {
if (!state.tokens) { if (!state.tokens) {
state.tokens = {} state.tokens = {}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment