diff --git a/frontend/src/pages/home/HomePage.vue b/frontend/src/pages/home/HomePage.vue index 554ef38..78851dc 100644 --- a/frontend/src/pages/home/HomePage.vue +++ b/frontend/src/pages/home/HomePage.vue @@ -23,6 +23,11 @@ const gObserverTarget = ref(null); const gObserver = ref(null); const gLoading = ref(false); const gPage = ref(1); +const openMatches = ref([]) +const mObserverTarget = ref(null); +const mObserver = ref(null); +const mLoading = ref(false); +const mPage = ref(1); const showHostModal = ref(false) const showJoinModal = ref(false) const selectedGame = ref(null) @@ -38,6 +43,21 @@ const lbObserverTarget = ref(null) const lbObserver = ref(null) const lbMorePages = ref(true) const publicStats = ref(null) +const isLoggedIn = useAuthStore().isLoggedIn + +const setupMatchesObserver = () => { + if (mObserver.value) mObserver.value.disconnect(); + + mObserver.value = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting && !mLoading.value && openMatches.value.length > 0) { + getPendingMatches(); + } + }, { threshold: 0.1 }); + + if (mObserverTarget.value) { + mObserver.value.observe(mObserverTarget.value); + } +} const setupGamesObserver = () => { if (gObserver.value) gObserver.value.disconnect(); @@ -67,14 +87,30 @@ const getPendingGames = async (mode = selectedMode.value) => { const newGames = response.data.data; openGames.value = [...openGames.value, ...newGames]; - gPage.value++; - } catch (error) { - console.error('Failed to fetch games:', error); } finally { gLoading.value = false; } } +const getPendingMatches = async (mode = selectedMode.value) => { + if (mLoading.value) return; + mLoading.value = true; + + try { + const response = await axios.get(`${API_BASE_URL}/matches/open`, { + params: { + type: mode, + page: mPage.value + } + }); + + const newMatches = response.data.data; + openMatches.value = [...openMatches.value, ...newMatches]; + } finally { + mLoading.value = false; + } +} + const fetchPublicStats = async () => { try { const response = await apiStore.getPublicStats() @@ -145,81 +181,77 @@ const setupLeaderboardObserver = () => { const clickMode = async (mode) => { if (selectedMode.value === mode) return; - openGames.value = []; selectedMode.value = mode; + openGames.value = []; gPage.value = 1; - await getPendingGames(); + openMatches.value = []; + mPage.value = 1; + await Promise.all([getPendingGames(), getPendingMatches()]); setupGamesObserver(); + setupMatchesObserver(); } const startSingle = () => { router.push({ name: 'bisca' + selectedMode.value }); } -const JoinGameModal = (game) => { - selectedGame.value = game - isReady.value = false - showJoinModal.value = true -} - -const hostGameModal = () => { - showHostModal.value = true -} - const toggleReady = () => { isReady.value = !isReady.value } onMounted(async () => { await fetchPublicStats(); - await getPendingGames(); - await nextTick(); - setupGamesObserver(); + if (isLoggedIn) { + await Promise.all([getPendingGames(), getPendingMatches()]); + await nextTick(); + setupGamesObserver(); + setupMatchesObserver(); + } }) const hostGame = async () => { - showHostModal.value = true + showHostModal.value = true - try { - const response = await axios.post(`${API_BASE_URL}/games/host`, { - type: selectedMode.value - }) + try { + const response = await axios.post(`${API_BASE_URL}/games/host`, { + type: selectedMode.value + }) - const gameId = response.data.id + const gameId = response.data.id - console.log('Game hosted:', gameId) + console.log('Game hosted:', gameId) - router.push({ - name: 'multiplayer-game', - params: { id: gameId }, - query: { type: selectedMode.value } - }) - } catch (error) { - console.error('Failed to host game:', error) - console.error('Error details:', error.response?.data) - showHostModal.value = false - alert('Failed to host game: ' + (error.response?.data?.message || error.message)) - } + router.push({ + name: 'multiplayer-game', + params: { id: gameId }, + query: { type: selectedMode.value } + }) + } catch (error) { + console.error('Failed to host game:', error) + console.error('Error details:', error.response?.data) + showHostModal.value = false + alert('Failed to host game: ' + (error.response?.data?.message || error.message)) + } } const joinGame = async (game) => { - selectedGame.value = game + selectedGame.value = game - try { - await axios.post(`${API_BASE_URL}/games/${game.id}/join`) + try { + await axios.post(`${API_BASE_URL}/games/${game.id}/join`) - console.log('Joined game:', game.id) + console.log('Joined game:', game.id) - router.push({ - name: 'multiplayer-game', - params: { id: game.id }, - query: { type: selectedMode.value } - }) - } catch (error) { - console.error('Failed to join game:', error) - console.error('Error details:', error.response?.data) - alert('Failed to join game: ' + (error.response?.data?.message || error.message)) - } + router.push({ + name: 'multiplayer-game', + params: { id: game.id }, + query: { type: selectedMode.value } + }) + } catch (error) { + console.error('Failed to join game:', error) + console.error('Error details:', error.response?.data) + alert('Failed to join game: ' + (error.response?.data?.message || error.message)) + } } @@ -227,7 +259,7 @@ const joinGame = async (game) => {