Skip to content

Commit f24add3

Browse files
authored
feat(app): be able to disable chains (#4648)
2 parents 72de31e + c457455 commit f24add3

File tree

2 files changed

+47
-13
lines changed

2 files changed

+47
-13
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { UniversalChainId } from "@unionlabs/sdk/schema"
2+
3+
export const DISABLED_CHAINS = [
4+
UniversalChainId.make("xion.xion-testnet-2"),
5+
]

app2/src/lib/transfer/shared/components/ChainAsset/ChainSelector.svelte

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<script lang="ts">
22
import { chainLogoMap } from "$lib/constants/chain-logos.ts"
3+
import { DISABLED_CHAINS } from "$lib/constants/disabled-chains.ts"
34
import { tokensStore } from "$lib/stores/tokens.svelte.ts"
45
import { uiStore } from "$lib/stores/ui.svelte.ts"
56
import { transferData } from "$lib/transfer/shared/data/transfer-data.svelte.ts"
@@ -53,20 +54,22 @@ const isValidRoute = (chain: Chain) =>
5354
5455
const getChainStatus = (chain: Chain, hasBucket: boolean) => {
5556
const isSourceChain = type === "destination" && transferData.raw.source === chain.chain_id
57+
const isDisabledChain = chain.universal_chain_id
58+
&& DISABLED_CHAINS.includes(chain.universal_chain_id)
5659
5760
return pipe(
5861
Match.value(type).pipe(
5962
Match.when("source", () => ({
6063
isSelected: transferData.raw.source === chain.chain_id,
6164
isSourceChain: false,
62-
isDisabled: false,
65+
isDisabled: isDisabledChain,
6366
hasBucket,
6467
hasRoute: true,
6568
})),
6669
Match.when("destination", () => ({
6770
isSelected: transferData.raw.destination === chain.chain_id,
6871
isSourceChain,
69-
isDisabled: isSourceChain || !isValidRoute(chain) || !hasBucket,
72+
isDisabled: isSourceChain || !isValidRoute(chain) || !hasBucket || isDisabledChain,
7073
hasBucket,
7174
hasRoute: isValidRoute(chain),
7275
})),
@@ -169,6 +172,28 @@ const filteredChains = $derived(
169172
allChains,
170173
filterBySigningMode,
171174
chains => filterChainsByTokenAvailability(chains, uiStore.filterWhitelist),
175+
chainWithAvailability => {
176+
// Sort so disabled chains appear last for both source and destination
177+
return chainWithAvailability.sort((a, b) => {
178+
const [chainA] = a
179+
const [chainB] = b
180+
const isDisabledA = chainA.universal_chain_id
181+
&& DISABLED_CHAINS.includes(chainA.universal_chain_id)
182+
const isDisabledB = chainB.universal_chain_id
183+
&& DISABLED_CHAINS.includes(chainB.universal_chain_id)
184+
185+
// If one is disabled and the other isn't, disabled goes last
186+
if (isDisabledA && !isDisabledB) {
187+
return 1
188+
}
189+
if (!isDisabledA && isDisabledB) {
190+
return -1
191+
}
192+
193+
// If both have same disabled status, maintain original order
194+
return 0
195+
})
196+
},
172197
)
173198
),
174199
),
@@ -189,7 +214,7 @@ const filteredChains = $derived(
189214

190215
<button
191216
class={cn(
192-
"flex flex-col items-center gap-2 justify-start px-2 py-4 rounded-md transition-colors",
217+
"flex flex-col items-center gap-2 justify-start px-2 py-4 rounded-md transition-colors min-h-[120px]",
193218
status.isSelected
194219
? "bg-zinc-900 hover:bg-zinc-800 ring-1 ring-accent"
195220
: status.isDisabled
@@ -210,16 +235,20 @@ const filteredChains = $derived(
210235

211236
<span class="text-xs text-center truncate w-fit">{chain.display_name}</span>
212237

213-
{#if status.isSourceChain}
214-
<span class="text-xs text-sky-400 -mt-2">source chain</span>
215-
{/if}
216-
{#if type === "destination" && !status.hasRoute && !status.isSourceChain}
217-
<span class="text-xs text-yellow-400 -mt-2">no route</span>
218-
{/if}
219-
{#if type === "destination" && !status.hasBucket && status.hasRoute
220-
&& !status.isSourceChain}
221-
<span class="text-xs text-yellow-400 -mt-2">not whitelisted</span>
222-
{/if}
238+
<!-- Status labels container with consistent height -->
239+
<div class="text-xs -mt-2 h-4 flex items-center">
240+
{#if status.isSourceChain}
241+
<span class="text-sky-400">source chain</span>
242+
{:else if chain.universal_chain_id
243+
&& DISABLED_CHAINS.includes(chain.universal_chain_id)}
244+
<span class="text-yellow-400">disabled</span>
245+
{:else if type === "destination" && !status.hasRoute && !status.isSourceChain}
246+
<span class="text-yellow-400">no route</span>
247+
{:else if type === "destination" && !status.hasBucket && status.hasRoute
248+
&& !status.isSourceChain}
249+
<span class="text-yellow-400">not whitelisted</span>
250+
{/if}
251+
</div>
223252
</button>
224253
{/each}
225254
</div>

0 commit comments

Comments
 (0)