AKY
0 EN VIVO
publicMundo

Conectando con AKY...

photo_libraryRecuerdos
sensorsTransmisiones en vivo
forumComunidad AKY
motion_photos_onEstados recientes
searchResultados
manage_search

Escribe para buscar

Videos, recuerdos, posts y usuarios

Usuario
Sin QR

Escanea con la app AKY para ver el perfil

'; }, emptyGrid: function(icon, title, sub) { return '
' + icon + '' + '

' + title + '

' + (sub || '') + '

'; }, cardHTML: function(m, isLive) { var flag = this.flag(m.country); var thumb; if (isLive) { thumb = m.avatar ? '' : '
sensors
'; } else if (m.kind === 'video') { thumb = m.thumb ? '' : ''; } else { thumb = ''; } var badge = isLive ? 'EN VIVO' : '' + (m.kind === 'video' ? 'VIDEO' : 'IMG') + ''; var overlayIcon = isLive ? 'sensors' : (m.kind === 'video' ? 'play_arrow' : 'fullscreen'); var metaLine = isLive ? this.esc(m.hostName) + (m.verified ? ' verified' : '') + ' • ' + this.fmtCount(m.viewers) + ' viendo' + (flag ? ' ' + flag : '') : this.esc(m.userName) + (m.verified ? ' verified' : '') + ' • ' + this.timeAgo(m.timestamp) + (flag ? ' ' + flag : ''); var avatarInner = m.avatar ? '' : this.esc(this.initial(isLive ? m.hostName : m.userName)); return '
' + '
' + thumb + '
' + overlayIcon + '
' + badge + '
' + '
' + '
' + avatarInner + '
' + '
' + '
' + this.esc(isLive ? (m.topic || 'Transmision en vivo') : (m.title || 'Sin titulo')) + '
' + '
' + metaLine + '
' + '
' + '
' + '
'; }, bindCards: function(container, items, isLive) { var self = this; var cards = container.querySelectorAll('.aky-card'); for (var i = 0; i < cards.length; i++) { (function(card, item) { card.onclick = function() { if (isLive) self.openQr(item.hostId, item.hostName, item.avatar, true); else self.openMedia(item); }; var av = card.querySelector('.aky-avatar-btn'); if (av) av.onclick = function(e) { e.stopPropagation(); self.openQr(isLive ? item.hostId : item.userId, isLive ? item.hostName : item.userName, item.avatar, isLive); }; })(cards[i], items[i]); } }, renderMundo: function() { var grid = document.getElementById('aky-grid-mundo'); if (!this.videos.length) { grid.innerHTML = this.emptyGrid('video_library', 'Sin videos', 'Aun no hay contenido en Mundo'); return; } var html = ''; for (var i = 0; i < this.videos.length; i++) html += this.cardHTML(this.videos[i]); grid.innerHTML = html; this.bindCards(grid, this.videos); }, renderRecuerdos: function() { var grid = document.getElementById('aky-grid-recuerdos'); if (!this.images.length) { grid.innerHTML = this.emptyGrid('photo_library', 'Sin recuerdos', 'Aun no hay imagenes'); return; } var html = ''; for (var i = 0; i < this.images.length; i++) html += this.cardHTML(this.images[i]); grid.innerHTML = html; this.bindCards(grid, this.images); }, renderLives: function() { var grid = document.getElementById('aky-grid-live'); if (!this.lives.length) { grid.innerHTML = this.emptyGrid('sensors_off', 'Sin transmisiones', 'No hay lives activos ahora'); return; } var html = ''; for (var i = 0; i < this.lives.length; i++) html += this.cardHTML(this.lives[i], true); grid.innerHTML = html; this.bindCards(grid, this.lives, true); }, updateLiveBadge: function() { var n = this.lives.length; var pill = document.getElementById('aky-live-pill'); var badge = document.getElementById('aky-live-badge'); document.getElementById('aky-live-count').textContent = n; pill.style.display = n > 0 ? 'flex' : 'none'; badge.style.display = n > 0 ? 'inline-block' : 'none'; badge.textContent = n; }, stars: function(rating) { var r = Math.round(Number(rating) || 0); var s = ''; for (var i = 1; i <= 5; i++) s += i <= r ? '★' : '☆'; return s; }, renderComunidad: function() { var self = this; var list = document.getElementById('aky-posts-list'); if (!this.posts.length) { list.innerHTML = this.emptyGrid('forum', 'Sin posts', 'La comunidad aun no publica'); return; } var html = ''; for (var i = 0; i < this.posts.length; i++) { var p = this.posts[i]; var flag = this.flag(p.country); var media = ''; if (p.videoUrl) { media = '
' + '
play_arrow
'; } else if (p.photo) { media = '
'; } var links = ''; if (p.webReferences.length) { links = '
'; for (var w = 0; w < p.webReferences.length; w++) { var ref = p.webReferences[w]; if (!/^https?:\/\//i.test(ref)) continue; links += '' + 'link' + this.esc(this.shortUrl(ref)) + ''; } links += '
'; } html += '
' + '
' + '
' + (p.avatar ? '' : this.esc(this.initial(p.userName))) + '
' + '' + (p.category ? '' + this.esc(p.category) + '' : '') + '
' + (p.text ? '
' + this.esc(p.text) + '
' : '') + media + links + '
' + (p.rating > 0 ? '' + this.stars(p.rating) + '' + Number(p.rating).toFixed(1) + ' (' + p.ratingCount + ')' : '') + 'favorite' + this.fmtCount(p.likes) + '' + '
' + '
'; } list.innerHTML = html; /* bind avatares + media */ var posts = list.querySelectorAll('.aky-post'); for (var j = 0; j < posts.length; j++) { (function(el, p) { var av = el.querySelector('.aky-avatar-btn'); if (av) av.onclick = function() { self.openQr(p.userId, p.userName, p.avatar); }; var media = el.querySelector('.aky-post-media'); if (media) media.onclick = function() { self.openMedia({ id: p.id, coll: 'free_aky_posts', kind: p.videoUrl ? 'video' : 'image', url: p.videoUrl || p.photo, title: p.videoDesc || p.text || 'Post', userId: p.userId, userName: p.userName, avatar: p.avatar, verified: p.verified, likes: p.likes, timestamp: p.timestamp, country: p.country }); }; })(posts[j], this.posts[j]); } }, shortUrl: function(u) { try { var h = new URL(u).hostname.replace(/^www\./, ''); return h.length > 24 ? h.slice(0, 24) + '…' : h; } catch (e) { return u.slice(0, 24); } }, renderStoriesBar: function() { var self = this; var bar = document.getElementById('aky-stories-bar'); if (!this.stories.length) { bar.className = ''; bar.innerHTML = ''; return; } var html = ''; for (var i = 0; i < this.stories.length; i++) { var g = this.stories[i]; html += '
' + '
' + (g.avatar ? '' : this.esc(this.initial(g.userName))) + '
' + '
' + this.esc(g.userName) + '
' + '
'; } bar.innerHTML = html; bar.className = 'has-stories'; var bubbles = bar.querySelectorAll('.aky-story-bubble'); for (var j = 0; j < bubbles.length; j++) { (function(idx) { bubbles[idx].onclick = function() { self.openStory(idx); }; })(j); } }, renderEstados: function() { var self = this; var grid = document.getElementById('aky-grid-estados'); if (!this.stories.length) { grid.innerHTML = this.emptyGrid('motion_photos_off', 'Sin estados', 'Los estados duran 24 horas'); return; } var html = ''; for (var i = 0; i < this.stories.length; i++) { var g = this.stories[i]; var last = g.items[g.items.length - 1]; html += '
' + '' + '
' + this.esc(g.userName) + '
' + g.items.length + ' estado' + (g.items.length > 1 ? 's' : '') + ' • ' + this.timeAgo(last.createdAt) + '
' + '
' + '
'; } grid.innerHTML = html; var cards = grid.querySelectorAll('.aky-state-card'); for (var j = 0; j < cards.length; j++) { (function(idx) { cards[idx].onclick = function() { self.openStory(idx); }; })(j); } }, /* ---------------- BUSCADOR ---------------- */ doSearch: function(q) { var self = this; q = (q || '').trim().toLowerCase(); var box = document.getElementById('aky-search-results'); if (this.section !== 'buscar') this.goTo('buscar'); if (!q) { box.innerHTML = this.emptyGrid('manage_search', 'Escribe para buscar', 'Videos, recuerdos, posts y usuarios'); return; } var mv = this.videos.filter(function(v) { return (v.title || '').toLowerCase().indexOf(q) !== -1 || (v.userName || '').toLowerCase().indexOf(q) !== -1; }); var mi = this.images.filter(function(v) { return (v.title || '').toLowerCase().indexOf(q) !== -1 || (v.userName || '').toLowerCase().indexOf(q) !== -1; }); var mp = this.posts.filter(function(p) { return (p.text || '').toLowerCase().indexOf(q) !== -1 || (p.userName || '').toLowerCase().indexOf(q) !== -1 || (p.nickname || '').toLowerCase().indexOf(q) !== -1; }); var html = ''; if (mv.length) { html += '
Videos (' + mv.length + ')
'; } if (mi.length) { html += '
Recuerdos (' + mi.length + ')
'; } if (mp.length) { html += '
Posts (' + mp.length + ')
'; } html += '
Usuarios
'; if (!mv.length && !mi.length && !mp.length) { html = '
search_off

