'use client' import { useCallback, useEffect, useRef, useState } from 'react' import './Leaderboards.css' import axios from 'axios' import { app } from '@tauri-apps/api' import { platform } from '@tauri-apps/plugin-os' import { decrypt, encrypt } from '../util/Encryption' import { invoke } from '@tauri-apps/api/core' import Image from 'next/image' import { LeaderboardResponse } from '../types/LeaderboardResponse' import { faChevronDown } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { getKey } from '../util/KeysHelper' import Berry from '../assets/berries/Berry.png' import PoisonBerry from '../assets/berries/PoisonBerry.png' import SlowBerry from '../assets/berries/SlowBerry.png' import UltraBerry from '../assets/berries/UltraBerry.png' import SpeedyBerry from '../assets/berries/SpeedyBerry.png' import CoinBerry from '../assets/berries/CoinBerry.png' export default function Leaderboards () { const [leaderboardData, setLeaderboardData] = useState(null) const [loading, setLoading] = useState(true) const [leftOpen, setLeftOpen] = useState(false) const [rightOpen, setRightOpen] = useState(false) const leftRef = useRef(null) const rightRef = useRef(null) const formatter = new Intl.NumberFormat('en-US') const [leaderboardType, setLeaderboardType] = useState(0) const [berryType, setBerryType] = useState(0) const refresh = useCallback(async () => { setLoading(true) setLeaderboardData(null) try { const launcherVersion = await app.getVersion() const sendKey = await getKey(1) const formData = new URLSearchParams() formData.append( await encrypt('type', sendKey), await encrypt(leaderboardType.toString(), sendKey) ) if (leaderboardType == 1) { formData.append( await encrypt('showType', sendKey), await encrypt(berryType.toString(), sendKey) ) } const response = await axios.post( 'https://berrydash.lncvrt.xyz/database/getTopPlayers.php', formData, { headers: { Requester: 'BerryDashLauncher', LauncherVersion: launcherVersion, ClientPlatform: platform() } } ) const decrypted = await decrypt(response.data) setLeaderboardData(JSON.parse(decrypted)) } catch (e) { console.error('Error fetching leaderboard data:', e) } finally { setLoading(false) } }, [leaderboardType, berryType]) function downloadLeaderboard () { let content = '"Username","Score","ScoreFormatted"\n' leaderboardData?.entries.forEach(entry => { content += `"${entry.username}","${entry.value}","${formatter.format( BigInt(entry.value) )}"\n` }) while (content.endsWith('\n')) { content = content.slice(0, -1) } invoke('download_leaderboard', { content }) } useEffect(() => { refresh() }, [refresh]) useEffect(() => { function onDocClick (e: MouseEvent) { const t = e.target as Node if (leftRef.current && !leftRef.current.contains(t)) setLeftOpen(false) if (rightRef.current && !rightRef.current.contains(t)) setRightOpen(false) } document.addEventListener('mousedown', onDocClick) return () => document.removeEventListener('mousedown', onDocClick) }, []) return (

Leaderboards

{leaderboardData?.entries?.length ? ( leaderboardData.entries.map((entry, i) => (
{ ;(e.currentTarget as HTMLImageElement).style.display = 'none' }} />

{entry.username} (#{i + 1})

{formatter.format(BigInt(entry.value))}

)) ) : loading ? (

Loading...

) : (

No data...

)}
) }