@dubsdotapp/expo 0.2.19 → 0.2.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.js CHANGED
@@ -51,6 +51,7 @@ __export(index_exports, {
51
51
  SettingsSheet: () => SettingsSheet,
52
52
  UserProfileCard: () => UserProfileCard,
53
53
  createSecureStoreStorage: () => createSecureStoreStorage,
54
+ getDeviceInfo: () => getDeviceInfo,
54
55
  mergeTheme: () => mergeTheme,
55
56
  parseSolanaError: () => parseSolanaError,
56
57
  signAndSendBase64Transaction: () => signAndSendBase64Transaction,
@@ -971,38 +972,6 @@ var PhantomDeeplinkAdapter = class {
971
972
  console.log(TAG2, "Decrypted signed transaction, length:", data.transaction?.length);
972
973
  return import_web32.Transaction.from(import_bs582.default.decode(data.transaction));
973
974
  }
974
- async signAndSendTransaction(transaction) {
975
- this.assertConnected();
976
- console.log(TAG2, "signAndSendTransaction() \u2014 serializing transaction");
977
- const serializedTx = import_bs582.default.encode(
978
- transaction.serialize({ requireAllSignatures: false, verifySignatures: false })
979
- );
980
- console.log(TAG2, "Transaction serialized, length:", serializedTx.length);
981
- const { nonce, ciphertext } = encryptPayload(
982
- { transaction: serializedTx, session: this._sessionToken },
983
- this._sharedSecret
984
- );
985
- const requestId = nextRequestId();
986
- const redirectLink = this.config.redirectUri;
987
- console.log(TAG2, `signAndSendTransaction() requestId=${requestId}`);
988
- const params = new URLSearchParams({
989
- dapp_encryption_public_key: import_bs582.default.encode(this._dappKeyPair.publicKey),
990
- nonce,
991
- payload: ciphertext,
992
- redirect_link: redirectLink
993
- });
994
- const url = `https://phantom.app/ul/v1/signAndSendTransaction?${params.toString()}`;
995
- console.log(TAG2, "Opening Phantom signAndSendTransaction deeplink...");
996
- const response = await this.handler.send(url, requestId, this.timeout);
997
- console.log(TAG2, "Received signAndSendTransaction response");
998
- const data = decryptPayload(
999
- response.params.data,
1000
- response.params.nonce,
1001
- this._sharedSecret
1002
- );
1003
- console.log(TAG2, "Transaction sent! Signature:", data.signature);
1004
- return data.signature;
1005
- }
1006
975
  async signMessage(message) {
1007
976
  this.assertConnected();
1008
977
  console.log(TAG2, "signMessage() \u2014 message length:", message.length);
@@ -1327,12 +1296,23 @@ function ManagedWalletProvider({
1327
1296
  }
1328
1297
  return;
1329
1298
  }
1330
- console.log(TAG3, "Phantom path \u2014 clearing any saved session, will require fresh connect");
1331
- await storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch(() => {
1332
- });
1333
1299
  try {
1300
+ const savedSession = await storage.getItem(STORAGE_KEYS.PHANTOM_SESSION);
1301
+ if (savedSession && !cancelled) {
1302
+ const session = JSON.parse(savedSession);
1303
+ console.log(TAG3, "Found saved Phantom session, restoring for wallet:", session.walletPublicKey);
1304
+ phantom.restoreSession(session);
1305
+ if (!cancelled) {
1306
+ console.log(TAG3, "Phantom reconnected from saved session");
1307
+ setConnected(true);
1308
+ }
1309
+ } else {
1310
+ console.log(TAG3, "No saved Phantom session");
1311
+ }
1334
1312
  } catch (err) {
1335
- console.log(TAG3, "Unexpected error during Phantom init:", err instanceof Error ? err.message : err);
1313
+ console.log(TAG3, "Phantom session restore failed:", err instanceof Error ? err.message : err);
1314
+ await storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch(() => {
1315
+ });
1336
1316
  } finally {
1337
1317
  if (!cancelled) {
1338
1318
  console.log(TAG3, "Phantom init complete, marking ready");
@@ -1438,7 +1418,7 @@ function ManagedWalletProvider({
1438
1418
 
1439
1419
  // src/ui/AuthGate.tsx
1440
1420
  var import_react12 = __toESM(require("react"));
1441
- var import_react_native5 = require("react-native");
1421
+ var import_react_native6 = require("react-native");
1442
1422
 
1443
1423
  // src/hooks/useEvents.ts
1444
1424
  var import_react2 = require("react");
@@ -1549,7 +1529,7 @@ var import_react6 = require("react");
1549
1529
 
1550
1530
  // src/utils/transaction.ts
1551
1531
  var import_web33 = require("@solana/web3.js");
1552
- async function signAndSendBase64Transaction(base64Tx, wallet) {
1532
+ async function signAndSendBase64Transaction(base64Tx, wallet, connection) {
1553
1533
  if (!wallet.publicKey) throw new Error("Wallet not connected");
1554
1534
  const binaryStr = atob(base64Tx);
1555
1535
  const bytes = new Uint8Array(binaryStr.length);
@@ -1560,12 +1540,14 @@ async function signAndSendBase64Transaction(base64Tx, wallet) {
1560
1540
  if (wallet.signAndSendTransaction) {
1561
1541
  return wallet.signAndSendTransaction(transaction);
1562
1542
  }
1563
- throw new Error("Wallet does not support signAndSendTransaction");
1543
+ const signed = await wallet.signTransaction(transaction);
1544
+ const signature = await connection.sendRawTransaction(signed.serialize());
1545
+ return signature;
1564
1546
  }
1565
1547
 
1566
1548
  // src/hooks/useCreateGame.ts
1567
1549
  function useCreateGame() {
1568
- const { client, wallet } = useDubs();
1550
+ const { client, wallet, connection } = useDubs();
1569
1551
  const [status, setStatus] = (0, import_react6.useState)("idle");
1570
1552
  const [error, setError] = (0, import_react6.useState)(null);
1571
1553
  const [data, setData] = (0, import_react6.useState)(null);
@@ -1586,7 +1568,8 @@ function useCreateGame() {
1586
1568
  console.log("[useCreateGame] Step 2: Signing and sending...");
1587
1569
  const signature = await signAndSendBase64Transaction(
1588
1570
  createResult.transaction,
1589
- wallet
1571
+ wallet,
1572
+ connection
1590
1573
  );
1591
1574
  console.log("[useCreateGame] Step 2 done. Signature:", signature);
1592
1575
  setStatus("confirming");
@@ -1626,7 +1609,7 @@ function useCreateGame() {
1626
1609
  // src/hooks/useJoinGame.ts
1627
1610
  var import_react7 = require("react");
1628
1611
  function useJoinGame() {
1629
- const { client, wallet } = useDubs();
1612
+ const { client, wallet, connection } = useDubs();
1630
1613
  const [status, setStatus] = (0, import_react7.useState)("idle");
1631
1614
  const [error, setError] = (0, import_react7.useState)(null);
1632
1615
  const [data, setData] = (0, import_react7.useState)(null);
@@ -1647,7 +1630,8 @@ function useJoinGame() {
1647
1630
  console.log("[useJoinGame] Step 2: Signing and sending transaction...");
1648
1631
  const signature = await signAndSendBase64Transaction(
1649
1632
  joinResult.transaction,
1650
- wallet
1633
+ wallet,
1634
+ connection
1651
1635
  );
1652
1636
  console.log("[useJoinGame] Step 2 done. Signature:", signature);
1653
1637
  setStatus("confirming");
@@ -1688,7 +1672,7 @@ function useJoinGame() {
1688
1672
  // src/hooks/useClaim.ts
1689
1673
  var import_react8 = require("react");
1690
1674
  function useClaim() {
1691
- const { client, wallet } = useDubs();
1675
+ const { client, wallet, connection } = useDubs();
1692
1676
  const [status, setStatus] = (0, import_react8.useState)("idle");
1693
1677
  const [error, setError] = (0, import_react8.useState)(null);
1694
1678
  const [data, setData] = (0, import_react8.useState)(null);
@@ -1709,7 +1693,8 @@ function useClaim() {
1709
1693
  console.log("[useClaim] Step 2: Signing and sending...");
1710
1694
  const signature = await signAndSendBase64Transaction(
1711
1695
  claimResult.transaction,
1712
- wallet
1696
+ wallet,
1697
+ connection
1713
1698
  );
1714
1699
  console.log("[useClaim] Step 2 done. Signature:", signature);
1715
1700
  const explorerUrl = `https://solscan.io/tx/${signature}`;
@@ -1736,7 +1721,7 @@ function useClaim() {
1736
1721
  // src/hooks/useCreateCustomGame.ts
1737
1722
  var import_react9 = require("react");
1738
1723
  function useCreateCustomGame() {
1739
- const { client, wallet } = useDubs();
1724
+ const { client, wallet, connection } = useDubs();
1740
1725
  const [status, setStatus] = (0, import_react9.useState)("idle");
1741
1726
  const [error, setError] = (0, import_react9.useState)(null);
1742
1727
  const [data, setData] = (0, import_react9.useState)(null);
@@ -1757,7 +1742,8 @@ function useCreateCustomGame() {
1757
1742
  console.log("[useCreateCustomGame] Step 2: Signing and sending...");
1758
1743
  const signature = await signAndSendBase64Transaction(
1759
1744
  createResult.transaction,
1760
- wallet
1745
+ wallet,
1746
+ connection
1761
1747
  );
1762
1748
  console.log("[useCreateCustomGame] Step 2 done. Signature:", signature);
1763
1749
  setStatus("confirming");
@@ -1803,6 +1789,45 @@ var import_bs583 = __toESM(require("bs58"));
1803
1789
  var import_react10 = require("react");
1804
1790
  var AuthContext = (0, import_react10.createContext)(null);
1805
1791
 
1792
+ // src/utils/device.ts
1793
+ var import_react_native5 = require("react-native");
1794
+ async function getDeviceInfo() {
1795
+ try {
1796
+ const Device = require("expo-device");
1797
+ return {
1798
+ platform: import_react_native5.Platform.OS,
1799
+ modelName: Device.modelName,
1800
+ brand: Device.brand,
1801
+ manufacturer: Device.manufacturer,
1802
+ osName: Device.osName,
1803
+ osVersion: Device.osVersion,
1804
+ deviceType: Device.deviceType,
1805
+ deviceName: Device.deviceName,
1806
+ totalMemory: Device.totalMemory,
1807
+ modelId: Device.modelId,
1808
+ designName: Device.designName,
1809
+ productName: Device.productName,
1810
+ isDevice: Device.isDevice
1811
+ };
1812
+ } catch {
1813
+ return {
1814
+ platform: import_react_native5.Platform.OS,
1815
+ modelName: null,
1816
+ brand: null,
1817
+ manufacturer: null,
1818
+ osName: null,
1819
+ osVersion: null,
1820
+ deviceType: null,
1821
+ deviceName: null,
1822
+ totalMemory: null,
1823
+ modelId: null,
1824
+ designName: null,
1825
+ productName: null,
1826
+ isDevice: null
1827
+ };
1828
+ }
1829
+ }
1830
+
1806
1831
  // src/hooks/useAuth.ts
1807
1832
  function useAuth() {
1808
1833
  const sharedAuth = (0, import_react11.useContext)(AuthContext);
@@ -1831,15 +1856,17 @@ function useAuth() {
1831
1856
  setStatus("authenticating");
1832
1857
  setError(null);
1833
1858
  const walletAddress = wallet.publicKey.toBase58();
1859
+ const deviceInfo = await getDeviceInfo();
1860
+ console.log("[useAuth] Device info:", JSON.stringify(deviceInfo, null, 2));
1834
1861
  const { nonce, message } = await client.getNonce(walletAddress);
1835
1862
  setStatus("signing");
1836
1863
  const messageBytes = new TextEncoder().encode(message);
1837
1864
  const signatureBytes = await wallet.signMessage(messageBytes);
1838
1865
  const signature = import_bs583.default.encode(signatureBytes);
1839
1866
  setStatus("verifying");
1840
- const result = await client.authenticate({ walletAddress, signature, nonce });
1867
+ const result = await client.authenticate({ walletAddress, signature, nonce, deviceInfo });
1841
1868
  if (result.needsRegistration) {
1842
- pendingAuth.current = { walletAddress, nonce, signature };
1869
+ pendingAuth.current = { walletAddress, nonce, signature, deviceInfo };
1843
1870
  setStatus("needsRegistration");
1844
1871
  return;
1845
1872
  }
@@ -1865,7 +1892,8 @@ function useAuth() {
1865
1892
  nonce: pending.nonce,
1866
1893
  username,
1867
1894
  referralCode,
1868
- avatarUrl
1895
+ avatarUrl,
1896
+ deviceInfo: pending.deviceInfo
1869
1897
  });
1870
1898
  pendingAuth.current = null;
1871
1899
  const user2 = avatarUrl && !result.user.avatar ? { ...result.user, avatar: avatarUrl } : result.user;
@@ -2037,44 +2065,44 @@ function DefaultLoadingScreen({ status, appName, accentColor }) {
2037
2065
  authenticated: "Ready!",
2038
2066
  error: "Something went wrong"
2039
2067
  };
2040
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.container, { backgroundColor: t.background }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.centerContent, children: [
2041
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.brandingSection, children: [
2042
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.logoCircle, { backgroundColor: accent }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.logoText, children: "D" }) }),
2043
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.appNameText, { color: t.text }], children: appName })
2068
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.container, { backgroundColor: t.background }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.centerContent, children: [
2069
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.brandingSection, children: [
2070
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.logoCircle, { backgroundColor: accent }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.logoText, children: "D" }) }),
2071
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.appNameText, { color: t.text }], children: appName })
2044
2072
  ] }),
2045
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.loadingSection, children: [
2046
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.ActivityIndicator, { size: "large", color: accent }),
2047
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.statusText, { color: t.textMuted }], children: statusText[status] || "Loading..." })
2073
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.loadingSection, children: [
2074
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.ActivityIndicator, { size: "large", color: accent }),
2075
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.statusText, { color: t.textMuted }], children: statusText[status] || "Loading..." })
2048
2076
  ] })
