// pages.jsx — route page components for saraslot // Loaded after games.jsx, before app.jsx. const { useState: useStateP } = React; /* ───────────────────────────────────────────────────────────── Mock data ──────────────────────────────────────────────────────────── */ const MOCK_PRODUCTS = [ { id: "p01", name: "GOLDEN DRAGON", tagline: "Hand-painted scatter slot — 8 reels, 96.5% RTP.", price: "RM 88", badge: "NEW", hue: 38 }, { id: "p02", name: "NEON RACER", tagline: "Cyber-arcade reels with x500 multiplier loops.", price: "RM 168", badge: "HOT", hue: 200 }, { id: "p03", name: "JADE EMPRESS", tagline: "Imperial 5x4 grid, free-spin coin trail bonus.", price: "RM 128", badge: null, hue: 150 }, { id: "p04", name: "TIGER REBORN", tagline: "Cluster-pays mahjong tiger, daily jackpot drop.", price: "RM 198", badge: "NEW", hue: 14 }, { id: "p05", name: "BLACK PEARL", tagline: "Deep-sea adventure, wild expanding pearls.", price: "RM 108", badge: null, hue: 280 }, { id: "p06", name: "SAKURA STORM", tagline: "Petal-fall reels with re-spin bloom feature.", price: "RM 78", badge: "HOT", hue: 330 }, { id: "p07", name: "CRYPTO VAULT", tagline: "Stacked-symbol heist game, hold & win frames.", price: "RM 158", badge: null, hue: 110 }, { id: "p08", name: "PHOENIX FORTUNE", tagline: "Rebirth wilds, 4-tier jackpot ladder.", price: "RM 228", badge: "NEW", hue: 22 }, ]; const MOCK_TRANSACTIONS = [ { id: "16162085179", type: "WITHDRAW", amount: 307.66, currency: "MYR", bank: "MAYBANK", accountName: "Sara Lee", accountNo: "10926135", method: "Manual", status: "COMPLETED", ts: "13 May 2026 7:59PM" }, { id: "16161582035", type: "DEPOSIT", amount: 30.00, currency: "MYR", bank: "DUITNOW", accountName: "Sara Lee", accountNo: "—", method: "Online", status: "COMPLETED", ts: "13 May 2026 6:44PM" }, { id: "16161546489", type: "FORFEITED", amount: -0.10, currency: "MYR", bank: null, accountName: null, accountNo: null, method: null, status: "COMPLETED", ts: "13 May 2026 6:39PM", remarks: "Player Clear Balance" }, { id: "16161523018", type: "BONUS", amount: 2.40, currency: "MYR", bank: null, accountName: null, accountNo: null, method: null, status: "COMPLETED", ts: "13 May 2026 6:35PM", remarks: "HOURLY FREE CREDIT 365" }, { id: "16161520047", type: "FORFEITED", amount: -1.20, currency: "MYR", bank: null, accountName: null, accountNo: null, method: null, status: "COMPLETED", ts: "13 May 2026 6:31PM", remarks: "Player Clear Balance" }, { id: "16161482219", type: "DEPOSIT", amount: 150.00, currency: "MYR", bank: "CIMB", accountName: "Sara Lee", accountNo: "—", method: "Online", status: "COMPLETED", ts: "13 May 2026 5:48PM" }, { id: "16161421008", type: "WITHDRAW", amount: 88.00, currency: "MYR", bank: "CIMB", accountName: "Sara Lee", accountNo: "76554120", method: "Manual", status: "PENDING", ts: "13 May 2026 4:12PM" }, { id: "16161330912", type: "BONUS", amount: 5.00, currency: "MYR", bank: null, accountName: null, accountNo: null, method: null, status: "COMPLETED", ts: "13 May 2026 2:50PM", remarks: "DAILY CHECK-IN" }, { id: "16161210055", type: "DEPOSIT", amount: 50.00, currency: "MYR", bank: "PUBLIC", accountName: "Sara Lee", accountNo: "—", method: "Online", status: "COMPLETED", ts: "13 May 2026 1:09PM" }, { id: "16161099201", type: "WITHDRAW", amount: 240.00, currency: "MYR", bank: "MAYBANK", accountName: "Sara Lee", accountNo: "10926135", method: "Manual", status: "COMPLETED", ts: "12 May 2026 11:33PM" }, { id: "16160880014", type: "BONUS", amount: 8.80, currency: "MYR", bank: null, accountName: null, accountNo: null, method: null, status: "COMPLETED", ts: "12 May 2026 9:22PM", remarks: "WEEKEND RELOAD" }, { id: "16160712455", type: "DEPOSIT", amount: 200.00, currency: "MYR", bank: "MAYBANK", accountName: "Sara Lee", accountNo: "—", method: "Online", status: "COMPLETED", ts: "12 May 2026 8:01PM" }, ]; const MOCK_BETS = [ { id: "B-901223", game: "GOLDEN DRAGON", provider: "Pragmatic", stake: 5.00, payout: 27.50, ts: "13 May 2026 6:38PM", result: "WIN" }, { id: "B-901219", game: "NEON RACER", provider: "PG Soft", stake: 10.00, payout: 0.00, ts: "13 May 2026 6:34PM", result: "LOSE" }, { id: "B-901207", game: "JADE EMPRESS", provider: "JILI", stake: 2.00, payout: 18.00, ts: "13 May 2026 6:21PM", result: "WIN" }, { id: "B-901192", game: "TIGER REBORN", provider: "Spadegaming",stake: 8.00, payout: 0.00, ts: "13 May 2026 5:50PM", result: "LOSE" }, { id: "B-901180", game: "SAKURA STORM", provider: "Habanero", stake: 1.00, payout: 4.20, ts: "13 May 2026 5:12PM", result: "WIN" }, { id: "B-901159", game: "BLACK PEARL", provider: "Pragmatic", stake: 6.00, payout: 12.00, ts: "13 May 2026 4:34PM", result: "WIN" }, { id: "B-901144", game: "CRYPTO VAULT", provider: "Hacksaw", stake: 4.00, payout: 0.00, ts: "13 May 2026 3:08PM", result: "LOSE" }, { id: "B-901101", game: "PHOENIX FORTUNE", provider: "PG Soft", stake: 12.00, payout: 88.00, ts: "13 May 2026 1:42PM", result: "WIN" }, ]; const MOCK_PROMOS = [ { id: "wel", percent: "50%", title: "WELCOME BONUS", body: "Boost your first deposit with extra chips to win more.", tags: ["ALL SLOTS", "NEW MEMBER", "NO LIVE GAME"] }, { id: "day", percent: "20%", title: "DAILY BONUS", body: "Get daily refresh and increase your chances to win.", tags: ["ALL SLOTS", "DAILY", "NO LIVE GAME"] }, { id: "wkd", percent: "30%", title: "WEEKEND BONUS", body: "Join us every Saturday and Sunday for more fun and rewards.",tags: ["ALL SLOTS", "WEEKEND", "NO LIVE GAME"] }, { id: "unl", percent: "10%", title: "UNLIMITED BONUS", body: "Enjoy unlimited slot bonuses with fast deposits and payouts.",tags: ["ALL SLOTS", "UNLIMITED", "NO LIVE GAME"] }, { id: "fish", percent: "5%", title: "TEMBAK IKAN BONUS", body: "Enjoy 5% bonus on every fish-shooter session.", tags: ["FISH", "DAILY"] }, ]; const MOCK_PROFILE = { username: "SARA888", name: "SARA LEE", phone: "60126668888", balance: "MYR 0.00", bank: { name: "Maybank Berhad", accountNo: "10926135", holder: "Sara Lee", bsb: "0625", payId: "0126668888" }, email: "sara888@saraslot.my", }; const MOCK_CHAT_INTRO = { ways: [ { label: "SMS Register", href: "#" }, { label: "WhatsApp Register", href: "#" }, { label: "Tukar Kata Laluan", href: "#" }, { label: "Withdraw", href: "#" }, ], deposit: ["online", "ewallet", "telcopin"], contacts: [ { label: "WhatsApp", value: "+60 12-666-8888" }, { label: "Telegram", value: "@saraslot_my" }, { label: "Line", value: "saraslot.my" }, ], sites: ["sara888.asia", "saraslot.org"], }; /* ───────────────────────────────────────────────────────────── HomePage — extracts the legacy homepage body ──────────────────────────────────────────────────────────── */ function HomePage({ theme }) { return (
); } window.HomePage = HomePage; /* ───────────────────────────────────────────────────────────── ShopPage — the new "♀ NEW" landing ──────────────────────────────────────────────────────────── */ function ProductThumb({ p }) { const hue = p.hue ?? 38; return (
{p.name.split(" ")[0]} {p.name.split(" ").slice(1).join(" ") || "SLOT"} {p.badge && {p.badge}}
); } function ProductCard({ p }) { return (

{p.name}

{p.tagline}

{p.price}
); } function ShopPage({ theme }) { return (
Drop · 05.2026

NEW DROPS

{MOCK_PRODUCTS.length} titles
{MOCK_PRODUCTS.map((p) => )}
); } window.ShopPage = ShopPage; /* ───────────────────────────────────────────────────────────── HistoryPage ──────────────────────────────────────────────────────────── */ function TxRow({ tx }) { const typeClass = tx.type.toLowerCase(); return (
{tx.type} ● {tx.status}
#{tx.id}
Amount : {tx.currency} {tx.amount.toFixed(2)}
{tx.bank &&
Bank : {tx.bank}
} {tx.accountName &&
BankAccountName : {tx.accountName}
} {tx.accountNo && tx.accountNo !== "—" &&
BankAccountNumber : {tx.accountNo}
} {tx.method &&
Method : {tx.method}
} {tx.remarks &&
Remarks : {tx.remarks}
}
{tx.ts}
); } function BetRow({ bet }) { const win = bet.result === "WIN"; return (
{bet.game} ● {bet.result}
#{bet.id} · {bet.provider}
Stake : MYR {bet.stake.toFixed(2)}
Payout : MYR {bet.payout.toFixed(2)}
{bet.ts}
); } function HistoryPage({ theme }) { const [tab, setTab] = useStateP("tx"); return (
{tab === "tx" ? "Transactions" : "Bet History"} Status
{tab === "tx" ? MOCK_TRANSACTIONS.map((t) => ) : MOCK_BETS.map((b) => ) }
); } window.HistoryPage = HistoryPage; /* ───────────────────────────────────────────────────────────── PromoPage ──────────────────────────────────────────────────────────── */ function PromoCard({ p }) { return (
{p.percent}
{p.title}

{p.body}

{p.tags.map((t) => {t})}
); } function PromoPage({ theme }) { return (

PROMOTIONS

Boost every spin — fresh drops every week.

{MOCK_PROMOS.map((p) => )}
); } window.PromoPage = PromoPage; /* ───────────────────────────────────────────────────────────── LiveChatPage ──────────────────────────────────────────────────────────── */ function LiveChatPage({ theme }) { const [draft, setDraft] = useStateP(""); const [history, setHistory] = useStateP([ { from: "bot", text: "Selamat Datang ke SARASLOT. How can we help today?" }, ]); const send = () => { const v = draft.trim(); if (!v) return; setHistory((h) => [...h, { from: "me", text: v }]); setDraft(""); setTimeout(() => { setHistory((h) => [...h, { from: "bot", text: "Thanks! A live agent will reply shortly." }]); }, 600); }; return (
9:14pm
SARASLOT

Selamat Datang ke

SARASLOT
CARA UNTUK
{MOCK_CHAT_INTRO.ways.map((w) => ( • {w.label} ))}
CARA DEPOSIT
{MOCK_CHAT_INTRO.deposit.map((d) => {d})}
CONTACT
{MOCK_CHAT_INTRO.contacts.map((c) => (
{c.label}{c.value}
))}
{MOCK_CHAT_INTRO.sites.map((s) => ◆ {s})}
{history.map((m, i) => (
{m.text}
))}
setDraft(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") send(); }} />
); } window.LiveChatPage = LiveChatPage; /* ───────────────────────────────────────────────────────────── SettingPage ──────────────────────────────────────────────────────────── */ function SettingRow({ label, value }) { return (
{label} : {value}
); } function SettingMenuRow({ label }) { return ( ); } function SettingPage({ theme }) { const p = MOCK_PROFILE; return (

PROFILE

SETTING

); } window.SettingPage = SettingPage;