{"id":146,"date":"2026-04-21T17:27:58","date_gmt":"2026-04-21T17:27:58","guid":{"rendered":"https:\/\/onlyfrenchiez.co.uk\/?page_id=146"},"modified":"2026-04-21T18:48:25","modified_gmt":"2026-04-21T18:48:25","slug":"leaderboard","status":"publish","type":"page","link":"https:\/\/onlyfrenchiez.co.uk\/?page_id=146","title":{"rendered":"Leaderboard"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"146\" class=\"elementor elementor-146\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-991eff2 e-flex e-con-boxed e-con e-parent\" data-id=\"991eff2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-43258b3 elementor-widget elementor-widget-shortcode\" data-id=\"43258b3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <div id=\"slu_e862e354-4ea7-4a47-ad02-082e1206ce11\" class=\"shuffle-leaderboard-wrap\" data-endpoint=\"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=%2Fshuffle%2Fv2%2Fleaderboard&#038;period=custom_cycle&#038;limit=20&#038;show_campaign=false&#038;start_time&#038;end_time\" data-refresh=\"30\">\n            <div class=\"shuffle-leaderboard-header\">\n                <h2>Leaderboard<\/h2>\n                <button type=\"button\" class=\"shuffle-refresh-btn\">Refresh<\/button>\n            <\/div>\n            <div class=\"shuffle-range\">Loading\u2026<\/div>\n                            <div class=\"shuffle-summary\" hidden>\n                    <div class=\"shuffle-summary-card\"><span class=\"label\">Players<\/span><span class=\"value\" data-field=\"players\">0<\/span><\/div>\n                    <div class=\"shuffle-summary-card\"><span class=\"label\">Total Wagered<\/span><span class=\"value\" data-field=\"total\">0<\/span><\/div>\n                    <div class=\"shuffle-summary-card\"><span class=\"label\">Top Wager<\/span><span class=\"value\" data-field=\"top\">0<\/span><\/div>\n                <\/div>\n                                        <div class=\"shuffle-podium\" hidden><\/div>\n                        <div class=\"shuffle-table-wrap\">\n                <table class=\"shuffle-leaderboard-table\">\n                    <thead>\n                        <tr>\n                            <th>Rank<\/th>\n                            <th>User<\/th>\n                                                        <th>Wager<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody><tr><td colspan=\"3\">Loading leaderboard\u2026<\/td><\/tr><\/tbody>\n                <\/table>\n            <\/div>\n            <div class=\"shuffle-note\">Wagered amount reflects finalised bets only.<\/div>\n        <\/div>\n        <script>\n        (function(){\n            const root = document.getElementById(\"slu_e862e354-4ea7-4a47-ad02-082e1206ce11\");\n            if (!root) return;\n            const endpoint = root.dataset.endpoint;\n            const refreshSeconds = parseInt(root.dataset.refresh || '0', 10);\n            const refreshBtn = root.querySelector('.shuffle-refresh-btn');\n            const tbody = root.querySelector('tbody');\n            const rangeEl = root.querySelector('.shuffle-range');\n            const summaryEl = root.querySelector('.shuffle-summary');\n            const podiumEl = root.querySelector('.shuffle-podium');\n            const colspan = root.querySelectorAll('thead th').length || 4;\n            const fmtCurrency = (n) => new Intl.NumberFormat(undefined, {maximumFractionDigits: 2}).format(Number(n || 0));\n\n            function renderPodium(rows){\n                if (!podiumEl) return;\n                if (!rows.length) {\n                    podiumEl.hidden = true;\n                    return;\n                }\n                const picks = [rows[1], rows[0], rows[2]].filter(Boolean);\n                podiumEl.innerHTML = picks.map((row, idx) => {\n                    const rank = idx === 0 ? 2 : (idx === 1 ? 1 : 3);\n                    return `\n                        <div class=\"shuffle-podium-item rank-${rank}\">\n                            <div class=\"rank\">#${rank}<\/div>\n                            <div class=\"name\">${row.username || ''}<\/div>\n                            <div class=\"amount\">${fmtCurrency(row.wagerAmount)}<\/div>\n                        <\/div>\n                    `;\n                }).join('');\n                podiumEl.hidden = false;\n            }\n\n            function renderRows(payload){\n                const rows = payload.rows || [];\n                const showCampaign = !!payload.show_campaign;\n                if (!rows.length) {\n                    tbody.innerHTML = `<tr><td colspan=\"${colspan}\">No data found for this range.<\/td><\/tr>`;\n                    return;\n                }\n                tbody.innerHTML = rows.map((row, i) => `\n                    <tr>\n                        <td>${i + 1}<\/td>\n                        <td>${row.username || ''}<\/td>\n                        ${showCampaign ? `<td>${row.campaignCode || ''}<\/td>` : ''}\n                        <td>${fmtCurrency(row.wagerAmount)}<\/td>\n                    <\/tr>\n                `).join('');\n            }\n\n            function renderSummary(payload){\n                if (!summaryEl) return;\n                const summary = payload.summary || {};\n                summaryEl.querySelector('[data-field=\"players\"]').textContent = summary.players || 0;\n                summaryEl.querySelector('[data-field=\"total\"]').textContent = fmtCurrency(summary.total_wagered || 0);\n                summaryEl.querySelector('[data-field=\"top\"]').textContent = fmtCurrency(summary.top_wager || 0);\n                summaryEl.hidden = false;\n            }\n\n            async function loadLeaderboard(){\n                if (refreshBtn) refreshBtn.disabled = true;\n                try {\n                    const res = await fetch(endpoint, {credentials: 'same-origin'});\n                    const payload = await res.json();\n                    if (!payload || payload.success === false) {\n                        tbody.innerHTML = `<tr><td colspan=\"${colspan}\">Unable to load leaderboard right now.<\/td><\/tr>`;\n                        return;\n                    }\n                    rangeEl.textContent = `${payload.range.start_human} \u2192 ${payload.range.end_human}`;\n                    renderSummary(payload);\n                    renderPodium(payload.rows || []);\n                    renderRows(payload);\n                } catch (e) {\n                    tbody.innerHTML = `<tr><td colspan=\"${colspan}\">Unable to load leaderboard right now.<\/td><\/tr>`;\n                } finally {\n                    if (refreshBtn) {\n                        window.setTimeout(() => { refreshBtn.disabled = false; }, refreshSeconds > 0 ? refreshSeconds * 1000 : 30000);\n                    }\n                }\n            }\n\n            if (refreshBtn) {\n                refreshBtn.addEventListener('click', loadLeaderboard);\n            }\n            loadLeaderboard();\n            if (refreshSeconds > 0) {\n                window.setInterval(loadLeaderboard, refreshSeconds * 1000);\n            }\n        })();\n        <\/script>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-146","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=146"}],"version-history":[{"count":5,"href":"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/146\/revisions"}],"predecessor-version":[{"id":169,"href":"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/146\/revisions\/169"}],"wp:attachment":[{"href":"https:\/\/onlyfrenchiez.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}