2049
2077
  ] }) });
2050
2078
  }
2051
2079
  function DefaultErrorScreen({ error, onRetry, appName, accentColor }) {
2052
2080
  const t = useDubsTheme();
2053
2081
  const accent = accentColor || t.accent;
2054
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.container, { backgroundColor: t.background }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.spreadContent, children: [
2055
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.brandingSection, children: [
2056
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.logoCircle, { backgroundColor: accent }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.logoText, children: "D" }) }),
2057
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.appNameText, { color: t.text }], children: appName })
2082
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.container, { backgroundColor: t.background }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.spreadContent, children: [
2083
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.brandingSection, children: [
2084
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.logoCircle, { backgroundColor: accent }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.logoText, children: "D" }) }),
2085
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.appNameText, { color: t.text }], children: appName })
2058
2086
  ] }),
2059
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: { gap: 16 }, children: [
2060
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.errorText, { color: t.errorText }], children: error.message }) }),
2061
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.TouchableOpacity, { style: [s.primaryBtn, { backgroundColor: accent }], onPress: onRetry, activeOpacity: 0.8, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.primaryBtnText, children: "Try Again" }) })
2087
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: { gap: 16 }, children: [
2088
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.errorText, { color: t.errorText }], children: error.message }) }),
2089
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.TouchableOpacity, { style: [s.primaryBtn, { backgroundColor: accent }], onPress: onRetry, activeOpacity: 0.8, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.primaryBtnText, children: "Try Again" }) })
2062
2090
  ] })
2063
2091
  ] }) });
2064
2092
  }
2065
2093
  function StepIndicator({ currentStep }) {
2066
2094
  const t = useDubsTheme();
2067
2095
  const steps = [0, 1, 2, 3];
2068
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: s.stepRow, children: steps.map((i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react12.default.Fragment, { children: [
2069
- i > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.stepLine, { backgroundColor: i <= currentStep ? t.success : t.border }] }),
2096
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: s.stepRow, children: steps.map((i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react12.default.Fragment, { children: [
2097
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.stepLine, { backgroundColor: i <= currentStep ? t.success : t.border }] }),
2070
2098
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2071
- import_react_native5.View,
2099
+ import_react_native6.View,
2072
2100
  {
2073
2101
  style: [
2074
2102
  s.stepCircle,
2075
2103
  i < currentStep ? { backgroundColor: t.success } : i === currentStep ? { backgroundColor: t.accent } : { backgroundColor: "transparent", borderWidth: 2, borderColor: t.border }
2076
2104
  ],
2077
- children: i < currentStep ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.stepCheck, children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.stepNum, { color: i === currentStep ? "#FFF" : t.textMuted }], children: i + 1 })
2105
+ children: i < currentStep ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.stepCheck, children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.stepNum, { color: i === currentStep ? "#FFF" : t.textMuted }], children: i + 1 })
2078
2106
  }
2079
2107
  )
2080
2108
  ] }, i)) });
