@pollar/react 0.9.0-rc.0 → 0.9.0-rc.2

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
@@ -1002,6 +1002,10 @@ var require_QRCode = __commonJS({
1002
1002
  var LOGO_POLLAR = "https://pollar.xyz/assets/logo_pollar.png";
1003
1003
  var LOGO_FREIGHTER = "https://pollar.xyz/assets/logo_freighter.png";
1004
1004
  var LOGO_ALBEDO = "https://pollar.xyz/assets/logo_albedo.svg";
1005
+ var _modalLog = console;
1006
+ function setModalErrorLogger(logger) {
1007
+ _modalLog = logger;
1008
+ }
1005
1009
  var ModalErrorBoundary = class extends Component {
1006
1010
  constructor() {
1007
1011
  super(...arguments);
@@ -1011,7 +1015,7 @@ var ModalErrorBoundary = class extends Component {
1011
1015
  return { crashed: true };
1012
1016
  }
1013
1017
  componentDidCatch(error) {
1014
- console.error("[PollarProvider] Modal crashed:", error);
1018
+ _modalLog.error("[PollarProvider] Modal crashed:", error);
1015
1019
  }
1016
1020
  render() {
1017
1021
  if (this.state.crashed) {
@@ -1029,7 +1033,7 @@ var PollarModalFooter = () => {
1029
1033
  /* @__PURE__ */ jsx("span", { className: "pollar-footer-name", children: "Pollar" }),
1030
1034
  /* @__PURE__ */ jsxs("span", { className: "pollar-footer-version", children: [
1031
1035
  "v",
1032
- "0.9.0-rc.0"
1036
+ "0.9.0-rc.2"
1033
1037
  ] })
1034
1038
  ] })
1035
1039
  ] });
@@ -1260,6 +1264,104 @@ function DistributionRulesModal({ onClose }) {
1260
1264
  }
1261
1265
  ) });
1262
1266
  }
