@dubsdotapp/expo 0.2.20 → 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,
@@ -1417,7 +1418,7 @@ function ManagedWalletProvider({
1417
1418
 
1418
1419
  // src/ui/AuthGate.tsx
1419
1420
  var import_react12 = __toESM(require("react"));
1420
- var import_react_native5 = require("react-native");
1421
+ var import_react_native6 = require("react-native");
1421
1422
 
1422
1423
  // src/hooks/useEvents.ts
1423
1424
  var import_react2 = require("react");
@@ -1788,6 +1789,45 @@ var import_bs583 = __toESM(require("bs58"));
1788
1789
  var import_react10 = require("react");
1789
1790
  var AuthContext = (0, import_react10.createContext)(null);
1790
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
+
1791
1831
  // src/hooks/useAuth.ts
1792
1832
  function useAuth() {
1793
1833
  const sharedAuth = (0, import_react11.useContext)(AuthContext);
@@ -1816,15 +1856,17 @@ function useAuth() {
1816
1856
  setStatus("authenticating");
1817
1857
  setError(null);
1818
1858
  const walletAddress = wallet.publicKey.toBase58();
1859
+ const deviceInfo = await getDeviceInfo();
1860
+ console.log("[useAuth] Device info:", JSON.stringify(deviceInfo, null, 2));
1819
1861
  const { nonce, message } = await client.getNonce(walletAddress);
1820
1862
  setStatus("signing");
1821
1863
  const messageBytes = new TextEncoder().encode(message);
1822
1864
  const signatureBytes = await wallet.signMessage(messageBytes);
1823
1865
  const signature = import_bs583.default.encode(signatureBytes);
1824
1866
  setStatus("verifying");
1825
- const result = await client.authenticate({ walletAddress, signature, nonce });
1867
+ const result = await client.authenticate({ walletAddress, signature, nonce, deviceInfo });
1826
1868
  if (result.needsRegistration) {
1827
- pendingAuth.current = { walletAddress, nonce, signature };
1869
+ pendingAuth.current = { walletAddress, nonce, signature, deviceInfo };
1828
1870
  setStatus("needsRegistration");
1829
1871
  return;
1830
1872
  }
@@ -1850,7 +1892,8 @@ function useAuth() {
1850
1892
  nonce: pending.nonce,
1851
1893
  username,
1852
1894
  referralCode,
1853
- avatarUrl
1895
+ avatarUrl,
1896
+ deviceInfo: pending.deviceInfo
1854
1897
  });
1855
1898
  pendingAuth.current = null;
1856
1899
  const user2 = avatarUrl && !result.user.avatar ? { ...result.user, avatar: avatarUrl } : result.user;
@@ -2022,44 +2065,44 @@ function DefaultLoadingScreen({ status, appName, accentColor }) {
2022
2065
  authenticated: "Ready!",
2023
2066
  error: "Something went wrong"
2024
2067
  };
2025
- 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: [
2026
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.brandingSection, children: [
2027
- /* @__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" }) }),
2028
- /* @__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 })
2029
2072
  ] }),
2030
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.loadingSection, children: [
2031
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.ActivityIndicator, { size: "large", color: accent }),
2032
- /* @__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..." })
2033
2076
  ] })
2034
2077
  ] }) });
2035
2078
  }
2036
2079
  function DefaultErrorScreen({ error, onRetry, appName, accentColor }) {
2037
2080
  const t = useDubsTheme();
2038
2081
  const accent = accentColor || t.accent;
2039
- 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: [
2040
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.brandingSection, children: [
2041
- /* @__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" }) }),
2042
- /* @__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 })
2043
2086
  ] }),
2044
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: { gap: 16 }, children: [
2045
- /* @__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 }) }),
2046
- /* @__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" }) })
2047
2090
  ] })
2048
2091
  ] }) });
2049
2092
  }
2050
2093
  function StepIndicator({ currentStep }) {
2051
2094
  const t = useDubsTheme();
2052
2095
  const steps = [0, 1, 2, 3];
2053
- 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: [
2054
- 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 }] }),
2055
2098
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2056
- import_react_native5.View,
2099
+ import_react_native6.View,
2057
2100
  {
2058
2101
  style: [
2059
2102
  s.stepCircle,
2060
2103
  i < currentStep ? { backgroundColor: t.success } : i === currentStep ? { backgroundColor: t.accent } : { backgroundColor: "transparent", borderWidth: 2, borderColor: t.border }
2061
2104
  ],
2062
- 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 })
2063
2106
  }
2064
2107
  )
2065
2108
  ] }, i)) });
@@ -2083,8 +2126,8 @@ function DefaultRegistrationScreen({
2083
2126
  const [checking, setChecking] = (0, import_react12.useState)(false);
2084
2127
  const [availability, setAvailability] = (0, import_react12.useState)(null);
2085
2128
  const debounceRef = (0, import_react12.useRef)(null);
2086
- const fadeAnim = (0, import_react12.useRef)(new import_react_native5.Animated.Value(1)).current;
2087
- 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;
2088
2131
  const avatarUrl = getAvatarUrl(avatarStyle, avatarSeed);
2089
2132
  (0, import_react12.useEffect)(() => {
2090
2133
  if (debounceRef.current) clearTimeout(debounceRef.current);
@@ -2111,92 +2154,92 @@ function DefaultRegistrationScreen({
2111
2154
  }, [username, client]);
2112
2155
  const animateToStep = (0, import_react12.useCallback)((newStep) => {
2113
2156
  const dir = newStep > step ? 1 : -1;
2114
- import_react_native5.Keyboard.dismiss();
2115
- import_react_native5.Animated.parallel([
2116
- import_react_native5.Animated.timing(fadeAnim, { toValue: 0, duration: 120, useNativeDriver: true }),
2117
- 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 })
2118
2161
  ]).start(() => {
2119
2162
  setStep(newStep);
2120
2163
  slideAnim.setValue(dir * 40);
2121
- import_react_native5.Animated.parallel([
2122
- import_react_native5.Animated.timing(fadeAnim, { toValue: 1, duration: 200, useNativeDriver: true }),
2123
- 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 })
2124
2167
  ]).start();
2125
2168
  });
2126
2169
  }, [step, fadeAnim, slideAnim]);
2127
2170
  const canContinueUsername = username.trim().length >= 3 && availability?.available === true && !checking;
2128
2171
  const handleSubmit = () => {
2129
- import_react_native5.Keyboard.dismiss();
2172
+ import_react_native6.Keyboard.dismiss();
2130
2173
  onRegister(username.trim(), referralCode.trim() || void 0, avatarUrl);
2131
2174
  };
2132
- const renderAvatarStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepContainer, children: [
2133
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepTop, children: [
2134
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.title, { color: t.text }], children: "Choose Your Avatar" }),
2135
- /* @__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" }),
2136
2179
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(StepIndicator, { currentStep: 0 }),
2137
- /* @__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: [
2138
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Image, { source: { uri: avatarUrl }, style: s.avatarLarge }),
2139
- /* @__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" }) })
2140
2183
  ] }) }),
2141
- /* @__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: [
2142
2185
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2143
- import_react_native5.TouchableOpacity,
2186
+ import_react_native6.TouchableOpacity,
2144
2187
  {
2145
2188
  style: [s.outlineBtn, { borderColor: t.border }],
2146
2189
  onPress: () => setAvatarSeed(generateSeed()),
2147
2190
  activeOpacity: 0.7,
2148
- 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" })
2149
2192
  }
2150
2193
  ),
2151
2194
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2152
- import_react_native5.TouchableOpacity,
2195
+ import_react_native6.TouchableOpacity,
2153
2196
  {
2154
2197
  style: [s.outlineBtn, { borderColor: accent, backgroundColor: accent + "15" }],
2155
2198
  onPress: () => setShowStyles(!showStyles),
2156
2199
  activeOpacity: 0.7,
2157
- 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" })
2158
2201
  }
2159
2202
  )
2160
2203
  ] }),
2161
- 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)(
2162
- 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,
2163
2206
  {
2164
2207
  onPress: () => setAvatarStyle(st),
2165
2208
  style: [s.styleThumbWrap, { borderColor: st === avatarStyle ? accent : t.border }],
2166
- 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 })
2167
2210
  },
2168
2211
  st
2169
2212
  )) })
2170
2213
  ] }),
2171
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.View, { style: s.bottomRow, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2172
- 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,
2173
2216
  {
2174
2217
  style: [s.primaryBtn, { backgroundColor: accent, flex: 1 }],
2175
2218
  onPress: () => animateToStep(1),
2176
2219
  activeOpacity: 0.8,
2177
- 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" })
2178
2221
  }
2179
2222
  ) })
2180
2223
  ] });
2181
- const renderUsernameStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepContainer, children: [
2182
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepTop, children: [
2183
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.headerRow, children: [
2184
- /* @__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" }) }),
2185
- /* @__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" })
2186
2229
  ] }),
2187
- /* @__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" }),
2188
2231
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(StepIndicator, { currentStep: 1 }),
2189
- /* @__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: [
2190
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Image, { source: { uri: avatarUrl }, style: s.avatarSmall }),
2191
- /* @__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" }) })
2192
2235
  ] }) }),
2193
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.inputGroup, children: [
2194
- /* @__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: [
2195
2238
  "Username ",
2196
- /* @__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: "*" })
2197
2240
  ] }),
2198
2241
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2199
- import_react_native5.TextInput,
2242
+ import_react_native6.TextInput,
2200
2243
  {
2201
2244
  style: [s.input, { backgroundColor: t.surface, color: t.text, borderColor: accent }],
2202
2245
  placeholder: "Enter username",
@@ -2208,63 +2251,63 @@ function DefaultRegistrationScreen({
2208
2251
  autoFocus: true
2209
2252
  }
2210
2253
  ),
2211
- 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
2212
2255
  ] })
2213
2256
  ] }),
2214
- /* @__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: [
2215
2258
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2216
- import_react_native5.TouchableOpacity,
2259
+ import_react_native6.TouchableOpacity,
2217
2260
  {
2218
2261
  style: [s.secondaryBtn, { borderColor: t.border }],
2219
2262
  onPress: () => animateToStep(0),
2220
2263
  activeOpacity: 0.7,
2221
- 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" })
2222
2265
  }
2223
2266
  ),
2224
2267
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2225
- import_react_native5.TouchableOpacity,
2268
+ import_react_native6.TouchableOpacity,
2226
2269
  {
2227
2270
  style: [s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: canContinueUsername ? 1 : 0.4 }],
2228
2271
  onPress: () => animateToStep(2),
2229
2272
  disabled: !canContinueUsername,
2230
2273
  activeOpacity: 0.8,
2231
- 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" })
2232
2275
  }
2233
2276
  )
2234
2277
  ] })
2235
2278
  ] });
2236
- const renderReferralStep = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepContainer, children: [
2237
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.stepTop, children: [
2238
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.headerRow, children: [
2239
- /* @__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" }) }),
2240
- /* @__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!" })
2241
2284
  ] }),
2242
- /* @__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)" }),
2243
2286
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(StepIndicator, { currentStep: 2 }),
2244
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: [s.profileCard, { borderColor: t.border }], children: [
2245
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Text, { style: [s.profileLabel, { color: t.textMuted }], children: "Your Profile" }),
2246
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.profileRow, children: [
2247
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native5.Image, { source: { uri: avatarUrl }, style: s.profileAvatar }),
2248
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: { gap: 4 }, children: [
2249
- /* @__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: [
2250
2293
  "@",
2251
2294
  username
2252
2295
  ] }),
2253
- /* @__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: [
2254
2297
  "\u2713",
2255
2298
  " Ready to go!"
2256
2299
  ] })
2257
2300
  ] })
2258
2301
  ] })
2259
2302
  ] }),
2260
- 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,
2261
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native5.View, { style: s.inputGroup, children: [
2262
- /* @__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: [
2263
2306
  "Referral Code ",
2264
- /* @__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)" })
2265
2308
  ] }),
2266
2309
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2267
- import_react_native5.TextInput,
2310
+ import_react_native6.TextInput,
2268
2311
  {
2269
2312
  style: [s.input, { backgroundColor: t.surface, color: t.text, borderColor: t.border }],
2270
2313
  placeholder: "Enter referral code",
@@ -2276,31 +2319,31 @@ function DefaultRegistrationScreen({
2276
2319
  editable: !registering
2277
2320
  }
2278
2321
  ),
2279
- /* @__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: [
2280
2323
  "\u{1F381}",
2281
2324
  " If a friend invited you, enter their code to give them credit!"
2282
2325
  ] })
2283
2326
  ] })
2284
2327
  ] }),
2285
- /* @__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: [
2286
2329
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2287
- import_react_native5.TouchableOpacity,
2330
+ import_react_native6.TouchableOpacity,
2288
2331
  {
2289
2332
  style: [s.secondaryBtn, { borderColor: t.border }],
2290
2333
  onPress: () => animateToStep(1),
2291
2334
  disabled: registering,
2292
2335
  activeOpacity: 0.7,
2293
- 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" })
2294
2337
  }
2295
2338
  ),
2296
2339
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2297
- import_react_native5.TouchableOpacity,
2340
+ import_react_native6.TouchableOpacity,
2298
2341
  {
2299
2342
  style: [s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: registering ? 0.7 : 1 }],
2300
2343
  onPress: handleSubmit,
2301
2344
  disabled: registering,
2302
2345
  activeOpacity: 0.8,
2303
- 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" })
2304
2347
  }
2305
2348
  )
2306
2349
  ] })
@@ -2318,18 +2361,18 @@ function DefaultRegistrationScreen({
2318
2361
  }
2319
2362
  };
2320
2363
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2321
- import_react_native5.KeyboardAvoidingView,
2364
+ import_react_native6.KeyboardAvoidingView,
2322
2365
  {
2323
2366
  style: [s.container, { backgroundColor: t.background }],
2324
- behavior: import_react_native5.Platform.OS === "ios" ? "padding" : void 0,
2367
+ behavior: import_react_native6.Platform.OS === "ios" ? "padding" : void 0,
2325
2368
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2326
- import_react_native5.ScrollView,
2369
+ import_react_native6.ScrollView,
2327
2370
  {
2328
2371
  contentContainerStyle: { flexGrow: 1 },
2329
2372
  keyboardShouldPersistTaps: "handled",
2330
2373
  bounces: false,
2331
2374
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2332
- import_react_native5.Animated.View,
2375
+ import_react_native6.Animated.View,
2333
2376
  {
2334
2377
  style: [
2335
2378
  { flex: 1 },
@@ -2343,7 +2386,7 @@ function DefaultRegistrationScreen({
2343
2386
  }
2344
2387
  );
2345
2388
  }
2346
- var s = import_react_native5.StyleSheet.create({
2389
+ var s = import_react_native6.StyleSheet.create({
2347
2390
  container: { flex: 1 },
2348
2391
  // Loading / Error
2349
2392
  centerContent: { flex: 1, justifyContent: "center", alignItems: "center", paddingHorizontal: 32, gap: 48 },
@@ -2595,7 +2638,7 @@ function useAppConfig() {
2595
2638
 
2596
2639
  // src/ui/UserProfileCard.tsx
2597
2640
  var import_react14 = require("react");
2598
- var import_react_native6 = require("react-native");
2641
+ var import_react_native7 = require("react-native");
2599
2642
  var import_jsx_runtime5 = require("react/jsx-runtime");
2600
2643
  function truncateAddress(address, chars = 4) {
2601
2644
  if (address.length <= chars * 2 + 3) return address;
@@ -2618,16 +2661,16 @@ function UserProfileCard({
2618
2661
  () => avatarUrl || `https://api.dicebear.com/9.x/avataaars/png?seed=${walletAddress}&size=128`,
2619
2662
  [avatarUrl, walletAddress]
2620
2663
  );
2621
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_native6.View, { style: [styles2.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
2622
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native6.Image, { source: { uri: imageUri }, style: styles2.avatar }),
2623
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_native6.View, { style: styles2.info, children: [
2624
- username ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native6.Text, { style: [styles2.username, { color: t.text }], children: username }) : null,
2625
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native6.Text, { style: [styles2.address, { color: t.textMuted }], children: truncateAddress(walletAddress) }),
2626
- 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
2627
2670
  ] })
2628
2671
  ] });
2629
2672
  }
2630
- var styles2 = import_react_native6.StyleSheet.create({
2673
+ var styles2 = import_react_native7.StyleSheet.create({
2631
2674
  card: {
2632
2675
  flexDirection: "row",
2633
2676
  alignItems: "center",
@@ -2661,7 +2704,7 @@ var styles2 = import_react_native6.StyleSheet.create({
2661
2704
  });
2662
2705
 
2663
2706
  // src/ui/SettingsSheet.tsx
2664
- var import_react_native7 = require("react-native");
2707
+ var import_react_native8 = require("react-native");
2665
2708
  var import_jsx_runtime6 = require("react/jsx-runtime");
2666
2709
  function truncateAddress2(address, chars = 4) {
2667
2710
  if (address.length <= chars * 2 + 3) return address;
@@ -2680,7 +2723,7 @@ function SettingsSheet({
2680
2723
  }) {
2681
2724
  const t = useDubsTheme();
2682
2725
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2683
- import_react_native7.ScrollView,
2726
+ import_react_native8.ScrollView,
2684
2727
  {
2685
2728
  style: [styles3.container, { backgroundColor: t.background }],
2686
2729
  contentContainerStyle: styles3.content,
@@ -2694,49 +2737,49 @@ function SettingsSheet({
2694
2737
  memberSince
2695
2738
  }
2696
2739
  ),
2697
- /* @__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: [
2698
2741
  onCopyAddress ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2699
- import_react_native7.TouchableOpacity,
2742
+ import_react_native8.TouchableOpacity,
2700
2743
  {
2701
2744
  style: styles3.actionRow,
2702
2745
  onPress: onCopyAddress,
2703
2746
  activeOpacity: 0.7,
2704
2747
  children: [
2705
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native7.View, { style: styles3.actionRowLeft, children: [
2706
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.Text, { style: [styles3.actionLabel, { color: t.text }], children: "Wallet Address" }),
2707
- /* @__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) })
2708
2751
  ] }),
2709
- /* @__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" })
2710
2753
  ]
2711
2754
  }
2712
2755
  ) : null,
2713
2756
  onSupport ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
2714
- 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,
2715
2758
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2716
- import_react_native7.TouchableOpacity,
2759
+ import_react_native8.TouchableOpacity,
2717
2760
  {
2718
2761
  style: styles3.actionRow,
2719
2762
  onPress: onSupport,
2720
2763
  activeOpacity: 0.7,
2721
2764
  children: [
2722
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native7.Text, { style: [styles3.actionLabel, { color: t.text }], children: "Help & Support" }),
2723
- /* @__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" })
2724
2767
  ]
2725
2768
  }
2726
2769
  )
2727
2770
  ] }) : null
2728
2771
  ] }),
2729
2772
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2730
- import_react_native7.TouchableOpacity,
2773
+ import_react_native8.TouchableOpacity,
2731
2774
  {
2732
2775
  style: [styles3.logoutButton, { borderColor: t.live }],
2733
2776
  onPress: onLogout,
2734
2777
  disabled: loggingOut,
2735
2778
  activeOpacity: 0.7,
2736
- 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" })
2737
2780
  }
2738
2781
  ),
2739
- 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: [
2740
2783
  "v",
2741
2784
  appVersion
2742
2785
  ] }) : null
@@ -2744,7 +2787,7 @@ function SettingsSheet({
2744
2787
  }
2745
2788
  );
2746
2789
  }
2747
- var styles3 = import_react_native7.StyleSheet.create({
2790
+ var styles3 = import_react_native8.StyleSheet.create({
2748
2791
  container: {
2749
2792
  flex: 1
2750
2793
  },
@@ -2808,7 +2851,7 @@ var styles3 = import_react_native7.StyleSheet.create({
2808
2851
 
2809
2852
  // src/ui/game/GamePoster.tsx
2810
2853
  var import_react15 = require("react");
2811
- var import_react_native8 = require("react-native");
2854
+ var import_react_native9 = require("react-native");
2812
2855
  var import_jsx_runtime7 = require("react/jsx-runtime");
2813
2856
  function computeCountdown(lockTimestamp) {
2814
2857
  if (!lockTimestamp) return "";
@@ -2830,7 +2873,7 @@ function GamePoster({ game, ImageComponent }) {
2830
2873
  const away = opponents[1];
2831
2874
  const countdown = computeCountdown(game.lockTimestamp);
2832
2875
  const isLive = countdown === "LIVE";
2833
- 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: [
2834
2877
  game.media?.poster ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2835
2878
  Img,
2836
2879
  {
@@ -2838,19 +2881,19 @@ function GamePoster({ game, ImageComponent }) {
2838
2881
  style: styles4.image,
2839
2882
  resizeMode: "cover"
2840
2883
  }
2841
- ) : /* @__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: [
2842
2885
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TeamLogoInternal, { url: home?.imageUrl, size: 56, Img }),
2843
- /* @__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" }),
2844
2887
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TeamLogoInternal, { url: away?.imageUrl, size: 56, Img })
2845
2888
  ] }) }),
2846
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.View, { style: styles4.overlay }),
2847
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native8.View, { style: styles4.teamNames, children: [
2848
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.Text, { style: styles4.teamNameText, numberOfLines: 1, children: home?.name || "Home" }),
2849
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.Text, { style: styles4.teamNameVs, children: "vs" }),
2850
- /* @__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" })
2851
2894
  ] }),
2852
- 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,
2853
- /* @__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: [
2854
2897
  game.totalPool || 0,
2855
2898
  " SOL"
2856
2899
  ] }) })
@@ -2859,7 +2902,7 @@ function GamePoster({ game, ImageComponent }) {
2859
2902
  function TeamLogoInternal({ url, size, Img }) {
2860
2903
  const [failed, setFailed] = (0, import_react15.useState)(false);
2861
2904
  if (!url || failed) {
2862
- 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 }] });
2863
2906
  }
2864
2907
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2865
2908
  Img,
@@ -2871,7 +2914,7 @@ function TeamLogoInternal({ url, size, Img }) {
2871
2914
  }
2872
2915
  );
2873
2916
  }
2874
- var styles4 = import_react_native8.StyleSheet.create({
2917
+ var styles4 = import_react_native9.StyleSheet.create({
2875
2918
  container: {
2876
2919
  height: 200,
2877
2920
  borderRadius: 16,
@@ -2879,12 +2922,12 @@ var styles4 = import_react_native8.StyleSheet.create({
2879
2922
  position: "relative"
2880
2923
  },
2881
2924
  image: {
2882
- ...import_react_native8.StyleSheet.absoluteFillObject,
2925
+ ...import_react_native9.StyleSheet.absoluteFillObject,
2883
2926
  justifyContent: "center",
2884
2927
  alignItems: "center"
2885
2928
  },
2886
2929
  overlay: {
2887
- ...import_react_native8.StyleSheet.absoluteFillObject,
2930
+ ...import_react_native9.StyleSheet.absoluteFillObject,
2888
2931
  backgroundColor: "rgba(0,0,0,0.35)"
2889
2932
  },
2890
2933
  fallback: {
@@ -2959,7 +3002,7 @@ var styles4 = import_react_native8.StyleSheet.create({
2959
3002
 
2960
3003
  // src/ui/game/LivePoolsCard.tsx
2961
3004
  var import_react16 = require("react");
2962
- var import_react_native9 = require("react-native");
3005
+ var import_react_native10 = require("react-native");
2963
3006
  var import_jsx_runtime8 = require("react/jsx-runtime");
2964
3007
  function LivePoolsCard({
2965
3008
  game,
@@ -2982,29 +3025,29 @@ function LivePoolsCard({
2982
3025
  awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : "\u2014"
2983
3026
  };
2984
3027
  }, [homePool, awayPool, totalPool]);
2985
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: [styles5.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
2986
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native9.Text, { style: [styles5.title, { color: t.text }], children: "Live Pools" }),
2987
- /* @__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: [
2988
3031
  totalPool,
2989
3032
  " SOL total"
2990
3033
  ] }),
2991
- /* @__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: [
2992
3035
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(PoolBar, { name: homeName, amount: homePool, percent: homePercent, color: homeColor, t }),
2993
3036
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(PoolBar, { name: awayName, amount: awayPool, percent: awayPercent, color: awayColor, t })
2994
3037
  ] }),
2995
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: styles5.oddsRow, children: [
2996
- /* @__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: [
2997
3040
  homeName,
2998
3041
  ": ",
2999
- /* @__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: [
3000
3043
  homeOdds,
3001
3044
  "x"
3002
3045
  ] })
3003
3046
  ] }),
3004
- /* @__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: [
3005
3048
  awayName,
3006
3049
  ": ",
3007
- /* @__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: [
3008
3051
  awayOdds,
3009
3052
  "x"
3010
3053
  ] })
@@ -3013,16 +3056,16 @@ function LivePoolsCard({
3013
3056
  ] });
3014
3057
  }
3015
3058
  function PoolBar({ name, amount, percent, color, t }) {
3016
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: styles5.barRow, children: [
3017
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native9.Text, { style: [styles5.barLabel, { color: t.textSecondary }], numberOfLines: 1, children: name }),
3018
- /* @__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 }] }) }),
3019
- /* @__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: [
3020
3063
  amount,
3021
3064
  " SOL"
3022
3065
  ] })
3023
3066
  ] });
3024
3067
  }
3025
- var styles5 = import_react_native9.StyleSheet.create({
3068
+ var styles5 = import_react_native10.StyleSheet.create({
3026
3069
  card: { borderRadius: 16, borderWidth: 1, padding: 16 },
3027
3070
  title: { fontSize: 17, fontWeight: "700", marginBottom: 4 },
3028
3071
  total: { fontSize: 14, fontWeight: "600", marginBottom: 14 },
@@ -3038,7 +3081,7 @@ var styles5 = import_react_native9.StyleSheet.create({
3038
3081
 
3039
3082
  // src/ui/game/PickWinnerCard.tsx
3040
3083
  var import_react17 = require("react");
3041
- var import_react_native10 = require("react-native");
3084
+ var import_react_native11 = require("react-native");
3042
3085
  var import_jsx_runtime9 = require("react/jsx-runtime");
3043
3086
  function PickWinnerCard({
3044
3087
  game,
@@ -3063,9 +3106,9 @@ function PickWinnerCard({
3063
3106
  }), [totalPool, homePool, awayPool, bettors]);
3064
3107
  const homeName = shortName ? shortName(opponents[0]?.name) : opponents[0]?.name || "Home";
3065
3108
  const awayName = shortName ? shortName(opponents[1]?.name) : opponents[1]?.name || "Away";
3066
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native10.View, { style: [styles6.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
3067
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native10.Text, { style: [styles6.title, { color: t.text }], children: "Pick Your Winner" }),
3068
- /* @__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: [
3069
3112
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3070
3113
  TeamOption,
3071
3114
  {
@@ -3112,29 +3155,29 @@ function TeamOption({
3112
3155
  const Img = ImageComponent || require("react-native").Image;
3113
3156
  const showImage = imageUrl && !imgFailed;
3114
3157
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
3115
- import_react_native10.TouchableOpacity,
3158
+ import_react_native11.TouchableOpacity,
3116
3159
  {
3117
3160
  style: [styles6.option, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + "15" : t.background }],
3118
3161
  onPress,
3119
3162
  activeOpacity: 0.7,
3120
3163
  children: [
3121
- 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] }),
3122
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native10.Text, { style: [styles6.name, { color: t.text }], numberOfLines: 1, children: name }),
3123
- /* @__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: [
3124
3167
  odds,
3125
3168
  "x"
3126
3169
  ] }),
3127
- /* @__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: [
3128
3171
  bets,
3129
3172
  " ",
3130
3173
  bets === 1 ? "bet" : "bets"
3131
3174
  ] }),
3132
- 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" }) })
3133
3176
  ]
3134
3177
  }
3135
3178
  );
3136
3179
  }
3137
- var styles6 = import_react_native10.StyleSheet.create({
3180
+ var styles6 = import_react_native11.StyleSheet.create({
3138
3181
  card: { borderRadius: 16, borderWidth: 1, padding: 16 },
3139
3182
  title: { fontSize: 17, fontWeight: "700", marginBottom: 12 },
3140
3183
  row: { flexDirection: "row", gap: 12 },
@@ -3150,7 +3193,7 @@ var styles6 = import_react_native10.StyleSheet.create({
3150
3193
 
3151
3194
  // src/ui/game/PlayersCard.tsx
3152
3195
  var import_react18 = require("react");
3153
- var import_react_native11 = require("react-native");
3196
+ var import_react_native12 = require("react-native");
3154
3197
  var import_jsx_runtime10 = require("react/jsx-runtime");
3155
3198
  function truncateWallet(addr, chars) {
3156
3199
  if (addr.length <= chars * 2 + 3) return addr;
@@ -3171,12 +3214,12 @@ function PlayersCard({
3171
3214
  if (team === "away") return awayColor;
3172
3215
  return drawColor;
3173
3216
  };
3174
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native11.View, { style: [styles7.card, { backgroundColor: t.surface, borderColor: t.border }], children: [
3175
- /* @__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: [
3176
3219
  "Players",
3177
3220
  bettors.length > 0 ? ` (${bettors.length})` : ""
3178
3221
  ] }),
3179
- 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)(
3180
3223
  BettorRow,
3181
3224
  {
3182
3225
  bettor: b,
@@ -3201,17 +3244,17 @@ function BettorRow({
3201
3244
  const [imgFailed, setImgFailed] = (0, import_react18.useState)(false);
3202
3245
  const Img = ImageComponent || require("react-native").Image;
3203
3246
  const showAvatar = bettor.avatar && !imgFailed;
3204
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native11.View, { style: [styles7.row, !isFirst && { borderTopColor: t.border, borderTopWidth: 1 }], children: [
3205
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native11.View, { style: [styles7.dot, { backgroundColor: dotColor }] }),
3206
- 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] }),
3207
- /* @__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) }) }),
3208
- /* @__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: [
3209
3252
  bettor.amount,
3210
3253
  " SOL"
3211
3254
  ] })
3212
3255
  ] });
3213
3256
  }
3214
- var styles7 = import_react_native11.StyleSheet.create({
3257
+ var styles7 = import_react_native12.StyleSheet.create({
3215
3258
  card: { borderRadius: 16, borderWidth: 1, padding: 16 },
3216
3259
  title: { fontSize: 17, fontWeight: "700", marginBottom: 12 },
3217
3260
  empty: { fontSize: 14, textAlign: "center", paddingVertical: 16 },
@@ -3226,7 +3269,7 @@ var styles7 = import_react_native11.StyleSheet.create({
3226
3269
 
3227
3270
  // src/ui/game/JoinGameButton.tsx
3228
3271
  var import_react19 = require("react");
3229
- var import_react_native12 = require("react-native");
3272
+ var import_react_native13 = require("react-native");
3230
3273
  var import_jsx_runtime11 = require("react/jsx-runtime");
3231
3274
  var STATUS_LABELS = {
3232
3275
  building: "Building transaction...",
@@ -3243,30 +3286,30 @@ function JoinGameButton({ game, walletAddress, selectedTeam, status, onJoin }) {
3243
3286
  if (alreadyJoined || game.isLocked || game.isResolved) return null;
3244
3287
  const isJoining = status !== "idle" && status !== "success" && status !== "error";
3245
3288
  const statusLabel = STATUS_LABELS[status] || "";
3246
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: [styles8.bar, { backgroundColor: t.background, borderTopColor: t.border }], children: [
3247
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles8.buyInRow, children: [
3248
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.Text, { style: [styles8.buyInLabel, { color: t.textMuted }], children: "Buy-in" }),
3249
- /* @__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: [
3250
3293
  game.buyIn,
3251
3294
  " SOL"
3252
3295
  ] })
3253
3296
  ] }),
3254
3297
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3255
- import_react_native12.TouchableOpacity,
3298
+ import_react_native13.TouchableOpacity,
3256
3299
  {
3257
3300
  style: [styles8.button, { backgroundColor: selectedTeam ? "#22D3EE" : t.border }],
3258
3301
  disabled: !selectedTeam || isJoining,
3259
3302
  onPress: onJoin,
3260
3303
  activeOpacity: 0.8,
3261
- children: isJoining ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles8.joiningRow, children: [
3262
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.ActivityIndicator, { size: "small", color: "#000" }),
3263
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.Text, { style: styles8.buttonText, children: statusLabel })
3264
- ] }) : /* @__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" })
3265
3308
  }
3266
3309
  )
3267
3310
  ] });
3268
3311
  }
3269
- var styles8 = import_react_native12.StyleSheet.create({
3312
+ var styles8 = import_react_native13.StyleSheet.create({
3270
3313
  bar: { position: "absolute", bottom: 0, left: 0, right: 0, paddingHorizontal: 16, paddingTop: 12, paddingBottom: 36, borderTopWidth: 1 },
3271
3314
  buyInRow: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", marginBottom: 10 },
3272
3315
  buyInLabel: { fontSize: 13 },
@@ -3278,7 +3321,7 @@ var styles8 = import_react_native12.StyleSheet.create({
3278
3321
 
3279
3322
  // src/ui/game/CreateCustomGameSheet.tsx
3280
3323
  var import_react20 = require("react");
3281
- var import_react_native13 = require("react-native");
3324
+ var import_react_native14 = require("react-native");
3282
3325
  var import_jsx_runtime12 = require("react/jsx-runtime");
3283
3326
  var STATUS_LABELS2 = {
3284
3327
  building: "Building transaction...",
@@ -3305,9 +3348,9 @@ function CreateCustomGameSheet({
3305
3348
  const [selectedAmount, setSelectedAmount] = (0, import_react20.useState)(null);
3306
3349
  const [customAmount, setCustomAmount] = (0, import_react20.useState)("");
3307
3350
  const [isCustom, setIsCustom] = (0, import_react20.useState)(false);
3308
- 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;
3309
3352
  (0, import_react20.useEffect)(() => {
3310
- import_react_native13.Animated.timing(overlayOpacity, {
3353
+ import_react_native14.Animated.timing(overlayOpacity, {
3311
3354
  toValue: visible ? 1 : 0,
3312
3355
  duration: 250,
3313
3356
  useNativeDriver: true
@@ -3377,32 +3420,32 @@ function CreateCustomGameSheet({
3377
3420
  const statusLabel = STATUS_LABELS2[mutation.status] || "";
3378
3421
  const playersLabel = playerCount === 2 ? "2 (1v1)" : `${playerCount} players`;
3379
3422
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3380
- import_react_native13.Modal,
3423
+ import_react_native14.Modal,
3381
3424
  {
3382
3425
  visible,
3383
3426
  animationType: "slide",
3384
3427
  transparent: true,
3385
3428
  onRequestClose: onDismiss,
3386
3429
  children: [
3387
- /* @__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 }) }),
3388
3431
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3389
- import_react_native13.KeyboardAvoidingView,
3432
+ import_react_native14.KeyboardAvoidingView,
3390
3433
  {
3391
3434
  style: styles9.keyboardView,
3392
- behavior: import_react_native13.Platform.OS === "ios" ? "padding" : void 0,
3393
- 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: [
3394
- /* @__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 }] }) }),
3395
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.header, children: [
3396
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.headerTitle, { color: t.text }], children: "New Game" }),
3397
- /* @__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" }) })
3398
3441
  ] }),
3399
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.section, children: [
3400
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.sectionLabel, { color: t.textSecondary }], children: "Buy-In Amount" }),
3401
- /* @__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: [
3402
3445
  presetAmounts.map((amount) => {
3403
3446
  const active = !isCustom && selectedAmount === amount;
3404
3447
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3405
- import_react_native13.TouchableOpacity,
3448
+ import_react_native14.TouchableOpacity,
3406
3449
  {
3407
3450
  style: [
3408
3451
  styles9.chip,
@@ -3411,7 +3454,7 @@ function CreateCustomGameSheet({
3411
3454
  ],
3412
3455
  onPress: () => handlePresetSelect(amount),
3413
3456
  activeOpacity: 0.8,
3414
- 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: [
3415
3458
  amount,
3416
3459
  " SOL"
3417
3460
  ] })
@@ -3420,7 +3463,7 @@ function CreateCustomGameSheet({
3420
3463
  );
3421
3464
  }),
3422
3465
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3423
- import_react_native13.TouchableOpacity,
3466
+ import_react_native14.TouchableOpacity,
3424
3467
  {
3425
3468
  style: [
3426
3469
  styles9.chip,
@@ -3429,12 +3472,12 @@ function CreateCustomGameSheet({
3429
3472
  ],
3430
3473
  onPress: handleCustomSelect,
3431
3474
  activeOpacity: 0.8,
3432
- 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" })
3433
3476
  }
3434
3477
  )
3435
3478
  ] }),
3436
3479
  isCustom && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3437
- import_react_native13.TextInput,
3480
+ import_react_native14.TextInput,
3438
3481
  {
3439
3482
  style: [styles9.input, { backgroundColor: t.surface, color: t.text, borderColor: t.accent }],
3440
3483
  placeholder: "Enter amount in SOL",
@@ -3446,31 +3489,31 @@ function CreateCustomGameSheet({
3446
3489
  }
3447
3490
  )
3448
3491
  ] }),
3449
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: [styles9.summaryCard, { backgroundColor: t.surface, borderColor: t.border }], children: [
3450
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.summaryRow, children: [
3451
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Your buy-in" }),
3452
- /* @__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" })
3453
3496
  ] }),
3454
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: [styles9.summarySep, { backgroundColor: t.border }] }),
3455
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.summaryRow, children: [
3456
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Players" }),
3457
- /* @__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 })
3458
3501
  ] }),
3459
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: [styles9.summarySep, { backgroundColor: t.border }] }),
3460
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.summaryRow, children: [
3461
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryLabel, { color: t.textMuted }], children: "Winner Takes" }),
3462
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.winnerCol, children: [
3463
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: [styles9.summaryValue, { color: t.success }], children: effectiveAmount ? `${winnerTakes.toFixed(4)} SOL` : "\u2014" }),
3464
- 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: [
3465
3508
  fee,
3466
3509
  "% platform fee"
3467
3510
  ] }) : null
3468
3511
  ] })
3469
3512
  ] })
3470
3513
  ] }),
3471
- 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 }) }),
3472
3515
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3473
- import_react_native13.TouchableOpacity,
3516
+ import_react_native14.TouchableOpacity,
3474
3517
  {
3475
3518
  style: [
3476
3519
  styles9.ctaButton,
@@ -3479,10 +3522,10 @@ function CreateCustomGameSheet({
3479
3522
  disabled: !canCreate,
3480
3523
  onPress: handleCreate,
3481
3524
  activeOpacity: 0.8,
3482
- children: isMutating ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: styles9.ctaLoading, children: [
3483
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.ActivityIndicator, { size: "small", color: "#FFFFFF" }),
3484
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Text, { style: styles9.ctaText, children: statusLabel })
3485
- ] }) : 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" })
3486
3529
  }
3487
3530
  )
3488
3531
  ] }) })
@@ -3492,9 +3535,9 @@ function CreateCustomGameSheet({
3492
3535
  }
3493
3536
  );
3494
3537
  }
3495
- var styles9 = import_react_native13.StyleSheet.create({
3538
+ var styles9 = import_react_native14.StyleSheet.create({
3496
3539
  overlay: {
3497
- ...import_react_native13.StyleSheet.absoluteFillObject,
3540
+ ...import_react_native14.StyleSheet.absoluteFillObject,
3498
3541
  backgroundColor: "rgba(0,0,0,0.5)"
3499
3542
  },
3500
3543
  overlayTap: {
@@ -3650,6 +3693,7 @@ var styles9 = import_react_native13.StyleSheet.create({
3650
3693
  SettingsSheet,
3651
3694
  UserProfileCard,
3652
3695
  createSecureStoreStorage,
3696
+ getDeviceInfo,
3653
3697
  mergeTheme,
3654
3698
  parseSolanaError,
3655
3699
  signAndSendBase64Transaction,