@@ -2098,8 +2126,8 @@ function DefaultRegistrationScreen({
2098
2126
  const [checking, setChecking] = (0, import_react12.useState)(false);
2099
2127
  const [availability, setAvailability] = (0, import_react12.useState)(null);
2100
2128
  const debounceRef = (0, import_react12.useRef)(null);
2101
- const fadeAnim = (0, import_react12.useRef)(new import_react_native5.Animated.Value(1)).current;
2102
- const slideAnim = (0, import_react12.useRef)(new import_react_native5.Animated.Value(0)).current;
2129
+ const fadeAnim = (0, import_react12.useRef)(new import_react_native6.Animated.Value(1)).current;
2130
+ const slideAnim = (0, import_react12.useRef)(new import_react_native6.Animated.Value(0)).current;
2103
2131
  const avatarUrl = getAvatarUrl(avatarStyle, avatarSeed);
2104
2132
  (0, import_react12.useEffect)(() => {
2105
2133
  if (debounceRef.current) clearTimeout(debounceRef.current);
@@ -2126,92 +2154,92 @@ function DefaultRegistrationScreen({
2126
2154
  }, [username, client]);
2127
2155
  const animateToStep = (0, import_react12.useCallback)((newStep) => {
2128
2156
  const dir = newStep > step ? 1 : -1;
2129
- import_react_native5.Keyboard.dismiss();
2130
- import_react_native5.Animated.parallel([
2131
- import_react_native5.Animated.timing(fadeAnim, { toValue: 0, duration: 120, useNativeDriver: true }),
2132
- import_react_native5.Animated.timing(slideAnim, { toValue: -dir * 40, duration: 120, useNativeDriver: true })
2157
+ import_react_native6.Keyboard.dismiss();
2158
+ import_react_native6.Animated.parallel([
2159
+ import_react_native6.Animated.timing(fadeAnim, { toValue: 0, duration: 120, useNativeDriver: true }),
2160
+ import_react_native6.Animated.timing(slideAnim, { toValue: -dir * 40, duration: 120, useNativeDriver: true })
2133
2161
  ]).start(() => {
2134
2162
  setStep(newStep);
2135
2163
  slideAnim.setValue(dir * 40);
2136
- import_react_native5.Animated.parallel([
2137
- import_react_native5.Animated.timing(fadeAnim, { toValue: 1, duration: 200, useNativeDriver: true }),
2138
- import_react_native5.Animated.timing(slideAnim, { toValue: 0, duration: 200, useNativeDriver: true })
2164
+ import_react_native6.Animated.parallel([
2165
+ import_react_native6.Animated.timing(fadeAnim, { toValue: 1, duration: 200, useNativeDriver: true }),
2166
+ import_react_native6.Animated.timing(slideAnim, { toValue: 0, duration: 200, useNativeDriver: true })
2139
2167
  ]).start();
2140
2168
  });
2141
2169
  }, [step, fadeAnim, slideAnim]);
2142
2170
  const canContinueUsername = username.trim().length >= 3 && availability?.available === true && !checking;
2143
2171
  const handleSubmit = () => {
2144
- import_react_native5.Keyboard.dismiss();
2172
+ import_react_native6.Keyboard.dismiss();
2145
2173
  onRegister(username.trim(), referralCode.trim() || void 0, avatarUrl);
2146
2174
  };
2147
- const renderAvatarStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepContainer, children: [
2148
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepTop, children: [
2149
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.title, { color: t.text }], children: "Choose Your Avatar" }),
2150
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.subtitle, { color: t.textMuted }], children: "Pick a look that represents you" }),
2175
+ const renderAvatarStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.stepContainer, children: [
2176
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.stepTop, children: [
2177
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.title, { color: t.text }], children: "Choose Your Avatar" }),
2178
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.subtitle, { color: t.textMuted }], children: "Pick a look that represents you" }),
2151
2179
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(StepIndicator, { currentStep: 0 }),
2152
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: s.avatarCenter, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: [s.avatarFrame, { borderColor: accent }], children: [
2153
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Image, { source: { uri: avatarUrl }, style: s.avatarLarge }),
2154
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.checkBadge, { backgroundColor: t.success }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.checkBadgeText, children: "\u2713" }) })
2180
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: s.avatarCenter, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: [s.avatarFrame, { borderColor: accent }], children: [
2181
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Image, { source: { uri: avatarUrl }, style: s.avatarLarge }),
2182
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.checkBadge, { backgroundColor: t.success }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.checkBadgeText, children: "\u2713" }) })
2155
2183
  ] }) }),
2156
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.avatarActions, children: [
2184
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.avatarActions, children: [
2157
2185
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2158
- import_react_native5.TouchableOpacity,
2186
+ import_react_native6.TouchableOpacity,
2159
2187
  {
2160
2188
  style: [s.outlineBtn, { borderColor: t.border }],
2161
2189
  onPress: () => setAvatarSeed(generateSeed()),
2162
2190
  activeOpacity: 0.7,
2163
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.outlineBtnText, { color: t.text }], children: "\u21BB Shuffle" })
2191
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.outlineBtnText, { color: t.text }], children: "\u21BB Shuffle" })
2164
2192
  }
2165
2193
  ),
2166
2194
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2167
- import_react_native5.TouchableOpacity,
2195
+ import_react_native6.TouchableOpacity,
2168
2196
  {
2169
2197
  style: [s.outlineBtn, { borderColor: accent, backgroundColor: accent + "15" }],
2170
2198
  onPress: () => setShowStyles(!showStyles),
2171
2199
  activeOpacity: 0.7,
2172
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.outlineBtnText, { color: accent }], children: "\u263A Customize" })
2200
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.outlineBtnText, { color: accent }], children: "\u263A Customize" })
2173
2201
  }
2174
2202
  )
2175
2203
  ] }),
2176
- showStyles && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: s.styleScroll, children: DICEBEAR_STYLES.map((st) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2177
- import_react_native5.TouchableOpacity,
2204
+ showStyles && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: s.styleScroll, children: DICEBEAR_STYLES.map((st) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2205
+ import_react_native6.TouchableOpacity,
2178
2206
  {
2179
2207
  onPress: () => setAvatarStyle(st),
2180
2208
  style: [s.styleThumbWrap, { borderColor: st === avatarStyle ? accent : t.border }],
2181
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Image, { source: { uri: getAvatarUrl(st, avatarSeed, 80) }, style: s.styleThumb })
2209
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Image, { source: { uri: getAvatarUrl(st, avatarSeed, 80) }, style: s.styleThumb })
2182
2210
  },
2183
2211
  st
2184
2212
  )) })
2185
2213
  ] }),
2186
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: s.bottomRow, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2187
- import_react_native5.TouchableOpacity,
2214
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: s.bottomRow, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2215
+ import_react_native6.TouchableOpacity,
2188
2216
  {
2189
2217
  style: [s.primaryBtn, { backgroundColor: accent, flex: 1 }],
2190
2218
  onPress: () => animateToStep(1),
2191
2219
  activeOpacity: 0.8,
2192
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.primaryBtnText, children: "Continue \u203A" })
2220
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.primaryBtnText, children: "Continue \u203A" })
2193
2221
  }
2194
2222
  ) })
2195
2223
  ] });
2196
- const renderUsernameStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepContainer, children: [
2197
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepTop, children: [
2198
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.headerRow, children: [
2199
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.TouchableOpacity, { onPress: () => animateToStep(0), hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.backChevron, { color: t.text }], children: "\u2039" }) }),
2200
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.titleInline, { color: t.text }], children: "Pick a Username" })
2224
+ const renderUsernameStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.stepContainer, children: [
2225
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.stepTop, children: [
2226
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.headerRow, children: [
2227
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.TouchableOpacity, { onPress: () => animateToStep(0), hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.backChevron, { color: t.text }], children: "\u2039" }) }),
2228
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.titleInline, { color: t.text }], children: "Pick a Username" })
2201
2229
  ] }),
2202
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.subtitle, { color: t.textMuted }], children: "This is how others will see you" }),
2230
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.subtitle, { color: t.textMuted }], children: "This is how others will see you" }),
2203
2231
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(StepIndicator, { currentStep: 1 }),
2204
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: s.avatarCenter, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: [s.avatarFrameSmall, { borderColor: accent }], children: [
2205
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Image, { source: { uri: avatarUrl }, style: s.avatarSmall }),
2206
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.checkBadgeSm, { backgroundColor: t.success }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.checkBadgeTextSm, children: "\u2713" }) })
2232
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: s.avatarCenter, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: [s.avatarFrameSmall, { borderColor: accent }], children: [
2233
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Image, { source: { uri: avatarUrl }, style: s.avatarSmall }),
2234
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.checkBadgeSm, { backgroundColor: t.success }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.checkBadgeTextSm, children: "\u2713" }) })
2207
2235
  ] }) }),
2208
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.inputGroup, children: [
2209
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.Text, { style: [s.inputLabel, { color: t.text }], children: [
2236
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.inputGroup, children: [
2237
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.Text, { style: [s.inputLabel, { color: t.text }], children: [
2210
2238
  "Username ",
2211
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: { color: t.errorText }, children: "*" })
2239
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: { color: t.errorText }, children: "*" })
2212
2240
  ] }),
2213
2241
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2214
- import_react_native5.TextInput,
2242
+ import_react_native6.TextInput,
2215
2243
  {
2216
2244
  style: [s.input, { backgroundColor: t.surface, color: t.text, borderColor: accent }],
2217
2245
  placeholder: "Enter username",
@@ -2223,63 +2251,63 @@ function DefaultRegistrationScreen({
2223
2251
  autoFocus: true
2224
2252
  }
2225
2253
  ),
2226
- checking ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.hint, { color: t.textDim }], children: "Checking..." }) : availability ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.hint, { color: availability.available ? t.success : t.errorText }], children: availability.available ? "\u2713 Available!" : availability.reason || "Username taken" }) : username.trim().length > 0 && username.trim().length < 3 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.hint, { color: t.textDim }], children: "At least 3 characters" }) : null
2254
+ checking ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.hint, { color: t.textDim }], children: "Checking..." }) : availability ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.hint, { color: availability.available ? t.success : t.errorText }], children: availability.available ? "\u2713 Available!" : availability.reason || "Username taken" }) : username.trim().length > 0 && username.trim().length < 3 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.hint, { color: t.textDim }], children: "At least 3 characters" }) : null
2227
2255
  ] })
2228
2256
  ] }),
2229
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.bottomRow, children: [
2257
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.bottomRow, children: [
2230
2258
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2231
- import_react_native5.TouchableOpacity,
2259
+ import_react_native6.TouchableOpacity,
2232
2260
  {
2233
2261
  style: [s.secondaryBtn, { borderColor: t.border }],
2234
2262
  onPress: () => animateToStep(0),
2235
2263
  activeOpacity: 0.7,
2236
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.secondaryBtnText, { color: t.text }], children: "\u2039 Back" })
2264
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.secondaryBtnText, { color: t.text }], children: "\u2039 Back" })
2237
2265
  }
