Skip to content

Commit bb5c2e8

Browse files
authored
Merge pull request #3497 from pyth-network/cprussin/remove-nuqs-from-proposals
fix(xc-admin-frontend): remove use of nuqs
2 parents 4bbfa8e + 59c1343 commit bb5c2e8

6 files changed

Lines changed: 163 additions & 141 deletions

File tree

flake.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
};
4848
in {
4949
devShells.default = pkgs.mkShell {
50+
FORCE_COLOR = 1;
51+
BIOME_BINARY = pkgs.lib.getExe pkgs.biome;
5052
buildInputs = [
5153
pkgs.cli
5254
pkgs.git
@@ -60,6 +62,7 @@
6062
pkgs.python3Packages.distutils
6163
pkgs.graphviz
6264
pkgs.anchor
65+
pkgs.biome
6366
];
6467
};
6568
}

governance/xc_admin/packages/xc_admin_frontend/components/tabs/Proposals/Proposals.tsx

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,10 @@
33
/* eslint-disable @typescript-eslint/no-deprecated */
44
/* eslint-disable @typescript-eslint/no-floating-promises */
55
import { Menu, Transition } from '@headlessui/react'
6-
import {
7-
useQueryState,
8-
parseAsStringLiteral,
9-
} from '@pythnetwork/react-hooks/nuqs'
106
import { useWallet } from '@solana/wallet-adapter-react'
117
import type { TransactionAccount } from '@sqds/mesh/lib/types'
128
import { useRouter } from 'next/router'
13-
import { useContext, useEffect, useState, useMemo, Fragment } from 'react'
9+
import { useContext, useEffect, useState, useMemo, Fragment, useCallback } from 'react'
1410

1511
import { Proposal } from './Proposal'
1612
import { ProposalRow } from './ProposalRow'
@@ -20,6 +16,7 @@ import { useMultisigContext } from '../../../contexts/MultisigContext'
2016
import ClusterSwitch from '../../ClusterSwitch'
2117
import { Select } from '../../Select'
2218
import Loadbar from '../../loaders/Loadbar'
19+
import { usePathname, useSearchParams } from 'next/navigation'
2320

2421
type ProposalType = 'priceFeed' | 'governance' | 'lazer'
2522

@@ -65,15 +62,15 @@ const Proposals = () => {
6562
const router = useRouter()
6663
const [currentProposal, setCurrentProposal] = useState<TransactionAccount>()
6764
const [currentProposalPubkey, setCurrentProposalPubkey] = useState<string>()
68-
const [statusFilter, setStatusFilter] = useQueryState(
65+
const [statusFilter, setStatusFilter] = useSeacrhParamFromEnum(
6966
'status',
70-
parseAsStringLiteral(PROPOSAL_STATUS_FILTERS).withDefault(
71-
DEFAULT_PROPOSAL_STATUS_FILTER
72-
)
67+
PROPOSAL_STATUS_FILTERS,
68+
DEFAULT_PROPOSAL_STATUS_FILTER
7369
)
74-
const [voteStatus, setVoteStatus] = useQueryState(
70+
const [voteStatus, setVoteStatus] = useSeacrhParamFromEnum(
7571
'voteStatus',
76-
parseAsStringLiteral(VOTE_STATUSES).withDefault(DEFAULT_VOTE_STATUS)
72+
VOTE_STATUSES,
73+
DEFAULT_VOTE_STATUS
7774
)
7875
const { cluster } = useContext(ClusterContext)
7976
const { publicKey: walletPublicKey } = useWallet()
@@ -407,3 +404,29 @@ const Proposals = () => {
407404
}
408405

409406
export default Proposals
407+
408+
const useSeacrhParamFromEnum = <T extends string>(param: string, validValues: readonly T[], defaultValue: T) => {
409+
const router = useRouter();
410+
const pathname = usePathname();
411+
const searchParams = useSearchParams();
412+
const value = useMemo(
413+
() => {
414+
const current = searchParams.get(param);
415+
return isInEnum(validValues, current) ? current : defaultValue;
416+
},
417+
[searchParams, param, validValues, defaultValue]
418+
);
419+
const updateValue = useCallback(
420+
(newValue: T) => {
421+
const newSearchParams = new URLSearchParams(searchParams.toString());
422+
newSearchParams.set(param, newValue);
423+
router.push(`${pathname}?${newSearchParams.toString()}`)
424+
},
425+
[searchParams, pathname, router, param]
426+
);
427+
428+
return [value, updateValue] as const;
429+
}
430+
431+
const isInEnum = <T,>(values: readonly T[], value: unknown): value is T =>
432+
values.includes(value as T);

governance/xc_admin/packages/xc_admin_frontend/pages/_app.tsx

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { NuqsAdapter } from '@pythnetwork/react-hooks/nuqs-adapters-next'
21
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base'
32
import {
43
ConnectionProvider,
@@ -85,37 +84,35 @@ function MyApp({ Component, pageProps }: AppProps) {
8584
)
8685

8786
return (
88-
<NuqsAdapter>
89-
<ConnectionProvider
90-
endpoint={endpoint || clusterApiUrl(WalletAdapterNetwork.Devnet)}
91-
>
92-
<WalletProvider wallets={wallets} autoConnect>
93-
<WalletModalProvider>
94-
<ClusterProvider>
95-
<ProgramProvider>
96-
<Head>
97-
<meta
98-
name="viewport"
99-
content="width=device-width, initial-scale=1.0, maximum-scale=1.0"
100-
/>
101-
{generateDefaultSeo(SEO)}
102-
</Head>
103-
<Component {...pageProps} />
104-
<Toaster
105-
position="bottom-left"
106-
toastOptions={{
107-
style: {
108-
wordBreak: 'break-word',
109-
},
110-
}}
111-
reverseOrder={false}
87+
<ConnectionProvider
88+
endpoint={endpoint || clusterApiUrl(WalletAdapterNetwork.Devnet)}
89+
>
90+
<WalletProvider wallets={wallets} autoConnect>
91+
<WalletModalProvider>
92+
<ClusterProvider>
93+
<ProgramProvider>
94+
<Head>
95+
<meta
96+
name="viewport"
97+
content="width=device-width, initial-scale=1.0, maximum-scale=1.0"
11298
/>
113-
</ProgramProvider>
114-
</ClusterProvider>
115-
</WalletModalProvider>
116-
</WalletProvider>
117-
</ConnectionProvider>
118-
</NuqsAdapter>
99+
{generateDefaultSeo(SEO)}
100+
</Head>
101+
<Component {...pageProps} />
102+
<Toaster
103+
position="bottom-left"
104+
toastOptions={{
105+
style: {
106+
wordBreak: 'break-word',
107+
},
108+
}}
109+
reverseOrder={false}
110+
/>
111+
</ProgramProvider>
112+
</ClusterProvider>
113+
</WalletModalProvider>
114+
</WalletProvider>
115+
</ConnectionProvider>
119116
)
120117
}
121118

0 commit comments

Comments
 (0)