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

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.1"
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 },
@@ -3467,7 +3569,7 @@ function formatBalance2(balance) {
3467
3569
  const n = parseFloat(balance);
3468
3570
  return isNaN(n) ? balance : n.toLocaleString(void 0, { maximumFractionDigits: 7 });
3469
3571
  }
3470
- function cropAddress(address) {
3572
+ function cropAddress2(address) {
3471
3573
  if (address.length <= 16) return address;
3472
3574
  return `${address.slice(0, 8)}...${address.slice(-8)}`;
3473
3575
  }
@@ -3537,7 +3639,7 @@ function WalletBalanceModalTemplate({
3537
3639
  /* @__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
3640
  ] })
3539
3641
  ] }),
3540
- walletAddress && /* @__PURE__ */ jsx("div", { className: "pollar-bal-address", children: cropAddress(walletAddress) }),
3642
+ walletAddress && /* @__PURE__ */ jsx("div", { className: "pollar-bal-address", children: cropAddress2(walletAddress) }),
3541
3643
  isLoading && /* @__PURE__ */ jsx("div", { className: "pollar-modal-empty", children: "Loading\u2026" }),
3542
3644
  walletBalance.step === "error" && /* @__PURE__ */ jsx("div", { className: "pollar-modal-error", children: walletBalance.message }),
3543
3645
  data && !data.exists && /* @__PURE__ */ jsxs("div", { className: "pollar-modal-empty", children: [
@@ -3650,6 +3752,7 @@ function PollarProvider({
3650
3752
  const [txHistory, setTxHistory] = useState({ step: "idle" });
3651
3753
  const [sessions, setSessions] = useState({ step: "idle" });
3652
3754
  const [walletBalance, setWalletBalance] = useState({ step: "idle" });
3755
+ const [enabledAssets, setEnabledAssets] = useState({ step: "idle" });
3653
3756
  const [resolvedConfig, setResolvedConfig] = useState(() => appConfigProp ?? DEFAULT_APP_CONFIG);
3654
3757
  useEffect(() => {
3655
3758
  return pollarClient.onTransactionStateChange(setTransaction);
@@ -3663,6 +3766,9 @@ function PollarProvider({
3663
3766
  useEffect(() => {
3664
3767
  return pollarClient.onWalletBalanceStateChange(setWalletBalance);
3665
3768
  }, [pollarClient]);
3769
+ useEffect(() => {
3770
+ return pollarClient.onEnabledAssetsStateChange(setEnabledAssets);
3771
+ }, [pollarClient]);
3666
3772
  useEffect(() => {
3667
3773
  return pollarClient.onNetworkStateChange((state) => {
3668
3774
  setNetworkState(state);
@@ -3683,6 +3789,9 @@ function PollarProvider({
3683
3789
  }
3684
3790
  });
3685
3791
  }, [pollarClient]);
3792
+ useEffect(() => {
3793
+ setModalErrorLogger(pollarClient.getLogger());
3794
+ }, [pollarClient]);
3686
3795
  useEffect(() => {
3687
3796
  if (appConfigProp !== void 0) return;
3688
3797
  let cancelled = false;
@@ -3690,7 +3799,7 @@ function PollarProvider({
3690
3799
  if (cancelled || !fetched) return;
3691
3800
  setResolvedConfig(fetched);
3692
3801
  }).catch((err) => {
3693
- console.error("[PollarProvider] getAppConfig failed", err);
3802
+ pollarClient.getLogger().error("[PollarProvider] getAppConfig failed", err);
3694
3803
  });
3695
3804
  return () => {
3696
3805
  cancelled = true;
@@ -3703,6 +3812,7 @@ function PollarProvider({
3703
3812
  const [rampModalOpen, setRampModalOpen] = useState(false);
3704
3813
  const [txHistoryModalOpen, setTxHistoryModalOpen] = useState(false);
3705
3814
  const [walletBalanceModalOpen, setWalletBalanceModalOpen] = useState(false);
3815
+ const [enabledAssetsModalOpen, setEnabledAssetsModalOpen] = useState(false);
3706
3816
  const [sendModalOpen, setSendModalOpen] = useState(false);
3707
3817
  const [receiveModalOpen, setReceiveModalOpen] = useState(false);
3708
3818
  const [sessionsModalOpen, setSessionsModalOpen] = useState(false);
@@ -3710,6 +3820,7 @@ function PollarProvider({
3710
3820
  const walletAddress = sessionState?.wallet?.address || "";
3711
3821
  const getClient = useCallback(() => pollarClient, [pollarClient]);
3712
3822
  const refreshWalletBalance = useCallback(() => pollarClient.refreshBalance(), [pollarClient, walletAddress]);
3823
+ const refreshAssets = useCallback(() => pollarClient.refreshAssets(), [pollarClient, walletAddress]);
3713
3824
  const renderWallets = ui?.renderWallets;
3714
3825
  const contextValue = useMemo(() => {
3715
3826
  const styles = resolvedConfig.styles ?? {};
@@ -3741,6 +3852,10 @@ function PollarProvider({
3741
3852
  walletBalance,
3742
3853
  refreshWalletBalance,
3743
3854
  openWalletBalanceModal: () => setWalletBalanceModalOpen(true),
3855
+ // enabled assets
3856
+ enabledAssets,
3857
+ refreshAssets,
3858
+ openEnabledAssetsModal: () => setEnabledAssetsModalOpen(true),
3744
3859
  // send / receive
3745
3860
  openSendModal: () => setSendModalOpen(true),
3746
3861
  openReceiveModal: () => setReceiveModalOpen(true),
@@ -3775,6 +3890,8 @@ function PollarProvider({
3775
3890
  sessions,
3776
3891
  walletBalance,
3777
3892
  refreshWalletBalance,
3893
+ enabledAssets,
3894
+ refreshAssets,
3778
3895
  networkState,
3779
3896
  resolvedConfig,
3780
3897
  adapters,
@@ -3796,6 +3913,7 @@ function PollarProvider({
3796
3913
  rampModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setRampModalOpen(false), children: /* @__PURE__ */ jsx(RampWidget, { onClose: () => setRampModalOpen(false) }) }),
3797
3914
  txHistoryModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setTxHistoryModalOpen(false), children: /* @__PURE__ */ jsx(TxHistoryModal, { onClose: () => setTxHistoryModalOpen(false) }) }),
3798
3915
  walletBalanceModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setWalletBalanceModalOpen(false), children: /* @__PURE__ */ jsx(WalletBalanceModal, { onClose: () => setWalletBalanceModalOpen(false) }) }),
3916
+ enabledAssetsModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setEnabledAssetsModalOpen(false), children: /* @__PURE__ */ jsx(EnabledAssetsModal, { onClose: () => setEnabledAssetsModalOpen(false) }) }),
3799
3917
  sendModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setSendModalOpen(false), children: /* @__PURE__ */ jsx(SendModal, { onClose: () => setSendModalOpen(false) }) }),
3800
3918
  receiveModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setReceiveModalOpen(false), children: /* @__PURE__ */ jsx(ReceiveModal, { onClose: () => setReceiveModalOpen(false) }) }),
3801
3919
  sessionsModalOpen && /* @__PURE__ */ jsx(ModalErrorBoundary, { onClose: () => setSessionsModalOpen(false), children: /* @__PURE__ */ jsx(SessionsModal, { onClose: () => setSessionsModalOpen(false) }) }),
@@ -4244,6 +4362,6 @@ function WalletButton() {
4244
4362
  );
4245
4363
  }
4246
4364
 
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 };
4365
+ 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
4366
  //# sourceMappingURL=index.mjs.map
4249
4367
  //# sourceMappingURL=index.mjs.map