@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.d.mts +24 -3
- package/dist/index.d.ts +24 -3
- package/dist/index.js +301 -272
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +83 -55
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -2
- package/src/hooks/useAuth.ts +10 -3
- package/src/hooks/useClaim.ts +2 -1
- package/src/hooks/useCreateCustomGame.ts +2 -1
- package/src/hooks/useCreateGame.ts +2 -1
- package/src/hooks/useJoinGame.ts +2 -1
- package/src/index.ts +2 -0
- package/src/managed-wallet.tsx +14 -7
- package/src/types.ts +4 -0
- package/src/utils/device.ts +55 -0
- package/src/utils/transaction.ts +9 -2
- package/src/wallet/phantom-deeplink/phantom-deeplink-adapter.ts +0 -40
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, "
|
|
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
|
|
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
|
-
|
|
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)(
|
|
2041
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2042
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2043
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
2046
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2047
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
2055
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2056
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2057
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
2060
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2061
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
2069
|
-
i > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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
|
-
|
|
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)(
|
|
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
|
|
2102
|
-
const slideAnim = (0, import_react12.useRef)(new
|
|
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
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
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
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
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
|
-
|
|
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)(
|
|
2148
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2149
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2150
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
2153
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2154
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
2184
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.avatarActions, children: [
|
|
2157
2185
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2158
|
-
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
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)(
|
|
2177
|
-
|
|
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)(
|
|
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)(
|
|
2187
|
-
|
|
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)(
|
|
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)(
|
|
2197
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2198
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2199
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2200
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
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)(
|
|
2205
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2206
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
2209
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
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)(
|
|
2257
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.bottomRow, children: [
|
|
2230
2258
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2231
|
-
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
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)(
|
|
2252
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2253
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2254
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2255
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
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)(
|
|
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)(
|
|
2260
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2261
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2262
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2263
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2264
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
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)(
|
|
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)(
|
|
2276
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
2277
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
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)(
|
|
2328
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native6.View, { style: s.bottomRow, children: [
|
|
2301
2329
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2302
|
-
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
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
|
-
|
|
2364
|
+
import_react_native6.KeyboardAvoidingView,
|
|
2337
2365
|
{
|
|
2338
2366
|
style: [s.container, { backgroundColor: t.background }],
|
|
2339
|
-
behavior:
|
|
2367
|
+
behavior: import_react_native6.Platform.OS === "ios" ? "padding" : void 0,
|
|
2340
2368
|
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2341
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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)(
|
|
2637
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2638
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2639
|
-
username ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2640
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2641
|
-
memberSince ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
2721
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2722
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
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)(
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
2738
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
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
|
-
|
|
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)(
|
|
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)(
|
|
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 =
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
2862
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
2863
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
2864
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
2865
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
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)(
|
|
2868
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
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)(
|
|
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 =
|
|
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
|
-
...
|
|
2925
|
+
...import_react_native9.StyleSheet.absoluteFillObject,
|
|
2898
2926
|
justifyContent: "center",
|
|
2899
2927
|
alignItems: "center"
|
|
2900
2928
|
},
|
|
2901
2929
|
overlay: {
|
|
2902
|
-
...
|
|
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
|
|
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)(
|
|
3001
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
3002
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
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)(
|
|
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)(
|
|
3011
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
3032
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
3033
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
3034
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
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 =
|
|
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
|
|
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)(
|
|
3082
|
-
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
3083
|
-
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
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
|
-
|
|
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)(
|
|
3137
|
-
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
3138
|
-
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
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)(
|
|
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)(
|
|
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 =
|
|
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
|
|
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)(
|
|
3190
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
|
|
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)(
|
|
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)(
|
|
3220
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
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)(
|
|
3222
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
3223
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
|
|
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 =
|
|
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
|
|
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)(
|
|
3262
|
-
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
|
|
3263
|
-
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3264
|
-
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
|
|
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
|
-
|
|
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)(
|
|
3277
|
-
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3278
|
-
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3279
|
-
] }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
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 =
|
|
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
|
|
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
|
|
3351
|
+
const overlayOpacity = (0, import_react20.useRef)(new import_react_native14.Animated.Value(0)).current;
|
|
3324
3352
|
(0, import_react20.useEffect)(() => {
|
|
3325
|
-
|
|
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
|
-
|
|
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)(
|
|
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
|
-
|
|
3432
|
+
import_react_native14.KeyboardAvoidingView,
|
|
3405
3433
|
{
|
|
3406
3434
|
style: styles9.keyboardView,
|
|
3407
|
-
behavior:
|
|
3408
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3409
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3410
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3411
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3412
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
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)(
|
|
3415
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3416
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
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
|
-
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
3465
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3466
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3467
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
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)(
|
|
3470
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3471
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3472
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
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)(
|
|
3475
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3476
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3477
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3478
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3479
|
-
effectiveAmount ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
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)(
|
|
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
|
-
|
|
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)(
|
|
3498
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3499
|
-
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3500
|
-
] }) : mutation.status === "success" ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
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 =
|
|
3538
|
+
var styles9 = import_react_native14.StyleSheet.create({
|
|
3511
3539
|
overlay: {
|
|
3512
|
-
...
|
|
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,
|