2238
2266
  ),
2239
2267
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2240
- import_react_native5.TouchableOpacity,
2268
+ import_react_native6.TouchableOpacity,
2241
2269
  {
2242
2270
  style: [s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: canContinueUsername ? 1 : 0.4 }],
2243
2271
  onPress: () => animateToStep(2),
2244
2272
  disabled: !canContinueUsername,
2245
2273
  activeOpacity: 0.8,
2246
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.primaryBtnText, children: "Continue \u203A" })
2274
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.primaryBtnText, children: "Continue \u203A" })
2247
2275
  }
2248
2276
  )
2249
2277
  ] })
2250
2278
  ] });
2251
- const renderReferralStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepContainer, children: [
2252
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepTop, children: [
2253
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.headerRow, children: [
2254
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.TouchableOpacity, { onPress: () => animateToStep(1), hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.backChevron, { color: t.text }], children: "\u2039" }) }),
2255
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.titleInline, { color: t.text }], children: "Almost There!" })
2279
+ const renderReferralStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.stepContainer, children: [
2280
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.stepTop, children: [
2281
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.headerRow, children: [
2282
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.TouchableOpacity, { onPress: () => animateToStep(1), hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.backChevron, { color: t.text }], children: "\u2039" }) }),
2283
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.titleInline, { color: t.text }], children: "Almost There!" })
2256
2284
  ] }),
2257
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.subtitle, { color: t.textMuted }], children: "Got a referral code? (optional)" }),
2285
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.subtitle, { color: t.textMuted }], children: "Got a referral code? (optional)" }),
2258
2286
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(StepIndicator, { currentStep: 2 }),
2259
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: [s.profileCard, { borderColor: t.border }], children: [
2260
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.profileLabel, { color: t.textMuted }], children: "Your Profile" }),
2261
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.profileRow, children: [
2262
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Image, { source: { uri: avatarUrl }, style: s.profileAvatar }),
2263
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: { gap: 4 }, children: [
2264
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.Text, { style: [s.profileUsername, { color: t.text }], children: [
2287
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: [s.profileCard, { borderColor: t.border }], children: [
2288
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.profileLabel, { color: t.textMuted }], children: "Your Profile" }),
2289
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.profileRow, children: [
2290
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Image, { source: { uri: avatarUrl }, style: s.profileAvatar }),
2291
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: { gap: 4 }, children: [
2292
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.Text, { style: [s.profileUsername, { color: t.text }], children: [
2265
2293
  "@",
2266
2294
  username
2267
2295
  ] }),
2268
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.Text, { style: [s.profileReady, { color: t.success }], children: [
2296
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.Text, { style: [s.profileReady, { color: t.success }], children: [
2269
2297
  "\u2713",
2270
2298
  " Ready to go!"
2271
2299
  ] })
2272
2300
  ] })
2273
2301
  ] })
2274
2302
  ] }),
2275
- error ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: [s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.errorText, { color: t.errorText }], children: error.message }) }) : null,
2276
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.inputGroup, children: [
2277
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.Text, { style: [s.inputLabel, { color: t.text }], children: [
2303
+ error ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.View, { style: [s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }], children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.errorText, { color: t.errorText }], children: error.message }) }) : null,
2304
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.inputGroup, children: [
2305
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.Text, { style: [s.inputLabel, { color: t.text }], children: [
2278
2306
  "Referral Code ",
2279
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: { color: t.textMuted }, children: "(optional)" })
2307
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: { color: t.textMuted }, children: "(optional)" })
2280
2308
  ] }),
2281
2309
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2282
- import_react_native5.TextInput,
2310
+ import_react_native6.TextInput,
2283
2311
  {
2284
2312
  style: [s.input, { backgroundColor: t.surface, color: t.text, borderColor: t.border }],
2285
2313
  placeholder: "Enter referral code",
@@ -2291,31 +2319,31 @@ function DefaultRegistrationScreen({
2291
2319
  editable: !registering
2292
2320
  }
2293
2321
  ),
2294
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.Text, { style: [s.hint, { color: t.textMuted }], children: [
2322
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.Text, { style: [s.hint, { color: t.textMuted }], children: [
2295
2323
  "\u{1F381}",
2296
2324
  " If a friend invited you, enter their code to give them credit!"
2297
2325
  ] })
2298
2326
  ] })
2299
2327
  ] }),
2300
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.bottomRow, children: [
2328
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.bottomRow, children: [
2301
2329
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2302
- import_react_native5.TouchableOpacity,
2330
+ import_react_native6.TouchableOpacity,
2303
2331
  {
2304
2332
  style: [s.secondaryBtn, { borderColor: t.border }],
2305
2333
  onPress: () => animateToStep(1),
2306
2334
  disabled: registering,
2307
2335
  activeOpacity: 0.7,
2308
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.secondaryBtnText, { color: t.text }], children: "\u2039 Back" })
2336
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: [s.secondaryBtnText, { color: t.text }], children: "\u2039 Back" })
2309
2337
  }
2310
2338
  ),
2311
2339
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2312
- import_react_native5.TouchableOpacity,
2340
+ import_react_native6.TouchableOpacity,
2313
2341
  {
2314
2342
  style: [s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: registering ? 0.7 : 1 }],
2315
2343
  onPress: handleSubmit,
2316
2344
  disabled: registering,
2317
2345
  activeOpacity: 0.8,
2318
- children: registering ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.ActivityIndicator, { color: "#FFFFFF", size: "small" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: s.primaryBtnText, children: "Create Account" })
2346
+ children: registering ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.ActivityIndicator, { color: "#FFFFFF", size: "small" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native6.Text, { style: s.primaryBtnText, children: "Create Account" })
2319
2347
  }
2320
2348
  )
2321
2349
  ] })
@@ -2333,18 +2361,18 @@ function DefaultRegistrationScreen({
2333
2361
  }
2334
2362
  };