Sin resultados en contenido

Buscando usuarios...

' + html; } box.innerHTML = html; var gv = document.getElementById('aky-s-videos'); if (gv) { var h=''; for (var i=0;i
' + '
' + (p.avatar ? '' : this.esc(this.initial(p.userName))) + '
' + '
' + '
' + this.esc(p.text) + '
'; } gp.innerHTML = html2; } /* Buscar usuarios en coleccion "users" (misma ruta que SearchActivity) */ this.db.collection('users').limit(200).get().then(function(snap) { var users = []; snap.forEach(function(doc) { var d = doc.data(); var name = (d.userName || d.displayName || '').toLowerCase(); var nick = (d.nickname || '').toLowerCase(); if (name.indexOf(q) !== -1 || nick.indexOf(q) !== -1) { users.push({ uid: doc.id, userName: d.userName || d.displayName || 'Usuario', nickname: d.nickname || '', avatar: d.profileImageUrl || null, verified: d.isVerified === true, followers: d.followersCount || 0, likes: d.likesCount || 0 }); } }); var target = document.getElementById('aky-s-users'); if (!target) return; if (!users.length) { target.innerHTML = '
Sin usuarios que coincidan
'; return; } var html3 = ''; for (var u = 0; u < Math.min(users.length, 20); u++) { var us = users[u]; html3 += '
' + '
' + (us.avatar ? '' : this.esc(this.initial(us.userName))) + '
' + '
' + this.esc(us.userName) + (us.verified ? ' verified' : '') + '
' + '
' + (us.nickname ? '@' + this.esc(us.nickname) : '') + '
' + '
' + this.fmtCount(us.followers) + ' seguidores
' + this.fmtCount(us.likes) + ' likes
' + '
'; } target.innerHTML = html3; /* resolver avatares de usuarios + bind click */ var rows = target.querySelectorAll('.aky-user-row'); for (var r = 0; r < rows.length; r++) { (function(row, u2) { self.getAvatar(u2.uid, u2.avatar).then(function(a) { var av = row.querySelector('.aky-avatar'); if (av && a) av.innerHTML = ''; }); row.onclick = function() { self.openQr(u2.uid, u2.userName, null); }; })(rows[r], users[r]); } }).catch(function() { var target = document.getElementById('aky-s-users'); if (target) target.innerHTML = '
No se pudo buscar usuarios
'; }); }, /* ---------------- MODAL MEDIA ---------------- */ openMedia: function(m) { var self = this; this.currentMedia = m; var player = document.getElementById('aky-player'); if (m.kind === 'video') { player.innerHTML = ''; } else { player.innerHTML = ''; } var liked = localStorage.getItem('aky_like_' + m.coll + '_' + m.id) === '1'; var flag = this.flag(m.country); document.getElementById('aky-player-info').innerHTML = '
' + this.esc(m.title || 'Sin titulo') + '
' + '
' + this.timeAgo(m.timestamp) + ' • ' + this.fmtCount(m.likes) + ' likes' + (flag ? ' • ' + flag : '') + '
' + '
' + '' + '
' + '
' + '
' + (m.avatar ? '' : this.esc(this.initial(m.userName))) + '
' + '
' + this.esc(m.userName) + (m.verified ? ' verified' : '') + '
' + '
Cargando...
' + '' + '
'; document.getElementById('aky-media-modal').classList.add('active'); document.body.style.overflow = 'hidden'; var likeBtn = document.getElementById('aky-like-btn'); if (likeBtn) likeBtn.onclick = function() { self.toggleLike(m); }; var av = document.getElementById('aky-player-avatar'); if (av) av.onclick = function() { self.openQr(m.userId, m.userName, m.avatar); }; var openApp = document.getElementById('aky-open-app'); if (openApp) openApp.onclick = function() { self.openQr(m.userId, m.userName, m.avatar); }; /* stats del canal */ this.getUser(m.userId).then(function(u) { var el = document.getElementById('aky-channel-stats'); if (el && u) el.textContent = self.fmtCount(u.followersCount) + ' seguidores'; else if (el) el.textContent = ''; }); this.loadComments(m); }, /* Likes: misma ruta de la app {coll}/{id} -> likeCount + likedBy[] */ toggleLike: function(m) { var key = 'aky_like_' + m.coll + '_' + m.id; var btn = document.getElementById('aky-like-btn'); var num = document.getElementById('aky-like-n'); if (!btn) return; var self = this; var likedNow = localStorage.getItem(key) === '1'; var delta = likedNow ? -1 : 1; var update = { likeCount: firebase.firestore.FieldValue.increment(delta) }; if (this.uid) { update.likedBy = likedNow ? firebase.firestore.FieldValue.arrayRemove(this.uid) : firebase.firestore.FieldValue.arrayUnion(this.uid); } this.db.collection(m.coll).doc(m.id).update(update) .then(function() { m.likes = Math.max(0, (m.likes || 0) + delta); if (likedNow) localStorage.removeItem(key); else localStorage.setItem(key, '1'); btn.classList.toggle('liked', !likedNow); if (num) num.textContent = self.fmtCount(m.likes); }) .catch(function(e) { console.warn('[AKY] like:', e); }); }, /* {coll}/{id}/comments -> misma subcoleccion que la app (solo lectura) */ loadComments: function(m) { var self = this; var box = document.getElementById('aky-comments'); box.innerHTML = '