1267
+ function cropAddress(address) {
1268
+ if (address.length <= 16) return address;
1269
+ return `${address.slice(0, 8)}...${address.slice(-8)}`;
1270
+ }
1271
+ function AssetItem({ record }) {
1272
+ const established = record.trustlineEstablished;
1273
+ return /* @__PURE__ */ jsxs("div", { className: "pollar-asset-item", children: [
1274
+ /* @__PURE__ */ jsxs("div", { className: "pollar-asset-info", children: [
1275
+ /* @__PURE__ */ jsx("span", { className: "pollar-asset-code", children: record.code }),
1276
+ record.name && /* @__PURE__ */ jsx("span", { className: "pollar-asset-name", children: record.name })
1277
+ ] }),
1278
+ /* @__PURE__ */ jsx("span", { className: `pollar-asset-trustline${established ? " established" : ""}`, children: established ? "Trustline active" : "Needs trustline" })
1279
+ ] });
1280
+ }
1281
+ function EnabledAssetsModalTemplate({
1282
+ theme,
1283
+ accentColor,
1284
+ enabledAssets,
1285
+ walletAddress,
1286
+ onRefresh,
1287
+ onClose
1288
+ }) {
1289
+ const isDark = theme === "dark";
1290
+ const cssVars = {
1291
+ "--pollar-accent": accentColor,
1292
+ "--pollar-bg": isDark ? "#1a1a1a" : "#ffffff",
1293
+ "--pollar-border": isDark ? "#374151" : "#e5e7eb",
1294
+ "--pollar-text": isDark ? "#ffffff" : "#111827",
1295
+ "--pollar-muted": isDark ? "#9ca3af" : "#6b7280",
1296
+ "--pollar-input-bg": isDark ? "#374151" : "#f9fafb",
1297
+ "--pollar-error-bg": isDark ? "#2a1515" : "#fef2f2",
1298
+ "--pollar-error-border": isDark ? "#7f1d1d" : "#fecaca",
1299
+ "--pollar-error-text": isDark ? "#f87171" : "#dc2626",
1300
+ "--pollar-success-text": isDark ? "#4ade80" : "#16a34a",
1301
+ "--pollar-buttons-border-radius": "6px",
1302
+ "--pollar-buttons-height": "44px",
1303
+ "--pollar-input-height": "44px",
1304
+ "--pollar-input-border-radius": "0.5rem",
1305
+ "--pollar-card-border-radius": "10px"
1306
+ };
1307
+ const isLoading = enabledAssets.step === "loading";
1308
+ const data = enabledAssets.step === "loaded" ? enabledAssets.data : null;
1309
+ return /* @__PURE__ */ jsxs("div", { className: "pollar-modal-card pollar-asset-modal", "data-theme": theme, style: cssVars, onClick: (e) => e.stopPropagation(), children: [
1310
+ /* @__PURE__ */ jsxs("div", { className: "pollar-modal-header", children: [
1311
+ /* @__PURE__ */ jsx("h2", { className: "pollar-modal-title", children: "Enabled Assets" }),
1312
+ /* @__PURE__ */ jsxs("div", { className: "pollar-modal-header-actions", children: [
1313
+ /* @__PURE__ */ jsxs("button", { className: "pollar-modal-refresh-btn", onClick: onRefresh, disabled: isLoading, children: [
1314
+ /* @__PURE__ */ jsxs(
1315
+ "svg",
1316
+ {
1317
+ className: `pollar-modal-refresh-icon${isLoading ? " spinning" : ""}`,
1318
+ width: "13",
1319
+ height: "13",
1320
+ viewBox: "0 0 13 13",
1321
+ fill: "none",
1322
+ "aria-hidden": true,
1323
+ children: [
1324
+ /* @__PURE__ */ jsx("path", { d: "M11.5 6.5a5 5 0 11-1.5-3.536", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }),
1325
+ /* @__PURE__ */ jsx("path", { d: "M10 1v3h-3", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })
1326
+ ]
1327
+ }
1328
+ ),
1329
+ "Refresh"
1330
+ ] }),
1331
+ /* @__PURE__ */ jsx("button", { className: "pollar-modal-close", onClick: onClose, "aria-label": "Close", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "M2 2l12 12M14 2L2 14", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) })
1332
+ ] })
1333
+ ] }),
1334
+ walletAddress && /* @__PURE__ */ jsx("div", { className: "pollar-asset-address", children: cropAddress(walletAddress) }),
1335
+ isLoading && /* @__PURE__ */ jsx("div", { className: "pollar-modal-empty", children: "Loading\u2026" }),
1336
+ enabledAssets.step === "error" && /* @__PURE__ */ jsx("div", { className: "pollar-modal-error", children: enabledAssets.message }),
1337
+ data && !data.exists && /* @__PURE__ */ jsxs("div", { className: "pollar-modal-empty", children: [
1338
+ "Account not found on ",
1339
+ data.network,
1340
+ "."
1341
+ ] }),
1342
+ data && data.assets.length === 0 && /* @__PURE__ */ jsx("div", { className: "pollar-modal-empty", children: "No assets enabled for this application." }),
1343
+ data && data.assets.length > 0 && /* @__PURE__ */ jsx("div", { className: "pollar-asset-list", children: data.assets.map((a) => /* @__PURE__ */ jsx(AssetItem, { record: a }, a.code + (a.issuer ?? ""))) }),
1344
+ /* @__PURE__ */ jsx(PollarModalFooter, {})
1345
+ ] });
1346
+ }
1347
+ function EnabledAssetsModal({ onClose }) {
1348
+ const { enabledAssets, refreshAssets, walletAddress, styles } = usePollar();
1349
+ const { theme = "light", accentColor = "#005DB4" } = styles;
1350
+ useEffect(() => {
1351
+ void refreshAssets();
1352
+ }, [refreshAssets]);
1353
+ return /* @__PURE__ */ jsx("div", { className: "pollar-overlay", onClick: onClose, children: /* @__PURE__ */ jsx(
1354
+ EnabledAssetsModalTemplate,
1355
+ {
1356
+ theme,
1357
+ accentColor,
1358
+ enabledAssets,
1359
+ walletAddress,
1360
+ onRefresh: () => refreshAssets(),
1361
+ onClose
1362
+ }
1363
+ ) });
1364
+ }
1263
1365
  var STATUS_CONFIG = {
1264
1366
  none: { label: "Not started", color: "#6b7280", dot: false },
1265
1367
  pending: { label: "Pending review", color: "#f59e0b", dot: true },
@@ -1810,6 +1912,9 @@ function LoginModal({ onClose }) {
1810
1912
  setCodeInputKey((k) => k + 1);
1811
1913
  }
1812
1914
  if (next.step === "authenticated") {
1915
+ if (autoCloseTimer.current !== null) {
1916
+ clearTimeout(autoCloseTimer.current);
1917
+ }
1813
1918
  autoCloseTimer.current = setTimeout(() => {
1814
1919
  autoCloseTimer.current = null;
1815
1920
  onCloseRef.current();
@@ -3467,7 +3572,7 @@ function formatBalance2(balance) {
3467
3572
  const n = parseFloat(balance);
3468
3573
  return isNaN(n) ? balance : n.toLocaleString(void 0, { maximumFractionDigits: 7 });
3469
3574
  }
3470
- function cropAddress(address) {
3575
+ function cropAddress2(address) {
3471
3576
  if (address.length <= 16) return address;
3472
3577
  return `${address.slice(0, 8)}...${address.slice(-8)}`;
3473
3578
  }
@@ -3537,7 +3642,7 @@ function WalletBalanceModalTemplate({
3537
3642
  /* @__PURE__ */ jsx("button", { className: "pollar-modal-close", onClick: onClose, "aria-label": "Close", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "M2 2l12 12M14 2L2 14", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) })
3538
3643
  ] })
3539
3644
  ] }),