2335
2363
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2336
- import_react_native5.KeyboardAvoidingView,
2364
+ import_react_native6.KeyboardAvoidingView,
2337
2365
  {
2338
2366
  style: [s.container, { backgroundColor: t.background }],
2339
- behavior: import_react_native5.Platform.OS === "ios" ? "padding" : void 0,
2367
+ behavior: import_react_native6.Platform.OS === "ios" ? "padding" : void 0,
2340
2368
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2341
- import_react_native5.ScrollView,
2369
+ import_react_native6.ScrollView,
2342
2370
  {
2343
2371
  contentContainerStyle: { flexGrow: 1 },
2344
2372
  keyboardShouldPersistTaps: "handled",
2345
2373
  bounces: false,
2346
2374
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2347
- import_react_native5.Animated.View,
2375
+ import_react_native6.Animated.View,
2348
2376
  {
2349
2377
  style: [
2350
2378
  { flex: 1 },
@@ -2358,7 +2386,7 @@ function DefaultRegistrationScreen({
2358
2386
  }
2359
2387
  );
2360
2388
  }
2361
- var s = import_react_native5.StyleSheet.create({
2389
+ var s = import_react_native6.StyleSheet.create({
2362
2390
  container: { flex: 1 },
2363
2391
  // Loading / Error
2364
2392
  centerContent: { flex: 1, justifyContent: "center", alignItems: "center", paddingHorizontal: 32, gap: 48 },
@@ -2610,7 +2638,7 @@ function useAppConfig() {
2610
2638
 
2611
2639
  // src/ui/UserProfileCard.tsx
2612
2640
  var import_react14 = require("react");
2613
- var import_react_native6 = require("react-native");
2641
+ var import_react_native7 = require("react-native");
2614
2642
  var import_jsx_runtime5 = require("react/jsx-runtime");
2615
2643
  function truncateAddress(address, chars = 4) {
2616
2644
  if (address.length <= chars * 2 + 3) return address;
@@ -2633,16 +2661,16 @@ function UserProfileCard({
2633
2661
  () => avatarUrl || `https://api.dicebear.com/9.x/avataaars/png?seed=${walletAddress}&size=128`,
2634
2662
  [avatarUrl, walletAddress]
2635
2663
  );
2636
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_native6.View, { style: [styles2.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
2637
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native6.Image, { source: { uri: imageUri }, style: styles2.avatar }),
2638
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_native6.View, { style: styles2.info, children: [
2639
- username ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native6.Text, { style: [styles2.username, { color: t.text }], children: username }) : null,
2640
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native6.Text, { style: [styles2.address, { color: t.textMuted }], children: truncateAddress(walletAddress) }),
2641
- memberSince ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native6.Text, { style: [styles2.memberSince, { color: t.textDim }], children: formatMemberSince(memberSince) }) : null
2664
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_native7.View, { style: [styles2.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
2665
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native7.Image, { source: { uri: imageUri }, style: styles2.avatar }),
2666
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_native7.View, { style: styles2.info, children: [
2667
+ username ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native7.Text, { style: [styles2.username, { color: t.text }], children: username }) : null,
2668
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native7.Text, { style: [styles2.address, { color: t.textMuted }], children: truncateAddress(walletAddress) }),
2669
+ memberSince ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native7.Text, { style: [styles2.memberSince, { color: t.textDim }], children: formatMemberSince(memberSince) }) : null
2642
2670
  ] })
2643
2671
  ] });
2644
2672
  }
2645
- var styles2 = import_react_native6.StyleSheet.create({
2673
+ var styles2 = import_react_native7.StyleSheet.create({
2646
2674
  card: {
2647
2675
  flexDirection: "row",
2648
2676
  alignItems: "center",
@@ -2676,7 +2704,7 @@ var styles2 = import_react_native6.StyleSheet.create({
2676
2704
  });
2677
2705
 
2678
2706
  // src/ui/SettingsSheet.tsx
2679
- var import_react_native7 = require("react-native");
2707
+ var import_react_native8 = require("react-native");
2680
2708
  var import_jsx_runtime6 = require("react/jsx-runtime");
2681
2709
  function truncateAddress2(address, chars = 4) {
2682
2710
  if (address.length <= chars * 2 + 3) return address;
@@ -2695,7 +2723,7 @@ function SettingsSheet({
2695
2723
  }) {
2696
2724
  const t = useDubsTheme();
2697
2725
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2698
- import_react_native7.ScrollView,
2726
+ import_react_native8.ScrollView,
2699
2727
  {
2700
2728
  style: [styles3.container, { backgroundColor: t.background }],
2701
2729
  contentContainerStyle: styles3.content,
@@ -2709,49 +2737,49 @@ function SettingsSheet({
2709
2737
  memberSince
2710
2738
  }
2711
2739
  ),
2712
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native7.View, { style: [styles3.actionsCard, { backgroundColor: t.surface, borderColor: t.border }], children: [
2740
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native8.View, { style: [styles3.actionsCard, { backgroundColor: t.surface, borderColor: t.border }], children: [
2713
2741
  onCopyAddress ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2714
- import_react_native7.TouchableOpacity,
2742
+ import_react_native8.TouchableOpacity,
2715
2743
  {
2716
2744
  style: styles3.actionRow,
2717
2745
  onPress: onCopyAddress,
2718
2746
  activeOpacity: 0.7,
2719
2747
  children: [
2720
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native7.View, { style: styles3.actionRowLeft, children: [
2721
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.Text, { style: [styles3.actionLabel, { color: t.text }], children: "Wallet Address" }),
2722
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.Text, { style: [styles3.actionValue, { color: t.textMuted }], children: truncateAddress2(walletAddress) })
2748
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native8.View, { style: styles3.actionRowLeft, children: [
2749
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native8.Text, { style: [styles3.actionLabel, { color: t.text }], children: "Wallet Address" }),
2750
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native8.Text, { style: [styles3.actionValue, { color: t.textMuted }], children: truncateAddress2(walletAddress) })
2723
2751
  ] }),
2724
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.Text, { style: [styles3.copyLabel, { color: t.accent }], children: "Copy" })
2752
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native8.Text, { style: [styles3.copyLabel, { color: t.accent }], children: "Copy" })
2725
2753
  ]
2726
2754
  }
2727
2755
  ) : null,
2728
2756
  onSupport ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
2729
- onCopyAddress ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.View, { style: [styles3.separator, { backgroundColor: t.border }] }) : null,
2757
+ onCopyAddress ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native8.View, { style: [styles3.separator, { backgroundColor: t.border }] }) : null,
2730
2758
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2731
- import_react_native7.TouchableOpacity,
2759
+ import_react_native8.TouchableOpacity,
2732
2760
  {
2733
2761
  style: styles3.actionRow,
2734
2762
  onPress: onSupport,
2735
2763
  activeOpacity: 0.7,
2736
2764
  children: [
2737
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.Text, { style: [styles3.actionLabel, { color: t.text }], children: "Help & Support" }),
2738
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.Text, { style: [styles3.chevron, { color: t.textMuted }], children: "\u203A" })
2765
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native8.Text, { style: [styles3.actionLabel, { color: t.text }], children: "Help & Support" }),
2766
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native8.Text, { style: [styles3.chevron, { color: t.textMuted }], children: "\u203A" })
2739
2767
  ]
2740
2768
  }
2741
2769
  )
2742
2770
  ] }) : null
2743
2771
  ] }),
2744
2772
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2745
- import_react_native7.TouchableOpacity,
2773
+ import_react_native8.TouchableOpacity,
2746
2774
  {
2747
2775
  style: [styles3.logoutButton, { borderColor: t.live }],
2748
2776
  onPress: onLogout,
2749
2777
  disabled: loggingOut,
2750
2778
  activeOpacity: 0.7,
2751
- children: loggingOut ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.ActivityIndicator, { color: t.live, size: "small" }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.Text, { style: [styles3.logoutText, { color: t.live }], children: "Log Out" })
2779
+ children: loggingOut ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native8.ActivityIndicator, { color: t.live, size: "small" }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native8.Text, { style: [styles3.logoutText, { color: t.live }], children: "Log Out" })
2752
2780
  }
2753
2781
  ),
2754
- appVersion ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native7.Text, { style: [styles3.version, { color: t.textDim }], children: [
2782
+ appVersion ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native8.Text, { style: [styles3.version, { color: t.textDim }], children: [
2755
2783
  "v",
2756
2784
  appVersion
2757
2785
  ] }) : null
@@ -2759,7 +2787,7 @@ function SettingsSheet({
2759
2787
  }
2760
2788
  );
2761
2789
  }
2762
- var styles3 = import_react_native7.StyleSheet.create({
2790
+ var styles3 = import_react_native8.StyleSheet.create({
2763
2791
  container: {
2764
2792
  flex: 1
2765
2793
  },
@@ -2823,7 +2851,7 @@ var styles3 = import_react_native7.StyleSheet.create({
2823
2851
 
2824
2852
  // src/ui/game/GamePoster.tsx
2825
2853
  var import_react15 = require("react");
2826
- var import_react_native8 = require("react-native");
2854
+ var import_react_native9 = require("react-native");
2827
2855
  var import_jsx_runtime7 = require("react/jsx-runtime");
2828
2856
  function computeCountdown(lockTimestamp) {
2829
2857
  if (!lockTimestamp) return "";
@@ -2845,7 +2873,7 @@ function GamePoster({ game, ImageComponent }) {
2845
2873
  const away = opponents[1];
2846
2874
  const countdown = computeCountdown(game.lockTimestamp);
2847
2875
  const isLive = countdown === "LIVE";
2848
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native8.View, { style: styles4.container, children: [
2876
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native9.View, { style: styles4.container, children: [
2849
2877
  game.media?.poster ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2850
2878
  Img,
2851
2879
  {
@@ -2853,19 +2881,19 @@ function GamePoster({ game, ImageComponent }) {
2853
2881
  style: styles4.image,
2854
2882
  resizeMode: "cover"
2855
2883
  }
2856
- ) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.View, { style: [styles4.image, { backgroundColor: t.surface }], children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native8.View, { style: styles4.fallback, children: [
2884
+ ) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.View, { style: [styles4.image, { backgroundColor: t.surface }], children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native9.View, { style: styles4.fallback, children: [
2857
2885
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TeamLogoInternal, { url: home?.imageUrl, size: 56, Img }),
2858
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.Text, { style: styles4.vs, children: "VS" }),
2886
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.Text, { style: styles4.vs, children: "VS" }),
2859
2887
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TeamLogoInternal, { url: away?.imageUrl, size: 56, Img })
2860
2888
  ] }) }),
2861
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.View, { style: styles4.overlay }),
2862
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native8.View, { style: styles4.teamNames, children: [
2863
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.Text, { style: styles4.teamNameText, numberOfLines: 1, children: home?.name || "Home" }),
2864
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.Text, { style: styles4.teamNameVs, children: "vs" }),
2865
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.Text, { style: styles4.teamNameText, numberOfLines: 1, children: away?.name || "Away" })
2889
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.View, { style: styles4.overlay }),
2890
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native9.View, { style: styles4.teamNames, children: [
2891
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.Text, { style: styles4.teamNameText, numberOfLines: 1, children: home?.name || "Home" }),
2892
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.Text, { style: styles4.teamNameVs, children: "vs" }),
2893
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.Text, { style: styles4.teamNameText, numberOfLines: 1, children: away?.name || "Away" })
2866
2894
  ] }),
2867
- countdown ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.View, { style: styles4.countdownPill, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.Text, { style: [styles4.countdownText, isLive && styles4.countdownLive], children: countdown }) }) : null,
2868
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.View, { style: styles4.poolPill, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native8.Text, { style: styles4.poolText, children: [
2895
+ countdown ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.View, { style: styles4.countdownPill, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.Text, { style: [styles4.countdownText, isLive && styles4.countdownLive], children: countdown }) }) : null,
2896
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.View, { style: styles4.poolPill, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native9.Text, { style: styles4.poolText, children: [
2869
2897
  game.totalPool || 0,
2870
2898
  " SOL"
2871
2899
  ] }) })
@@ -2874,7 +2902,7 @@ function GamePoster({ game, ImageComponent }) {
2874
2902
  function TeamLogoInternal({ url, size, Img }) {
2875
2903
  const [failed, setFailed] = (0, import_react15.useState)(false);
2876
2904
  if (!url || failed) {
2877
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.View, { style: [styles4.logoPlaceholder, { width: size, height: size, borderRadius: size / 2 }] });
2905
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native9.View, { style: [styles4.logoPlaceholder, { width: size, height: size, borderRadius: size / 2 }] });
2878
2906
  }
2879
2907
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2880
2908
  Img,
@@ -2886,7 +2914,7 @@ function TeamLogoInternal({ url, size, Img }) {
2886
2914
  }
2887
2915
  );
