let allJourneys = []; // ==================== LOAD JOURNEYS ==================== async function loadJourneys() { try { const res = await fetch(`${API_BASE}/journeys`, { credentials: 'include' }); if (!res.ok) throw new Error('Failed to fetch journeys'); const journeys = await res.json(); allJourneys = journeys; renderJourneys(journeys); } catch (err) { console.error(err); document.getElementById('posts-grid').innerHTML = '

Failed to load journeys. Make sure the backend is running.

'; } } function renderJourneys(journeys) { const container = document.getElementById('posts-grid'); if (!journeys.length) { container.innerHTML = `

No journeys yet. Create one on the map!

`; return; } container.innerHTML = journeys.map(journey => `
${journey.image ? `${journey.title}` : '
'}

${escapeHtml(journey.title)}

${new Date(journey.created_at).toLocaleDateString()} ${journey.markers ? ` ${journey.markers.length} chapters` : ''} ${getJourneyBadges(journey)}
${escapeHtml(journey.description || journey.markers?.[0]?.text?.substring(0, 150) + '…')}
`).join(''); } function getJourneyBadges(journey) { const badges = []; const isOwner = journey.owner_id === currentUser?.id; const isShared = journey.visibility === 'shared' && !isOwner; if (journey.visibility === 'public') badges.push('Public'); if (isShared) badges.push(journey.can_edit ? 'Shared edit' : 'Shared'); return badges.map((badge) => `${badge}`).join(''); } function filterJourneys(filter) { if (filter === 'all') { renderJourneys(allJourneys); } else if (filter === 'own') { renderJourneys(allJourneys.filter(j => j.owner_id === currentUser?.id)); } else if (filter === 'shared') { renderJourneys(allJourneys.filter(j => j.owner_id !== currentUser?.id && j.visibility === 'shared')); } else if (filter === 'public') { renderJourneys(allJourneys.filter(j => j.visibility === 'public')); } } // ==================== INITIALIZATION ==================== document.addEventListener('DOMContentLoaded', async () => { const authenticated = await checkAuthAndRedirect(); if (!authenticated) return; updateUserMenu(); loadJourneys(); document.querySelectorAll('.filter-btn').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); filterJourneys(btn.dataset.filter); }); }); });