From aa81f3c588cea29c3db5e94db851a57e0a13cb70 Mon Sep 17 00:00:00 2001 From: binarybaron <86064887+binarybaron@users.noreply.github.com> Date: Sun, 17 Nov 2024 23:14:36 +0100 Subject: [PATCH] feat(gui): Switch to up-to-date asb, if current one is outdated (#189) --- src-gui/src/store/features/providersSlice.ts | 60 ++++++++++---------- src-gui/src/utils/multiAddrUtils.ts | 2 +- src-gui/src/utils/sortUtils.ts | 12 +++- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src-gui/src/store/features/providersSlice.ts b/src-gui/src/store/features/providersSlice.ts index dfcfc676..1c971932 100644 --- a/src-gui/src/store/features/providersSlice.ts +++ b/src-gui/src/store/features/providersSlice.ts @@ -3,7 +3,7 @@ import { ExtendedProviderStatus, ProviderStatus } from "models/apiModel"; import { Seller } from "models/tauriModel"; import { getStubTestnetProvider } from "store/config"; import { rendezvousSellerToProviderStatus } from "utils/conversionUtils"; -import { isProviderCompatible } from "utils/multiAddrUtils"; +import { isProviderOutdated } from "utils/multiAddrUtils"; import { sortProviderList } from "utils/sortUtils"; const stubTestnetProvider = getStubTestnetProvider(); @@ -37,13 +37,21 @@ function selectNewSelectedProvider( ): ProviderStatus { const selectedPeerId = peerId || slice.selectedProvider?.peerId; - return ( - slice.registry.providers?.find((prov) => prov.peerId === selectedPeerId) || - slice.rendezvous.providers.find((prov) => prov.peerId === selectedPeerId) || - slice.registry.providers?.at(0) || - slice.rendezvous.providers[0] || - null - ); + // Check if we still have a record of the currently selected provider + const currentProvider = slice.registry.providers?.find((prov) => prov.peerId === selectedPeerId) || slice.rendezvous.providers.find((prov) => prov.peerId === selectedPeerId); + + // If the currently selected provider is not outdated, keep it + if (currentProvider != null && !isProviderOutdated(currentProvider)) { + return currentProvider; + } + + // Otherwise we'd prefer to switch to a provider that has the newest version + const providers = sortProviderList([ + ...(slice.registry.providers ?? []), + ...(slice.rendezvous.providers ?? []), + ]); + + return providers.at(0) || null; } export const providersSlice = createSlice({ @@ -61,29 +69,22 @@ export const providersSlice = createSlice({ } // If the provider was already discovered via the public registry, don't add it again - if ( - !slice.registry.providers?.some( - (prov) => - prov.peerId === discoveredProviderStatus.peerId && - prov.multiAddr === discoveredProviderStatus.multiAddr, - ) - ) { - const indexOfExistingProvider = slice.rendezvous.providers.findIndex( - (prov) => - prov.peerId === discoveredProviderStatus.peerId && - prov.multiAddr === discoveredProviderStatus.multiAddr, - ); + const indexOfExistingProvider = slice.rendezvous.providers.findIndex( + (prov) => + prov.peerId === discoveredProviderStatus.peerId && + prov.multiAddr === discoveredProviderStatus.multiAddr, + ); - // Avoid duplicate entries, replace them instead - if (indexOfExistingProvider !== -1) { - slice.rendezvous.providers[indexOfExistingProvider] = - discoveredProviderStatus; - } else { - slice.rendezvous.providers.push(discoveredProviderStatus); - } + // Avoid duplicate entries, replace them instead + if (indexOfExistingProvider !== -1) { + slice.rendezvous.providers[indexOfExistingProvider] = + discoveredProviderStatus; + } else { + slice.rendezvous.providers.push(discoveredProviderStatus); } }); + // Sort the provider list and select a new provider if needed slice.rendezvous.providers = sortProviderList(slice.rendezvous.providers); slice.selectedProvider = selectNewSelectedProvider(slice); }, @@ -95,9 +96,8 @@ export const providersSlice = createSlice({ action.payload.push(stubTestnetProvider); } - slice.registry.providers = sortProviderList(action.payload).filter( - isProviderCompatible, - ); + // Sort the provider list and select a new provider if needed + slice.registry.providers = sortProviderList(action.payload); slice.selectedProvider = selectNewSelectedProvider(slice); }, registryConnectionFailed(slice) { diff --git a/src-gui/src/utils/multiAddrUtils.ts b/src-gui/src/utils/multiAddrUtils.ts index 9d8b9a00..91bba201 100644 --- a/src-gui/src/utils/multiAddrUtils.ts +++ b/src-gui/src/utils/multiAddrUtils.ts @@ -11,7 +11,7 @@ export function providerToConcatenatedMultiAddr(provider: Provider) { .toString(); } -export function isProviderCompatible( +export function isProviderOnCorrectNetwork( provider: ExtendedProviderStatus, ): boolean { return provider.testnet === isTestnet(); diff --git a/src-gui/src/utils/sortUtils.ts b/src-gui/src/utils/sortUtils.ts index e7022332..a2ac79b3 100644 --- a/src-gui/src/utils/sortUtils.ts +++ b/src-gui/src/utils/sortUtils.ts @@ -1,10 +1,12 @@ import { ExtendedProviderStatus } from "models/apiModel"; -import { isProviderCompatible, isProviderOutdated } from "./multiAddrUtils"; +import { isProviderOnCorrectNetwork, isProviderOutdated } from "./multiAddrUtils"; export function sortProviderList(list: ExtendedProviderStatus[]) { return list - .filter(isProviderCompatible) + // Filter out providers that are on the wrong network (testnet / mainnet) + .filter(isProviderOnCorrectNetwork) .concat() + // Sort by criteria .sort((firstEl, secondEl) => { // If either provider is outdated, prioritize the one that isn't if (isProviderOutdated(firstEl) && !isProviderOutdated(secondEl)) return 1; @@ -24,5 +26,9 @@ export function sortProviderList(list: ExtendedProviderStatus[]) { return -1; } return 1; - }); + }) + // Remove duplicate providers + .filter((provider, index, self) => + index === self.findIndex((p) => p.peerId === provider.peerId) + ) } \ No newline at end of file