2888
2916
  }
2889
- var styles4 = import_react_native8.StyleSheet.create({
2917
+ var styles4 = import_react_native9.StyleSheet.create({
2890
2918
  container: {
2891
2919
  height: 200,
2892
2920
  borderRadius: 16,
@@ -2894,12 +2922,12 @@ var styles4 = import_react_native8.StyleSheet.create({
2894
2922
  position: "relative"
2895
2923
  },
2896
2924
  image: {
2897
- ...import_react_native8.StyleSheet.absoluteFillObject,
2925
+ ...import_react_native9.StyleSheet.absoluteFillObject,
2898
2926
  justifyContent: "center",
2899
2927
  alignItems: "center"
2900
2928
  },
2901
2929
  overlay: {
2902
- ...import_react_native8.StyleSheet.absoluteFillObject,
2930
+ ...import_react_native9.StyleSheet.absoluteFillObject,
2903
2931
  backgroundColor: "rgba(0,0,0,0.35)"
2904
2932
  },
2905
2933
  fallback: {
@@ -2974,7 +3002,7 @@ var styles4 = import_react_native8.StyleSheet.create({
2974
3002
 
2975
3003
  // src/ui/game/LivePoolsCard.tsx
2976
3004
  var import_react16 = require("react");
2977
- var import_react_native9 = require("react-native");
3005
+ var import_react_native10 = require("react-native");
2978
3006
  var import_jsx_runtime8 = require("react/jsx-runtime");
2979
3007
  function LivePoolsCard({
2980
3008
  game,
@@ -2997,29 +3025,29 @@ function LivePoolsCard({
2997
3025
  awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : "\u2014"
2998
3026
  };
2999
3027
  }, [homePool, awayPool, totalPool]);
3000
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: [styles5.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
3001
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native9.Text, { style: [styles5.title, { color: t.text }], children: "Live Pools" }),
3002
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.Text, { style: [styles5.total, { color: t.accent }], children: [
3028
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.View, { style: [styles5.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
3029
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native10.Text, { style: [styles5.title, { color: t.text }], children: "Live Pools" }),
3030
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.Text, { style: [styles5.total, { color: t.accent }], children: [
3003
3031
  totalPool,
3004
3032
  " SOL total"
3005
3033
  ] }),
3006
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: styles5.bars, children: [
3034
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.View, { style: styles5.bars, children: [
3007
3035
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(PoolBar, { name: homeName, amount: homePool, percent: homePercent, color: homeColor, t }),
3008
3036
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(PoolBar, { name: awayName, amount: awayPool, percent: awayPercent, color: awayColor, t })
3009
3037
  ] }),
3010
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: styles5.oddsRow, children: [
3011
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.Text, { style: [styles5.oddsText, { color: t.textMuted }], children: [
3038
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.View, { style: styles5.oddsRow, children: [
3039
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.Text, { style: [styles5.oddsText, { color: t.textMuted }], children: [
3012
3040
  homeName,
3013
3041
  ": ",
3014
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.Text, { style: { color: t.text, fontWeight: "700" }, children: [
3042
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.Text, { style: { color: t.text, fontWeight: "700" }, children: [
3015
3043
  homeOdds,
3016
3044
  "x"
3017
3045
  ] })
3018
3046
  ] }),
3019
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.Text, { style: [styles5.oddsText, { color: t.textMuted }], children: [
3047
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.Text, { style: [styles5.oddsText, { color: t.textMuted }], children: [
3020
3048
  awayName,
3021
3049
  ": ",
3022
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.Text, { style: { color: t.text, fontWeight: "700" }, children: [
3050
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.Text, { style: { color: t.text, fontWeight: "700" }, children: [
3023
3051
  awayOdds,
3024
3052
  "x"
3025
3053
  ] })
@@ -3028,16 +3056,16 @@ function LivePoolsCard({
3028
3056
  ] });
3029
3057
  }
3030
3058
  function PoolBar({ name, amount, percent, color, t }) {
3031
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: styles5.barRow, children: [
3032
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native9.Text, { style: [styles5.barLabel, { color: t.textSecondary }], numberOfLines: 1, children: name }),
3033
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native9.View, { style: [styles5.barTrack, { backgroundColor: t.border }], children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native9.View, { style: [styles5.barFill, { width: `${Math.max(percent, 2)}%`, backgroundColor: color }] }) }),
3034
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.Text, { style: [styles5.barAmount, { color: t.text }], children: [
3059
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.View, { style: styles5.barRow, children: [
3060
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native10.Text, { style: [styles5.barLabel, { color: t.textSecondary }], numberOfLines: 1, children: name }),
3061
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native10.View, { style: [styles5.barTrack, { backgroundColor: t.border }], children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native10.View, { style: [styles5.barFill, { width: `${Math.max(percent, 2)}%`, backgroundColor: color }] }) }),
3062
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.Text, { style: [styles5.barAmount, { color: t.text }], children: [
3035
3063
  amount,
3036
3064
  " SOL"
3037
3065
  ] })
3038
3066
  ] });
3039
3067
  }
3040
- var styles5 = import_react_native9.StyleSheet.create({
3068
+ var styles5 = import_react_native10.StyleSheet.create({
3041
3069
  card: { borderRadius: 16, borderWidth: 1, padding: 16 },
3042
3070
  title: { fontSize: 17, fontWeight: "700", marginBottom: 4 },
3043
3071
  total: { fontSize: 14, fontWeight: "600", marginBottom: 14 },
@@ -3053,7 +3081,7 @@ var styles5 = import_react_native9.StyleSheet.create({
3053
3081
 
3054
3082
  // src/ui/game/PickWinnerCard.tsx
3055
3083
  var import_react17 = require("react");
3056
- var import_react_native10 = require("react-native");
3084
+ var import_react_native11 = require("react-native");
3057
3085
  var import_jsx_runtime9 = require("react/jsx-runtime");
3058
3086
  function PickWinnerCard({
3059
3087
  game,
@@ -3078,9 +3106,9 @@ function PickWinnerCard({
3078
3106
  }), [totalPool, homePool, awayPool, bettors]);
3079
3107
  const homeName = shortName ? shortName(opponents[0]?.name) : opponents[0]?.name || "Home";
3080
3108
  const awayName = shortName ? shortName(opponents[1]?.name) : opponents[1]?.name || "Away";
3081
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native10.View, { style: [styles6.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
3082
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native10.Text, { style: [styles6.title, { color: t.text }], children: "Pick Your Winner" }),
3083
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native10.View, { style: styles6.row, children: [
3109
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native11.View, { style: [styles6.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
3110
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native11.Text, { style: [styles6.title, { color: t.text }], children: "Pick Your Winner" }),
3111
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native11.View, { style: styles6.row, children: [
3084
3112
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3085
3113
  TeamOption,
3086
3114
  {
@@ -3127,29 +3155,29 @@ function TeamOption({
3127
3155
  const Img = ImageComponent || require("react-native").Image;
3128
3156
  const showImage = imageUrl && !imgFailed;
3129
3157
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
3130
- import_react_native10.TouchableOpacity,
3158
+ import_react_native11.TouchableOpacity,
3131
3159
  {
3132
3160
  style: [styles6.option, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + "15" : t.background }],
3133
3161
  onPress,
3134
3162
  activeOpacity: 0.7,
3135
3163
  children: [
3136
- showImage ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Img, { source: { uri: imageUrl }, style: styles6.logo, resizeMode: "contain", onError: () => setImgFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native10.View, { style: [styles6.logo, styles6.logoPlaceholder] }),
3137
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native10.Text, { style: [styles6.name, { color: t.text }], numberOfLines: 1, children: name }),
3138
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native10.Text, { style: [styles6.odds, { color }], children: [
3164
+ showImage ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Img, { source: { uri: imageUrl }, style: styles6.logo, resizeMode: "contain", onError: () => setImgFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native11.View, { style: [styles6.logo, styles6.logoPlaceholder] }),
3165
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native11.Text, { style: [styles6.name, { color: t.text }], numberOfLines: 1, children: name }),
3166
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native11.Text, { style: [styles6.odds, { color }], children: [
3139
3167
  odds,
3140
3168
  "x"
3141
3169
  ] }),
3142
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native10.Text, { style: [styles6.bets, { color: t.textMuted }], children: [
3170
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native11.Text, { style: [styles6.bets, { color: t.textMuted }], children: [
3143
3171
  bets,
3144
3172
  " ",
3145
3173
  bets === 1 ? "bet" : "bets"
3146
3174
  ] }),
3147
- selected && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native10.View, { style: [styles6.badge, { backgroundColor: color }], children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native10.Text, { style: styles6.badgeText, children: "Selected" }) })
3175
+ selected && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native11.View, { style: [styles6.badge, { backgroundColor: color }], children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native11.Text, { style: styles6.badgeText, children: "Selected" }) })
3148
3176
  ]
3149
3177
  }
3150
3178
  );
3151
3179
  }
3152
- var styles6 = import_react_native10.StyleSheet.create({
3180
+ var styles6 = import_react_native11.StyleSheet.create({
3153
3181
  card: { borderRadius: 16, borderWidth: 1, padding: 16 },
3154
3182
  title: { fontSize: 17, fontWeight: "700", marginBottom: 12 },
3155
3183
  row: { flexDirection: "row", gap: 12 },
@@ -3165,7 +3193,7 @@ var styles6 = import_react_native10.StyleSheet.create({
3165
3193
 
3166
3194
  // src/ui/game/PlayersCard.tsx
3167
3195
  var import_react18 = require("react");
3168
- var import_react_native11 = require("react-native");
3196
+ var import_react_native12 = require("react-native");
3169
3197
  var import_jsx_runtime10 = require("react/jsx-runtime");
3170
3198
  function truncateWallet(addr, chars) {
3171
3199
  if (addr.length <= chars * 2 + 3) return addr;
@@ -3186,12 +3214,12 @@ function PlayersCard({
3186
3214
  if (team === "away") return awayColor;
3187
3215
  return drawColor;
3188
3216
  };
3189
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native11.View, { style: [styles7.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
3190
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native11.Text, { style: [styles7.title, { color: t.text }], children: [
3217
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: [styles7.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
3218
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.Text, { style: [styles7.title, { color: t.text }], children: [
3191
3219
  "Players",
3192
3220
  bettors.length > 0 ? ` (${bettors.length})` : ""
3193
3221
  ] }),
3194
- bettors.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native11.Text, { style: [styles7.empty, { color: t.textMuted }], children: "No players yet \u2014 be the first!" }) : bettors.map((b, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3222
+ bettors.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native12.Text, { style: [styles7.empty, { color: t.textMuted }], children: "No players yet \u2014 be the first!" }) : bettors.map((b, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3195
3223
  BettorRow,
3196
3224
  {
3197
3225
  bettor: b,
@@ -3216,17 +3244,17 @@ function BettorRow({
3216
3244
  const [imgFailed, setImgFailed] = (0, import_react18.useState)(false);
3217
3245
  const Img = ImageComponent || require("react-native").Image;
3218
3246
  const showAvatar = bettor.avatar && !imgFailed;
3219
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native11.View, { style: [styles7.row, !isFirst && { borderTopColor: t.border, borderTopWidth: 1 }], children: [
3220
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native11.View, { style: [styles7.dot, { backgroundColor: dotColor }] }),
3221
- showAvatar ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Img, { source: { uri: bettor.avatar }, style: styles7.avatar, resizeMode: "cover", onError: () => setImgFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native11.View, { style: [styles7.avatar, styles7.avatarPlaceholder] }),
3222
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native11.View, { style: styles7.nameCol, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native11.Text, { style: [styles7.username, { color: t.text }], numberOfLines: 1, children: bettor.username || truncateWallet(bettor.wallet, truncateChars) }) }),
3223
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native11.Text, { style: [styles7.amount, { color: t.textSecondary }], children: [
3247
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: [styles7.row, !isFirst && { borderTopColor: t.border, borderTopWidth: 1 }], children: [
3248
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native12.View, { style: [styles7.dot, { backgroundColor: dotColor }] }),
3249
+ showAvatar ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Img, { source: { uri: bettor.avatar }, style: styles7.avatar, resizeMode: "cover", onError: () => setImgFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native12.View, { style: [styles7.avatar, styles7.avatarPlaceholder] }),
3250
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native12.View, { style: styles7.nameCol, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native12.Text, { style: [styles7.username, { color: t.text }], numberOfLines: 1, children: bettor.username || truncateWallet(bettor.wallet, truncateChars) }) }),
3251
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.Text, { style: [styles7.amount, { color: t.textSecondary }], children: [
3224
3252
  bettor.amount,
3225
3253
  " SOL"
3226
3254
  ] })
3227
3255
  ] });
3228
3256
  }
3229
- var styles7 = import_react_native11.StyleSheet.create({
3257
+ var styles7 = import_react_native12.StyleSheet.create({
3230
3258
  card: { borderRadius: 16, borderWidth: 1, padding: 16 },
3231
3259
  title: { fontSize: 17, fontWeight: "700", marginBottom: 12 },
3232
3260
  empty: { fontSize: 14, textAlign: "center", paddingVertical: 16 },
@@ -3241,7 +3269,7 @@ var styles7 = import_react_native11.StyleSheet.create({
3241
3269
 
3242
3270
  // src/ui/game/JoinGameButton.tsx
3243
3271
  var import_react19 = require("react");
3244
- var import_react_native12 = require("react-native");
3272
+ var import_react_native13 = require("react-native");
3245
3273
  var import_jsx_runtime11 = require("react/jsx-runtime");
3246
3274
  var STATUS_LABELS = {
3247
3275
  building: "Building transaction...",
@@ -3258,30 +3286,30 @@ function JoinGameButton({ game, walletAddress, selectedTeam, status, onJoin }) {
3258
3286
  if (alreadyJoined || game.isLocked || game.isResolved) return null;
3259
3287
  const isJoining = status !== "idle" && status !== "success" && status !== "error";
3260
3288
  const statusLabel = STATUS_LABELS[status] || "";
3261
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: [styles8.bar, { backgroundColor: t.background, borderTopColor: t.border }], children: [
3262
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles8.buyInRow, children: [
3263
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.Text, { style: [styles8.buyInLabel, { color: t.textMuted }], children: "Buy-in" }),
3264
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.Text, { style: [styles8.buyInValue, { color: t.text }], children: [
3289
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.View, { style: [styles8.bar, { backgroundColor: t.background, borderTopColor: t.border }], children: [
3290
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.View, { style: styles8.buyInRow, children: [
3291
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native13.Text, { style: [styles8.buyInLabel, { color: t.textMuted }], children: "Buy-in" }),
3292
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.Text, { style: [styles8.buyInValue, { color: t.text }], children: [
3265
3293
  game.buyIn,
3266
3294
  " SOL"
3267
3295
  ] })
3268
3296
  ] }),
3269
3297
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3270
- import_react_native12.TouchableOpacity,
3298
+ import_react_native13.TouchableOpacity,
3271
3299
  {
3272
3300
  style: [styles8.button, { backgroundColor: selectedTeam ? "#22D3EE" : t.border }],
3273
3301
  disabled: !selectedTeam || isJoining,
3274
3302
  onPress: onJoin,
3275
3303
  activeOpacity: 0.8,
3276
- children: isJoining ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles8.joiningRow, children: [
3277
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.ActivityIndicator, { size: "small", color: "#000" }),
3278
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.Text, { style: styles8.buttonText, children: statusLabel })
3279
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.Text, { style: [styles8.buttonText, !selectedTeam && { color: t.textMuted }], children: selectedTeam ? `Join Bet \u2014 ${game.buyIn} SOL` : "Pick a team to bet" })
3304
+ children: isJoining ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.View, { style: styles8.joiningRow, children: [
3305
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native13.ActivityIndicator, { size: "small", color: "#000" }),
3306
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native13.Text, { style: styles8.buttonText, children: statusLabel })
3307
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native13.Text, { style: [styles8.buttonText, !selectedTeam && { color: t.textMuted }], children: selectedTeam ? `Join Bet \u2014 ${game.buyIn} SOL` : "Pick a team to bet" })
3280
3308
  }
3281
3309
  )
3282
3310
  ] });
3283
3311
  }
3284
- var styles8 = import_react_native12.StyleSheet.create({
3312
+ var styles8 = import_react_native13.StyleSheet.create({
3285
3313
  bar: { position: "absolute", bottom: 0, left: 0, right: 0, paddingHorizontal: 16, paddingTop: 12, paddingBottom: 36, borderTopWidth: 1 },
3286
3314
  buyInRow: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", marginBottom: 10 },
3287
3315
  buyInLabel: { fontSize: 13 },
@@ -3293,7 +3321,7 @@ var styles8 = import_react_native12.StyleSheet.create({
3293
3321
 
3294
3322
  // src/ui/game/CreateCustomGameSheet.tsx
3295
3323
  var import_react20 = require("react");
3296
- var import_react_native13 = require("react-native");
3324
+ var import_react_native14 = require("react-native");
3297
3325
  var import_jsx_runtime12 = require("react/jsx-runtime");
3298
3326
  var STATUS_LABELS2 = {
3299
3327
  building: "Building transaction...",
@@ -3320,9 +3348,9 @@ function CreateCustomGameSheet({
3320
3348
  const [selectedAmount, setSelectedAmount] = (0, import_react20.useState)(null);
3321
3349
  const [customAmount, setCustomAmount] = (0, import_react20.useState)("");
3322
3350
  const [isCustom, setIsCustom] = (0, import_react20.useState)(false);
3323
- const overlayOpacity = (0, import_react20.useRef)(new import_react_native13.Animated.Value(0)).current;
3351
+ const overlayOpacity = (0, import_react20.useRef)(new import_react_native14.Animated.Value(0)).current;
3324
3352
  (0, import_react20.useEffect)(() => {
3325
- import_react_native13.Animated.timing(overlayOpacity, {
3353
+ import_react_native14.Animated.timing(overlayOpacity, {
3326
3354
  toValue: visible ? 1 : 0,
3327
3355
  duration: 250,
3328
3356
  useNativeDriver: true
@@ -3392,32 +3420,32 @@ function CreateCustomGameSheet({
3392
3420
  const statusLabel = STATUS_LABELS2[mutation.status] || "";
3393
3421
  const playersLabel = playerCount === 2 ? "2 (1v1)" : `${playerCount} players`;
3394
3422
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3395
- import_react_native13.Modal,
3423
+ import_react_native14.Modal,
3396
3424
  {
3397
3425
  visible,
3398
3426
  animationType: "slide",
3399
3427
  transparent: true,
3400
3428
  onRequestClose: onDismiss,
3401
3429
  children: [
3402
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Animated.View, { style: [styles9.overlay, { opacity: overlayOpacity }], children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.TouchableOpacity, { style: styles9.overlayTap, activeOpacity: 1, onPress: onDismiss }) }),
3430
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Animated.View, { style: [styles9.overlay, { opacity: overlayOpacity }], children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.TouchableOpacity, { style: styles9.overlayTap, activeOpacity: 1, onPress: onDismiss }) }),
3403
3431
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3404
- import_react_native13.KeyboardAvoidingView,
3432
+ import_react_native14.KeyboardAvoidingView,
3405
3433
  {
3406
3434
  style: styles9.keyboardView,
3407
- behavior: import_react_native13.Platform.OS === "ios" ? "padding" : void 0,
3408
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: styles9.sheetPositioner, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: [styles9.sheet, { backgroundColor: t.background }], children: [
3409
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: styles9.handleRow, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: [styles9.handle, { backgroundColor: t.textMuted }] }) }),
3410
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.header, children: [
3411
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.headerTitle, { color: t.text }], children: "New Game" }),
3412
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.TouchableOpacity, { onPress: onDismiss, activeOpacity: 0.8, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.closeButton, { color: t.textMuted }], children: "\u2715" }) })
3435
+ behavior: import_react_native14.Platform.OS === "ios" ? "padding" : void 0,
3436
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: styles9.sheetPositioner, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: [styles9.sheet, { backgroundColor: t.background }], children: [
3437
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: styles9.handleRow, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: [styles9.handle, { backgroundColor: t.textMuted }] }) }),
3438
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: styles9.header, children: [
3439
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.headerTitle, { color: t.text }], children: "New Game" }),
3440
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.TouchableOpacity, { onPress: onDismiss, activeOpacity: 0.8, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.closeButton, { color: t.textMuted }], children: "\u2715" }) })
3413
3441
  ] }),
3414
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.section, children: [
3415
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.sectionLabel, { color: t.textSecondary }], children: "Buy-In Amount" }),
3416
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.chipsRow, children: [
3442
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: styles9.section, children: [
3443
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.sectionLabel, { color: t.textSecondary }], children: "Buy-In Amount" }),
3444
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: styles9.chipsRow, children: [
3417
3445
  presetAmounts.map((amount) => {
3418
3446
  const active = !isCustom && selectedAmount === amount;
3419
3447
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3420
- import_react_native13.TouchableOpacity,
3448
+ import_react_native14.TouchableOpacity,
3421
3449
  {
3422
3450
  style: [
3423
3451
  styles9.chip,
@@ -3426,7 +3454,7 @@ function CreateCustomGameSheet({
3426
3454
  ],
3427
3455
  onPress: () => handlePresetSelect(amount),
3428
3456
  activeOpacity: 0.8,
3429
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.Text, { style: [styles9.chipText, { color: active ? "#FFFFFF" : t.text }], children: [
3457
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.Text, { style: [styles9.chipText, { color: active ? "#FFFFFF" : t.text }], children: [
3430
3458
  amount,
3431
3459
  " SOL"
3432
3460
  ] })
@@ -3435,7 +3463,7 @@ function CreateCustomGameSheet({
3435
3463
  );
3436
3464
  }),
3437
3465
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3438
- import_react_native13.TouchableOpacity,
3466
+ import_react_native14.TouchableOpacity,
3439
3467
  {
3440
3468
  style: [
3441
3469
  styles9.chip,
@@ -3444,12 +3472,12 @@ function CreateCustomGameSheet({
3444
3472
  ],
3445
3473
  onPress: handleCustomSelect,
3446
3474
  activeOpacity: 0.8,
3447
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.chipText, { color: isCustom ? "#FFFFFF" : t.text }], children: "Custom" })
3475
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.chipText, { color: isCustom ? "#FFFFFF" : t.text }], children: "Custom" })
3448
3476
  }
3449
3477
  )
3450
3478
  ] }),
3451
3479
  isCustom && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3452
- import_react_native13.TextInput,
3480
+ import_react_native14.TextInput,
3453
3481
  {
3454
3482
  style: [styles9.input, { backgroundColor: t.surface, color: t.text, borderColor: t.accent }],
3455
3483
  placeholder: "Enter amount in SOL",
@@ -3461,31 +3489,31 @@ function CreateCustomGameSheet({
3461
3489
  }
3462
3490
  )
3463
3491
  ] }),
3464
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: [styles9.summaryCard, { backgroundColor: t.surface, borderColor: t.border }], children: [
3465
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.summaryRow, children: [
3466
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Your buy-in" }),
3467
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryValue, { color: t.text }], children: effectiveAmount ? `${effectiveAmount} SOL` : "\u2014" })
3492
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: [styles9.summaryCard, { backgroundColor: t.surface, borderColor: t.border }], children: [
3493
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: styles9.summaryRow, children: [
3494
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Your buy-in" }),
3495
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.summaryValue, { color: t.text }], children: effectiveAmount ? `${effectiveAmount} SOL` : "\u2014" })
3468
3496
  ] }),
3469
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: [styles9.summarySep, { backgroundColor: t.border }] }),
3470
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.summaryRow, children: [
3471
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Players" }),
3472
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryValue, { color: t.text }], children: playersLabel })
3497
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: [styles9.summarySep, { backgroundColor: t.border }] }),
3498
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: styles9.summaryRow, children: [
3499
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Players" }),
3500
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.summaryValue, { color: t.text }], children: playersLabel })
3473
3501
  ] }),
3474
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: [styles9.summarySep, { backgroundColor: t.border }] }),
3475
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.summaryRow, children: [
3476
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Winner Takes" }),
3477
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.winnerCol, children: [
3478
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryValue, { color: t.success }], children: effectiveAmount ? `${winnerTakes.toFixed(4)} SOL` : "\u2014" }),
3479
- effectiveAmount ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.Text, { style: [styles9.feeNote, { color: t.textDim }], children: [
3502
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: [styles9.summarySep, { backgroundColor: t.border }] }),
3503
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: styles9.summaryRow, children: [
3504
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Winner Takes" }),
3505
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: styles9.winnerCol, children: [
3506
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.summaryValue, { color: t.success }], children: effectiveAmount ? `${winnerTakes.toFixed(4)} SOL` : "\u2014" }),
3507
+ effectiveAmount ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.Text, { style: [styles9.feeNote, { color: t.textDim }], children: [
3480
3508
  fee,
3481
3509
  "% platform fee"
3482
3510
  ] }) : null
3483
3511
  ] })
3484
3512
  ] })
