@compass-labs/widgets 0.1.20 → 0.1.21

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.
package/dist/index.mjs CHANGED
@@ -3,7 +3,7 @@ import { QueryClient, QueryClientProvider, useQueryClient, useQuery } from '@tan
3
3
  import { CompassApiSDK } from '@compass-labs/api-sdk';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
  import { arbitrum, base, mainnet } from 'viem/chains';
6
- import { Wallet, LogOut, X, ChevronDown, AlertCircle, ArrowRight, Loader2, ArrowDownLeft, ArrowUpRight, ExternalLink, Coins, Search, SlidersHorizontal, TrendingUp, ChevronRight, Plus, Minus, Shield, CheckCircle, Calendar, ArrowDownUp, ChevronUp, Inbox, Percent, Clock, TrendingDown } from 'lucide-react';
6
+ import { Wallet, LogOut, X, ChevronDown, AlertCircle, ArrowRight, Loader2, ArrowDownLeft, ArrowUpRight, ExternalLink, Coins, Search, SlidersHorizontal, TrendingUp, Plus, ChevronRight, Minus, Shield, CheckCircle, Calendar, ArrowDownUp, ChevronUp, Inbox, Percent, Clock, TrendingDown } from 'lucide-react';
7
7
 
8
8
  // src/provider/CompassProvider.tsx
9
9
  var ApiContext = createContext(null);
@@ -3779,31 +3779,45 @@ function AaveMarketsList({
3779
3779
  )
3780
3780
  ] });
3781
3781
  }
3782
- var MARKET_TYPES = [
3783
- { value: "aave", label: "SAFE" },
3784
- { value: "vaults", label: "MODERATE" },
3785
- { value: "pendle", label: "FIXED" }
3782
+ var MARKET_TABS = [
3783
+ { value: "variable", label: "VARIABLE" },
3784
+ { value: "fixed", label: "FIXED" }
3786
3785
  ];
3786
+ var TAB_TO_MARKET_TYPES = {
3787
+ variable: ["aave", "vaults"],
3788
+ fixed: ["pendle"]
3789
+ };
3787
3790
  function MarketSelector({
3788
3791
  markets,
3789
3792
  selectedMarket,
3790
3793
  onMarketSelect,
3791
- marketType,
3792
- onMarketTypeChange,
3793
- minTvl,
3794
- onMinTvlChange,
3795
- isLoading
3794
+ marketTab,
3795
+ onMarketTabChange,
3796
+ isLoading,
3797
+ allowedMarketIds
3796
3798
  }) {
3797
3799
  const [isDropdownOpen, setIsDropdownOpen] = useState(false);
3798
- const showTvl = marketType !== "aave";
3800
+ const dropdownRef = useRef(null);
3801
+ useEffect(() => {
3802
+ function handleClickOutside(e) {
3803
+ if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
3804
+ setIsDropdownOpen(false);
3805
+ }
3806
+ }
3807
+ document.addEventListener("mousedown", handleClickOutside);
3808
+ return () => document.removeEventListener("mousedown", handleClickOutside);
3809
+ }, []);
3810
+ const allowedTypes = TAB_TO_MARKET_TYPES[marketTab];
3811
+ const showTvl = marketTab === "variable";
3799
3812
  const filteredMarkets = useMemo(() => {
3800
- return markets.filter((m) => m.type === marketType && (showTvl ? m.tvl >= minTvl : true));
3801
- }, [markets, marketType, minTvl, showTvl]);
3802
- const maxTvl = useMemo(() => {
3803
- const typeMarkets = markets.filter((m) => m.type === marketType);
3804
- if (typeMarkets.length === 0) return 0;
3805
- return Math.max(...typeMarkets.map((m) => m.tvl));
3806
- }, [markets, marketType]);
3813
+ return markets.filter((m) => {
3814
+ if (!allowedTypes.includes(m.type)) return false;
3815
+ if (allowedMarketIds !== void 0) {
3816
+ return allowedMarketIds.includes(m.id);
3817
+ }
3818
+ return true;
3819
+ }).sort((a, b) => b.apy - a.apy);
3820
+ }, [markets, allowedTypes, allowedMarketIds]);
3807
3821
  const hasMarkets = filteredMarkets.length > 0;