3540
- walletAddress && /* @__PURE__ */ jsx("div", { className: "pollar-bal-address", children: cropAddress(walletAddress) }),
3645
+ walletAddress && /* @__PURE__ */ jsx("div", { className: "pollar-bal-address", children: cropAddress2(walletAddress) }),
3541
3646
  isLoading && /* @__PURE__ */ jsx("div", { className: "pollar-modal-empty", children: "Loading\u2026" }),
3542
3647
  walletBalance.step === "error" && /* @__PURE__ */ jsx("div", { className: "pollar-modal-error", children: walletBalance.message }),
3543
3648
  data && !data.exists && /* @__PURE__ */ jsxs("div", { className: "pollar-modal-empty", children: [
@@ -3650,6 +3755,7 @@ function PollarProvider({
3650
3755
  const [txHistory, setTxHistory] = useState({ step: "idle" });
3651
3756
  const [sessions, setSessions] = useState({ step: "idle" });
3652
3757
  const [walletBalance, setWalletBalance] = useState({ step: "idle" });
3758
+ const [enabledAssets, setEnabledAssets] = useState({ step: "idle" });
3653
3759
  const [resolvedConfig, setResolvedConfig] = useState(() => appConfigProp ?? DEFAULT_APP_CONFIG);
3654
3760
  useEffect(() => {
3655
3761
  return pollarClient.onTransactionStateChange(setTransaction);
@@ -3663,6 +3769,9 @@ function PollarProvider({
3663
3769
  useEffect(() => {
3664
3770
  return pollarClient.onWalletBalanceStateChange(setWalletBalance);
3665
3771
  }, [pollarClient]);
3772
+ useEffect(() => {
3773
+ return pollarClient.onEnabledAssetsStateChange(setEnabledAssets);
3774
+ }, [pollarClient]);
3666
3775
  useEffect(() => {
3667
3776
  return pollarClient.onNetworkStateChange((state) => {
3668
3777
  setNetworkState(state);
@@ -3683,6 +3792,9 @@ function PollarProvider({
3683
3792
  }
3684
3793
  });
3685
3794
  }, [pollarClient]);
3795
+ useEffect(() => {
3796
+ setModalErrorLogger(pollarClient.getLogger());
3797
+ }, [pollarClient]);
3686
3798
  useEffect(() => {
3687
3799
  if (appConfigProp !== void 0) return;
3688
3800
  let cancelled = false;
@@ -3690,7 +3802,7 @@ function PollarProvider({
3690
3802
  if (cancelled || !fetched) return;
3691
3803
  setResolvedConfig(fetched);
3692
3804
  }).catch((err) => {
3693
- console.error("[PollarProvider] getAppConfig failed", err);
3805
+ pollarClient.getLogger().error("[PollarProvider] getAppConfig failed", err);
3694
3806
  });
3695
3807
  return () => {
3696
3808
  cancelled = true;
@@ -3703,6 +3815,7 @@ function PollarProvider({
3703
3815
  const [rampModalOpen, setRampModalOpen] = useState(false);
3704
3816
  const [txHistoryModalOpen, setTxHistoryModalOpen] = useState(false);
3705
3817
  const [walletBalanceModalOpen, setWalletBalanceModalOpen] = useState(false);
3818
+ const [enabledAssetsModalOpen, setEnabledAssetsModalOpen] = useState(false);
3706
3819
  const [sendModalOpen, setSendModalOpen] = useState(false);
3707
3820
  const [receiveModalOpen, setReceiveModalOpen] = useState(false);
3708
3821
  const [sessionsModalOpen, setSessionsModalOpen] = useState(false);
@@ -3710,6 +3823,7 @@ function PollarProvider({
3710
3823
  const walletAddress = sessionState?.wallet?.address || "";
3711
3824
  const getClient = useCallback(() => pollarClient, [pollarClient]);
3712
3825
  const refreshWalletBalance = useCallback(() => pollarClient.refreshBalance(), [pollarClient, walletAddress]);
3826
+ const refreshAssets = useCallback(() => pollarClient.refreshAssets(), [pollarClient, walletAddress]);
3713
3827
  const renderWallets = ui?.renderWallets;
3714
3828
  const contextValue = useMemo(() => {
3715
3829
  const styles = resolvedConfig.styles ?? {};
@@ -3741,6 +3855,10 @@ function PollarProvider({
3741
3855
  walletBalance,
3742
3856
  refreshWalletBalance,
3743
3857
  openWalletBalanceModal: () => setWalletBalanceModalOpen(true),
3858
+ // enabled assets
3859
+ enabledAssets,
3860
+ refreshAssets,
3861
+ openEnabledAssetsModal: () => setEnabledAssetsModalOpen(true),
3744
3862
  // send / receive
3745
3863
  openSendModal: () => setSendModalOpen(true),
3746
3864
  openReceiveModal: () => setReceiveModalOpen(true),
@@ -3775,6 +3893,8 @@ function PollarProvider({
3775
3893
  sessions,
3776
3894
  walletBalance,
3777
3895
  refreshWalletBalance,
3896
+ enabledAssets,
3897
+ refreshAssets,
3778
3898
  networkState,
3779
3899
  resolvedConfig,
3780
3900
  adapters,
@@ -3796,6 +3916,7 @@ function PollarProvider({
3796
3916
  rampModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setRampModalOpen(false), children: /* @__PURE__ */ jsx(RampWidget, { onClose: () => setRampModalOpen(false) }) }),
3797
3917
  txHistoryModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setTxHistoryModalOpen(false), children: /* @__PURE__ */ jsx(TxHistoryModal, { onClose: () => setTxHistoryModalOpen(false) }) }),
3798
3918
  walletBalanceModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setWalletBalanceModalOpen(false), children: /* @__PURE__ */ jsx(WalletBalanceModal, { onClose: () => setWalletBalanceModalOpen(false) }) }),
3919
+ enabledAssetsModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setEnabledAssetsModalOpen(false), children: /* @__PURE__ */ jsx(EnabledAssetsModal, { onClose: () => setEnabledAssetsModalOpen(false) }) }),
3799
3920
  sendModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setSendModalOpen(false), children: /* @__PURE__ */ jsx(SendModal, { onClose: () => setSendModalOpen(false) }) }),
3800
3921
  receiveModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setReceiveModalOpen(false), children: /* @__PURE__ */ jsx(ReceiveModal, { onClose: () => setReceiveModalOpen(false) }) }),
3801
3922
  sessionsModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setSessionsModalOpen(false), children: /* @__PURE__ */ jsx(SessionsModal, { onClose: () => setSessionsModalOpen(false) }) }),
@@ -4244,6 +4365,6 @@ function WalletButton() {
4244
4365
  );
4245
4366
  }
4246
4367
 
4247
- export { DistributionRulesModal, DistributionRulesModalTemplate, KycModal, KycModalTemplate, KycStatus, LoginModalTemplate, PollarProvider, RampWidget, RampWidgetTemplate, ReceiveModal, ReceiveModalTemplate, RouteDisplay, SendModal, SendModalTemplate, SessionsModal, SessionsModalTemplate, TransactionModalTemplate, TxHistoryModalTemplate, TxStatusView, WalletBalanceModal, WalletBalanceModalTemplate, WalletButton, WalletButtonTemplate, createPollarAdapterHook, usePollar };
4368
+ export { DistributionRulesModal, DistributionRulesModalTemplate, EnabledAssetsModal, EnabledAssetsModalTemplate, KycModal, KycModalTemplate, KycStatus, LoginModalTemplate, PollarProvider, RampWidget, RampWidgetTemplate, ReceiveModal, ReceiveModalTemplate, RouteDisplay, SendModal, SendModalTemplate, SessionsModal, SessionsModalTemplate, TransactionModalTemplate, TxHistoryModalTemplate, TxStatusView, WalletBalanceModal, WalletBalanceModalTemplate, WalletButton, WalletButtonTemplate, createPollarAdapterHook, usePollar };
4248
4369
  //# sourceMappingURL=index.mjs.map
4249
4370
  //# sourceMappingURL=index.mjs.map