3485
3513
  ] }),
3486
- mutation.error && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: [styles9.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }], children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.errorText, { color: t.errorText }], children: mutation.error.message }) }),
3514
+ mutation.error && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: [styles9.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }], children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.errorText, { color: t.errorText }], children: mutation.error.message }) }),
3487
3515
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3488
- import_react_native13.TouchableOpacity,
3516
+ import_react_native14.TouchableOpacity,
3489
3517
  {
3490
3518
  style: [
3491
3519
  styles9.ctaButton,
@@ -3494,10 +3522,10 @@ function CreateCustomGameSheet({
3494
3522
  disabled: !canCreate,
3495
3523
  onPress: handleCreate,
3496
3524
  activeOpacity: 0.8,
3497
- children: isMutating ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.ctaLoading, children: [
3498
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.ActivityIndicator, { size: "small", color: "#FFFFFF" }),
3499
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: styles9.ctaText, children: statusLabel })
3500
- ] }) : mutation.status === "success" ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: styles9.ctaText, children: STATUS_LABELS2.success }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.ctaText, !canCreate && { opacity: 0.5 }], children: effectiveAmount ? `Create Game \u2014 ${effectiveAmount} SOL` : "Select buy-in amount" })
3525
+ children: isMutating ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: styles9.ctaLoading, children: [
3526
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.ActivityIndicator, { size: "small", color: "#FFFFFF" }),
3527
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: styles9.ctaText, children: statusLabel })
3528
+ ] }) : mutation.status === "success" ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: styles9.ctaText, children: STATUS_LABELS2.success }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.Text, { style: [styles9.ctaText, !canCreate && { opacity: 0.5 }], children: effectiveAmount ? `Create Game \u2014 ${effectiveAmount} SOL` : "Select buy-in amount" })
3501
3529
  }
3502
3530
  )
3503
3531
  ] }) })
@@ -3507,9 +3535,9 @@ function CreateCustomGameSheet({
3507
3535
  }
3508
3536
  );
3509
3537
  }
3510
- var styles9 = import_react_native13.StyleSheet.create({
3538
+ var styles9 = import_react_native14.StyleSheet.create({
3511
3539
  overlay: {
3512
- ...import_react_native13.StyleSheet.absoluteFillObject,
3540
+ ...import_react_native14.StyleSheet.absoluteFillObject,
3513
3541
  backgroundColor: "rgba(0,0,0,0.5)"
3514
3542
  },
3515
3543
  overlayTap: {
@@ -3665,6 +3693,7 @@ var styles9 = import_react_native13.StyleSheet.create({
3665
3693
  SettingsSheet,
3666
3694
  UserProfileCard,
3667
3695
  createSecureStoreStorage,
3696
+ getDeviceInfo,
3668
3697
  mergeTheme,
3669
3698
  parseSolanaError,
3670
3699
  signAndSendBase64Transaction,