space-game/src/stores/levelRegistry.ts
Michael Mainguy 5e67b796ba Add ESLint and refactor leaderboard to join with users table
- Add ESLint with typescript-eslint for unused code detection
- Fix 33 unused variable/import warnings across codebase
- Remove player_name from leaderboard insert (normalized design)
- Add ensureUserProfile() to upsert user display_name to users table
- Update leaderboard queries to join with users(display_name)
- Add getDisplayName() helper for leaderboard entries

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 03:52:03 -06:00

55 lines
1.4 KiB
TypeScript

import { writable } from 'svelte/store';
import { LevelRegistry } from '../levels/storage/levelRegistry';
import type { LevelConfig } from '../levels/config/levelConfig';
import type { CloudLevelEntry } from '../services/cloudLevelService';
interface LevelRegistryState {
isInitialized: boolean;
levels: Map<string, CloudLevelEntry>;
}
function createLevelRegistryStore() {
const registry = LevelRegistry.getInstance();
const initial: LevelRegistryState = {
isInitialized: false,
levels: new Map(),
};
const { subscribe, set: _set, update } = writable<LevelRegistryState>(initial);
// Initialize registry
(async () => {
try {
await registry.initialize();
update(state => ({
...state,
isInitialized: true,
levels: registry.getAllLevels(),
}));
} catch (error) {
console.error('[LevelRegistryStore] Failed to initialize:', error);
}
})();
return {
subscribe,
getLevel: (levelId: string): LevelConfig | null => {
return registry.getLevel(levelId);
},
getLevelEntry: (levelId: string): CloudLevelEntry | null => {
return registry.getLevelEntry(levelId);
},
refresh: async () => {
registry.reset();
await registry.initialize();
update(state => ({
...state,
levels: registry.getAllLevels(),
}));
},
};
}
export const levelRegistryStore = createLevelRegistryStore();