chat_bubbleComentarios

' + '
'; this.db.collection(m.coll).doc(m.id).collection('comments') .orderBy('timestamp', 'desc').limit(50).get() .then(function(snap) { var html = '

chat_bubbleComentarios (' + snap.size + ')

'; if (!snap.size) { html += '
Sin comentarios aun
'; } else { snap.forEach(function(doc) { var c = doc.data(); var color = ''; if (typeof c.commentColor === 'number') { var hex = (c.commentColor >>> 0).toString(16).padStart(8, '0').slice(2); color = ' style="color:#' + hex + '"'; } html += '
' + '
' + self.esc(self.initial(c.userName)) + '
' + '
' + self.esc(c.userName || 'Usuario') + '' + self.timeAgo(c.timestamp) + '
' + '
' + self.esc(c.text || '') + '
' + '
'; }); } box.innerHTML = html; }) .catch(function() { /* fallback sin orden si falta indice */ self.db.collection(m.coll).doc(m.id).collection('comments').limit(50).get() .then(function(snap) { var html = '

chat_bubbleComentarios (' + snap.size + ')

'; if (!snap.size) html += '
Sin comentarios aun
'; snap.forEach(function(doc) { var c = doc.data(); html += '
' + '
' + self.esc(self.initial(c.userName)) + '
' + '
' + self.esc(c.userName || 'Usuario') + '
' + '
' + self.esc(c.text || '') + '
'; }); box.innerHTML = html; }) .catch(function() { box.innerHTML = '

chat_bubbleComentarios

' + '
No se pudieron cargar
'; }); }); }, closeMedia: function() { document.getElementById('aky-media-modal').classList.remove('active'); document.body.style.overflow = ''; var v = document.querySelector('#aky-player video'); if (v) v.pause(); document.getElementById('aky-player').innerHTML = ''; }, /* ---------------- MODAL QR PERFIL ---------------- */ /* QR = "aky://user/{uid}" -> mismo deep link del AndroidManifest */ openQr: function(uid, fallbackName, fallbackAvatar, isLive) { var self = this; var qrAvatar = document.getElementById('aky-qr-avatar'); var qrName = document.getElementById('aky-qr-name'); var qrStats = document.getElementById('aky-qr-stats'); var qrSocials = document.getElementById('aky-qr-socials'); var qrImg = document.getElementById('aky-qr-img'); var qrHint = document.getElementById('aky-qr-hint'); qrAvatar.innerHTML = '
'; qrName.textContent = fallbackName || 'Usuario'; qrStats.textContent = 'Cargando...'; qrSocials.innerHTML = ''; qrImg.innerHTML = '
'; qrHint.textContent = isLive ? 'Escanea con la app AKY para ver la transmision' : 'Escanea con la app AKY para ver el perfil'; document.getElementById('aky-qr-modal').classList.add('active'); if (!uid) { qrAvatar.textContent = this.initial(fallbackName); qrStats.textContent = ''; qrImg.innerHTML = 'Usuario no identificado'; return; } var qrData = 'aky://user/' + uid; var qrUrl = 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&margin=10&data=' + encodeURIComponent(qrData); this.getUser(uid).then(function(u) { var display = u ? (u.nickname ? '@' + u.nickname : u.userName) : (fallbackName || 'Usuario'); qrName.textContent = display || 'Usuario'; if (u) { qrStats.textContent = self.fmtCount(u.followersCount) + ' seguidores • ' + self.fmtCount(u.likesCount) + ' likes'; var chips = ''; for (var net in u.socials) { if (u.socials[net]) { chips += '' + self.esc(net) + ''; } } qrSocials.innerHTML = chips; } else { qrStats.textContent = ''; } var showAvatar = function(url) { if (url) qrAvatar.innerHTML = ''; else qrAvatar.textContent = self.initial(display); }; if (fallbackAvatar) showAvatar(fallbackAvatar); else if (u && u.profileImageUrl) self.resolveUrl(u.profileImageUrl).then(showAvatar); else self.fallbackAvatar(uid).then(showAvatar); qrImg.innerHTML = 'QR'; }); }, closeQr: function() { document.getElementById('aky-qr-modal').classList.remove('active'); }, /* ---------------- STORY VIEWER ---------------- */ storyTimer: null, storyIdx: 0, storyPos: 0, openStory: function(groupIdx) { this.storyIdx = groupIdx; this.storyPos = 0; document.getElementById('aky-story-modal').classList.add('active'); document.body.style.overflow = 'hidden'; this.showStoryItem(); }, showStoryItem: function() { var self = this; var g = this.stories[this.storyIdx]; if (!g) { this.closeStory(); return; } var item = g.items[this.storyPos]; if (!item) { this.closeStory(); return; } /* progreso */ var prog = ''; for (var i = 0; i < g.items.length; i++) { prog += '
'; } document.getElementById('aky-story-progress').innerHTML = prog; document.getElementById('aky-story-head').innerHTML = '
' + (g.avatar ? '' : this.esc(this.initial(g.userName))) + '
' + '
' + this.esc(g.userName) + '
' + '
' + this.timeAgo(item.createdAt) + '
'; var media = document.getElementById('aky-story-media'); var isVideo = /\.(mp4|webm|mov)(\?|$)/i.test(item.resolved || ''); if (isVideo) { media.innerHTML = ''; } else { media.innerHTML = ''; } /* animar segmento actual */ var segs = document.querySelectorAll('#aky-story-progress .aky-story-seg > div'); var seg = segs[this.storyPos]; clearTimeout(this.storyTimer); if (seg) { seg.style.transition = 'none'; seg.style.width = '0'; void seg.offsetWidth; seg.style.transition = 'width 5s linear'; seg.style.width = '100%'; } this.storyTimer = setTimeout(function() { self.stepStory(1); }, 5000); }, stepStory: function(dir) { var g = this.stories[this.storyIdx]; if (!g) { this.closeStory(); return; } var next = this.storyPos + dir; if (next >= g.items.length) { /* siguiente grupo */ if (this.storyIdx + 1 < this.stories.length) { this.storyIdx++; this.storyPos = 0; } else { this.closeStory(); return; } } else if (next < 0) { if (this.storyIdx > 0) { this.storyIdx--; this.storyPos = this.stories[this.storyIdx].items.length - 1; } else { this.storyPos = 0; } } else { this.storyPos = next; } this.showStoryItem(); }, closeStory: function() { clearTimeout(this.storyTimer); document.getElementById('aky-story-modal').classList.remove('active'); document.body.style.overflow = ''; document.getElementById('aky-story-media').innerHTML = ''; } }; window.AKY = AKY; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', function() { AKY.init(); }); } else { AKY.init(); } })();