diff --git a/src/gistService.tsx b/src/gistService.tsx index b061adb..488a7ee 100644 --- a/src/gistService.tsx +++ b/src/gistService.tsx @@ -1,6 +1,6 @@ import axios, { AxiosError } from 'axios'; import { initializeApp } from 'firebase/app'; -import { getDatabase, ref, get, set } from 'firebase/database'; +import { getDatabase, ref, get, set, runTransaction } from 'firebase/database'; // Replace with your Firebase config const firebaseConfig = { @@ -50,7 +50,7 @@ export const updateLeaderboard = async (leaderboard: LeaderboardEntry[]): Promis await set(leaderboardRef, updates); }; -// Function to create or update leaderboard entry +// Function to create or update leaderboard entry with transaction export const createOrUpdateLeaderboardEntry = async ( address: string, time: number, @@ -66,18 +66,28 @@ export const createOrUpdateLeaderboardEntry = async ( userName: effectiveUserName }; - const currentLeaderboard = await getLeaderboard(); - const existingEntryIndex = currentLeaderboard.findIndex(entry => entry.playerId === playerId || entry.address === address); + await runTransaction(leaderboardRef, (currentData) => { + if (currentData) { + const currentLeaderboard: LeaderboardEntry[] = Object.values(currentData); - if (existingEntryIndex >= 0) { - // Update existing entry if new time is better - if (time < currentLeaderboard[existingEntryIndex].time) { - currentLeaderboard[existingEntryIndex] = newEntry; - } - } else { - // Add new entry if not found - currentLeaderboard.push(newEntry); - } + const existingEntryIndex = currentLeaderboard.findIndex(entry => entry.playerId === playerId || entry.address === address); + + if (existingEntryIndex >= 0) { + if (time < currentLeaderboard[existingEntryIndex].time) { + currentLeaderboard[existingEntryIndex] = newEntry; + } + } else { + currentLeaderboard.push(newEntry); + } - await updateLeaderboard(currentLeaderboard); + const updates: Record = {}; + currentLeaderboard.forEach((entry, index) => { + updates[`entry_${index}`] = entry; + }); + return updates; + } else { + const updates: Record = { entry_0: newEntry }; + return updates; + } + }); };