3808
3822
  const formatTvl = (value) => {
3809
3823
  if (value >= 1e9) return `$${(value / 1e9).toFixed(1)}B`;
@@ -3842,15 +3856,15 @@ function MarketSelector({
3842
3856
  border: "1px solid var(--compass-color-border, rgba(255, 255, 255, 0.1))",
3843
3857
  overflow: "hidden"
3844
3858
  },
3845
- children: MARKET_TYPES.map((type) => /* @__PURE__ */ jsx(
3859
+ children: MARKET_TABS.map((tab) => /* @__PURE__ */ jsx(
3846
3860
  "button",
3847
3861
  {
3848
- onClick: () => onMarketTypeChange(type.value),
3862
+ onClick: () => onMarketTabChange(tab.value),
3849
3863
  style: {
3850
3864
  flex: 1,
3851
3865
  padding: "6px 8px",
3852
- backgroundColor: marketType === type.value ? "var(--compass-color-primary, #6366f1)" : "var(--compass-color-surface, #12121a)",
3853
- color: marketType === type.value ? "var(--compass-color-primary-text, white)" : "var(--compass-color-text, #e4e4e7)",
3866
+ backgroundColor: marketTab === tab.value ? "var(--compass-color-primary, #6366f1)" : "var(--compass-color-surface, #12121a)",
3867
+ color: marketTab === tab.value ? "var(--compass-color-primary-text, white)" : "var(--compass-color-text, #e4e4e7)",
3854
3868
  border: "none",
3855
3869
  cursor: "pointer",
3856
3870
  fontSize: "12px",
@@ -3858,9 +3872,9 @@ function MarketSelector({
3858
3872
  fontFamily: "var(--compass-font-family)",
3859
3873
  transition: "var(--compass-transition-normal, all 0.2s ease)"
3860
3874
  },
3861
- children: type.label
3875
+ children: tab.label
3862
3876
  },
3863
- type.value
3877
+ tab.value
3864
3878
  ))
3865
3879
  }
3866
3880
  )
@@ -3878,7 +3892,7 @@ function MarketSelector({
3878
3892
  children: "Select Market"
3879
3893
  }
3880
3894
  ),
3881
- /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
3895
+ /* @__PURE__ */ jsxs("div", { ref: dropdownRef, style: { position: "relative" }, children: [
3882
3896
  /* @__PURE__ */ jsxs(
3883
3897
  "button",
3884
3898
  {
@@ -3905,7 +3919,7 @@ function MarketSelector({
3905
3919
  style: {
3906
3920
  color: selectedMarket ? "var(--compass-color-text)" : "var(--compass-color-text-secondary)"
3907
3921
  },
3908
- children: isLoading ? "Loading markets..." : !hasMarkets ? `No markets above ${formatTvl(minTvl)}` : selectedMarket ? selectedMarket.name : "Select a market"
3922
+ children: isLoading ? "Loading markets..." : !hasMarkets ? "No markets available" : selectedMarket ? selectedMarket.name : "Select a market"
3909
3923
  }
3910
3924
  ),
3911
3925
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "var(--compass-spacing-unit)" }, children: [
@@ -3998,7 +4012,7 @@ function MarketSelector({
3998
4012
  ]
3999
4013
  }
4000
4014
  ),
4001
- (showTvl || market.expiry) && /* @__PURE__ */ jsxs(
4015
+ (showTvl && market.tvl > 0 || market.expiry) && /* @__PURE__ */ jsxs(
4002
4016
  "div",
4003
4017
  {
4004
4018
  style: {
@@ -4007,8 +4021,8 @@ function MarketSelector({
4007
4021
  marginTop: "calc(var(--compass-spacing-unit) * 0.5)"
4008
4022
  },
4009
4023
  children: [
4010
- showTvl && `TVL: ${formatTvl(market.tvl)}`,
4011
- showTvl && market.expiry && " \xB7 ",
4024
+ showTvl && market.tvl > 0 && `TVL: ${formatTvl(market.tvl)}`,
4025
+ showTvl && market.tvl > 0 && market.expiry && " \xB7 ",
4012
4026
  market.expiry && `Expires: ${market.expiry}`
4013
4027
  ]
4014
4028
  }
@@ -4020,56 +4034,6 @@ function MarketSelector({
4020
4034
  }
4021
4035
  )
4022
4036
  ] })
4023
- ] }),
4024
- showTvl && /* @__PURE__ */ jsxs("div", { children: [
4025
- /* @__PURE__ */ jsxs(
4026
- "div",
4027
- {
4028
- style: {
4029
- display: "flex",
4030
- justifyContent: "space-between",
4031
- alignItems: "center",
4032
- marginBottom: "var(--compass-spacing-unit)"
4033
- },
4034
- children: [
4035
- /* @__PURE__ */ jsx(
4036
- "label",
4037
- {
4038
- style: {
4039
- fontSize: "var(--compass-font-size-sm)",
4040
- color: "var(--compass-color-text-secondary)"
4041
- },
4042
- children: "Min TVL"
4043
- }
4044
- ),
4045
- /* @__PURE__ */ jsx(
4046
- "span",
4047
- {
4048
- style: {
4049
- fontSize: "var(--compass-font-size-sm)",
4050
- color: "var(--compass-color-text)"
4051
- },
4052
- children: formatTvl(minTvl)
4053
- }
4054
- )
4055
- ]
4056
- }
4057
- ),
4058
- /* @__PURE__ */ jsx(
4059
- "input",
4060
- {
4061
- type: "range",
4062
- min: 0,
4063
- max: maxTvl,
4064
- step: 1e5,
4065
- value: minTvl,
4066
- onChange: (e) => onMinTvlChange(Number(e.target.value)),
4067
- style: {
4068
- width: "100%",
4069
- accentColor: "var(--compass-color-primary)"
4070
- }
4071
- }
4072
- )
4073
4037
  ] })
4074
4038
  ]
4075
4039
  }
@@ -4667,12 +4631,15 @@ function EarnAccount({
4667
4631
  title = "Savings Account",
4668
4632
  onDeposit,
4669
4633
  onWithdraw,
4670
- defaultMarketType = "aave",
4671
- defaultMinTvl = 0
4634
+ defaultMarketTab = "variable",
4635
+ allowedVariableMarkets,
4636
+ allowedFixedMarkets,
4637
+ chain: chainProp
4672
4638
  }) {
4673
4639
  const { address, isConnected, login, signTypedData, switchChain, walletChainId } = useEmbeddableWallet();
4674
4640
  const { isDeployed } = useEarnAccount();
4675
- const { chainId: CHAIN_ID } = useChain();
4641
+ const { chainId: contextChainId } = useChain();
4642
+ const CHAIN_ID = chainProp || contextChainId;
4676
4643
  const queryClient = useQueryClient();
4677
4644
  const [activeTab, setActiveTab] = useState("deposit");
4678
4645
  const [selectedToken, setSelectedToken] = useState("USDC");
@@ -4688,9 +4655,8 @@ function EarnAccount({
4688
4655
  const [fundError, setFundError] = useState(null);
4689
4656
  const [fundStatus, setFundStatus] = useState("");
4690
4657
  const [isBalancesModalOpen, setIsBalancesModalOpen] = useState(false);
4691
- const [marketType, setMarketType] = useState(defaultMarketType);
4658
+ const [marketTab, setMarketTab] = useState(defaultMarketTab);
4692
4659
  const [selectedMarket, setSelectedMarket] = useState(null);
4693
- const [minTvl, setMinTvl] = useState(defaultMinTvl);
4694
4660
  const [isEarningsModalOpen, setIsEarningsModalOpen] = useState(false);
4695
4661
  useEffect(() => {
4696
4662
  setSelectedMarket(null);
@@ -4756,7 +4722,7 @@ function EarnAccount({
4756
4722
  });
4757
4723
  const allPositionData = positionQuery.data || [];
4758
4724
  const totalDepositedBalance = allPositionData.reduce((sum, p) => sum + parseFloat(p.balanceUsd || "0"), 0);
4759
- const earnAccountTotal = parseFloat(earnAccountTotalUsd);
4725
+ const earnAccountTotal = parseFloat(earnAccountTotalUsd) + totalDepositedBalance;
4760
4726
  const aaveMarketsQuery = useQuery({
4761
4727
  queryKey: ["allAaveMarkets", CHAIN_ID],
4762
4728
  queryFn: async () => {
@@ -5373,7 +5339,7 @@ function EarnAccount({
5373
5339
  ) }),
5374
5340
  /* @__PURE__ */ jsx(WalletStatus, { compact: true })
5375
5341
  ] }),
5376
- /* @__PURE__ */ jsx(ChainSwitcher, {}),
5342
+ !chainProp && /* @__PURE__ */ jsx(ChainSwitcher, {}),
5377
5343
  /* @__PURE__ */ jsxs(EarnAccountGuard, { children: [
5378
5344
  /* @__PURE__ */ jsxs(
5379
5345
  "div",
@@ -5385,14 +5351,14 @@ function EarnAccount({
5385
5351
  padding: compact ? "var(--compass-spacing-card)" : "calc(var(--compass-spacing-card) * 1.25)"
5386
5352
  },
5387
5353
  children: [
5388
- /* @__PURE__ */ jsxs(
5389
- "button",
5390
- {
5391
- onClick: () => setIsBalancesModalOpen(true),
5392
- className: "flex flex-col text-left w-full transition-opacity hover:opacity-80",
5393
- style: { gap: "calc(var(--compass-spacing-unit) * 0.5)" },
5394
- children: [
5395
- /* @__PURE__ */ jsxs("div", { className: "flex items-center", style: { gap: "calc(var(--compass-spacing-unit) * 0.5)" }, children: [
5354
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", style: { gap: "calc(var(--compass-spacing-unit) * 0.5)" }, children: [
5355
+ /* @__PURE__ */ jsxs(
5356
+ "button",
5357
+ {
5358
+ onClick: () => setIsBalancesModalOpen(true),
5359
+ className: "flex items-center text-left transition-opacity hover:opacity-80",
5360
+ style: { gap: "calc(var(--compass-spacing-unit) * 0.5)" },
5361
+ children: [
5396
5362
  /* @__PURE__ */ jsx(
5397
5363
  "span",
5398
5364
  {
@@ -5402,22 +5368,51 @@ function EarnAccount({
5402
5368
  }
5403
5369
  ),
5404
5370
  /* @__PURE__ */ jsx(ChevronDown, { size: 12, style: { color: "var(--compass-color-text-tertiary)" } })
5405
- ] }),
5406
- /* @__PURE__ */ jsx(
5407
- "span",
5408
- {
5409
- className: "font-bold",
5410
- style: {
5411
- color: "var(--compass-color-text)",
5412
- fontSize: compact ? "2rem" : "2.5rem",
5413
- lineHeight: "1"
5414
- },
5415
- children: formatCurrency(earnAccountTotal)
5416
- }
5417
- )
5418
- ]
5419
- }
5420
- ),
5371
+ ]
5372
+ }
5373
+ ),
5374
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
5375
+ /* @__PURE__ */ jsx(
5376
+ "button",
5377
+ {
5378
+ onClick: () => setIsBalancesModalOpen(true),
5379
+ className: "transition-opacity hover:opacity-80",
5380
+ children: /* @__PURE__ */ jsx(
5381
+ "span",
5382
+ {
5383
+ className: "font-bold",
5384
+ style: {
5385
+ color: "var(--compass-color-text)",
5386
+ fontSize: compact ? "2rem" : "2.5rem",
5387
+ lineHeight: "1"
5388
+ },
5389
+ children: formatCurrency(earnAccountTotal)
5390
+ }
5391
+ )
5392
+ }
5393
+ ),
5394
+ showTopUpButton && /* @__PURE__ */ jsxs(
5395
+ "button",
5396
+ {
5397
+ onClick: () => setIsFundModalOpen(true),
5398
+ className: "flex items-center font-medium transition-all hover:opacity-80",
5399
+ style: {
5400
+ backgroundColor: "var(--compass-color-surface-elevated, var(--compass-color-surface))",
5401
+ border: "1px solid var(--compass-color-border)",
5402
+ color: "var(--compass-color-text-secondary)",
5403
+ borderRadius: "var(--compass-border-radius-md)",
5404
+ padding: "6px 10px",
5405
+ gap: "4px",
5406
+ fontSize: "12px"
5407
+ },
5408
+ children: [
5409
+ /* @__PURE__ */ jsx(Plus, { size: 14 }),
5410
+ "Top Up"
5411
+ ]
5412
+ }
5413
+ )
5414
+ ] })
5415
+ ] }),
5421
5416
  /* @__PURE__ */ jsx(
5422
5417
  "div",
5423
5418
  {
@@ -5480,14 +5475,13 @@ function EarnAccount({
5480
5475
  markets: allMarkets,
5481
5476
  selectedMarket,
5482
5477
  onMarketSelect: setSelectedMarket,
5483
- marketType,
5484
- onMarketTypeChange: (type) => {
5485
- setMarketType(type);
5478
+ marketTab,
5479
+ onMarketTabChange: (tab) => {
5480
+ setMarketTab(tab);
5486
5481
  setSelectedMarket(null);
5487
5482
  },
5488
- minTvl,
5489
- onMinTvlChange: setMinTvl,
5490
- isLoading: isMarketsLoading
5483
+ isLoading: isMarketsLoading,
5484
+ allowedMarketIds: marketTab === "variable" ? allowedVariableMarkets : allowedFixedMarkets
5491
5485
  }
5492
5486
  ),
5493
5487
  /* @__PURE__ */ jsxs(
@@ -5747,26 +5741,6 @@ function EarnAccount({
5747
5741
  ] })
5748
5742
  ]
5749
5743
  }
5750
- ),
5751
- showTopUpButton && /* @__PURE__ */ jsxs(
5752
- "button",
5753
- {
5754
- onClick: () => setIsFundModalOpen(true),
5755
- className: "w-full font-medium flex items-center justify-center transition-all",
5756
- style: {
5757
- backgroundColor: "var(--compass-color-surface)",
5758
- border: "1px solid var(--compass-color-border)",
5759
- color: "var(--compass-color-text)",
5760
- borderRadius: "var(--compass-border-radius-lg)",
5761
- padding: compact ? "calc(var(--compass-spacing-unit) * 0.75)" : "var(--compass-spacing-card)",
5762
- gap: "calc(var(--compass-spacing-unit) * 0.5)",
5763
- transition: "var(--compass-transition-normal)"
5764
- },
5765
- children: [
5766
- /* @__PURE__ */ jsx(Wallet, { size: compact ? 16 : 18 }),
5767
- "Top Up"
5768
- ]
5769
- }
5770
5744
  )
5771
5745
  ] }),
5772
5746
  /* @__PURE__ */ jsx(