add a toggle for hiding mangoAccount in leaderboards + search
This commit is contained in:
parent
2e73510e26
commit
5c0a6e2955
|
@ -0,0 +1,48 @@
|
|||
import {
|
||||
toggleMangoAccountHidden,
|
||||
useMangoAccountHidden,
|
||||
} from 'hooks/useMangoAccountHidden'
|
||||
import { useWallet } from '@solana/wallet-adapter-react'
|
||||
import useMangoAccount from 'hooks/useMangoAccount'
|
||||
import Switch from '@components/forms/Switch'
|
||||
import { useState } from 'react'
|
||||
import Loading from '@components/shared/Loading'
|
||||
|
||||
const HideMangoAccount = () => {
|
||||
const { publicKey, signMessage } = useWallet()
|
||||
const { mangoAccountPk } = useMangoAccount()
|
||||
const { accountHidden, refetch } = useMangoAccountHidden()
|
||||
const [signingForHide, setSigningForHide] = useState(false)
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="flex items-center justify-between border-t border-th-bkg-3 p-4">
|
||||
<p className="">Hide Mango Account From Search</p>
|
||||
{signingForHide ? (
|
||||
<Loading />
|
||||
) : (
|
||||
<Switch
|
||||
checked={accountHidden ?? false}
|
||||
onChange={async () => {
|
||||
if (!publicKey) throw new Error('Wallet not connected!')
|
||||
if (!mangoAccountPk) throw new Error('MangoAccount not found!')
|
||||
if (!signMessage)
|
||||
throw new Error('Wallet does not support message signing!')
|
||||
setSigningForHide(true)
|
||||
await toggleMangoAccountHidden(
|
||||
mangoAccountPk,
|
||||
publicKey,
|
||||
!(accountHidden ?? false),
|
||||
signMessage,
|
||||
)
|
||||
setSigningForHide(false)
|
||||
refetch()
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default HideMangoAccount
|
|
@ -27,6 +27,7 @@ import {
|
|||
import mangoStore from '@store/mangoStore'
|
||||
import Switch from '@components/forms/Switch'
|
||||
import { CUSTOM_SKINS } from 'utils/theme'
|
||||
import HideMangoAccount from '@components/account/HideMangoAccount'
|
||||
|
||||
const NOTIFICATION_POSITIONS = [
|
||||
'bottom-left',
|
||||
|
@ -237,6 +238,7 @@ const DisplaySettings = () => {
|
|||
onChange={() => setPrivacyMode(!privacyMode)}
|
||||
/>
|
||||
</div>
|
||||
<HideMangoAccount />
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
import { bs58 } from '@project-serum/anchor/dist/cjs/utils/bytes'
|
||||
import { PublicKey } from '@solana/web3.js'
|
||||
import { useQuery } from '@tanstack/react-query'
|
||||
import { isMangoError } from 'types'
|
||||
import { MANGO_DATA_API_URL } from 'utils/constants'
|
||||
import { notify } from 'utils/notifications'
|
||||
import useMangoAccount from './useMangoAccount'
|
||||
|
||||
const fetchMangoAccountHidden = async (mangoAccountAddress: string) => {
|
||||
try {
|
||||
const hideResponse = await fetch(
|
||||
`${MANGO_DATA_API_URL}/user-data/account-hidden?mango-account=${mangoAccountAddress}`,
|
||||
)
|
||||
const res = await hideResponse.json()
|
||||
return res?.hidden ?? false
|
||||
} catch (e) {
|
||||
console.log('Failed to fetch spot volume', e)
|
||||
}
|
||||
}
|
||||
|
||||
export function useMangoAccountHidden() {
|
||||
const { mangoAccountAddress } = useMangoAccount()
|
||||
|
||||
const {
|
||||
data: accountHidden,
|
||||
isLoading: loadingAccountHidden,
|
||||
refetch,
|
||||
} = useQuery(
|
||||
['account-hidden', mangoAccountAddress],
|
||||
() => fetchMangoAccountHidden(mangoAccountAddress),
|
||||
{
|
||||
cacheTime: 1000 * 60 * 10,
|
||||
staleTime: 1000 * 60,
|
||||
retry: 3,
|
||||
refetchOnWindowFocus: false,
|
||||
enabled: !!mangoAccountAddress,
|
||||
},
|
||||
)
|
||||
|
||||
return {
|
||||
accountHidden,
|
||||
loadingAccountHidden,
|
||||
refetch,
|
||||
}
|
||||
}
|
||||
|
||||
export const toggleMangoAccountHidden = async (
|
||||
mangoAccountPk: PublicKey,
|
||||
walletPk: PublicKey,
|
||||
hidden: boolean,
|
||||
signMessage: (message: Uint8Array) => Promise<Uint8Array>,
|
||||
) => {
|
||||
try {
|
||||
let messageObject = {
|
||||
mango_account_pk: mangoAccountPk.toString(),
|
||||
wallet_pk: walletPk.toString(),
|
||||
hidden: hidden,
|
||||
}
|
||||
const messageString = JSON.stringify(messageObject)
|
||||
const message = new TextEncoder().encode(messageString)
|
||||
const signature = await signMessage(message)
|
||||
const requestOptions = {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
wallet_pk: walletPk.toString(),
|
||||
message: messageString,
|
||||
signature: bs58.encode(signature),
|
||||
}),
|
||||
}
|
||||
return fetch(
|
||||
`${MANGO_DATA_API_URL}/user-data/account-hidden`,
|
||||
requestOptions,
|
||||
)
|
||||
} catch (e) {
|
||||
if (isMangoError(e)) {
|
||||
notify({
|
||||
title: 'idk',
|
||||
description: e.message,
|
||||
txid: e.txid,
|
||||
type: 'error',
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue