@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
117 lines (100 loc) • 3.67 kB
text/typescript
import { InvalidAddress, InvalidAddressBecauseDestinationIsAlsoSource } from "@ledgerhq/errors";
import { useMemo } from "react";
import type { AddressSearchResult } from "../types";
type UseRecipientSearchStateProps = {
searchValue: string;
result: AddressSearchResult;
isLoading: boolean;
recipientSupportsDomain: boolean;
};
export function useRecipientSearchState({
searchValue,
result,
isLoading,
recipientSupportsDomain,
}: UseRecipientSearchStateProps) {
const hasSearchValue = searchValue.length > 0;
const showSearchResults = hasSearchValue && !isLoading;
const isSanctioned = result.status === "sanctioned";
const isAddressComplete = useMemo(() => {
return (
result.status === "valid" ||
result.status === "ens_resolved" ||
result.status === "sanctioned"
);
}, [result.status]);
const hasAnyMatches =
(result.matchedAccounts && result.matchedAccounts.length > 0) ||
!!result.matchedRecentAddress ||
!!result.ensName ||
result.isLedgerAccount ||
isSanctioned;
const showSanctionedBanner = isSanctioned && hasSearchValue;
const bridgeRecipientError = result.bridgeErrors?.recipient;
const bridgeRecipientWarning = result.bridgeWarnings?.recipient;
const bridgeSenderError = result.bridgeErrors?.sender;
const isSelfTransferError =
bridgeRecipientError instanceof InvalidAddressBecauseDestinationIsAlsoSource;
const isBridgeInvalidAddress =
bridgeRecipientError instanceof InvalidAddress && !isSelfTransferError;
const hasBridgeRecipientError =
!!bridgeRecipientError && !isBridgeInvalidAddress && !showSanctionedBanner;
const hasBridgeRecipientWarning = !!bridgeRecipientWarning;
const showMatchedAddress =
showSearchResults &&
(hasAnyMatches ||
(result.status === "valid" && !result.error && !isBridgeInvalidAddress) ||
(isAddressComplete && (hasBridgeRecipientError || hasBridgeRecipientWarning))) &&
(result.status === "valid" ||
(recipientSupportsDomain && result.status === "ens_resolved") ||
result.isLedgerAccount ||
!!result.matchedRecentAddress ||
isSanctioned ||
(isAddressComplete && (hasBridgeRecipientError || hasBridgeRecipientWarning)));
const showAddressValidationError =
showSearchResults &&
!showSanctionedBanner &&
!hasAnyMatches &&
(!!result.error || isBridgeInvalidAddress);
const addressValidationErrorType = useMemo(() => {
if (result.error) return result.error;
if (isBridgeInvalidAddress) {
if (searchValue.includes(".")) {
return "wallet_not_exist";
}
return "incorrect_format";
}
return null;
}, [result.error, isBridgeInvalidAddress, searchValue]);
const showBridgeRecipientError =
showSearchResults && hasBridgeRecipientError && !showAddressValidationError;
const showBridgeRecipientWarning =
showSearchResults &&
!!bridgeRecipientWarning &&
!showBridgeRecipientError &&
!showAddressValidationError;
const showBridgeSenderError = showSearchResults && !!bridgeSenderError;
const showEmptyState =
showSearchResults &&
(!isAddressComplete || !hasAnyMatches) &&
!showMatchedAddress &&
!showSanctionedBanner &&
!showAddressValidationError &&
!showBridgeRecipientError;
return {
showSearchResults,
showMatchedAddress,
showAddressValidationError,
showEmptyState,
showBridgeSenderError,
showSanctionedBanner,
showBridgeRecipientError,
showBridgeRecipientWarning,
isSanctioned,
isAddressComplete,
addressValidationErrorType,
bridgeRecipientError,
bridgeRecipientWarning,
bridgeSenderError,
};
}