@rash2x/bridge-widget 0.6.34 → 0.6.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
5
- import { useEffect, useMemo, createContext, useContext, useState, useCallback, forwardRef, useRef } from "react";
5
+ import { useEffect, useMemo, createContext, useContext, useState, useCallback, forwardRef, useRef, useLayoutEffect } from "react";
6
6
  import { initReactI18next, I18nextProvider, useTranslation } from "react-i18next";
7
7
  import i18n from "i18next";
8
8
  import { Button } from "@/components/ui/button";
@@ -30,6 +30,7 @@ import { isAddress, formatUnits, parseUnits } from "viem";
30
30
  import { TronLinkAdapterName } from "@tronweb3/tronwallet-adapters";
31
31
  import { TronWeb } from "tronweb";
32
32
  import { CardHeader, CardTitle, CardAction, Card, CardContent, CardFooter } from "@/components/ui/card";
33
+ import { FixedSizeList } from "react-window";
33
34
  const common$1 = { "connecting": "Connecting…", "initializing": "Initializing...", "loading": "Loading...", "paste": "paste", "close": "Close", "zeroPlaceholder": "0", "nativeToken": "Native Token" };
34
35
  const wallets$1 = { "addTonWallet": "Add TON wallet", "addEvmWallet": "Add EVM wallet", "connectTonWallet": "Connect TON wallet", "connectEvmWallet": "Connect EVM wallet", "initializingMetamask": "Initializing MetaMask SDK...", "initializingTronlink": "Initializing TronLink...", "failedToConnectTon": "Failed to connect to TON wallet", "failedToDisconnect": "Failed to disconnect", "metamaskConnectionError": "MetaMask connection error", "failedToConnectMetamask": "Failed to connect to MetaMask", "failedToDisconnectMetamask": "Failed to disconnect from MetaMask", "selectWallet": "Select Wallet", "tonWallets": "TON", "evmWallets": "EVM", "tronWallets": "TRON", "tonconnect": "TonConnect", "metaMask": "WalletConnect", "walletConnect": "WalletConnect", "tronLink": "TronLink", "addTronWallet": "Add Tron wallet", "comingSoon": "Coming Soon", "connected": "CONNECTED", "connectedStatus": "Connected", "disconnect": "Disconnect", "chooseWallet": "Connect wallet", "oneWalletPerEnv": "You can only connect one wallet per environment.", "connect": "Connect", "connectTronWallet": "Connect Tron wallet", "connectWallet": "Connect wallet" };
35
36
  const bridge$1 = { "max": "Max", "sourceNetwork": "Source network", "destinationNetwork": "Destination network", "selectToken": "Select token", "selectNetwork": "Select network", "selectSourceNetwork": "Select source network", "selectDestinationNetwork": "Select destination network", "searchToken": "Search token", "myTokens": "My tokens", "allTokens": "All tokens", "search": "Search", "select": "Select", "willChangeSourceChain": "Will change source network", "willChangeSourceNetworkAndToken": "Will change source token", "noBalancesFound": "No balances found.", "noResults": "No results", "tokenNotFound": "We couldn't find a token with that name or symbol. Please try again.", "chainNotFound": "We couldn't find a chain with that name. Please try again.", "sendToAnotherAddress": "Send to another address", "youWillReceive": "You will receive", "anotherAddressPlaceholder": "Address", "addressDoesntMatch": "Address doesn't match the {{network}} network", "checkBeforeTransfer": "Check correctness before transfer" };
@@ -6714,6 +6715,7 @@ const SettingsModal = ({ isOpen, onClose }) => {
6714
6715
  }
6715
6716
  ) });
6716
6717
  };
