add a toggle for hiding mangoAccount in leaderboards + search

This commit is contained in:
Lou-Kamades 2023-08-25 11:24:11 +02:00
parent 2e73510e26
commit 5c0a6e2955
No known key found for this signature in database
GPG Key ID: 87A166E4D7C01F30
3 changed files with 135 additions and 0 deletions

View File

@ -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

View File

@ -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 />
</>
)
}

View File

@ -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',
})
}
}
}