FEATURE: Migrate username storage from localStorage to IndexedDB

- Created storage.js wrapper with IndexedDB support
- Automatic fallback to localStorage if IndexedDB unavailable
- Updated all username storage calls to use async API
- Better performance and more storage capacity
- Improved PWA compatibility

Benefits:
- 50MB+ storage vs 5-10MB localStorage
- Async API doesn't block main thread
- Better for future features (game history, stats, etc.)
This commit is contained in:
2025-12-14 12:15:16 +11:00
parent bc76e7aab1
commit bcf3b0a032
3 changed files with 149 additions and 10 deletions

View File

@@ -21,7 +21,7 @@ class MultiplayerClient {
}
// Show username modal immediately if not saved
const savedUsername = localStorage.getItem('connect5_username');
const savedUsername = await window.gameStorage.getItem('connect5_username');
if (!savedUsername) {
this.showUsernameModal();
} else {
@@ -92,13 +92,13 @@ class MultiplayerClient {
}
}, 5000);
tempSocket.on('connect', () => {
tempSocket.on('connect', async () => {
clearTimeout(timeout);
this.socket = tempSocket;
console.log('✅ Socket connected, listeners ready');
// Now that listeners are set up, handle auto-registration
const savedUsername = localStorage.getItem('connect5_username') || this.username;
const savedUsername = await window.gameStorage.getItem('connect5_username') || this.username;
if (savedUsername) {
console.log('Auto-registering with saved username:', savedUsername);
this.registerPlayer(savedUsername);
@@ -191,9 +191,9 @@ class MultiplayerClient {
}
// Register player
registerPlayer(username) {
async registerPlayer(username) {
this.username = username;
localStorage.setItem('connect5_username', username);
await window.gameStorage.setItem('connect5_username', username);
// Hide username modal immediately for better UX
const modal = document.getElementById('usernameModal');
@@ -220,14 +220,12 @@ class MultiplayerClient {
}
// Handle registration response
handleRegistration(data) {
async handleRegistration(data) {
if (data.success) {
this.playerId = data.player.id;
this.username = data.player.username;
// Save username to localStorage for auto-login
localStorage.setItem('connect5_username', this.username);
console.log('Username saved to localStorage');
await window.gameStorage.setItem('connect5_username', this.username);
console.log('Username saved to IndexedDB');
// Hide username modal (if visible)
const modal = document.getElementById('usernameModal');