6718
+ const TOKEN_ROW_HEIGHT = 52;
6717
6719
  const TokenRow = ({
6718
6720
  symbol,
6719
6721
  name,
@@ -6765,17 +6767,21 @@ const TokenSelectModal = ({
6765
6767
  const [query, setQuery] = useState("");
6766
6768
  const [tab, setTab] = useState("my");
6767
6769
  const [manualTabSwitch, setManualTabSwitch] = useState(false);
6770
+ const [listHeight, setListHeight] = useState(400);
6768
6771
  const { srcAddress } = useAddresses();
6769
6772
  const { fromChain, setFromChain, chains } = useChainsStore();
6770
6773
  const { assetMatrix, selectedAssetSymbol } = useTokensStore();
6771
- const { hasAnyWallet } = useConnectedWalletsStore();
6774
+ const { hasAnyWallet, hasWalletForChain } = useConnectedWalletsStore();
6772
6775
  const { getBalance, query: balancesQuery } = useBalances(
6773
6776
  fromChain?.chainKey,
6774
6777
  srcAddress
6775
6778
  );
6779
+ const hasSourceWallet = useCallback(() => {
6780
+ return hasWalletForChain(fromChain?.chainKey);
6781
+ }, [hasWalletForChain, fromChain?.chainKey]);
6776
6782
  useEffect(() => {
6777
- if (!hasAnyWallet()) setTab("all");
6778
- }, [hasAnyWallet]);
6783
+ if (!hasSourceWallet()) setTab("all");
6784
+ }, [hasSourceWallet]);
6779
6785
  const getTokenUsdValue = useCallback(
6780
6786
  (symbol, price) => {
6781
6787
  const bal = getBalance(symbol);
@@ -6842,7 +6848,7 @@ const TokenSelectModal = ({
6842
6848
  getTokenUsdValue
6843
6849
  ]);
6844
6850
  const myTokens = groupedTokens.withBalance;
6845
- const effectiveTab = hasAnyWallet() ? tab : "all";
6851
+ const effectiveTab = hasSourceWallet() ? tab === "my" && myTokens.length === 0 && !manualTabSwitch ? "all" : tab : "all";
6846
6852
  useEffect(() => {
6847
6853
  if (query.trim() !== "" && tab === "my" && myTokens.length === 0 && !manualTabSwitch) {
6848
6854
  setTab("all");
@@ -6869,14 +6875,17 @@ const TokenSelectModal = ({
6869
6875
  if (!isOpen) resetState();
6870
6876
  }, [isOpen, resetState]);
6871
6877
  useEffect(() => () => resetState(), [resetState]);
6872
- const onPick = (sym, willChangeSrcChain = false) => {
6873
- if (willChangeSrcChain) {
6874
- const newChain = findFirstAvailableChain(sym);
6875
- if (newChain && setFromChain) setFromChain(newChain);
6876
- }
6877
- onChangeAsset(sym);
6878
- handleClose();
6879
- };
6878
+ const onPick = useCallback(
6879
+ (sym, willChangeSrcChain = false) => {
6880
+ if (willChangeSrcChain) {
6881
+ const newChain = findFirstAvailableChain(sym);
6882
+ if (newChain && setFromChain) setFromChain(newChain);
6883
+ }
6884
+ onChangeAsset(sym);
6885
+ handleClose();
6886
+ },
6887
+ [findFirstAvailableChain, handleClose, onChangeAsset, setFromChain]
6888
+ );
6880
6889
  const tokensToRender = useMemo(() => {
6881
6890
  if (effectiveTab === "my") {
6882
6891
  return myTokens.map((token) => ({
@@ -6904,6 +6913,103 @@ const TokenSelectModal = ({
6904
6913
  [groupedTokens.willChangeSrcChain]
6905
6914
  );
6906
6915
  const hasNoResults = tokensToRender.length === 0 && willChangeSrcTokens.length === 0;
6916
+ const virtualItems = useMemo(() => {
6917
+ const items2 = tokensToRender.map(
6918
+ ({ token, willChangeSrc }) => ({
6919
+ type: "token",
6920
+ data: { token, willChangeSrc }
6921
+ })
6922
+ );
6923
+ if (effectiveTab === "all" && willChangeSrcTokens.length > 0) {
6924
+ items2.push({
6925
+ type: "header",
6926
+ text: t2("bridge.willChangeSourceChain")
6927
+ });
6928
+ items2.push(
6929
+ ...willChangeSrcTokens.map(({ token, willChangeSrc }) => ({
6930
+ type: "token",
6931
+ data: { token, willChangeSrc }
6932
+ }))
6933
+ );
6934
+ }
6935
+ return items2;
6936
+ }, [effectiveTab, tokensToRender, t2, willChangeSrcTokens]);
6937
+ useLayoutEffect(() => {
6938
+ const updateHeight = () => {
6939
+ const container2 = document.getElementById("token-select-list");
6940
+ console.log("CONTAINER", container2);
6941
+ if (!container2) return;
6942
+ const height = container2.getBoundingClientRect().height;
6943
+ if (height > 0) {
6944
+ setListHeight(height);
6945
+ }
6946
+ };
6947
+ updateHeight();
6948
+ const timeout1 = setTimeout(updateHeight, 0);
6949
+ const timeout2 = setTimeout(updateHeight, 300);
6950
+ const resizeObserver = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => {
6951
+ updateHeight();
6952
+ }) : void 0;
6953
+ const container = document.getElementById("token-select-list");
6954
+ if (container) resizeObserver?.observe(container);
6955
+ return () => {
6956
+ clearTimeout(timeout1);
6957
+ clearTimeout(timeout2);
6958
+ resizeObserver?.disconnect();
6959
+ };
6960
+ }, [isOpen, hasSourceWallet]);
6961
+ const VirtualRow = useCallback(
6962
+ ({ index, style }) => {
6963
+ const item = virtualItems[index];
6964
+ if (!item) return null;
6965
+ if (item.type === "header") {
6966
+ return /* @__PURE__ */ jsx(
6967
+ "div",
6968
+ {
6969
+ style: { ...style, height: TOKEN_ROW_HEIGHT },
6970
+ className: "px-5 flex leading-4 text-base py-2 text-muted-foreground uppercase mt-8",
6971
+ children: /* @__PURE__ */ jsx("p", { children: item.text })
6972
+ }
6973
+ );
6974
+ }
6975
+ const { token, willChangeSrc } = item.data;
6976
+ const bal = getBalance(token.symbol);
6977
+ const usd = getTokenUsdValue(token.symbol, token.price?.usd);
6978
+ const isSelected = selectedAssetSymbol?.toUpperCase() === token.symbol.toUpperCase();
6979
+ return /* @__PURE__ */ jsx("div", { style: { ...style, height: TOKEN_ROW_HEIGHT }, children: /* @__PURE__ */ jsx(
6980
+ TokenRow,
6981
+ {
6982
+ symbol: token.symbol,
6983
+ name: token.name,
6984
+ isSelected: !!isSelected,
6985
+ hasAnyWallet: hasAnyWallet(),
6986
+ balance: bal,
6987
+ usdValue: usd,
6988
+ isBalanceLoading: balancesQuery.isLoading || balancesQuery.isFetching,
6989
+ onPick: () => onPick(token.symbol, willChangeSrc)
6990
+ }
6991
+ ) });
6992
+ },
6993
+ [
6994
+ balancesQuery.isFetching,
6995
+ balancesQuery.isLoading,
6996
+ getBalance,
6997
+ getTokenUsdValue,
6998
+ hasAnyWallet,
6999
+ onPick,
7000
+ selectedAssetSymbol,
7001
+ virtualItems
7002
+ ]
7003
+ );
7004
+ const itemKey = useCallback(
7005
+ (index) => {
7006
+ const item = virtualItems[index];
7007
+ if (!item) return index;
7008
+ if (item.type === "header") return `header-${index}-${item.text}`;
7009
+ return `${effectiveTab}:${item.data.token.symbol}:${item.data.willChangeSrc ? "will" : "on"}`;
7010
+ },
7011
+ [effectiveTab, virtualItems]
7012
+ );
6907
7013
  return /* @__PURE__ */ jsx(Dialog, { open: isOpen, onOpenChange: (open) => !open && handleClose(), children: /* @__PURE__ */ jsxs(DialogContent, { className: "max-h-[90dvh] h-[90dvh] overflow-hidden flex flex-col p-10 pt-7", children: [
6908
7014
  /* @__PURE__ */ jsx(DialogHeader, { className: "text-left", children: /* @__PURE__ */ jsx(DialogTitle, { className: "text-2xl leading-8", children: t2("bridge.selectToken") }) }),
6909
7015
  /* @__PURE__ */ jsx(
@@ -6914,11 +7020,11 @@ const TokenSelectModal = ({
6914
7020
  onChange: setQuery
6915
7021
  }
6916
7022
  ),
6917
- hasAnyWallet() && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
6918
- myTokens.length !== 0 && /* @__PURE__ */ jsx(
7023
+ hasSourceWallet() && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
7024
+ /* @__PURE__ */ jsx(
6919
7025
  Button,
6920
7026
  {
6921
- variant: tab === "my" ? "default" : "ghost",
7027
+ variant: effectiveTab === "my" ? "default" : "ghost",
6922
7028
  onClick: () => {
6923
7029
  setTab("my");
6924
7030
  setManualTabSwitch(true);
@@ -6926,7 +7032,7 @@ const TokenSelectModal = ({
6926
7032
  size: "sm",
6927
7033
  className: cn$2(
6928
7034
  "px-4 cursor-pointer",
6929
- tab !== "my" && "bg-muted hover:bg-accent"
7035
+ effectiveTab !== "my" && "bg-muted hover:bg-accent"
6930
7036
  ),
6931
7037
  children: t2("bridge.myTokens")
6932
7038
  }
@@ -6934,7 +7040,7 @@ const TokenSelectModal = ({
6934
7040
  /* @__PURE__ */ jsx(
6935
7041
  Button,
6936
7042
  {
6937
- variant: tab === "all" ? "default" : "ghost",
7043
+ variant: effectiveTab === "all" ? "default" : "ghost",
6938
7044
  onClick: () => {
6939
7045
  setTab("all");
6940
7046
  setManualTabSwitch(true);
@@ -6942,58 +7048,27 @@ const TokenSelectModal = ({
6942
7048
  size: "sm",
6943
7049
  className: cn$2(
6944
7050
  "px-4 cursor-pointer",
6945
- tab !== "all" && "bg-muted hover:bg-accent"
7051
+ effectiveTab !== "all" && "bg-muted hover:bg-accent"
6946
7052
  ),
6947
7053
  children: t2("bridge.allTokens")
6948
7054
  }
6949
7055
  )
6950
7056
  ] }),
6951
- /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto -mx-5", children: hasNoResults ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground px-12 py-2 h-28 flex items-center justify-center text-center", children: t2("bridge.tokenNotFound") }) : /* @__PURE__ */ jsxs(Fragment, { children: [
7057
+ /* @__PURE__ */ jsx("div", { id: "token-select-list", className: "flex-1 -mx-5 min-h-0", children: hasNoResults ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground px-12 py-2 h-28 flex items-center justify-center text-center", children: t2("bridge.tokenNotFound") }) : /* @__PURE__ */ jsxs(Fragment, { children: [
6952
7058
  effectiveTab === "my" && myTokens.length === 0 && /* @__PURE__ */ jsx("p", { className: "leading-4 px-5 text-base text-muted-foreground uppercase py-2", children: t2("bridge.noBalancesFound") }),
6953
- tokensToRender.map(({ token, willChangeSrc }) => {
6954
- const bal = getBalance(token.symbol);
6955
- const usd = getTokenUsdValue(token.symbol, token.price?.usd);
6956
- const isSelected = selectedAssetSymbol?.toUpperCase() === token.symbol.toUpperCase();
6957
- return /* @__PURE__ */ jsx(
6958
- TokenRow,
6959
- {
6960
- symbol: token.symbol,
6961
- name: token.name,
6962
- isSelected: !!isSelected,
6963
- hasAnyWallet: hasAnyWallet(),
6964
- balance: bal,
6965
- usdValue: usd,
6966
- isBalanceLoading: balancesQuery.isLoading || balancesQuery.isFetching,
6967
- onPick: () => onPick(token.symbol, willChangeSrc)
6968
- },
6969
- `${effectiveTab}:${token.symbol}`
6970
- );
6971
- }),
6972
- effectiveTab === "all" && willChangeSrcTokens.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
6973
- /* @__PURE__ */ jsx("div", { className: "px-5 flex leading-4 text-base py-2 text-muted-foreground uppercase mt-8", children: /* @__PURE__ */ jsx("p", { children: t2("bridge.willChangeSourceChain") }) }),
6974
- willChangeSrcTokens.map(({ token, willChangeSrc }) => {
6975
- const bal = getBalance(token.symbol);
6976
- const usd = getTokenUsdValue(
6977
- token.symbol,
6978
- token.price?.usd
6979
- );
6980
- const isSelected = selectedAssetSymbol?.toUpperCase() === token.symbol.toUpperCase();
6981
- return /* @__PURE__ */ jsx(
6982
- TokenRow,
6983
- {
6984
- symbol: token.symbol,
6985
- name: token.name,
6986
- isSelected: !!isSelected,
6987
- hasAnyWallet: hasAnyWallet(),
6988
- balance: bal,
6989
- usdValue: usd,
6990
- isBalanceLoading: balancesQuery.isLoading || balancesQuery.isFetching,
6991
- onPick: () => onPick(token.symbol, willChangeSrc)
6992
- },
6993
- `will:${token.symbol}`
6994
- );
6995
- })
6996
- ] })
7059
+ /* @__PURE__ */ jsx(
7060
+ FixedSizeList,
7061
+ {
7062
+ height: listHeight,
7063
+ itemCount: virtualItems.length,
7064
+ itemSize: TOKEN_ROW_HEIGHT,
7065
+ width: "100%",
7066
+ itemKey,
7067
+ className: "[&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-muted-foreground/20 [&::-webkit-scrollbar-thumb]:rounded-full hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/30",
7068
+ overscanCount: 5,
7069
+ children: VirtualRow
7070
+ }
7071
+ )
6997
7072
  ] }) })
6998
7073
  ] }) });
6999
7074
  };
@@ -25839,7 +25914,7 @@ class WalletConnectModal {
25839
25914
  }
25840
25915
  async initUi() {
25841
25916
  if (typeof window !== "undefined") {
25842
- await import("./index-sU0Z-m5M.js");
25917
+ await import("./index-Cd_UnZsU.js");
25843
25918
  const modal = document.createElement("wcm-modal");
25844
25919
  document.body.insertAdjacentElement("beforeend", modal);
25845
25920
  OptionsCtrl.setIsUiLoaded(true);
@@ -26563,4 +26638,4 @@ export {
26563
26638
  getQuoteFees as y,
26564
26639
  calculateMinReceived as z
26565
26640
  };
26566
- //# sourceMappingURL=index-CO2PQtBo.js.map
26641
+ //# sourceMappingURL=index-DvKN7Y1C.js.map