mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2025-05-02 06:46:06 -04:00
feat(gui): Switch to up-to-date asb, if current one is outdated (#189)
This commit is contained in:
parent
ba0b7ac893
commit
aa81f3c588
3 changed files with 40 additions and 34 deletions
|
@ -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) {
|
||||
|
|
|
@ -11,7 +11,7 @@ export function providerToConcatenatedMultiAddr(provider: Provider) {
|
|||
.toString();
|
||||
}
|
||||
|
||||
export function isProviderCompatible(
|
||||
export function isProviderOnCorrectNetwork(
|
||||
provider: ExtendedProviderStatus,
|
||||
): boolean {
|
||||
return provider.testnet === isTestnet();
|
||||
|
|
|
@ -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)
|
||||
)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue